Merge branch 'iandoug-master'

pull/120/head
Ian Prest 9 years ago
commit e11477a517

@ -6,8 +6,9 @@ Special thanks to the following contributors:
support
* [jasonm23](https://github.com/jasonm23), for initial Custom Styles
implementation
* [iandoug](http://iandoug.com/?p=64), for the case background textures &
related options.
* [iandoug](http://iandoug.com/?p=64), for first versions of: Move/Size/Angle stepsize; case background textures &
related options; default switch options.
* [Kevin Schoedel](https://github.com/datatravelandexperiments) for the Colors in Keyboard patch
The following users have contributed some of the sample keyboard layouts &
presets:
@ -39,6 +40,7 @@ keyboard-layout-editor.com:
* [Jison](http://zaach.github.io/jison/) (JavaScript parser generator)
* [Hint.css](http://kushagragour.in/lab/hint/) (CSS-only tooltips)
* [doT.js](http://olado.github.io/doT/) (fast micro-templating)
* [html2canvas](https://github.com/niklasvh/html2canvas)
* [Font Awesome](http://fortawesome.github.io/Font-Awesome/)
* [C64 TrueType Font](http://style64.org/c64-truetype) font (by
[Style64.org](https://www.style64.org))

@ -89,6 +89,7 @@ $(call BOWER,bower_components/marked/marked.min.js)
$(call BOWER,bower_components/FileSaver/FileSaver.min.js)
$(call BOWER,bower_components/doT/doT.min.js)
$(call BOWER,bower_components/URLON/src/urlon.js)
$(call BOWER,bower_components/html2canvas/build/html2canvas.min.js)
# Rules to generate a webfont from our source .svg files

@ -44,6 +44,7 @@
"hint.css": "1.3.5",
"angular-cookies": "1.2.28",
"ace-builds": "1.2.0",
"angular-ui-ace": "0.2.3"
"angular-ui-ace": "0.2.3",
"html2canvas": "0.4.1"
}
}

@ -302,8 +302,8 @@
},
{
"name" : "WASD keyboards",
"href" : "http://www.wasdkeyboards.com/index.php/products/sampler-kit/wasd-sampler-kit-o-ring-keycaps.html",
"description" : "These are the 11 colors and their RGB codes, taken from the HTML code of the shop pages.",
"href" : "http://www.wasdkeyboards.com/index.php/products/keycap-set/104-key-cherry-mx-keycap-set.html",
"description" : "These are the 19 colors and their RGB codes, taken from the HTML code of the shop pages.",
"colors" : [
{ "name": "black", "r":26, "g":26, "b":26},
{ "name": "white", "r":255, "g":255, "b":255},

@ -111,4 +111,19 @@
return this;
};
// Polyfill for HTMLCanvasElement.toBlob, which is currently only available on Firefox
if (typeof(HTMLCanvasElement) !== 'undefined' && !HTMLCanvasElement.prototype.toBlob) {
Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
value: function (callback, type, quality) {
var binStr = atob( this.toDataURL(type, quality).split(',')[1] ),
len = binStr.length,
arr = new Uint8Array(len);
for (var i=0; i<len; i++ ) {
arr[i] = binStr.charCodeAt(i);
}
callback( new Blob( [arr], {type: type || 'image/png'} ) );
}
});
}
}());

@ -0,0 +1,10 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg viewBox="0 -410 2402 2048">
<g transform="matrix(1 0 0 -1 0 1638)">
<path fill="currentColor"
d="M1063 1019h29q47 -116 73 -116h102q35 116 72 116q0 -364 175 -364l73 -14q218 36 218 232q0 10 -29 102h15q611 -229 611 -465v-73q0 -244 -480 -437q51 56 87 160q0 117 -131 117q-117 0 -218 -88h-30q0 70 -145 88q-146 0 -277 -277q-165 277 -305 277q-61 0 -161 -88
q-121 88 -232 88q-117 0 -117 -131q15 -55 87 -146h-29q-451 227 -451 422v44q0 299 626 509l-15 -102v-58q0 -122 204 -174q248 0 248 305v73z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 651 B

@ -0,0 +1,12 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg viewBox="0 -410 2048 2048">
<g transform="matrix(1 0 0 -1 0 1638)">
<path fill="currentColor"
d="M899 1845h34q198 0 396 -110q58 -34 121 -87q65 -60 92 -93q192 -235 192 -528q0 -259 -156 -480q-31 -42 -87 -101q-89 -81 -137 -108q-202 -127 -438 -127q-279 0 -509 178q-84 69 -137 139q-44 59 -68 103q-102 191 -102 381v33q0 189 101 379q33 60 87 127
q59 68 115 114l59 43q155 100 315 126q71 11 122 11zM266 1028q0 -214 132 -393q20 -28 82 -90l18 -15q186 -152 416 -152h8q207 0 386 130q35 25 95 87l20 24q144 186 144 404v8q0 245 -172 439q-64 65 -99 87q-173 122 -380 122q-240 0 -432 -164q-75 -73 -87 -96
q-38 -48 -62 -99q-69 -138 -69 -292zM912 1487h8q174 0 311 -124q60 -61 81 -101q63 -111 63 -222v-25q0 -121 -77 -243q-19 -29 -69 -81l-25 -21q-38 -30 -78 -50q-100 -50 -196 -50h-25q-114 0 -229 67q-38 22 -95 78q-65 71 -97 159q-9 26 -15 54h217l14 -27
q48 -79 138 -111q39 -12 76 -12h5q95 0 170 68q78 79 78 178v7q0 115 -96 195q-70 53 -155 53q-121 0 -203 -104q-15 -23 -22 -38h-220q11 47 36 100q21 38 46 72q56 66 89 87q125 91 270 91z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -13,8 +13,26 @@ Select(0uE609); Import("font-src/logo-linux-tux.svg",0,16);
Select(0uE60A); Import("font-src/logo-linux-tux-ibm.svg",0,16);
Select(0uE60B); Import("font-src/logo-linux-tux-ibm-invert.svg",0,16);
Select(0uE60C); Import("font-src/logo-atari.svg",0,16);
Select(0uE60D); Import("font-src/logo-linux-archlinux.svg",0,16);
Select(0uE60E); Import("font-src/logo-bsd-freebsd.svg",0,16);
Select(0uE60F); Import("font-src/logo-linux-centos.svg",0,16);
Select(0uE610); Import("font-src/logo-winlin-cygwin.svg",0,16);
Select(0uE611); Import("font-src/logo-linux-debian.svg",0,16);
Select(0uE612); Import("font-src/logo-linux-edubuntu.svg",0,16);
Select(0uE613); Import("font-src/logo-linux-fedora.svg",0,16);
Select(0uE614); Import("font-src/logo-linux-gentoo.svg",0,16);
Select(0uE615); Import("font-src/logo-gnu.svg",0,16);
Select(0uE616); Import("font-src/logo-linux-knoppix.svg",0,16);
Select(0uE617); Import("font-src/logo-linux-redhat.svg",0,16);
Select(0uE618); Import("font-src/logo-linux-opensuse.svg",0,16);
Select(0uE619); Import("font-src/logo-android.svg",0,16);
Select(0uE700); Import("font-src/community-hapster.svg",0,16);
Select(0uE701); Import("font-src/community-awesome.svg",0,16);
Select(0uE702); Import("font-src/community-awesome-invert.svg",0,16);
Select(0uE703); Import("font-src/copyleft.svg",0,16);
Select(0uE704); Import("font-src/batman.svg",0,16);
Generate($2);

@ -0,0 +1 @@
<svg height="1000" width="785.714" xmlns="http://www.w3.org/2000/svg"><path d="M275.094 269.578q8.928 0 15.345 -6.417t6.417 -15.345 -6.417 -15.345 -15.345 -6.417 -15.066 6.417 -6.138 15.345 6.138 15.345 15.066 6.417zm235.476 0q8.928 0 15.066 -6.417t6.138 -15.345 -6.138 -15.345 -15.066 -6.417 -15.345 6.417 -6.417 15.345 6.417 15.345 15.345 6.417zm-453.096 102.672q23.436 0 40.176 16.74t16.74 40.176v239.94q0 23.994 -16.461 40.734t-40.455 16.74 -40.734 -16.74 -16.74 -40.734v-239.94q0 -23.436 16.74 -40.176t40.734 -16.74zm591.48 10.602v371.628q0 25.668 -17.856 43.524t-42.966 17.856h-41.85v126.666q0 23.994 -16.74 40.734t-40.734 16.74 -40.734 -16.74 -16.74 -40.734v-126.666h-77.004v126.666q0 23.994 -16.74 40.734t-40.734 16.74q-23.436 0 -40.176 -16.74t-16.74 -40.734l-.558 -126.666h-41.292q-25.668 0 -43.524 -17.856t-17.856 -43.524v-371.628h512.244zm-129.456 -225.99q59.706 30.69 95.418 85.653t35.712 120.249h-516.15q0 -65.286 35.712 -120.249t95.976 -85.653l-39.618 -73.098q-3.906 -7.254 2.79 -11.16 7.254 -3.348 11.16 3.348l40.176 73.656q53.01 -23.436 112.158 -23.436t112.158 23.436l40.176 -73.656q3.906 -6.696 11.16 -3.348 6.696 3.906 2.79 11.16zm266.166 272.304v239.94q0 23.994 -16.74 40.734t-40.734 16.74q-23.436 0 -40.176 -16.74t-16.74 -40.734v-239.94q0 -23.994 16.74 -40.455t40.176 -16.461q23.994 0 40.734 16.461t16.74 40.455z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -0,0 +1,9 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg viewBox="0 -410 2048 2048">
<g transform="matrix(1 0 0 -1 0 1638)">
<path fill="currentColor"
d="M1690 0h-11q-351 0 -529 309q-143 251 -143 630v426h102v-164q0 -428 86 -653q133 -348 495 -343v-205zM973 0h-171v1365h171v-1365zM768 939q0 -380 -148 -634q-183 -308 -535 -305v205q348 -5 488 310q98 220 98 617q0 54 -1.5 112t-3.5 121h102v-426z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 500 B

@ -0,0 +1,40 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg viewBox="0 -410 2048 2048">
<g transform="matrix(1 0 0 -1 0 1638)">
<path fill="currentColor"
d="M727 1903q18 0 23 -16q-1 -9 -32 -37q-56 -64 -56 -85l-1 -12q0 -35 17 -35q8 0 59 22q46 15 97 15q102 0 210 -61q17 -11 45 -40q10 -10 20 -10q30 0 85 37q7 9 7 27q0 59 -32 104q-9 17 -9 23v4q0 10 17 14l10 1q53 0 124 -119q31 -68 31 -117q0 -63 -61 -136
q-42 -46 -58 -54q-33 -26 -69 -49l1 -7v-18q0 -132 -86 -212q-59 -56 -59 -84l-1 -13q0 -24 28 -69q20 -42 20 -125v-14q0 -41 -16 -78l-2 -13q14 -78 64 -150q32 -38 59 -56q49 -33 114 -56q76 -22 210 -48q114 -27 153 -52q50 -33 50 -79v-2q0 -34 -58 -65
q-35 -13 -119 -28l-1 -1l3 -16q0 -9 -33 -9q-93 0 -269 -10q-16 1 -17 5v2q0 9 47 32q7 5 48 27q88 46 147 86l6 2h6q14 -11 26 -38q6 -21 19 -21q32 0 79 21q26 14 26 25q-5 16 -35 33q-31 14 -94 23q-182 24 -267 51q-117 35 -144 63q-28 16 -54 40q22 -43 47 -125
q8 -17 8 -38v-13q0 -17 -43 -32q-76 -38 -152 -55q-92 -14 -132 -14h-17q-90 0 -193 11q-47 11 -74 32l-7 11l-7 -1h-7q-139 0 -160 12q-41 17 -41 56v5q0 39 150 72q15 3 31 3h19q57 7 74 7l53 1q18 0 46 16q43 14 43 22v4q0 8 -15 44l-3 17v3q0 7 7 7q-54 74 -54 115v14
q0 31 18 65l1 3q0 2 -20 24q-6 12 -6 18v9l1 7q-32 4 -32 12l-11 9l-12 -1h-7q-34 0 -49 20q-13 11 -13 19l2 9q-22 0 -43 25q-7 9 -7 26q0 43 27 61v1l-52 43l-7 3q-56 -36 -93 -36q-87 0 -127 59q-23 25 -42 63q-6 16 -6 22q0 9 8 9h3q6 0 40 -23q17 -13 63 -26
q8 -6 8 -11v-2q0 -9 -20 -20l-1 -1v-3q2 -5 29 -13l24 -4h13q22 0 49 17l3 4v4q0 16 -44 47q0 1 -5 2q-18 -16 -23 -16q-8 0 -15 33l-34 69l-1 9v2l5 4q6 0 56 -28q21 -9 53 -13q4 -3 4 -7l-9 -18v-1q2 -5 33 -27q16 -15 22 -15q21 10 21 30q0 27 -29 51q-4 0 -20 -12h-4
q-9 0 -15 27q-15 34 -38 63l-4 10q2 4 3 4h2q7 0 77 -34q31 -11 31 -20v-2q0 -4 -6 -12q15 -10 26 -22q17 -28 17 -65q0 -26 -16 -47v-3q15 -17 36 -32q14 29 62 29h22q23 0 44 -26q8 -18 8 -34q0 -28 -18 -37v-1h5q28 0 87 -8q22 0 28 36v3q0 13 -12 26q-44 20 -64 40
q-75 49 -91 49q-52 19 -85 75q-17 30 -17 58v7q0 45 46 95q21 30 21 46q20 73 20 90v4l-16 94l-4 36q0 28 21 79q22 28 46 53q47 47 78 68q77 53 104 53zM485 1650q0 -18 20 -125v-11q0 -13 -6 -35v-1h1q22 75 56 128q22 26 50 56q25 25 54 25q35 0 41 -25l3 -15v-1l-3 -1
q-4 0 -9 21q-9 14 -32 14q-31 0 -61 -37q-41 -41 -59 -79q-17 -36 -41 -109q-4 -7 -21 -57q-13 -21 -44 -59q-16 -32 -16 -55v-3q0 -56 58 -107q20 -16 51 -26q15 -1 93 -55q12 -14 46 -27q21 -13 21 -36v-2q0 -29 -24 -42l-12 -2l-48 6h-1v-1q20 -9 28 -25q4 -11 4 -29v-2
l-1 -1v-1q32 23 61 23h11q58 0 111 -46q26 -15 45 -15h3q32 0 42 12h3l2 -2v-3q-11 -14 -48 -14h-4q-31 0 -76 38q-40 23 -82 23h-4q-31 0 -59 -22h-2v-1q8 0 18 -33v-4q0 -5 -16 -23q-21 -38 -58 -38q-2 -4 -2 -11v-2q0 -17 23 -37q0 -6 18 -9q16 -8 49 -8l12 1l1 -1v-6
l-5 -1h-5q-39 0 -65 11q20 -34 64 -48l38 -6l6 1h7l2 -2v-2q0 -3 -13 -4l-22 2h-1v-1q38 -24 77 -24q17 3 89 24l65 10q82 34 99 45q33 29 33 66v26q0 102 -32 144q-16 28 -16 53v1q0 42 47 84q58 59 63 76q36 62 36 147v6l-1 22q58 37 109 82q79 84 79 153q0 48 -33 119
q-70 110 -115 110q-14 0 -20 -8v-2q0 -6 26 -53q15 -28 15 -79q0 -29 -23 -39q-47 -29 -78 -29q-16 0 -44 33q-36 29 -69 41q-83 37 -161 37q-71 0 -139 -34q-9 -3 -17 -3h-1q-22 0 -22 43q0 30 21 54q18 27 55 64q8 6 12 13v3q0 5 -16 8q-43 -8 -134 -79q-92 -85 -94 -112
q-13 -34 -13 -55zM802 1680h10q53 0 68 -60l7 -27l-1 -3h-4q-3 1 -12 39q-17 44 -57 44h-9q-16 0 -49 -20h-2l-3 3v1q7 7 39 21zM653 1628q17 0 26 -25l1 -7q0 -11 -34 -94q-27 -94 -41 -116q-23 -33 -44 -33h-4q-30 0 -41 43l-1 13v1q0 64 28 106q0 7 39 64q27 37 58 46z
M522 1410q0 -38 29 -49l8 -1q25 0 50 49q35 113 59 169l5 18q0 18 -21 25q-22 0 -53 -31l-26 -36q-50 -78 -50 -121zM780 1615h6q23 0 42 -38q7 -23 7 -47v-6q0 -101 -41 -170q-34 -49 -78 -49h-1l-1 -1q-30 0 -54 25q-22 28 -22 74q0 55 68 161q24 35 66 50zM645 1402
q0 -61 40 -83q13 -7 26 -7h6q33 0 64 37q47 66 47 176v4q0 57 -33 76l-11 3h-2q-28 0 -66 -43q-35 -52 -53 -94q-18 -43 -18 -69zM576 1491h3q17 0 23 -28l1 -12v-3q0 -42 -28 -68q-9 -7 -19 -7q-15 0 -22 27l-2 15q0 42 31 72zM551 1438q3 -19 8 -19h3q13 0 17 29v4
q0 18 -11 18q-17 -7 -17 -32zM712 1471h6q23 0 32 -39l1 -12v-8q0 -40 -31 -69q-12 -10 -25 -10h-1q-23 0 -33 28q-4 11 -4 24v5q0 46 36 75q10 6 19 6zM682 1411q3 -19 8 -19h3q13 0 17 29v4q0 18 -11 18q-17 -7 -17 -32zM568 1342q29 0 51 -19v-5h-5q-22 17 -48 17
q-31 0 -45 -27q-3 -10 -3 -17v-11q0 -17 23 -33q17 -12 50 -12l42 5h4l23 -8q19 0 19 10v5q0 14 -12 24v2l3 3h1q15 -10 15 -27v-8q0 -16 -26 -16l-24 8h-2l-43 -5q-58 0 -77 38l-3 12v14q0 34 36 47q10 3 21 3zM282 1296q19 -26 35 -56q9 -28 13 -32q15 12 22 12h1
q13 -3 29 -30q7 -14 7 -30q0 -23 -26 -35l-4 -1q-7 1 -44 32q-16 9 -16 18v2q0 4 8 16q0 2 -28 6q-21 4 -61 29l-14 6v-1q6 -16 26 -54q10 -19 16 -45l1 -1h1q17 15 21 15h2q9 0 35 -25q20 -15 20 -29v-6q-4 -21 -58 -28h-16q-59 8 -59 26q0 5 17 16l5 7q0 6 -38 16
q-20 7 -65 38h-4v-2h-1q5 -34 64 -101q32 -28 61 -32q24 -4 44 -4q32 0 90 36h4q9 0 64 -50h1q7 4 15 4v1q-12 17 -12 40l1 7q-41 30 -41 41l14 28l3 21q0 53 -34 76q-9 3 -10 7v2q0 3 7 13v1q-2 6 -41 20q-13 8 -55 26zM506 1208q28 0 36 -14q63 -67 81 -73q32 -19 74 -19
h6q32 0 58 13q66 31 76 46q12 9 29 9h14l3 -3v-2q0 -6 -6 -6h-6q-24 0 -31 -12q-29 -23 -86 -47q-20 -9 -52 -9h-4q-79 0 -132 63q-2 0 -40 40q-7 3 -24 3l-2 3v5q1 3 6 3zM445 1052q0 -32 30 -50q13 -5 27 -5h7q50 0 58 21q3 5 4 18q0 34 -27 48q-9 6 -20 6h-17
q-52 0 -61 -31zM407 945q0 -32 37 -44q13 -3 41 -4q23 0 48 26q8 12 8 26q0 13 -12 34l-9 7h-19q-28 0 -44 16l-1 1h-1q-29 0 -45 -37q-2 -6 -3 -25zM532 990l4 -6h1l8 7h-3zM541 977q7 -19 7 -29q0 -39 -50 -56l-14 -2l-27 2l-2 -8q11 -20 34 -30l22 -2h2q31 0 61 16
q53 54 53 67v4q0 32 -27 43q-13 8 -28 8q-20 0 -31 -13zM544 845v-2q0 -8 32 -11h1q26 4 36 12l34 44q0 9 -12 29q-10 0 -28 -25q-34 -39 -50 -39q-13 -5 -13 -8zM921 707v-1q75 -47 90 -58q6 -7 6 -19q0 -13 -19 -29l-5 -1h-8q-5 0 -70 43q-30 17 -66 46l-4 6
q-69 -22 -81 -22q-48 0 -93 33q-3 0 -3 4q-16 0 -52 29l-15 18h-1q-15 -30 -15 -59v-8q0 -40 44 -101q0 -10 40 -36l7 1h19q19 0 36 -20h1q16 0 16 2q15 0 19 -25v-2h3q14 40 25 40q8 6 26 6q22 0 54 -29h1q0 10 52 10l50 17l4 1q7 0 19 -14q26 -24 44 -36q47 -36 78 -45
q52 -23 150 -47q75 -17 238 -39q62 -13 85 -38q10 -12 10 -20q0 -28 -86 -49l-27 -3q-18 0 -28 33q-13 22 -19 26q-4 0 -43 -26q-53 -31 -173 -96q-17 -10 -26 -17l8 -1q126 8 290 11l4 1l1 1v1l-3 16q0 7 39 12q80 15 102 31q37 27 37 50v1q0 80 -168 116q-53 13 -190 42
q-133 33 -202 101q-40 40 -68 105q-22 59 -22 77l3 19q-17 -20 -53 -32q-53 -24 -61 -26zM854 696v-1q27 -26 78 -55q51 -34 55 -34h3q11 0 20 23v2q0 13 -36 32q-24 17 -47 30q-13 11 -16 11q-18 -4 -57 -8zM632 563v-4q0 -8 18 -53v-11q0 -15 -51 -30q-23 -15 -46 -15
q-71 0 -97 -5v-1q14 -1 42 -27q7 -6 7 -17v-1h1q48 23 102 23h6l29 -2q12 8 69 27q43 10 43 16q4 0 8 15l-2 20l1 1v1q-5 27 -12 27l-18 -1q-7 0 -24 18l-13 2l-36 -1l-19 14zM769 488l1 -9q0 -29 -45 -36q-5 0 -70 -24q0 -2 25 -8q14 -5 33 -21q46 22 83 32q49 9 74 20
q8 7 8 17v4q0 25 -4 51q-29 33 -57 33q-29 0 -40 -40q-4 -14 -8 -19zM881 520q4 -36 4 -56v-4q0 -21 -19 -28q-24 -8 -88 -22l-59 -25v-1q25 -30 25 -66h1q80 0 183 27q51 15 110 47l8 2q-20 70 -43 118q-15 34 -21 34q-43 -19 -75 -19q-24 0 -26 -7zM652 506h11
q32 0 71 -14l3 -3v-4l-3 -1q-38 15 -74 15h-3q-5 0 -6 4zM779 499q29 0 95 -14l1 -1v-3l-3 -3q-66 14 -93 14l-1 1v4l1 1v1zM968 497q18 0 28 -28v-7q0 -31 -24 -40h-6q-32 4 -32 31q0 30 27 43zM938 452q0 -21 27 -26h5q22 7 22 37v3q0 18 -24 27q-18 0 -28 -28zM636 478
q24 -2 81 -20l2 -3q-1 -4 -4 -4q-32 12 -77 20q-5 0 -5 3zM771 467q40 0 90 -14v-5l-3 -1q-53 13 -88 13l-2 3v2q0 2 3 2zM596 461q31 -5 65 -18l4 -4v-2l-2 -2l-42 14q-28 4 -28 7v2zM528 445q47 0 99 -15v-2h1q-1 -4 -3 -4q-57 14 -98 14l-1 1v5h2v1zM256 398
q34 -27 107 -27q104 3 104 5q6 7 29 18l2 6v2q0 11 -38 34q-19 6 -39 6h-12q-47 0 -133 -33zM742 442q32 0 55 -9l1 -1v-5l-4 -1q-20 9 -55 9l-1 1v3q0 2 4 3zM693 431q33 0 59 -16l1 -1q-1 -4 -3 -4h-1q-32 14 -55 14h-3l-1 1v4q0 2 3 2zM459 357l31 -21q46 -21 145 -21
l96 2q6 0 6 2q0 26 -19 55q-34 41 -103 41h-8q-67 0 -132 -41q-15 -14 -16 -17zM234 372v-1q0 -61 107 -61q33 -2 88 -2h2l10 1l-1 1v19q0 17 13 32l4 6h-1l-93 -3q-75 0 -110 27l-5 2q-14 -10 -14 -21zM635 308q-137 0 -171 38l-8 5q-9 -8 -9 -22v-11q0 -23 23 -31
q44 -25 97 -25q84 -7 152 -7h10q60 0 162 20q64 18 157 65q5 7 5 12q0 35 -5 35h-1l-66 -31q-63 -28 -166 -40q-87 -8 -180 -8z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.9 KiB

@ -0,0 +1,44 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg viewBox="0 -410 2048 2048">
<g transform="matrix(1 0 0 -1 0 1638)">
<path fill="currentColor"
d="M465 1810h25q108 0 203 -60q22 -7 42 -7q14 0 34 6v-1q-44 -66 -117 -66l-111 6q-169 0 -227 -130q-18 -43 -18 -88q0 -75 44 -120q17 -15 29 -15h8q61 0 186 161q101 120 202 120q76 0 174 -73q69 59 128 59q73 0 188 -110l27 -33q24 -37 64 -77q31 -26 59 -26
q58 0 87 86q8 33 8 58q0 68 -42 131q-27 32 -69 43q-12 6 -126 9q-33 0 -67 22q-27 28 -27 48v2l3 3h1q9 0 51 -18l12 -2h5q29 0 105 42q59 29 112 29q92 0 158 -71q28 -37 39 -67q32 -85 32 -168v-16q0 -116 -65 -213q-79 -108 -211 -108h-2v-1q49 -104 66 -104h2q4 0 9 17
l1 1h2q3 0 5 -11q0 -34 -32 -44q-9 -3 -23 -3h-11q-5 0 -7 3q-10 -2 -27 -2h-12q-16 0 -49 13q-18 0 -51 14q-48 27 -58 55h-1l-1 -9l4 -65v-6q0 -17 -2 -17q0 -10 29 -19q39 16 52 16h2q14 0 18 -20q18 -45 18 -70q0 -30 -35 -59q-42 -41 -45 -55q8 -10 41 -37l2 -7v-4
q0 -10 -33 -33q-25 -22 -38 -22v-1q15 -7 17 -41q0 -39 -27 -53l-10 -2l-25 4q-45 -4 -56 -37q-3 -6 -3 -16v-5q16 -22 16 -40v-7q0 -42 -72 -79q-44 -26 -44 -72v-12q0 -22 12 -43l4 -1l11 3v-1q-3 -7 -9 -7h-7v-1q6 -13 21 -13l26 5q-10 -11 -25 -11h-5q-22 0 -29 24
l-10 13q-14 20 -14 42q0 45 51 82q52 40 52 83l-2 17v1h1q3 -12 3 -27v-2q0 -37 -40 -69v-1q65 33 65 74q0 23 -29 53v10q0 8 -4 9q-10 0 -24 -16q-10 -17 -10 -32v-4q0 -9 12 -20q4 -8 4 -17v-6q0 -21 -58 -67q-30 -29 -30 -65t27 -61h1v-2h-1q-64 27 -64 68q0 53 77 83
l20 24q15 16 17 30q0 12 -23 33q-3 8 -3 15q0 8 5 26q-11 11 -28 11h-8l-25 -3h-4l-3 3q0 18 51 28q24 0 65 16q14 3 28 3h1q54 -6 68 -6q35 0 35 8q10 13 10 33q0 28 -23 38q-33 11 -58 11h-5q-33 0 -97 -23l-20 -2h-4q-36 0 -86 45q-51 57 -57 77q-38 75 -64 75l-7 1v1
l5 1h6q35 0 55 -45q5 -8 10 -8q4 0 18 32q16 21 28 23q-25 -26 -32 -64l-1 -12v-2q2 -23 48 -74q31 -26 59 -26h11q18 0 40 11q4 2 11 2h2q5 0 7 -4v-5q-21 0 -39 -11q-16 -3 -29 -3l-14 1h-1v-1q14 -8 30 -8q23 0 90 31q33 11 70 11h7q30 0 63 -4q12 0 30 24v2q0 9 -33 34
q-6 9 -6 14v3h-1l-4 -3l-23 2h-3q-17 0 -41 -10h-2l-2 2v2q0 3 42 35q11 10 15 10q4 -5 7 -5q47 36 58 36h1v-2q29 17 29 35v2q0 28 -14 74q-8 13 -19 13h-2q-12 0 -38 -14h-3q-39 0 -53 46q-46 99 -69 128q-22 22 -41 58q-3 8 -3 17v10q0 58 35 101q8 6 22 8l6 -3
q0 -4 -19 -8v-2q10 0 14 -12v-1q0 -4 -32 -41q-9 -13 -9 -19v-1h1q13 21 42 21q22 -1 22 -11v-1q-1 -10 -4 -10h-3q0 13 -10 13l-4 1h-5q-20 0 -39 -27q-6 -11 -6 -24q0 -5 2 -5q25 15 49 15h3q19 0 33 -9l4 22l-6 -5h-2l-2 2v2q0 4 8 12q7 8 7 29v1q0 30 -44 69
q-20 22 -20 28q0 2 4 3q12 0 52 -51q18 -27 18 -48v-6q0 -12 -9 -35v-14l-1 -12q15 -6 15 -18v-3q0 -12 -9 -14h-3q-3 0 -5 13l-10 6v-2h-1q2 -4 2 -16q0 -19 -19 -26l-14 -2l-6 1h-4v-2q3 -8 22 -10q21 0 27 17l5 2l2 -4q-1 -7 -6 -13h1q7 5 13 17l1 1h5l2 -2v-4
q0 -9 -14 -17l-1 -5q4 -22 13 -46h1l2 38l19 -31q23 -35 72 -50q37 -10 50 -10l30 5h1l5 -1v-3q-2 -5 -26 -8v-1q9 -3 17 -3q13 0 46 6q1 -6 3 -6h7q25 0 39 19l-1 -1h-11q-9 0 -21 22q-22 34 -53 92l-61 119q-15 28 -36 52q-54 45 -112 56h-6q-5 0 -20 -9q-4 0 -23 22
l-16 1q-33 0 -63 -37q8 -17 8 -29q-4 -34 -32 -34h-4l-20 3v2q19 0 26 29l1 7q0 26 -29 40q-29 22 -29 61l-5 9h-1v-3q0 -53 42 -86q7 -12 7 -19l-4 -15h-2l1 9q0 23 -40 33q-41 20 -41 53h-1v-7q0 -34 33 -46q17 -2 35 -19q8 -15 8 -21q-24 27 -35 28q-31 7 -41 20
q-12 17 -12 35v11q-48 -5 -76 -28q-2 -5 -8 -9h-4l-29 9q-12 4 -46 6q-91 0 -211 -62q-31 -19 -61 -51q-86 -108 -86 -238q-5 -20 -30 -37q-11 -10 -11 -21l3 -20q0 -13 -55 -65q-5 -10 -5 -15q0 -18 14 -18q13 0 42 27q9 6 15 6h7l5 -1q9 21 35 21q20 20 39 20h9l13 -1
q82 0 161 116q18 29 27 71q9 81 16 107q10 34 40 65l9 8v-1q-33 -45 -38 -73q-5 -14 -16 -108q-14 -66 -54 -113q-41 -45 -64 -57q-33 -22 -83 -31q-8 -4 -27 -25l-2 -51q0 -160 91 -264q17 -25 84 -95q6 -11 6 -21q0 -22 -26 -32h-4l-5 1q13 10 13 23q0 17 -27 38
q-137 134 -137 325q0 36 6 74h-1l-3 -2h-5q-8 0 -17 14q-38 -42 -62 -42q-5 0 -20 6q-22 -12 -34 -12q-17 3 -17 22v2q0 25 37 51q23 21 23 34l-1 22q0 16 28 37q9 11 9 35v22h-4q-90 0 -184 89q-64 72 -83 138q-18 52 -18 101v23q0 99 67 208q62 94 179 135q64 20 119 20z
M113 1441q0 -138 103 -252q82 -78 162 -78h4v1q-42 0 -105 39q-92 65 -120 132q-35 86 -35 152v19q0 143 142 266q84 69 240 69q70 0 124 -38q49 -24 68 -24l1 -1q7 0 7 -6t-18 -14q-16 -5 -30 -5q-82 8 -122 8h-20q-86 0 -132 -39q-39 -27 -70 -72q-44 -67 -44 -141
q0 -90 58 -130q19 -12 44 -12q74 0 161 116q30 42 86 97q72 66 157 66q76 0 151 -63v1q-25 30 -44 40q-56 32 -113 32q-113 0 -224 -155q-52 -62 -99 -98q-43 -30 -64 -30h-8q-24 3 -55 29q-39 44 -39 113q0 65 44 137q73 104 199 104h19l106 -6q61 0 97 34q-14 -4 -26 -4
q-30 0 -64 28q-80 44 -160 44h-22q-112 0 -219 -80q-55 -50 -66 -70q-74 -99 -74 -209zM1235 1724q-15 0 -48 14v-1q6 -18 28 -32q20 -11 87 -11q112 0 151 -39q26 -26 33 -43q27 -53 27 -101v-17q0 -69 -52 -130q-24 -21 -55 -21q-67 0 -145 128q-23 31 -33 31h-1
q-3 -1 -3 -6v-4q0 -16 36 -54q42 -45 68 -62q51 -45 69 -46l17 -2h1q66 0 114 104q21 53 21 104q0 83 -56 128q-16 15 -72 32q-48 11 -86 11q-16 0 -66 -6q-27 0 -57 10v3q31 0 162 51q47 14 76 14q86 0 144 -77q53 -73 53 -169q0 -123 -68 -230q-35 -44 -64 -51
q-12 0 -27 -19q-15 -33 -44 -44q-23 -7 -33 -7v-1l9 -1q133 0 206 123q47 85 47 188q0 112 -47 203q-38 64 -108 88q-37 10 -62 10h-16q-57 0 -152 -52q-37 -16 -54 -16zM132 1440v-11q0 -51 16 -67h2q4 0 9 97q8 63 18 94q17 45 47 88q18 23 18 29v1h-3q-28 -10 -69 -74
q-38 -68 -38 -157zM609 1490q1 -10 7 -10l57 38q58 30 107 30h8q42 0 102 -28h3l3 3v5q0 29 -89 51l-42 4q-57 0 -123 -48q-33 -28 -33 -45zM971 1487v-2q0 -7 14 -40q0 -27 20 -48q10 -8 18 -8h4q16 0 34 24q-4 -2 -11 -2h-2l-1 1h-1q0 -5 -20 -10h-3q-22 0 -31 33l-1 7
l1 8q-16 17 -20 37h-1zM958 1446v-12q0 -28 22 -54l10 -5q-25 29 -25 69v11zM942 1444q2 -27 14 -48q5 -6 7 -6v1q-14 27 -14 61v1zM1011 1453l-2 -12l4 -17l-1 -7q3 -9 17 -9l15 3l-12 8q0 4 -15 8q-5 4 -5 26h-1zM933 1433v-5h1v5h-1zM1036 1373v-1q7 -13 7 -30v-5l-2 -13
q7 7 7 24l-1 10h2q4 -10 4 -19v-2q0 -8 -2 -13v-1h1q6 13 6 21v1q0 15 -22 28zM798 1372l1 -5v-16q0 -46 -59 -90l-16 -14v1q33 43 33 72v3q0 12 -8 12q-26 -7 -52 -44q-17 -24 -39 -47l-22 -18h-1v1q35 37 50 78q20 40 62 40q32 0 43 15zM922 1348h2v-1q-10 -11 -23 -11
l-4 1v3q11 8 25 8zM949 1347v-2q-19 -14 -32 -14l-1 1v2q2 5 29 13h4zM943 1333q4 -1 4 -3q0 -5 -18 -9h-1l-5 1v2q0 9 20 9zM974 1308h2l2 -2v-3q-6 -3 -13 -3h-2l-3 3q0 4 14 5zM978 1291l3 -1v-1q-6 -8 -20 -8l-2 2q0 5 19 8zM879 1287q21 0 21 -6l-3 -9q18 -12 18 -23
q0 -5 -4 -7h-3q-6 0 -11 10q-16 9 -16 16l5 8v1q-53 0 -91 -28l-7 -1h-1q0 13 42 30q26 9 50 9zM982 1278l4 -1v-2q-4 -6 -10 -6h-3v3q0 3 9 6zM990 1272h3v-1q-4 -7 -19 -12l-3 1v2q0 5 19 10zM990 1260h3v-3q0 -4 -14 -8h-2q-2 0 -2 3q0 5 15 8zM1145 1254h3l-2 -2h-3z
M994 1247h4v-1q-6 -8 -16 -8h-1l-2 2q5 7 15 7zM1004 1241l1 -1v-1q-5 -7 -16 -7l-1 1v2q0 3 16 6zM798 1239q2 0 5 -18l5 -3q47 18 78 18q30 0 30 -9q12 -14 12 -29v-2q-11 16 -30 16l-3 -1q8 -8 8 -18q0 -25 -26 -34l-14 -2q-29 3 -29 22v2q0 12 10 22h-1q-47 -15 -47 -31
q3 -8 32 -29v-4h-1q-15 0 -32 20q-7 13 -14 15q-2 0 -2 5v7q0 9 9 18l-5 -1h-5v3q0 4 19 33h1zM1007 1230h1v-2h1q-8 -12 -11 -14h-1v5q2 11 10 11zM1110 1209q2 -7 14 -17q6 22 18 22v1l-15 2q-17 -2 -17 -8zM1008 1205h2v-5q0 -6 -9 -14h-5q0 6 12 19zM865 1192q3 -7 7 -7
q4 1 6 5v3q0 5 -4 7h-4q-5 -3 -5 -8zM917 1188h2q5 0 6 -30q0 -8 -13 -17l-4 -1h-2l-2 2v2q11 10 11 17v3l-1 19q1 5 3 5zM809 1173h3q15 -17 27 -22q22 -5 47 -5h11l2 -2q0 -7 -9 -7h-26q-35 0 -57 29v5zM942 1149h3l2 -2q-4 -17 -22 -34h-1q-4 1 -4 5q1 4 14 18z
M1156 1142v-1q58 -97 58 -116q1 0 3 -7h1v9q0 43 -21 96l-3 13l-12 -2h-4q-11 0 -21 8h-1zM685 1107l5 -5v-2l-7 -15l-1 -8q0 -13 24 -64l2 -8v-4l-3 -3h-2q-10 4 -28 72l-1 13q1 24 11 24zM1005 1034h4q60 0 135 -88v-1h-1q-86 76 -137 76h-5q-34 0 -61 -35
q-10 -15 -10 -33q0 -19 16 -44h-1q-25 21 -25 52q0 41 44 64q19 9 41 9zM579 970h1v-1l-1 -34v-12q0 -134 71 -188l65 -54q42 -40 59 -70q26 -45 40 -90l2 -5h-2q-32 95 -127 159q-36 23 -74 65q-40 54 -40 139v11q0 33 6 80zM1021 952q36 0 45 -55v-14q0 -12 -7 -27h-2
l2 23v8q0 36 -27 56h-2q-8 -1 -8 -7q3 -9 21 -17l1 -1v-7q-4 -6 -12 -6q-39 5 -39 24l-1 4q0 10 9 14q10 5 20 5zM432 926q5 -12 16 -12q27 26 27 29l-1 1h-1q-19 0 -41 -17v-1zM1061 934q40 -36 40 -78v-15h-1q0 25 -15 45q-4 -10 -6 -10h-3v3q0 23 -15 54v1zM398 911h2
q17 6 17 10v2q-19 -7 -19 -12zM822 920q5 -2 5 -4v-5l-9 1q-25 -16 -29 -16l-1 1v2q0 13 33 21h1zM358 890v-1l2 -2h4q17 0 32 13v1l-13 1q-18 0 -25 -12zM927 635h1l3 -5v-8l-9 -9h-1v1q1 21 6 21zM1081 630v-1q-12 -10 -34 -10q-16 0 -24 8v1q9 -4 19 -4h10q17 0 29 6z
M956 622q4 0 11 -8q14 -6 14 -10v-1q-3 -3 -23 -5l-9 -8h-6v3q11 13 18 13q-8 10 -8 14zM856 575h1v-1q-22 -23 -22 -50q0 -17 11 -34l1 -1h1v14q0 25 20 37v-1q-13 -16 -13 -40v-4q0 -19 8 -25q34 -42 42 -59q7 -6 9 -6q9 3 9 10q0 14 -33 45q-17 21 -17 38v2q0 23 29 39h1
q-20 -19 -20 -37q0 -31 52 -71q9 -10 10 -19v-5q0 -10 -14 -35l-2 -14q0 -16 20 -40v-1q-26 7 -38 22q-7 12 -7 25v10q-17 -19 -17 -36v-3q0 -26 38 -45v-2q-50 16 -50 49v6q0 25 27 52v1q0 24 -72 95q-13 15 -13 34q0 16 10 40h1v-1q-4 -15 -4 -27l3 -21h1q0 44 28 59z
M1120 567l-4 2l-1 -1q0 -8 7 -15l4 18zM1063 564q-7 -13 -7 -23v-2q0 -8 5 -12v5q0 14 11 29zM967 347q2 -18 8 -18h2v2h1l-4 25q0 28 39 64v1q-46 -23 -46 -74zM1017 365v-4l15 30q8 10 26 27q-8 0 -31 -27q-10 -18 -10 -26zM981 349q0 -23 16 -36q-7 17 -7 35q0 29 20 60
v1q-29 -23 -29 -60zM909 369q0 -27 22 -39v1q-9 8 -9 25v5q0 18 17 44q-29 -22 -29 -27zM957 383l-3 -31q0 -50 51 -78l10 -8h-2q-65 27 -65 71v12q4 34 9 34z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.0 KiB

@ -0,0 +1,14 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg viewBox="0 -410 2048 2048">
<g transform="matrix(1 0 0 -1 0 1638)">
<path fill="currentColor"
d="M841 1759q99 0 200 -71q80 -57 153 -155q66 -91 120 -200q70 -147 123 -322l32 -116h1q93 108 93 190v7q0 118 -200 202q-43 21 -43 31q0 4 11 4h1q61 0 209 -57q253 -113 253 -250q0 -68 -47 -142q-14 -25 -64 -75q-71 -63 -111 -84q-8 -7 -59 -35v-1q38 -240 38 -331
q0 -37 -19 -37h-3q-19 0 -26 20q-7 37 -14 62q-40 128 -84 234h-1q-121 -57 -353 -119q-141 -37 -311 -66q-255 -34 -356 -34q-45 0 -59 8q-33 -105 -131 -105h-5q-48 0 -74 43q-15 29 -15 60q0 46 27 257q37 231 84 384q49 161 112 288q42 84 106 173q184 237 412 237z
M104 419q0 -48 33 -80q23 -19 53 -19h3q97 0 130 107q68 207 133 358q50 116 122 216q131 174 309 174q235 0 434 -358q84 -150 156 -369q26 -79 26 -96q5 -32 27 -32h1q16 0 16 36q0 90 -40 345q-44 231 -101 397q-75 213 -158 348q-39 63 -88 123q-156 187 -320 187
q-196 0 -362 -182q-68 -79 -95 -129q-61 -93 -116 -234q-54 -132 -102 -345q-28 -130 -48 -298q-7 -56 -13 -149zM842 1696h1q128 0 256 -145q63 -73 104 -145q85 -135 178 -425q68 -225 68 -302l-1 -1h-1q-7 0 -51 103q-36 81 -69 140q-200 314 -441 314q-261 0 -439 -333
q-88 -170 -184 -469q-10 -24 -25 -42q-13 -11 -43 -11h-9q-12 0 -15 8q-8 15 -8 33q0 48 27 254q37 227 83 376q46 148 104 266q39 80 105 171q162 208 360 208zM330 433v0q29 7 223 47q367 85 566 179q95 41 192 103l26 18q-206 392 -450 392q-226 0 -378 -289
q-86 -159 -179 -450z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,12 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg viewBox="0 -410 2048 2048">
<g transform="matrix(1 0 0 -1 0 1638)">
<path fill="currentColor"
d="M865 1807h1l180 -180v-1h-157v-475l-20 -20l-19 20v475h-165zM322 1580h256v0l-111 -111l336 -336v-28h-27l-336 336l-117 -116h-1v255zM1169 1580h247v-247v0l-113 112l-340 -340h-27v28l339 340l-106 107v0zM638 1579h165v-381l-273 273zM936 1579h157q2 0 112 -111v-1
l-269 -269v381zM1304 1379l112 -113v-161h-385v1zM439 1374h1l268 -268v-1h-386v153zM1463 1218h1l175 -175l-176 -176v152h-480l-20 20l20 19h480v160zM274 1210h1v-152h481l19 -19l-19 -20h-481v-159l-175 175v1zM322 972h386v0l-272 -273l-114 114v159zM775 972h28v-27
l-340 -340l107 -107v-1h-248v249l114 -113zM936 972h27l337 -335l116 116v-256h-255v1l110 111l-335 336v27zM1031 972h385v-152l-117 -117l-268 269v0zM869 945l20 -20v-475h157l-181 -181l-180 181h165v475zM803 878v-381h-165l-108 108zM936 878l269 -269l-112 -112h-157
v381z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@ -0,0 +1,19 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg viewBox="0 -410 2048 2048">
<g transform="matrix(1 0 0 -1 0 1638)">
<path fill="currentColor"
d="M749 1747h3v-1q-41 -3 -58 -6h-3l-5 1v1zM656 1737h1v-1q-25 -12 -29 -16l18 2h7l34 -3h3l26 3v1l-25 5v1h5q30 0 30 -4q-5 -4 -35 -9q-13 -4 -13 -6l1 -1h18l47 6h6q14 0 27 -5v2l-2 11h1q86 -27 113 -39l33 -16l31 6h5q13 0 26 -7q0 -16 42 -38v1q-1 4 -20 21h-1v2h1
q39 -20 94 -68q57 -57 80 -96q25 -41 39 -82l4 -14h-2q-2 8 -11 17h-1v-1l4 -35l-2 -5q13 -31 28 -98v-4h-1q-22 83 -46 128l-10 16h-1q0 -9 -7 -9l-16 1l-2 -3v-4q4 -33 11 -33h1q3 1 3 6h3q12 -12 12 -36q10 -38 10 -46h-1q-3 2 -16 21h-2q7 -35 21 -50h1v-1q0 -2 -7 -4
l-1 -7v-4q1 -35 9 -35q5 3 10 3q-19 -54 -19 -63l-1 -10l3 -22v-1h-1l-12 35h-1v-3l1 -45q0 -11 -9 -36h-1v1q8 27 8 44v9q0 7 -3 8l-4 -4v-4q0 -39 -33 -97q-7 -20 -7 -28l1 -5h-1l-14 18q-15 -20 -18 -33l1 -18q0 -3 -9 -21h-2l4 10l-2 5q0 3 4 9v1q-2 0 -54 -50
q-100 -80 -208 -80h-20q-55 0 -127 25v-1q13 -16 39 -31q46 -17 111 -17h29v-1q-25 -9 -51 -9h-4q-91 0 -194 74q-44 38 -54 58q-2 1 -9 14h2q16 -12 51 -54q19 -18 29 -23v1q-27 25 -42 50h1q50 -51 73 -59q3 -3 16 -9l2 9v2q-1 4 -34 28q-51 42 -72 72q-47 61 -47 145v9
q0 54 9 58l20 53q11 24 25 36q5 2 15 22q60 75 155 75h2q84 0 151 -76v-2h-1q-57 49 -126 49h-9q-74 0 -141 -59q-62 -66 -62 -155v-6l1 -5q3 0 6 11h1v-11q0 -75 58 -146q47 -48 69 -56q55 -31 108 -31q37 0 75 17q0 -3 3 -3q29 5 58 33l20 16h1v-1l-14 -16v-2h2v-1
q18 4 97 79l3 11l-1 15q5 21 14 21q14 7 14 9q22 50 22 81v2h-1q-3 -10 -11 -22v1q11 35 11 75l-1 56v28q-5 0 -5 2q0 57 -41 136q-23 45 -72 95q-97 105 -265 105q-56 0 -100 -18q4 5 31 12l1 1v2h-1q-43 0 -85 -25q-29 -18 -53 -24q-4 0 -7 -5h2v-1l29 6v-1
q-10 -12 -31 -12q-32 -2 -55 -16q-14 -8 -37 -32v-1h1l18 8v-1l-9 -15l-5 1q-47 0 -152 -116l-17 -22q-10 -12 -17 -25q12 -1 12 -3l-46 -94q-5 0 -12 -87q-8 -58 -8 -102v-16q0 -52 19 -77l-4 -35l16 -31l-5 -1h-3q12 -39 24 -55q4 -6 29 -10q22 -17 32 -46q8 -16 8 -20
q-18 6 -25 19h-1v-1q6 -27 37 -69l-9 -9q6 -13 30 -33h-2l-8 3h-2v-2q0 -13 57 -87v-1h2q0 3 6 10q0 -26 37 -68h19q36 -47 58 -47v-1q-11 -14 -11 -16h1q18 -4 46 -26l29 -12l-10 19h1l41 -41q26 -25 72 -36q64 -10 89 -18v-1q-114 0 -165 20q-49 16 -90 37q-59 30 -122 83
q-68 61 -97 99q-50 63 -86 129q-83 163 -83 321l1 33l-1 37l2 96q0 16 -5 34q29 101 68 182v1l5 -3q15 0 37 61q15 32 18 32q7 0 9 14q9 23 97 102q5 3 23 22l2 -11q53 50 219 115h1l-3 -4v-2l4 -1q57 11 68 11zM138 1444h1q0 -4 2 -4l10 1l1 -3q-5 -23 -12 -23l-10 -8h-1v1
q9 10 9 36zM113 1337v-1q-5 -29 -11 -50h-1l-1 28q2 12 13 23zM948 1179h4l2 -12v-13l-2 -9h-2q-3 0 -9 20q0 7 7 14zM1207 1108q0 -20 -23 -94l-21 -46h-1v2q17 32 33 88q8 50 12 50zM935 1092q-10 -42 -29 -63q0 8 -12 9l-3 6q0 11 24 38v-2l-20 -37v-2l1 -1q21 8 21 15
q14 23 17 37h1zM839 1002v-1q-21 -20 -24 -20q-44 8 -44 15q0 2 5 2v1l17 -1h14q17 0 32 4zM542 999h1q5 -14 19 -33l6 -20q-26 40 -26 52v1zM523 966h1l45 -77h-1q-22 20 -45 56l-3 4z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

@ -0,0 +1,13 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg viewBox="0 -410 2048 2048">
<g transform="matrix(1 0 0 -1 0 1638)">
<path fill="currentColor"
d="M1063 1900h2q-71 -106 -71 -296v-25q0 -124 74 -224q76 -85 160 -85h13q51 0 88 22q40 -42 65 -81q44 -67 69 -149q23 -79 23 -121h-240v1q0 24 -26 91q-19 43 -54 83q-7 12 -43 43q-99 78 -218 78q-48 0 -106 -17q-4 27 -4 66v21q0 189 100 384q36 68 98 141
q48 51 70 68zM1237 1610h3q67 0 112 -58q26 -38 26 -77v-7q0 -78 -76 -123q-34 -15 -63 -15q-78 0 -124 73q-17 36 -17 67q0 53 38 96q44 44 101 44zM573 1372h1l119 -207v-2q-31 -22 -68 -70q-64 -93 -64 -200q0 -132 96 -238l36 -33l-120 -207q-30 16 -101 88
q-93 108 -125 223q56 33 84 111q8 34 8 57q0 88 -73 153l-19 14q21 65 46 111q23 44 75 107q65 68 98 88zM237 1033h4q67 0 112 -58q26 -37 26 -79v-5q0 -67 -60 -113q-38 -25 -80 -25q-70 0 -117 63q-22 37 -22 70v16q0 52 50 100q42 31 87 31zM1246 845h240
q-7 -74 -27 -136q-24 -66 -53 -115q-26 -45 -75 -99l-1 -1h-1q-43 22 -93 22q-72 0 -134 -54q-39 -40 -50 -75q-13 -41 -13 -61q-65 -15 -127 -15h-13q-124 0 -242 55v1l119 207q66 -25 129 -25q158 0 270 130q36 50 51 88q20 60 20 78zM1230 456h15q59 0 106 -55
q27 -40 27 -81v-9q0 -45 -35 -88q-46 -46 -99 -46h-11q-57 0 -103 51q-31 41 -31 82v13q0 57 52 103q41 30 79 30z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -0,0 +1,12 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg viewBox="0 -410 2048 2048">
<g transform="matrix(1 0 0 -1 0 1638)">
<path fill="currentColor"
d="M724 1696h72q240 0 452 -212q172 -195 172 -440v-12q0 -357 -336 -572q-161 -80 -288 -80h-556q-92 0 -132 104q-8 16 -8 44v500q0 381 340 588q153 80 284 80zM636 1224v-148h-148q-235 0 -316 -244l-8 -72q0 -207 212 -300q50 -16 84 -16h44q146 0 252 156
q44 67 44 192v124h152q234 0 312 248l8 68q0 198 -204 296q-58 20 -112 20h-4q-193 0 -288 -188q-28 -59 -28 -136zM1068 1508h4q184 -100 184 -276q0 -179 -184 -276q-62 -24 -108 -24q32 33 32 64q-10 60 -36 60v4q120 0 164 140v40q0 94 -96 144l36 20q24 25 24 56
q0 22 -20 48zM952 1388q156 -28 156 -152v-8q0 -112 -132 -152h-164l-12 12v160q0 72 92 124zM472 1060q-32 -32 -32 -64q0 -35 32 -64q-108 0 -156 -128l-4 -32v-36q0 -79 100 -132v-4q-64 -7 -64 -64v-12l16 -40h-4q-180 98 -180 280q0 169 180 272q76 24 112 24zM624 916
l12 -12v-148q0 -117 -140 -152h-16q-110 0 -152 128v36q0 106 132 148h164zM1232 540h36v-12h-12v-36h-12v36h-12v12zM1272 540h12l4 -20h8l4 20h12v-48h-8v16h-4l-4 -16h-8v8h-4v-8h-12v48z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@ -0,0 +1,13 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg viewBox="0 -410 2048 2048">
<g transform="matrix(1 0 0 -1 0 1638)">
<path fill="currentColor"
d="M721 1783h18q131 0 337 -104q105 -54 227 -144q64 -48 153 -131q84 -90 112 -135q62 -96 62 -151q0 -80 -137 -221q-69 -68 -114 -104q-103 -86 -216 -163q-152 -98 -255 -152q-115 -62 -259 -117q-187 -68 -311 -68q-98 0 -161 43q-28 20 -47 48q-30 53 -30 94v14
q0 98 125 243q75 80 128 124q111 95 194 155q16 12 18 15q-125 57 -243 118q-198 108 -198 165v6q0 61 89 182q25 33 87 95l19 17q128 109 254 147q82 24 148 24zM196 1329v-1q0 -16 24 -40q24 -20 122 -74l246 -132q35 -18 47 -29q7 -7 7 -18q0 -31 -84 -94
q-94 -76 -158 -134q-26 -21 -97 -94q-72 -82 -103 -133q-25 -31 -25 -66v-4q0 -57 49 -94q38 -23 65 -33q38 -12 86 -12q57 0 134 23q95 27 182 63q117 51 261 136q180 107 338 228q61 47 148 129q112 109 119 143q4 12 4 23v5q0 29 -64 113q-36 43 -118 125
q-94 87 -153 128q-125 93 -242 152q-57 29 -128 53q-77 24 -157 24h-3q-35 0 -130 -32q-111 -43 -222 -142q-64 -64 -85 -94q-52 -64 -63 -119zM821 1466q44 0 107 -42q57 -44 74 -88q10 -24 10 -43v-3q0 -65 -65 -108q-32 -16 -62 -16h-2q-54 0 -125 49q-87 69 -87 137
q0 67 93 104q33 10 57 10zM756 1313v-7q0 -34 48 -72q36 -23 69 -23q43 0 69 42q4 11 4 18v6q0 38 -56 76q-35 18 -60 18h-5q-35 0 -58 -28q-11 -14 -11 -30z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1,53 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg viewBox="0 -410 2048 2048">
<g transform="matrix(1 0 0 -1 0 1638)">
<path fill="currentColor"
d="M895 1857v-3l-20 -2v3l2 2h5h13zM913 1858h19v-3h-19v3zM950 1858l20 -1v-3l-20 1v3zM988 1857l20 -1v-4l-20 1v4zM857 1855v-4l-19 -3l-1 4zM1026 1854l19 -3v-3q-20 1 -20 3v1l1 1v1zM820 1850v-3l-20 -3v4h1zM1063 1848l19 -2v-4q-20 3 -20 4zM783 1844v-4l-19 -3
l-1 1v2zM1100 1842l19 -3v-5l-20 5zM746 1836v-4l-19 -4l-1 3zM1137 1834q19 -5 19 -6l-1 -3l-19 4v3l1 1v1zM709 1826h1v-4l-19 -4v2h-1l1 1zM1175 1823q17 -4 17 -6l-1 -3l-19 6v1q0 2 3 2zM674 1814l1 -3l-19 -6l-1 1v2q0 2 19 7v-1zM1208 1811l19 -5v-3l-1 -1v0l-18 6v3
zM638 1802h1v-2q0 -2 -18 -8v0l-1 3h1zM1244 1799l18 -7v-2q0 -2 -2 -2q-13 4 -17 8v1l1 1v1zM604 1788v-1v-2q0 -2 -18 -9v1v3zM1280 1783q17 -7 17 -9l-2 -2l-17 9zM570 1771l1 -3h-1q-13 -8 -17 -8l-1 1v3l18 8v-1zM1313 1767q17 -8 17 -10v-1l-2 -1l-17 9zM537 1754
l1 -1v-3l-17 -9l-1 1v2q9 8 17 10zM1345 1749h1q17 -9 17 -11v-1h-1v-1q-16 8 -17 10v3zM504 1735l1 -1v-2l-16 -11l-2 4zM1379 1729q16 -10 16 -11l-3 -2q-14 8 -15 11v1zM474 1714l1 -3l-16 -11h-2v2l-1 1l1 1q13 10 17 10zM1410 1708q14 -8 16 -12l-3 -2q-15 10 -15 12
t2 2zM442 1692l2 -2q-14 -12 -16 -12l-1 1v2zM1439 1686l17 -12v-1l-3 -2l-15 11zM412 1669l2 -2v-1l-14 -12h-1l-1 3zM1469 1662q3 0 15 -13v-1l-2 -2l-15 13v1zM384 1644l2 -2q-7 -9 -14 -14l-2 3zM1497 1636h1l14 -13q-2 0 -2 -3h-20v4h15l-10 10v1zM941 1628
q53 0 121 -35q22 -14 38 -32q32 -38 40 -79q10 -73 17 -246q4 -53 12 -80q8 -32 45 -76q85 47 188 131q106 90 179 119q14 6 31 9q14 0 23 -21h4v-31l-1 -4l1 -6v-16h-3l-1 1h-1q-2 -23 -39 -80q-42 -65 -75 -123h14q136 0 218 -16q9 0 16 -29v-7q0 -21 -32 -40
q-39 -29 -97 -63v-19h-4v16h-1q-30 -19 -67 -32q-46 -20 -97 -52q-111 -75 -150 -181q-8 -24 -13 -73q-13 -49 -27 -76q-9 -17 -25 -40q191 -19 191 -42q0 -6 -13 -18l2 -2l-16 -11l-2 2l5 6q-17 -9 -69 -25q-12 -9 -30 -33q-14 -10 -28 -10l8 -6l1 1h3q0 -4 26 -23
q15 -13 17 -18v-7q-16 -23 -61 -23q-21 0 -53 12h-2q-19 0 -33 -6l-5 -1q-10 0 -33 6l-13 -3l-2 1v2l7 1v1h-2q-21 -4 -44 -10h-1q-9 0 -40 11h-4l-44 -13h-8q-37 10 -37 26q0 10 36 35q55 43 55 62q0 18 -116 22h-10q-132 -14 -132 -31q2 -7 33 -30q56 -36 56 -53
q0 -14 -34 -16h-9q-18 0 -40 2q-5 0 -24 -18l-7 -1q0 -3 17 -4h10v-4h-16l-19 4l1 1v3l-55 18l-6 -2q1 -3 7 -3v-4l-16 3q-19 -6 -29 -7q-8 0 -31 18l-3 1l-46 -20l-7 -1q-59 0 -59 18v2q0 14 30 39l6 4v2q-3 0 -5 3l1 3l9 -3l6 5v1q-2 0 -19 21q-18 15 -43 15q-27 8 -42 16
v-1l10 -7l-1 -3h-1q-16 10 -16 12l1 2q-1 0 -15 9l-1 -1v-1q-9 6 -16 13l3 3q-8 6 -8 14v5q0 13 117 25l75 6q-32 61 -71 176q-18 67 -27 86q-12 23 -48 60q-86 75 -203 120q-75 33 -135 75q-37 31 -38 50v8q0 11 16 24q36 19 106 19h23v19h4v-19h1q37 0 94 -7
q-68 93 -90 171q-2 5 -6 23h-3v9l-2 37q0 23 3 27l-1 5v17h4v-12h1q5 13 21 13h1q42 0 192 -127q66 -53 115 -84q50 -32 79 -43q60 65 60 138v4l-3 120v27q0 168 106 223q56 27 120 27zM249 1624h20v-4h-20v4zM287 1624h19v-4h-19v4zM324 1624h20v-4h-20v4zM362 1624h20v-4
h-20v4zM400 1624h19v-4h-19v4zM437 1624h19v-4h-19v4zM475 1624h19v-4h-19v4zM512 1624h19v-4h-19v4zM549 1624h20v-4h-20v4zM587 1624h20v-4h-20v4zM625 1624h19v-4h-19v4zM662 1624h20v-4h-20v4zM700 1624h20v-4h-20v4zM738 1624h19v-4h-19v4zM775 1624h20v-4h-20v4z
M813 1624h20v-4h-20v4zM851 1624h19v-4h-19v4zM1001 1624h20v-4h-20v4zM1039 1624h19v-4h-19v4zM1077 1624h18v-4h-18v4zM1114 1624h19v-4h-19v4zM1151 1624h20v-4h-20v4zM1189 1624h19v-4h-19v4zM1226 1624h20v-4h-20v4zM1264 1624h20v-4h-20v4zM1302 1624h19v-4h-19v4z
M1339 1624h20v-4h-20v4zM1377 1624h20v-4h-20v4zM1415 1624h19v-4h-19v4zM1452 1624h20v-4h-20v4zM1528 1624h19v-4h-19v4zM1565 1624h20v-4h-20v4zM1603 1624h20v-4h-20v4zM1635 1619h4v-20h-4v20zM357 1618l2 -2l-14 -14l-2 3zM1524 1610q14 -12 14 -14l-3 -2l-14 14z
M245 1606h4v-20h-4v20zM331 1591l2 -2l-13 -15l-2 3zM1000 1570q0 -16 35 -32q27 -25 42 -55q14 -29 25 -70q4 -16 9 -16h4q8 0 15 13q-11 97 -18 97q-16 26 -60 58q-24 18 -29 18h-3q-19 -2 -19 -11zM1550 1583l13 -15l-3 -2q-4 4 -12 14zM1635 1581h4v-20h-4v20zM245 1568
h4v-20h-4v20zM306 1562l2 -1q-2 -6 -12 -16l-2 2v1zM1575 1554l11 -15l-1 -2h-1q-12 12 -12 16zM1635 1543h4v-19h-4v19zM282 1533h1l2 -2q-9 -15 -12 -16l-2 3zM245 1530h4v-19h-4v19zM1597 1524h1l11 -16l-3 -2l-11 16zM1635 1506h4v-19h-4v19zM260 1503l3 -3
q-10 -13 -10 -15h-1l-2 2v0zM1619 1494l11 -16l-2 -2h-1q-3 1 -11 15zM245 1493h4v-20h-4v20zM812 1387q0 -20 8 -48l18 1q-5 18 -5 36q0 49 31 68l9 2h6q22 0 36 -42l3 -23v-3l1 1h6l15 -1v15q0 44 -28 77q-17 17 -36 17q-41 0 -60 -66q-4 -21 -4 -34zM941 1383l1 -5h8
l12 -2v1q0 45 31 67l9 2h6q21 0 35 -39q4 -15 5 -31q-2 -27 -7 -37h7h12q3 0 7 18q2 12 2 26v12q0 50 -36 83q-13 9 -28 9q-42 0 -61 -70zM239 1471h1l3 -3l-10 -16l-3 1q0 3 9 18zM1635 1468h4v-3l10 -20v-1h-2l-1 -1l-1 1q-4 10 -6 10v-5h-4v19zM245 1455h4v-20h-4v20z
M220 1439l4 -2q-8 -16 -10 -17l-3 2zM1635 1431h4v-19h-4v19zM1659 1429l8 -17l-1 -1h-2q-2 0 -9 17l1 1h3zM245 1417h4v-19h-4v19zM203 1405l3 -1l-8 -18h-2l-1 1h-1zM1672 1395h4l7 -18h-2l-1 -1l-1 1l-7 17v1zM1635 1394h4v-20h-4v20zM245 1380h4v-20h-4v20zM188 1371
l1 -2l-7 -18l-3 2q4 14 9 18zM811 1324v-1q67 -40 133 -40q67 0 123 42v1l-5 4h-2q-49 0 -81 27q-9 6 -41 12l-8 1q-11 0 -35 -18q-49 -23 -62 -23t-22 -5zM1691 1361q6 -13 6 -18l-2 -1l-8 19h2l1 1zM1635 1356h4v-20h-4v20zM914 1343h4q2 0 4 -11q-2 -10 -5 -11
q-6 0 -6 13zM956 1343h3q3 0 4 -7v-6q0 -7 -5 -9q-4 0 -5 9v6q1 6 3 7zM171 1336h4q0 -4 -6 -19h-2l-1 1h-1zM1705 1327q6 -15 6 -19h-2l-1 -1l-1 1l-6 18zM810 1314v-1q42 -34 106 -65l18 -6q27 4 121 60l4 4q-59 -31 -120 -31q-66 0 -129 39zM159 1301h1l2 -2l-5 -18h-2
l-2 2zM935 1228q-14 0 -82 35l-32 21h-3q-2 0 -3 -25q-9 -59 -18 -80q0 -7 -22 -45q-11 -26 -22 -87q-7 -67 -11 -67q-26 -72 -55 -123q-21 -38 -21 -120q0 -81 18 -176q15 -43 82 -77q59 -28 172 -28l27 -1q173 0 213 85q33 69 33 164q0 92 -35 151q-22 47 -43 114
q-5 5 -30 101q-31 121 -31 130l-2 53v43q-53 -46 -135 -68zM1717 1292l6 -20h-4l-4 19zM149 1265h1l1 -2q-4 -18 -6 -18l-3 1q5 19 7 19zM1728 1256l5 -20h-4l-4 19zM1635 1243h4v-20h-4v20zM245 1229h4v-20h-4v20zM139 1228h3l-4 -19h-4v0q2 13 5 19zM1734 1219h3l4 -19
l-1 -1h-3zM1635 1205h4v-19h-4v19zM132 1191h2l-3 -19h-4q3 19 5 19zM245 1191h4v-19h-4v19zM1741 1181h2q2 0 5 -18l-1 -1h-2q-2 0 -4 19zM1635 1168h4v-20h-4v20zM125 1154h3l-3 -19h-3q1 19 3 19zM245 1154h4v-19h-4v19zM1747 1144h4l1 -19h-3zM1635 1130h4v-20h-4v20z
M120 1117h3l-1 -20h-4zM245 1117h4v-20h-4v20zM1751 1107h3l1 -16v-3l-3 -1v2zM1635 1092h4v-19h-4v19zM117 1080h2q2 0 2 -3l-1 -17h-4zM1752 1070h4l1 -5v-15h-4v13zM1363 1020l1 -3q0 -22 -12 -22q-5 -3 -5 -9l2 -10h4q40 0 49 13q0 8 116 10h8q120 0 171 -8v-1
q-7 -8 -7 -14v-1l3 -3h4q18 2 48 26l3 8v0q0 11 -29 18zM519 985q0 -48 62 -76l8 -1q13 3 13 22v1l-5 33q0 15 16 29h-34q-4 0 -36 23q-7 4 -13 4q-8 0 -11 -35zM158 997q0 -19 104 -71q29 -18 151 -84q32 -18 96 -67q19 -14 59 -56q7 -5 12 -5h1q5 2 5 9v13q-30 44 -84 100
q-52 44 -103 75q-63 38 -100 46q-51 15 -86 56h-12q-43 0 -43 -16zM854 987q118 0 195 -10v-1h-2q-113 0 -286 -16h-1q-12 0 -12 5q0 9 37 22h69zM119 967h4l1 -20h-3zM1750 963h3l-1 -20h-2l-1 1h-1zM754 932q9 0 9 -19v-17q0 -34 -22 -186v-10q0 -81 96 -158
q40 -27 91 -54q8 -4 8 -6q0 -3 -15 -4q-75 0 -142 36q-29 14 -49 57q-30 77 -30 163q0 64 54 198zM123 929h4l3 -19l-4 -1zM1747 926h3l-3 -20h-4v1q1 19 4 19zM129 892h3q2 0 4 -19h-1l-3 -1v1zM245 891h4v-20h-4v20zM1740 889h2l1 -2l-3 -18h-4zM1286 751v-2q0 -21 14 -21
h4q23 0 60 55q31 37 57 56l43 28v1q-24 8 -41 8h-12q-53 0 -101 -62q-24 -37 -24 -63zM1635 867h4v-19h-4v19zM141 855l4 -19h-4l-4 19h1l3 1v-1zM245 853h4v-19h-4v19zM1732 852h3v-1l-3 -19h-2q-2 0 -2 3zM1635 830h4v-20h-4v20zM146 819h4l5 -19h-4zM245 816h4v-20h-4v20
zM1724 816l2 -2q-4 -18 -6 -18l-3 1q5 18 7 19zM1635 792h4v-20h-4v20zM160 783l7 -18l-1 -1h-2q-3 0 -7 19h1h2zM1713 780h1l1 -2l-7 -18l-2 1q5 19 7 19zM245 778h4v-20h-4v20zM1635 754h4v-19h-4v19zM173 747l6 -18v-1h-3l-7 18l1 1h3zM1700 745l3 -2l-8 -18l-3 1
q6 19 8 19zM245 740h4v-19h-4v19zM1635 717h4v-20h-4v20zM188 713l7 -18l-1 -1h-2q-3 0 -8 18l1 1h3zM1686 709h1v0h1q-6 -16 -9 -18l-2 1q7 17 9 17zM245 703h4v-20h-4v20zM202 679q2 0 9 -18h-2l-1 -1l-1 1l-8 17l1 1h2zM1635 679h4v-20h-4v20zM1669 675h1l2 -2
q-7 -15 -10 -17l-2 3q8 16 9 16zM245 665h4v-20h-4v20zM219 645q3 0 10 -17l-1 -1h-3l-9 18h1h2zM1651 643l4 -2q-8 -16 -11 -17q-2 0 -2 2zM1635 641h4v-19h-4v19zM245 627h4v-19h-4v19zM239 614l10 -17l-4 -2l-10 16zM1632 610l3 -1q0 -3 -10 -18l-2 1q0 3 9 18zM1635 604
h4v-20h-4v20zM245 590h4v-19h-4v19zM259 582l11 -17h-1l-3 -1q-10 14 -10 17zM1612 579l3 -2q-9 -15 -11 -16h-3v1zM1635 566h4v-20h-4v20zM245 552h4v-19h-4v19zM281 552l11 -17l-2 -1l-12 15v2zM1590 548l3 -1v-2l-11 -15l-4 3zM1635 528h4v-19h-4v19zM303 522l13 -15
l-3 -2l-13 15zM1567 518l2 -2v-1l-12 -14l-2 3q8 11 12 14zM245 515h4v-19h-4v19zM327 493q9 -7 14 -15l-3 -1l-13 14zM1635 491h4v-20h-4v20zM1543 490l2 -3q-6 -9 -14 -14l-1 3q9 11 13 14zM245 478h4v-20h-4v20zM354 466l13 -14l-3 -2l-13 13zM1516 462h1l2 -2v-1
q-8 -9 -14 -12l-2 2v1zM1635 453h4v-20h-4v20zM245 440h4v-20h-4v20zM380 440l14 -13v-1l-2 -2v0l-14 13v1zM1247 438q-31 -34 -48 -42l-10 -6q0 -21 19 -28q26 -9 69 -37q28 5 36 14l9 9l-22 30v1l67 -11h9q20 0 48 22l4 9v1q0 16 -78 22q-51 7 -91 7q-4 0 -12 9zM1490 437
h1l1 -4l-14 -11h-1l-2 1zM617 427q-61 0 -146 -14q-21 -5 -21 -18q4 -10 23 -19q21 -10 30 -10l14 1v0h-5q0 2 55 18l-17 -33q23 -27 46 -27q18 13 72 45l7 8v3q-2 9 -30 27q-17 15 -18 23h-1q-3 -4 -9 -4zM1635 415h4v-19h-4v19zM408 414h1l14 -10v-2l-2 -2h-1l-14 13z
M1461 412h1l2 -2v-2l-15 -11h-2v3zM684 403q4 -14 4 -23v-6q0 -12 -17 -17q-75 -43 -116 -76q-11 -11 -11 -17q0 -13 27 -13h11q29 0 40 20l32 38h1v-1l1 -40l1 -3h-3v0q23 -9 33 -9h3q15 0 15 8q13 35 15 36l29 -50q6 -3 14 -3h6q10 0 26 13l-18 34v2h1q54 -35 61 -37
l25 -3q17 1 17 10v4q0 9 -17 15q-37 23 -69 54q-5 8 -5 16q0 12 17 26h1v1h-10q-69 0 -114 21zM1075 382h-11q17 -17 17 -27v-2q0 -22 -85 -73q-6 -3 -6 -11v-1q0 -12 18 -12q11 0 45 9q14 19 33 38v0v-1q-8 -31 -8 -38v-1q0 -12 26 -16h3q14 0 29 13l-6 38l36 -39l16 -3
q13 0 30 7v1q-3 0 -3 3l-1 35q51 -46 54 -46q13 -5 27 -5h13q22 0 24 13v1q-1 13 -52 46q-48 31 -89 53l-3 10v5q0 10 5 23q-44 -20 -112 -20zM245 402h4v-19h-4v19zM1635 378h4v-20h-4v20zM1402 367l2 -3l-15 -11h-1l-2 2q2 3 16 12zM245 365h4v-20h-4v20zM499 348h1l15 -9
v-2l-2 -2l-16 9v2zM1372 345l1 -3q-15 -9 -18 -9l-1 1v1q0 3 18 11v-1zM1635 340h4v-19h-4v19zM531 329l17 -10v-1l-2 -2l-16 10v1zM245 327h4v-20h-4v20zM1339 327l1 -1v-2q0 -3 -17 -10l-1 1v2q1 2 17 10zM1635 302h4v-18h-4v18zM245 289h4v-19h-4v19zM1635 265h4v-19h-4
v19zM245 252h4v-20h-4v20zM739 245h1q19 -4 19 -6l-1 -2l-19 4v4zM1131 243l1 -3h-1l-19 -3v3l19 4v-1zM1095 233h17v-4h-20v3l-17 -3v4l20 3v-3zM264 233h20v-4h-20v4zM302 233h20v-4h-20v4zM339 233h20v-4h-20v4zM377 233h20v-4h-20v4zM415 233h20v-4h-20v4zM452 233h20
v-4h-20v4zM490 233h20v-4h-20v4zM528 233h20v-4h-20v4zM565 233h20v-4h-20v4zM603 233h20v-4h-20v4zM641 233h19v-4h-19v4zM678 233h19v-4h-19v4zM716 233h19v-4h-19v4zM753 233h20v-4h-20v4zM828 233h20v-4h-20v4zM866 233h20v-4h-20v4zM903 233h20v-4h-20v4zM941 233h20
v-4h-20v4zM979 233h20v-4h-20v4zM1016 233h20v-4h-20v4zM1054 233h20v-4h-17l1 -1v-2h-1l-19 -2v4h1q15 0 15 3v2zM1129 233h20v-4h-20v4zM1167 233h20v-4h-20v4zM1205 233h20v-4h-20v4zM1242 233h20v-4h-20v4zM1280 233h19v-4h-19v4zM1317 233h20v-4h-20v4zM1354 233h20v-4
h-20v4zM1392 233h20v-4h-20v4zM1430 233h20v-4h-20v4zM1467 233h20v-4h-20v4zM1505 233h20v-4h-20v4zM1543 233h20v-4h-20v4zM1580 233h20v-4h-20v4zM1618 233h20v-4h-20v4zM813 230q20 -2 20 -3l-1 -3l-19 3v3zM850 226l20 -2v-4h-1l-19 2v4zM1020 225v-4l-18 -1l-1 -1
l-1 4l3 1zM888 222h8l11 -1v-3l-11 1h-8v3zM981 222h2v-3h-1l-19 -1v3zM925 221h20v-3h-20v3z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,13 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg viewBox="0 -410 2048 2048">
<g transform="matrix(1 0 0 -1 0 1638)">
<path fill="currentColor"
d="M801 1427h69q165 0 366 -64v1l1 9v38l3 3q148 -24 238 -53q63 -21 90 -42q28 -21 61 -123q11 -39 11 -46q-68 -51 -131 -51q-83 0 -231 96v-1q22 -53 27 -60q140 -68 195 -68q51 0 128 39l5 1l1 -1v-4q0 -17 -16 -46q-20 -17 -86 -43q-88 -26 -175 -26l-130 11h-8
q-68 0 -68 -72q0 -63 62 -152v-4q-4 0 -58 25q-72 32 -74 38q-63 73 -89 97q-63 50 -133 50q-85 0 -113 -61q-10 -31 -10 -65q0 -21 5 -61h-1l-76 36q-23 11 -23 13q-8 37 -19 63q-17 42 -62 90q-75 72 -169 72h-11q-103 0 -157 -88q-21 -34 -21 -76q0 -87 78 -142
q43 -24 92 -24q83 0 107 67q5 15 5 31q0 53 -51 88q-23 11 -48 11q-35 0 -50 -29l-2 -13q0 -24 26 -32l4 -1q6 0 29 6h7q13 0 23 -10q10 -11 10 -25q0 -36 -66 -43h-7q-45 0 -83 46q-17 30 -17 58v1q0 77 84 111q29 7 48 7q84 0 143 -76q31 -49 31 -101v-5q0 -75 -65 -135
q-57 -43 -132 -43h-5q-126 0 -211 102q-40 58 -47 108q-5 20 -5 48q0 162 167 311q61 49 105 74q83 50 163 81q142 54 266 54zM1385 1231q0 -53 55 -84q20 -7 35 -7h2q57 0 85 59q5 16 6 32q0 53 -55 84q-20 7 -35 7h-2q-57 0 -85 -59q-6 -20 -6 -32zM1476 1296h1
q39 0 58 -37q6 -12 6 -27v-1q0 -46 -49 -62l-16 -2q-38 0 -58 38q-6 15 -6 27q0 38 37 58q12 6 27 6zM1462 1246v-3q0 -13 28 -17q27 4 27 18q-4 19 -27 19h-1q-27 -3 -27 -17z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1,15 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg viewBox="0 -410 2048 2048">
<g transform="matrix(1 0 0 -1 0 1638)">
<path fill="currentColor"
d="M713 1603h28q165 0 327 -99q43 -28 95 -76q70 -72 90 -110q20 -28 40 -70q62 -129 62 -272q0 -205 -124 -375h-1q-8 8 -24 8l-1 1h-1l-40 -1h-20q-18 4 -33 4h-17q-22 0 -40 -4q6 -10 6 -19v-2q0 -15 -56 -33q-15 -7 -43 -35q-8 -16 -37 -35q-23 -11 -33 -11h-5
q-6 0 -8 6q0 8 11 19q25 32 75 103q30 30 30 70q4 24 17 74l1 7q0 4 -9 5q-23 -12 -44 -12h-5q-20 0 -51 9h-27q-16 -7 -28 -9l-33 11l-22 1q-39 -8 -78 -8h-23q-57 0 -85 40q-52 62 -65 62h-8q-15 -12 -20 -12q-10 0 -38 43q-27 40 -68 40q-44 -16 -44 -56q0 -24 23 -47
q12 -14 18 -27q17 -18 31 -24q7 -9 7 -16v-2q-3 -16 -14 -16q-49 0 -72 40q-22 31 -57 31h-10l-52 -3h-12l-62 2l3 -32v-3q-7 -12 -18 -12q-15 5 -15 13q-34 92 -34 187v32q0 163 97 323q28 46 90 111q72 66 133 100q148 79 293 79zM731 1470h-6q-25 0 -125 15
q-46 0 -85 -32q-16 -17 -26 -48q-29 -102 -29 -133q0 -65 91 -92q21 -9 129 -39q52 -18 65 -34q5 -8 9 -42q4 -14 30 -42l-20 -1q-28 0 -67 16q-130 43 -212 92q-17 12 -38 34q-7 9 -7 23q0 21 15 52h-1l-81 2q-44 -3 -80 -10q-23 -9 -52 -33q-16 -17 -16 -38v-1
q0 -121 356 -294q78 -38 162 -58q87 -19 183 -19q134 0 209 47q26 13 68 53q48 53 48 105v10q0 55 -51 86q-29 21 -82 44l-33 12h-1q-4 -27 -24 -57l-10 -8l-1 3l14 57l1 21q0 63 -47 163l-8 23q-10 34 -36 77q-49 62 -149 62q-63 -3 -63 -10q-15 -6 -30 -6zM849 1443h2
q48 0 63 -29v-1q-11 -23 -51 -23h-23v1q23 11 23 25q0 18 -50 21q0 2 -10 2v1q23 3 46 3zM551 1368q9 -19 36 -29q19 -4 45 -4h8l31 4h1q29 0 47 -18q-15 -10 -63 -10q-41 -5 -58 -17q-10 -9 -10 -13q-32 10 -46 33q-9 16 -9 28q0 20 18 26zM853 675q7 0 10 -16
q0 -21 -27 -29l-17 -1q-9 0 -32 10q-31 5 -31 13v3q0 13 17 18h8q6 0 33 -15l10 -1q11 0 24 17z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -0,0 +1,11 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg viewBox="0 -410 2048 2048">
<g transform="matrix(1 0 0 -1 0 1638)">
<path fill="currentColor"
d="M888 1633q67 0 85 -7q166 -42 218 -66q49 -25 49 -66v-6q0 -48 -67 -73q-36 -15 -119 -37q-94 -28 -126 -28l-63 -1h-392q-47 0 -47 -5q-8 -6 -16 -20q-12 -15 -12 -37l-1 -47v-404q0 -66 5 -71q20 -36 33 -36l22 -2h400q105 0 119 -8q132 -34 194 -56q31 -13 50 -28
q20 -21 20 -47v-6q0 -48 -68 -73q-40 -17 -146 -45q-69 -20 -101 -20l-72 -1h-487q-103 0 -105 6q-36 15 -74 40q-25 19 -44 44q-41 69 -41 87q-2 18 -2 62v713q0 66 6 77q16 40 44 80q26 30 44 40q22 15 63 33q10 8 63 8h568zM582 1225h9q67 0 467 -91q79 -20 148 -41
q67 -22 67 -45q1 0 1 -9h1q0 -17 -13 -29q-19 -17 -112 -44q-225 -58 -489 -107q-54 -8 -76 -8q-26 0 -32 13q-14 19 -14 59v2q0 35 15 39q9 6 33 15q30 14 37 28q10 12 10 32q0 40 -51 59q-32 14 -36 19q-8 7 -8 33v2q0 47 19 66q7 7 24 7z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 986 B

@ -308,3 +308,32 @@ for i in (1..9) {
line-height: 1.5;
border-radius: 3px;
}
.dropdown-fixedwidth {
width:110px;
max-width:110px;
height: 26px;
}
.dropdown-fixedwidth>:first-child {
display: block;
left: 5px;
width: calc(100% - 12px);
text-align: left;
overflow: hidden;
}
.dropdown-fixedwidth .caret {
display: block;
position: absolute;
right: 5px;
top: 11px;
}
.dropdown-select {
max-height: 40vh;
overflow-y: auto;
}
.dropdown-fixedwidth:disabled {
background-color: #eee !important;
}

@ -32,6 +32,7 @@ All rights reserved.
<script type="text/javascript" src="js/cssparser.js"></script><script type="text/javascript">$cssParser = parser;</script>
<script type="text/javascript" src="js/color.js"></script>
<script type="text/javascript" src="js/jsonl.min.js"></script>
<script type="text/javascript" src="js/html2canvas.min.js"></script>
<script type="text/javascript" src="extensions.js"></script>
<script type="text/javascript" src="render.js"></script>
<script type="text/javascript" src="serial.js"></script>
@ -83,6 +84,8 @@ Nav Bar / Header
<a class="dropdown-toggle" dropdown-toggle><i class="fa fa-th"></i> Color Swatches <b class="caret"></b></a>
<ul class="dropdown-menu">
<li ng-repeat="pal in palettes"><a ng-click="loadPalette(pal)" href="#">{{pal.name}}</a></li>
<li class="divider"></li>
<li><a ng-click="makePaletteFromKeys()" href="#">Current key colors</a></li>
</ul>
</li>
@ -176,8 +179,14 @@ Nav Bar / Header
<i class="fa fa-save"></i> Save
</button>
</div>
<div class="btn-group pull-right" style="margin-right: 4px;">
<button type="button" class="btn btn-success" ng-click="downloadSvg()"><i class="fa fa-download"></i> Download SVG (experimental)</button>
<div class="btn-group pull-right" style="margin-right: 4px;" dropdown>
<button type="button" class="btn btn-success dropdown-toggle" dropdown-toggle><i class="fa fa-download"></i> Download <span class="caret"></span></button>
<ul class="dropdown-menu" role="menu">
<li><a ng-click="downloadSvg()">Download SVG (Experimental)</a></li>
<li><a ng-click="downloadPng()">Download PNG (Experimental)</a></li>
<li class="divider"></li>
<li><a ng-click="downloadJson()">Download JSON</a></li>
</ul>
</div>
@ -464,6 +473,53 @@ Nav Bar / Header
</div>
</div>
<!-- Keyswitch options-->
<div class="form-group form-group-sm">
<label class="control-label col-md-3 col-lg-3 text-nowrap" for="switcheditor">Switch:</label>
<div class="form-inline form-outdent col-md-9 col-lg-9">
<!-- Keyswitch mount style-->
<div class="hint--bottom hint--rounded" data-hint="Specify the mount style of switch for this key.">
<div class="btn-group btn-group-sm-form dropup" dropdown>
<button id="switcheditor" type="button" class="btn btn-default dropdown-toggle dropdown-fixedwidth" ng-disabled="selectedKeys.length<1 || multi.decal" dropdown-toggle>
<div>{{(multi.sm || meta.switchMount) ? switches[multi.sm || meta.switchMount].name : 'Mount N/A'}}</div>
<b class="caret"></b>
</button>
<ul class="dropdown-menu dropdown-select" role="menu">
<li ng-repeat="(k,v) in switches"><a ng-click="setMulti('sm',k)">{{v.name + (meta.switchMount===k ? ' (default)' : '')}}</a></li>
</ul>
</div>
</div>
<!-- Keyswitch brand-->
<div class="hint--bottom hint--rounded" data-hint="Specify the brand of key switch for this key.">
<div class="btn-group btn-group-sm-form dropup" dropdown>
<button type="button" class="btn btn-default dropdown-toggle dropdown-fixedwidth" dropdown-toggle ng-disabled="selectedKeys.length<1 || !(multi.sm || meta.switchMount) || multi.decal">
<div>{{(multi.sb || meta.switchBrand) ? switches[multi.sm || meta.switchMount].brands[multi.sb || meta.switchBrand].name : 'Brand N/A'}}</div>
<b class="caret"></b>
</button>
<ul class="dropdown-menu dropdown-select" role="menu">
<li ng-repeat="(k,v) in switches[multi.sm || meta.switchMount].brands"><a ng-click="setMulti('sb',k)">{{v.name + (meta.switchBrand===k ? ' (default)' : '')}}</a></li>
</ul>
</div>
</div>
<!-- Keyswitch type-->
<div class="hint--bottom hint--rounded" data-hint="Specify the type of key switch for this key.">
<div class="btn-group btn-group-sm-form dropup" dropdown>
<button type="button" class="btn btn-default dropdown-toggle dropdown-fixedwidth" dropdown-toggle ng-disabled="selectedKeys.length<1 || !(multi.sm || meta.switchMount) || !(multi.sb || meta.switchBrand) || multi.decal">
<div>{{(multi.st || meta.switchType) ? switches[multi.sm || meta.switchMount].brands[multi.sb || meta.switchBrand].switches[multi.st || meta.switchType].name : 'Switch N/A'}}</div>
<b class="caret"></b>
</button>
<ul class="dropdown-menu dropdown-select" role="menu">
<li ng-repeat="(k,v) in switches[multi.sm || meta.switchMount].brands[multi.sb || meta.switchBrand].switches"><a ng-click="setMulti('st',k)">{{v.name + (v.feel ? ', '+v.feel : '') + (v.weight ? ', '+v.weight.toString()+' cN' : '') + (meta.switchType===k ? ' (default)' : '')}}</a></li>
</ul>
</div>
</div>
</div>
</div>
<!-- Misc -->
<div class="form-group form-group-sm">
<label class="control-label col-md-3 col-lg-3 text-nowrap">Misc:</label>
@ -550,7 +606,7 @@ Nav Bar / Header
<div class="input-group input-group-sm hint--top hint--rounded" data-hint="Specify the background texture for the keyboard.">
<div class="btn-group btn-group-sm-form" dropdown>
<button type="button" class="btn btn-default dropdown-toggle" dropdown-toggle>{{meta.background ? meta.background.name : 'No Texture'}} <b class="caret"></b></button>
<ul class="dropdown-menu" role="menu" style="max-height:40vh;overflow-y:scroll;">
<ul class="dropdown-menu dropdown-select" role="menu">
<li><a ng-click='setBackground()'>None</a></li>
<li class="divider"></li>
<li ng-repeat="category in backgrounds">
@ -566,7 +622,7 @@ Nav Bar / Header
<!-- Corner radii -->
<div class="form-group form-group-sm">
<label class="control-label text-nowrap" for="kbdradiieditor">Radii:</label>
<label class="control-label text-nowrap" style='margin-left: 5px;' for="kbdradiieditor">Radii:</label>
<div class="hint--top hint--rounded"
data-hint="Specify the corner radii for this keyboard, in CSS3 format.
@ -613,12 +669,12 @@ Nav Bar / Header
<!-- Default keyswitch options-->
<div class="form-group form-group-sm">
<label class="control-label col-md-2 col-lg-1 text-nowrap" for="switcheditor">Default switch:</label>
<label class="control-label col-md-2 col-lg-1 text-nowrap" for="defaultswitcheditor">Default switch:</label>
<!-- Default keyswitch style-->
<!-- Default keyswitch mount style-->
<div class="form-inline form-outdent col-md-10 col-lg-11">
<div class="hint--top hint--rounded" data-hint="Specify the default style of switch for this keyboard layout.">
<select id="switcheditor" class="form-control input-sm dropdown"
<div class="hint--top hint--rounded" data-hint="Specify the default mount style of switch for this keyboard layout.">
<select id="defaultswitcheditor" class="form-control input-sm dropdown"
ng-model="meta.switchMount"
ng-change="updateMeta('switchMount')"
ng-blur="validateMeta('switchMount')">
@ -633,7 +689,8 @@ Nav Bar / Header
<select class="form-control input-sm dropdown"
ng-model="meta.switchBrand"
ng-change="updateMeta('switchBrand')"
ng-blur="validateMeta('switchBrand')">
ng-blur="validateMeta('switchBrand')"
ng-disabled="!meta.switchMount">
<option value="">Brand Not Specified</option>
<option ng-repeat="(k,v) in switches[meta.switchMount].brands" value="{{k}}" ng-selected="meta.switchBrand == k">{{v.name}}</option>
</select>
@ -645,14 +702,41 @@ Nav Bar / Header
<select class="form-control input-sm dropdown"
ng-model="meta.switchType"
ng-change="updateMeta('switchType')"
ng-blur="validateMeta('switchType')">
ng-blur="validateMeta('switchType')"
ng-disabled="!meta.switchMount || !meta.switchBrand">
<option value="">Switch Type Not Specified</option>
<option ng-repeat="v in switches[meta.switchMount].brands[meta.switchBrand].switches" value="{{v.part}}" ng-selected="meta.switchType == v.part">{{v.name + (v.feel ? ', '+v.feel : '') + (v.weight ? ', '+v.weight.toString()+' cN' : '')}}</option>
</select>
</div>
<!-- Switch mounting -->
<div class="form-group form-group-sm form-horizontal">
<label class="control-label text-nowrap" style='margin-left: 5px;' for="pcb">Mounted on:</label>
<div class="checkbox hint--top hint--rounded" data-hint="Specify if the switches are PCB mounted.">
<label style='margin-bottom: -3px;'>
<input type="checkbox" id="pcb" class="checkbox"
ng-model="meta.pcb"
ng-change="updateMeta('pcb')"
ng-blur="validateMeta('pcb')">
PCB
</label>
</div>
<div class="checkbox hint--top hint--rounded" data-hint="Specify if the switches are plate mounted.">
<label style='margin-bottom: -3px;'>
<input type="checkbox" id="plate" class="checkbox"
ng-model="meta.plate"
ng-change="updateMeta('plate')"
ng-blur="validateMeta('plate')">
Plate
</label>
</div>
</div>
</div>
</div>
<!-- Notes -->
<div class="form-group form-group-sm">
<label class="control-label col-md-2 col-lg-1 text-nowrap" for="noteseditor">Notes:</label>

84
kb.js

@ -6,7 +6,7 @@
function toJsonPretty(obj) {
var res = [];
obj.forEach(function(elem,ndx) {
// We don't want CSS & notes in the Raw Data editor; they have their
// We don't want CSS & notes in the Raw Data editor; they have their
// own editors, and inclusion in the raw data tab just clutters it up.
// Other metadata isn't too bad, but doesn't really offer any benefit.
if(ndx > 0 || (elem instanceof Array)) {
@ -193,6 +193,17 @@
var blob = new Blob([data], {type:"image/svg+xml"});
saveAs(blob, "keyboard-layout.svg");
};
$scope.downloadPng = function() {
html2canvas($("#keyboard-bg"), {
useCORS: true,
onrendered: function(canvas) {
canvas.toBlob(function(blob) {
saveAs(blob, "keyboard-layout.png");
});
}
});
};
$scope.downloadJson = function() {
var data = angular.toJson($serial.serialize($scope.keyboard), true /*pretty*/);
var blob = new Blob([data], {type:"application/json"});
@ -278,11 +289,11 @@
$http.get('backgrounds.json').success(function(data) {
$scope.backgrounds = data;
});
$http.get('switches.json').success(function(data) {
$scope.switches = data;
});
// The currently selected palette & character-picker
$scope.palette = {};
$scope.picker = {};
@ -543,7 +554,7 @@
}
};
// Validate a key's property values (in the case of an array property, only validates a single value)
// Validate a key's property values
function validate(key,prop,value) {
var v = {
_ : function() { return value; },
@ -588,6 +599,9 @@
ghost : function() { if(!key.decal) key[prop] = value; },
decal : function() { key[prop] = value; key.x2 = key.y2 = 0; key.width2 = key.width; key.height2 = key.height; key.nub = key.stepped = key.ghost = false; },
rotation_angle : function() { key.rotation_angle = value; key.rotation_x = $scope.multi.rotation_x; key.rotation_y = $scope.multi.rotation_y; },
sm : function() { if(value===$scope.meta.switchMount) value=''; if(value != key.sm) { key.sm = value; key.sb = key.st = ''; } },
sb : function() { if(value===$scope.meta.switchBrand) value=''; if(value != key.sb) { key.sb = value; key.st = ''; } },
st : function() { if(value===$scope.meta.switchType) value=''; if(value != key.st) { key.st = value; } },
};
return (u[prop] || u._)();
}
@ -610,6 +624,10 @@
$scope.multi = angular.copy($scope.selectedKeys.last());
});
};
$scope.setMulti = function(prop, value) {
$scope.multi[prop] = value;
$scope.updateMulti(prop);
};
$scope.validateMulti = function(prop, index) {
if($scope.multi[prop] == null) {
@ -731,6 +749,64 @@
});
};
$scope.makePaletteFromKeys = function(event) {
if (event) {
event.preventDefault();
}
var unselect = false;
if($scope.selectedKeys.length<1) {
$scope.selectAll();
unselect = true;
}
var colors = {};
// Get the unique colors of selected keys.
$scope.selectedKeys.forEach(function(selectedKey) {
colors[selectedKey.color] = null;
colors[selectedKey.text] = null;
});
// Build palette.
var p = {
"name": "Custom palette",
"description": "This is a custom palette generated from existing colors in the keyboard layout.",
"href": $scope.getPermalink(),
"colors": []
};
// Build colors.
for (var prop in colors) {
if (colors.hasOwnProperty(prop) && prop[0] == '#') {
var color = null;
// Look for the color in the current palette, and use it if found,
// in order to keep the name.
if ($scope.palette && $scope.palette.colors) {
for (var i = 0, len = $scope.palette.colors.length; i < len; ++i) {
if ($scope.palette.colors[i].css == prop) {
color = $scope.palette.colors[i];
break;
}
}
}
if (color == null) {
// Make a new color.
color = $color.sRGB8(parseInt(prop.slice(1,3), 16),
parseInt(prop.slice(3,5), 16),
parseInt(prop.slice(5,7), 16));
color.css = color.hex();
color.name = color.css;
}
if (color) {
p.colors.push(color);
}
}
}
p.colors.sort(function(a, b) { return a.name.localeCompare(b.name); });
$scope.loadPalette(p);
if (unselect) {
$scope.unselectAll();
}
}
$scope.moveKeys = function(x,y,$event) {
$event.preventDefault();
$event.stopPropagation();

@ -9,7 +9,9 @@
"radii": "30px 30px 50% 50%",
"switchMount": "cherry",
"switchBrand": "cherry",
"switchType": "MX1A-G1xx"
"switchType": "MX1A-G1xx",
"plate": true,
"pcb": false
},
[
{
@ -328,8 +330,8 @@
"fa": [
0,
0,
0,
0,
5,
5,
5
]
},

@ -100,13 +100,14 @@ var $serial = (typeof(exports) !== 'undefined') ? exports : {};
};
var _defaultKeyProps = {
x: 0, y: 0, x2: 0, y2: 0, // position
width: 1, height: 1, width2: 1, height2: 1, // size
rotation_angle: 0, rotation_x: 0, rotation_y: 0, // rotation
labels:[], textColor: [], textSize: [], // label properties
default: { textColor: "#000000", textSize: 3 }, // label defaults
color: "#cccccc", profile: "", nub: false, // cap appearance
ghost: false, stepped: false, decal: false
x: 0, y: 0, x2: 0, y2: 0, // position
width: 1, height: 1, width2: 1, height2: 1, // size
rotation_angle: 0, rotation_x: 0, rotation_y: 0, // rotation
labels:[], textColor: [], textSize: [], // label properties
default: { textColor: "#000000", textSize: 3 }, // label defaults
color: "#cccccc", profile: "", nub: false, // cap appearance
ghost: false, stepped: false, decal: false, // miscellaneous options
sm: "", sb:"", st:"" // switch
};
var _defaultMetaData = { backcolor: '#eeeeee', name: '', author: '', notes: '', background: undefined, radii: '', switchMount: '', switchBrand: '', switchType: '' };
@ -233,6 +234,9 @@ var $serial = (typeof(exports) !== 'undefined') ? exports : {};
current.textColor = serializeProp(props, "t", ordered.textColor.join("\n").trimEnd(), current.textColor);
current.ghost = serializeProp(props, "g", key.ghost, current.ghost);
current.profile = serializeProp(props, "p", key.profile, current.profile);
current.sm = serializeProp(props, "sm", key.sm, current.sm);
current.sb = serializeProp(props, "sb", key.sb, current.sb);
current.st = serializeProp(props, "st", key.st, current.st);
current.align = serializeProp(props, "a", ordered.align, current.align);
current.default.textSize = serializeProp(props, "f", key.default.textSize, current.default.textSize);
if(props.f) current.textSize = [];
@ -351,6 +355,9 @@ var $serial = (typeof(exports) !== 'undefined') ? exports : {};
if(key.l) { current.stepped = key.l; }
if(key.d) { current.decal = key.d; }
if(key.g != null) { current.ghost = key.g; }
if(key.sm) { current.sm = key.sm; }
if(key.sb) { current.sb = key.sb; }
if(key.st) { current.st = key.st; }
}
}

@ -1,61 +1,71 @@
{
"cherry": { "mount": "cherry", "name": "Cherry MX Mount", "brands": {
"cherry": { "brand": "cherry", "name": "Cherry Electrical Products", "switches": [
{ "part": "MX1A-E1xx", "name": "MX Blue", "feel": "clicky", "weight": 50 },
{ "part": "MX1A-11xx", "name": "MX Black", "feel": "linear", "weight": 60 },
{ "part": "MX1A-G1xx", "name": "MX Brown", "feel": "tactile", "weight": 45 },
{ "part": "MX1A-C1xx", "name": "MX Clear", "feel": "tactile", "weight": 65 },
{ "part": "MX1A-F1xx", "name": "MX Green", "feel": "clicky", "weight": 80 },
{ "part": "MX1A-21xx", "name": "MX Linear Grey", "feel": "linear", "weight": 80 },
{ "part": "MX1A-31xx", "name": "MX Lock", "feel": "linear", "weight": 60, "lock": true },
{ "part": "MX1A-L1xx", "name": "MX Red", "feel": "linear", "weight": 45 },
{ "part": "MX1A-11xx", "name": "MX RGB Black", "feel": "linear", "weight": 60 },
{ "part": "MX1A-E1xx", "name": "MX RGB Blue", "feel": "clicky", "weight": 50 },
{ "part": "MX1A-G1xx", "name": "MX RGB Brown", "feel": "tactile", "weight": 45 },
{ "part": "MX1A-L1xx", "name": "MX RGB Red", "feel": "linear", "weight": 45 },
{ "part": "MX1A-D1xx", "name": "MX Tactile Grey", "feel": "tactile", "weight": 80 },
{ "part": "MX1A-A1xx", "name": "MX White", "feel": "clicky", "weight": 80 }
]},
"gaote": { "brand": "gaote", "name": "Outemu / Gaote Electronics", "switches": [
{ "part": "PG150B01-1", "name": "Clear, Black Shaft", "weight": 65 },
{ "part": "PG150R01-1", "name": "Clear, Red Shaft", "weight": 50 },
{ "part": "PG150Q01-1", "name": "Clear, Blue Shaft", "weight": 55 },
{ "part": "PG150T01-1", "name": "Clear, Brown Shaft", "weight": 50 },
{ "part": "PG150B01", "name": "Black, Black Shaft", "weight": 65 },
{ "part": "PG150R01", "name": "Black, Red Shaft", "weight": 50 },
{ "part": "PG150Q01", "name": "Black, Blue Shaft", "weight": 60 },
{ "part": "PG150T01", "name": "Black, Brown Shaft", "weight": 55 }
]},
"gateron": { "brand": "gateron", "name": "Gateron", "switches": [
{ "part": "KS-3-Black", "name": "KS-3 Black Shaft (black)", "feel": "linear", "weight": 50 },
{ "part": "KS-3-Green", "name": "KS-3 Green Axis (blue)", "feel": "clicky", "weight": 55 },
{ "part": "KS-3-Red", "name": "KS-3 Red Axis (red)", "feel": "linear", "weight": 45 },
{ "part": "KS-3-Tea", "name": "KS-3 Tea Axis (brown)", "feel": "tactile", "weight": 45 },
{ "part": "KS-3-Yellow", "name": "KS-3 Yellow (yellow)", "feel": "linear", "weight": 50 },
{ "part": "KS-3-White", "name": "KS-3 White Shaft (translucent white)", "feel": "linear", "weight": 35 }
]},
"greetech": { "brand": "greetech", "name": "Greetech (Huizhou Greetech Electronics Co.)", "switches": [
{ "part": "GT02A1Exx", "name": "GT02 Red stem", "feel": "linear", "weight": 45 },
{ "part": "GT02A1Dxx", "name": "GT02 Blue stem", "feel": "clicky", "weight": 55 },
{ "part": "GT02A1Bxx", "name": "GTO2 Brown stem", "feel": "tactile", "weight": 50 },
{ "part": "GT02A2Axx", "name": "GTO2 Black stem", "feel": "linear", "weight": 65 }
]},
"kailh": { "brand": "kailh", "name": "Kailh (Kaihua Electronics Co.)", "switches": [
{ "part": "PG151101D01/D15", "name": "Kailh Black", "feel": "linear", "weight": 60 },
{ "part": "PG151101D64/D10", "name": "Kailh Blue", "feel": "clicky", "weight": 60 },
{ "part": "PG151101D49/D09", "name": "Kailh Brown", "feel": "tactile", "weight": 55 },
{ "part": "PG151101D05/D43", "name": "Kailh Red", "feel": "linear", "weight": 50 }
]}
"cherry": { "brand": "cherry", "name": "Cherry Electrical Products", "switches": {
"MX1A-A1xx": { "part": "MX1A-A1xx", "name": "MX White", "feel": "clicky", "weight": 70 },
"MX1A-11xx": { "part": "MX1A-11xx", "name": "MX Black", "feel": "linear", "weight": 60 },
"MX1A-C1xx": { "part": "MX1A-C1xx", "name": "MX Clear", "feel": "tactile", "weight": 55 },
"MX1A-D1xx": { "part": "MX1A-D1xx", "name": "MX Tactile Grey", "feel": "tactile", "weight": 80 },
"MX1A-E1xx": { "part": "MX1A-E1xx", "name": "MX Blue", "feel": "clicky", "weight": 50 },
"MX1A-F1xx": { "part": "MX1A-F1xx", "name": "MX Green", "feel": "clicky", "weight": 70 },
"MX1A-G1xx": { "part": "MX1A-G1xx", "name": "MX Brown", "feel": "tactile", "weight": 45 },
"MX1A-L1xx": { "part": "MX1A-L1xx", "name": "MX Red", "feel": "linear", "weight": 45 },
"MX1A-11Nx": { "part": "MX1A-11Nx", "name": "MX RGB Black", "feel": "linear", "weight": 60 },
"MX1A-E1Nx": { "part": "MX1A-E1Nx", "name": "MX RGB Blue", "feel": "clicky", "weight": 50 },
"MX1A-G1Nx": { "part": "MX1A-G1Nx", "name": "MX RGB Brown", "feel": "tactile", "weight": 45 },
"MX1A-L1Nx": { "part": "MX1A-L1Nx", "name": "MX RGB Red", "feel": "linear", "weight": 45 },
"MX1A-21xx": { "part": "MX1A-21xx", "name": "MX Linear Grey", "feel": "linear", "weight": 80 },
"MX1A-31xx": { "part": "MX1A-31xx", "name": "MX Lock", "feel": "linear", "weight": 60, "lock": true },
"MX3A-11Nx": { "part": "MX3A-11Nx", "name": "MX Silent RGB Black", "feel": "linear", "weight": 60 },
"MX3A-L1Nx": { "part": "MX3A-L1Nx", "name": "MX Silent RGB Red", "feel": "linear", "weight": 45 },
"MX3A-L1xx": { "part": "MX3A-L1xx", "name": "MX Silent Red", "feel": "linear", "weight": 45 },
"MX3A-11xx": { "part": "MX3A-11xx", "name": "MX Silent Black", "feel": "linear", "weight": 60 }
}},
"outemu": { "brand": "outemu", "name": "Outemu (Gaote Electronics)", "switches": {
"PG150B01-1": { "part": "PG150B01-1", "name": "Clear, Black Shaft", "weight": 65 },
"PG150R01-1": { "part": "PG150R01-1", "name": "Clear, Red Shaft", "weight": 50 },
"PG150Q01-1": { "part": "PG150Q01-1", "name": "Clear, Blue Shaft", "weight": 55 },
"PG150T01-1": { "part": "PG150T01-1", "name": "Clear, Brown Shaft", "weight": 50 },
"PG150B01": { "part": "PG150B01", "name": "Black, Black Shaft", "weight": 65 },
"PG150R01": { "part": "PG150R01", "name": "Black, Red Shaft", "weight": 50 },
"PG150Q01": { "part": "PG150Q01", "name": "Black, Blue Shaft", "weight": 60 },
"PG150T01": { "part": "PG150T01", "name": "Black, Brown Shaft", "weight": 55 }
}},
"gateron": { "brand": "gateron", "name": "Gateron (Huizhou Jia Electronic Technology Co.)", "switches": {
"KS-3-Black": { "part": "KS-3-Black", "name": "KS-3 Black Shaft (black)", "feel": "linear", "weight": 50 },
"KS-3-Green": { "part": "KS-3-Green", "name": "KS-3 Green Axis (blue)", "feel": "clicky", "weight": 55 },
"KS-3-Red": { "part": "KS-3-Red", "name": "KS-3 Red Axis (red)", "feel": "linear", "weight": 45 },
"KS-3-Tea": { "part": "KS-3-Tea", "name": "KS-3 Tea Axis (brown)", "feel": "tactile", "weight": 45 },
"KS-3-Yellow": { "part": "KS-3-Yellow", "name": "KS-3 Yellow (yellow)", "feel": "linear", "weight": 50 },
"KS-3-White": { "part": "KS-3-White", "name": "KS-3 White Shaft (translucent white)", "feel": "linear", "weight": 35 }
}},
"greetech": { "brand": "greetech", "name": "Greetech (Huizhou Greetech Electronics Co.)", "switches": {
"GT02A1Exx": { "part": "GT02A1Exx", "name": "GT02 Red stem", "feel": "linear", "weight": 45 },
"GT02A1Dxx": { "part": "GT02A1Dxx", "name": "GT02 Blue stem", "feel": "clicky", "weight": 55 },
"GT02A1Bxx": { "part": "GT02A1Bxx", "name": "GTO2 Brown stem", "feel": "tactile", "weight": 50 },
"GT02A2Axx": { "part": "GT02A2Axx", "name": "GTO2 Black stem", "feel": "linear", "weight": 65 }
}},
"hua-jie": { "brand": "hua-jie", "name": "Hua-Jie (Hua-Jie (Taiwan) Corp)", "switches": {
"AX01-B": { "part": "AX01-B", "name": "Black stem", "feel": "linear", "weight": 60 },
"AX01-R": { "part": "AX01-R", "name": "Red stem", "feel": "linear", "weight": 45 },
"AX01-T": { "part": "AX01-T", "name": "Tea/Brown stem", "feel": "tactile", "weight": 55 },
"AX01-C": { "part": "AX01-C", "name": "Cyan/Blue stem", "feel": "clicky", "weight": 60 }
}},
"kailh": { "brand": "kailh", "name": "Kailh (Kaihua Electronics Co.)", "switches": {
"PG151101D01/D15": { "part": "PG151101D01/D15", "name": "Kailh Black", "feel": "linear", "weight": 60 },
"PG151101D64/D10": { "part": "PG151101D64/D10", "name": "Kailh Blue", "feel": "clicky", "weight": 60 },
"PG151101D49/D09": { "part": "PG151101D49/D09", "name": "Kailh Brown", "feel": "tactile", "weight": 55 },
"PG151101D05/D43": { "part": "PG151101D05/D43", "name": "Kailh Red", "feel": "linear", "weight": 50 }
}}
}},
"alps": { "mount": "alps", "name": "Alps Mount", "brands": {
"alps": { "brand": "alps", "name": "Alps Electric Co.", "switches": [
{ "part": "SKCL/SKCM", "name": "SKCL/SKCM (Complicated Alps)" },
{ "part": "SKBL/SKBM", "name": "SKBL/SKBM (Simplified Alps)" }
]},
"matias": { "brand": "matias", "name": "Matias Corporation", "switches": [
{ "part": "PG155B02", "name": "Click", "feel": "clicky", "weight": 60 },
{ "part": "KS102Q", "name": "Quiet Linear", "feel": "linear", "weight": 35 },
{ "part": "PG155B01", "name": "Quiet Click", "feel": "tactile", "weight": 60 }
]}
"alps": { "brand": "alps", "name": "Alps Electric Co.", "switches": {
"SKCL/SKCM": { "part": "SKCL/SKCM", "name": "SKCL/SKCM (Complicated Alps)" },
"SKBL/SKBM": { "part": "SKBL/SKBM", "name": "SKBL/SKBM (Simplified Alps)" }
}},
"matias": { "brand": "matias", "name": "Matias Corporation", "switches": {
"PG155B02": { "part": "PG155B02", "name": "Click", "feel": "clicky", "weight": 60 },
"KS102Q": { "part": "KS102Q", "name": "Quiet Linear", "feel": "linear", "weight": 35 },
"PG155B01": { "part": "PG155B01", "name": "Quiet Click", "feel": "tactile", "weight": 60 }
}}
}}
}
Loading…
Cancel
Save