From 38c87840af405c9b3ccde627e014b94e0c5be156 Mon Sep 17 00:00:00 2001 From: SirStendec Date: Sun, 29 Sep 2019 15:49:29 -0400 Subject: [PATCH] This is a maintenance commit with no released build. * Added: `npm run font` command for editing the Fontello icon font. Use it to get started, then start the development server with `npm start` and changes will automatically save when you click `Export Font` from Fontello. * Changed: The list of Fontello icons is now extracted from our Fontello config file so that it doesn't have to be manually updated. --- .gitignore | 3 +- README.md | 11 +- bin/update_fonts.js | 24 + fontello.client.json | 6 + fontello.config.json | 566 ++++++++++++++++++++ package-lock.json | 152 +++++- package.json | 7 +- res/font/ffz-fontello.eot | Bin 26052 -> 26052 bytes res/font/ffz-fontello.ttf | Bin 25868 -> 25868 bytes res/font/ffz-fontello.woff | Bin 16204 -> 16204 bytes res/font/ffz-fontello.woff2 | Bin 13556 -> 13592 bytes src/std-components/icon-picker.vue | 83 +-- src/utilities/ffz-icons.js | 84 +++ styles/fontello/animation.scss | 85 +++ styles/fontello/ffz-fontello-codes.scss | 79 +++ styles/fontello/ffz-fontello-embedded.scss | 132 +++++ styles/fontello/ffz-fontello-ie7-codes.scss | 79 +++ styles/fontello/ffz-fontello-ie7.scss | 90 ++++ styles/fontello/ffz-fontello.scss | 135 +++++ styles/icons.scss | 79 +-- webpack.clips.dev.js | 17 + webpack.web.dev.js | 19 + webpack.web.dev.prod.js | 17 + 23 files changed, 1502 insertions(+), 166 deletions(-) create mode 100644 bin/update_fonts.js create mode 100644 fontello.client.json create mode 100644 fontello.config.json create mode 100644 src/utilities/ffz-icons.js create mode 100644 styles/fontello/animation.scss create mode 100644 styles/fontello/ffz-fontello-codes.scss create mode 100644 styles/fontello/ffz-fontello-embedded.scss create mode 100644 styles/fontello/ffz-fontello-ie7-codes.scss create mode 100644 styles/fontello/ffz-fontello-ie7.scss create mode 100644 styles/fontello/ffz-fontello.scss diff --git a/.gitignore b/.gitignore index f8735532..455bda1f 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ cdn stats.json .idea *.iml -credentials.json \ No newline at end of file +credentials.json +.fontello-session \ No newline at end of file diff --git a/README.md b/README.md index dd3b1ac2..6b7767ff 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ server for development. To get everything you need: From there, you can use npm to build FrankerFaceZ from source simply by -running `npm run build`. For development, you can instruct gulp to watch +running `npm run build`. For development, you can instruct webpack to watch the source files for changes and re-build automatically with `npm start` FrankerFaceZ comes with a local development server that listens on port 8000 @@ -32,6 +32,15 @@ It should be noted that this project is not a browser extension that you would load in your browser's extensions system. You still need the FrankerFaceZ extension or user-script for your browser. +You can edit the project's icon font using the `npm run font` command. This will +create a new Fontello session, if one doesn't already exist, and open your +default web browser to Fontello so you can edit the font. + +If you're running the development server with `npm start`, you'll be able to +automatically save changes to the Fontello font by clicking Fontello's Export +button. Otherwise, you can use `npm run font:save` to download the changes +from your session. + Editor Settings =============== diff --git a/bin/update_fonts.js b/bin/update_fonts.js new file mode 100644 index 00000000..e3c9788d --- /dev/null +++ b/bin/update_fonts.js @@ -0,0 +1,24 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const dir = 'styles/fontello'; + +for(const file of fs.readdirSync(dir)) { + if ( file.endsWith('.css') ) { + const old_path = path.join(dir, file), + new_path = `${old_path.substr(0, old_path.length - 4)}.scss`; + + fs.renameSync(old_path, new_path); + } +} + +const config = JSON.parse(fs.readFileSync('fontello.config.json', 'utf8')); +const icons = config.glyphs.map(x => x.css); + +fs.writeFileSync('src/utilities/ffz-icons.js', `'use strict'; +// This is a generated file. To update it, please run: npm run font:update +/* eslint quotes: 0 */ + +export default ${JSON.stringify(icons, null, '\t')};`); diff --git a/fontello.client.json b/fontello.client.json new file mode 100644 index 00000000..ab4aab1e --- /dev/null +++ b/fontello.client.json @@ -0,0 +1,6 @@ +{ + "config": "./fontello.config.json", + "download": "https://localhost:8000/update_font", + "css": "./styles/fontello", + "font": "./res/font" +} \ No newline at end of file diff --git a/fontello.config.json b/fontello.config.json new file mode 100644 index 00000000..350891f8 --- /dev/null +++ b/fontello.config.json @@ -0,0 +1,566 @@ +{ + "name": "ffz-fontello", + "css_prefix_text": "ffz-i-", + "css_use_suffix": false, + "hinting": true, + "units_per_em": 1000, + "ascent": 850, + "glyphs": [ + { + "uid": "04f022b8bd044d4ccfffd3887ff72088", + "css": "window-minimize", + "code": 62161, + "src": "fontawesome" + }, + { + "uid": "07f0832c07f3d9713fffb06c8bffa027", + "css": "window-maximize", + "code": 62160, + "src": "fontawesome" + }, + { + "uid": "5211af474d3a9848f67f945e2ccaf143", + "css": "cancel", + "code": 59392, + "src": "fontawesome" + }, + { + "uid": "1b294e4ad5be28af1bd6bbc2053c110c", + "css": "zreknarf", + "code": 59393, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M620.3 8.9C641.2 8.5 663 4.6 682.9 13.1 701.4 22.4 718.8 34.5 739.3 39 750 57.5 770.7 67 781.3 85.5 799.8 114.6 817.7 145.3 823.8 179.7 832.1 228.5 860.1 270.6 888.9 309.7 906.5 349.4 899 394.3 907.3 435.9 918.8 462.2 928.3 489.2 942 514.5 947.9 524.7 964.5 517.7 966.5 507.7 972.6 471.3 954.2 436.2 956.4 399.8 958.3 381.2 951.7 361.5 957.6 343.5 971.7 324.3 981.1 302.2 995.9 283.6 1014.2 255.6 1048.8 240.9 1081.7 244.5 1093.3 259.3 1108.1 271.2 1120.6 285.1 1135.4 307.1 1154.1 326.2 1171 346.5 1180.7 359.8 1186.7 375.4 1194 390.2 1208.4 415.3 1214.5 444 1228 469.6 1239.1 500.6 1256.5 530.7 1255.5 564.5 1258.9 574.5 1259.5 585 1260.6 595.4 1265.7 615.6 1275.1 639.2 1263.8 659.1 1251.5 685.9 1227.7 705.1 1204.6 722.3 1173.5 746.2 1145 773.8 1110.4 792.8 1089.5 806.4 1068.1 819.3 1045.2 829.1 1026.8 837.2 1014.1 854.5 994.7 860.4 982.9 869.1 974.3 883.5 958.9 886.1 935.5 893 912.9 867 889.7 879.7 874.4 889.1 857.9 896.2 841.5 903.3 797.9 932.1 748.6 951.9 697.6 962.9 654.8 961.8 612.1 966.1 569.2 965.3 551.2 955.7 529.8 959.7 511.6 950.8 479.9 943 455.6 919.9 426.4 906.6 411.7 899.5 398.1 890.4 384.8 881 371.6 871.4 363.4 856.2 349 848 329.4 847.4 315.5 865.5 296.5 868.1 284.7 869.5 272.7 869.7 260.8 869.7 242.9 851 231.6 824.9 206.5 814.5 180.8 795.6 152.3 780.3 130.4 756.8 117.5 743.7 103.6 731.8 88.2 721.9 63.9 701 47.5 673.1 29.6 646.9 13.8 624.3 2.9 597 6.1 569 9.4 527.9 9.2 486.1 19.1 445.8 39.9 392.2 76.3 346.7 111.7 301.9 130.7 274.7 162.5 249.6 197.8 258.9 214.5 267.2 227.3 282.3 234.5 299.4 240.6 313.2 252.4 324.7 254.3 340.2 259.3 370.2 262.5 401 258.1 431.3 249.4 462.7 242.8 495.6 246.2 528.3 246.3 543.2 261.1 555.7 275.8 551.7 291.5 548.2 296.3 530.8 303.1 518.5 311.7 497.6 324.6 479.2 337.4 460.9 355.9 433.8 363.5 401.5 376.6 371.8 387.2 348.4 385.3 322.4 389.7 297.6 393.7 258.4 386.5 218.5 393.3 179.5 400.1 160.1 402.5 139 412.8 121 428.2 102.3 447.5 87 463.3 68.4 472.1 57.5 484.9 51.4 496.9 44.8 537.3 30.9 576.7 10.2 620.3 8.9Z", + "width": 1277 + }, + "search": [ + "zreknarf" + ] + }, + { + "uid": "9dd9e835aebe1060ba7190ad2b2ed951", + "css": "search", + "code": 59394, + "src": "fontawesome" + }, + { + "uid": "7394501fc0b17cb7bda99538f92e26d6", + "css": "window-close", + "code": 62163, + "src": "fontawesome" + }, + { + "uid": "d0e62145dbf40f30e47b3819b8b43a8f", + "css": "window-restore", + "code": 62162, + "src": "fontawesome" + }, + { + "uid": "598a5f2bcf3521d1615de8e1881ccd17", + "css": "clock", + "code": 59395, + "src": "fontawesome" + }, + { + "uid": "474656633f79ea2f1dad59ff63f6bf07", + "css": "star", + "code": 59396, + "src": "fontawesome" + }, + { + "uid": "d17030afaecc1e1c22349b99f3c4992a", + "css": "star-empty", + "code": 59397, + "src": "fontawesome" + }, + { + "uid": "e70df9acbabaebfbbf9c1dbc3e52ab13", + "css": "twitch", + "code": 61928, + "src": "fontawesome" + }, + { + "uid": "627abcdb627cb1789e009c08e2678ef9", + "css": "twitter", + "code": 61593, + "src": "fontawesome" + }, + { + "uid": "2d6150442079cbda7df64522dc24f482", + "css": "down-dir", + "code": 59398, + "src": "fontawesome" + }, + { + "uid": "fb1c799ffe5bf8fb7f8bcb647c8fe9e6", + "css": "right-dir", + "code": 59399, + "src": "fontawesome" + }, + { + "uid": "ecb97add13804c190456025e43ec003b", + "css": "keyboard", + "code": 61724, + "src": "fontawesome" + }, + { + "uid": "c76b7947c957c9b78b11741173c8349b", + "css": "attention", + "code": 59400, + "src": "fontawesome" + }, + { + "uid": "12f4ece88e46abd864e40b35e05b11cd", + "css": "ok", + "code": 59401, + "src": "fontawesome" + }, + { + "uid": "e99461abfef3923546da8d745372c995", + "css": "cog", + "code": 59402, + "src": "fontawesome" + }, + { + "uid": "44e04715aecbca7f266a17d5a7863c68", + "css": "plus", + "code": 59403, + "src": "fontawesome" + }, + { + "uid": "750058837a91edae64b03d60fc7e81a7", + "css": "ellipsis-vert", + "code": 61762, + "src": "fontawesome" + }, + { + "uid": "bbfb51903f40597f0b70fd75bc7b5cac", + "css": "trash", + "code": 61944, + "src": "fontawesome" + }, + { + "uid": "c95735c17a10af81448c7fed98a04546", + "css": "folder-open", + "code": 59404, + "src": "fontawesome" + }, + { + "uid": "9a76bc135eac17d2c8b8ad4a5774fc87", + "css": "download", + "code": 59405, + "src": "fontawesome" + }, + { + "uid": "eeec3208c90b7b48e804919d0d2d4a41", + "css": "upload", + "code": 59406, + "src": "fontawesome" + }, + { + "uid": "f5999a012fc3752386635ec02a858447", + "css": "download-cloud", + "code": 61677, + "src": "fontawesome" + }, + { + "uid": "de2fc7a5c986ab8c622f63455d7cf814", + "css": "upload-cloud", + "code": 61678, + "src": "fontawesome" + }, + { + "uid": "f4445feb55521283572ee88bc304f928", + "css": "floppy", + "code": 59407, + "src": "fontawesome" + }, + { + "uid": "0bda4bc779d4c32623dec2e43bd67ee8", + "css": "gauge", + "code": 61668, + "src": "fontawesome" + }, + { + "uid": "9b7a1c4122860a6066c6fda9df404495", + "css": "crown", + "code": 59408, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M785 290L500 5 215 290 0 75 0 645 1000 645 1000 75Z", + "width": 1000 + }, + "search": [ + "crown" + ] + }, + { + "uid": "5fa5198b360abc57ba0cd05d68086715", + "css": "verified", + "code": 59409, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M164.8 164.8L562.5 0 960.3 164.8 1125 562.5 960.3 960.3 562.5 1125 164.8 960.3 0 562.5 164.8 164.8ZM461.3 819.4L842.3 418.1 751.7 332 456.3 643.3 355.5 548.3 269.9 639.4 461.4 819.4Z", + "width": 1000 + }, + "search": [ + "verified" + ] + }, + { + "uid": "d73eceadda1f594cec0536087539afbf", + "css": "heart", + "code": 59410, + "src": "fontawesome" + }, + { + "uid": "f3dc2d6d8fe9cf9ebff84dc260888cdf", + "css": "heart-empty", + "code": 59411, + "src": "fontawesome" + }, + { + "uid": "3db5347bd219f3bce6025780f5d9ef45", + "css": "tag", + "code": 59412, + "src": "fontawesome" + }, + { + "uid": "a3f89e106175a5c5c4e9738870b12e55", + "css": "tags", + "code": 59413, + "src": "fontawesome" + }, + { + "uid": "09feb4465d9bd1364f4e301c9ddbaa92", + "css": "retweet", + "code": 59414, + "src": "fontawesome" + }, + { + "uid": "acf41aa4018e58d49525665469e35665", + "css": "thumbs-up", + "code": 59415, + "src": "fontawesome" + }, + { + "uid": "7533e68038fc6d520ede7a7ffa0a2f64", + "css": "thumbs-down", + "code": 59416, + "src": "fontawesome" + }, + { + "uid": "cd21cbfb28ad4d903cede582157f65dc", + "css": "bell", + "code": 59417, + "src": "fontawesome" + }, + { + "uid": "8a074400a056c59d389f2d0517281bd5", + "css": "bell-off", + "code": 61943, + "src": "fontawesome" + }, + { + "uid": "d35a1d35efeb784d1dc9ac18b9b6c2b6", + "css": "pencil", + "code": 59418, + "src": "fontawesome" + }, + { + "uid": "e82cedfa1d5f15b00c5a81c9bd731ea2", + "css": "info", + "code": 59419, + "src": "fontawesome" + }, + { + "uid": "17ebadd1e3f274ff0205601eef7b9cc4", + "css": "help", + "code": 59420, + "src": "fontawesome" + }, + { + "uid": "531bc468eecbb8867d822f1c11f1e039", + "css": "calendar", + "code": 59421, + "src": "fontawesome" + }, + { + "uid": "ead4c82d04d7758db0f076584893a8c1", + "css": "calendar-empty", + "code": 61747, + "src": "fontawesome" + }, + { + "uid": "9dc654095085167524602c9acc0c5570", + "css": "left-dir", + "code": 59422, + "src": "fontawesome" + }, + { + "uid": "4d42044cbab8aa1146f577cb6272a3d8", + "css": "inventory", + "code": 59423, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M444.4 444.4H611.1L611.1 683.3 722.2 644.4V444.4H833.3 888.9V611.1L866.7 666.7 444.4 833.3H388.9V388.9L444.4 444.4ZM388.9 388.9V833.3H333.3L22.2 666.7 0 611.1V444.4H55.6V611.1L277.8 722.2 333.3 666.7V444.4L388.9 388.9ZM833.3 333.3H722.2L722.2 188.9 611.1 155.6V333.3H444.4L388.9 388.9V55.6H444.4L866.7 166.7 888.9 222.2V333.3H833.3ZM0 333.3L0 222.2 22.2 166.7 333.3 55.6H388.9V388.9L333.3 333.3V116.7L55.6 216.7V333.3H0ZM83.3 183.3L16.7 105.6 27.8 61.1 211.1 0 238.9 5.6 322.2 94.4 83.3 183.3ZM88.9 100L111.1 133.3 238.9 88.9 211.1 55.6 88.9 100Z", + "width": 1000 + }, + "search": [ + "inventory_logo" + ] + }, + { + "uid": "c1f1975c885aa9f3dad7810c53b82074", + "css": "lock", + "code": 59424, + "src": "fontawesome" + }, + { + "uid": "657ab647f6248a6b57a5b893beaf35a9", + "css": "lock-open", + "code": 59425, + "src": "fontawesome" + }, + { + "uid": "a73c5deb486c8d66249811642e5d719a", + "css": "arrows-cw", + "code": 59426, + "src": "fontawesome" + }, + { + "uid": "ea239dd8b0a0de2db4e1651fd68a97d1", + "css": "ignore", + "code": 59427, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M812.5 708.8V1000L579.9 806.1C553.9 809.9 527.4 812.5 500 812.5 258.4 812.5 62.5 658.6 62.5 468.8 62.5 278.9 258.4 125 500 125S937.5 278.9 937.5 468.8C937.5 562.3 889.6 646.9 812.5 708.8ZM687.5 437.5H312.5V500H687.5V437.5Z", + "width": 1000 + }, + "search": [ + "ignore" + ] + }, + { + "uid": "98d9c83c1ee7c2c25af784b518c522c5", + "css": "block", + "code": 59428, + "src": "fontawesome" + }, + { + "uid": "p57wgnf4glngbchbucdi029iptu8oxb8", + "css": "pin", + "code": 59429, + "src": "typicons" + }, + { + "uid": "6373242453e92e8ce419b8391463867a", + "css": "pin-outline", + "code": 59430, + "src": "typicons" + }, + { + "uid": "28f308aa0a07a67433f54c089c400d82", + "css": "gift", + "code": 59431, + "src": "fontawesome" + }, + { + "uid": "e15f0d620a7897e2035c18c80142f6d9", + "css": "link-ext", + "code": 61582, + "src": "fontawesome" + }, + { + "uid": "88e6faa0f633ee23667f815689e82af3", + "css": "eyedropper", + "code": 61947, + "src": "fontawesome" + }, + { + "uid": "c5fd349cbd3d23e4ade333789c29c729", + "css": "eye", + "code": 59433, + "src": "fontawesome" + }, + { + "uid": "7fd683b2c518ceb9e5fa6757f2276faa", + "css": "eye-off", + "code": 59434, + "src": "fontawesome" + }, + { + "uid": "d6ac2bfbbe55d82aafaa353f66f94412", + "css": "discord", + "code": 59432, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M435 432.9C411.3 432.9 392.5 453.8 392.5 479.2S411.7 525.4 435 525.4C458.8 525.4 477.5 504.6 477.5 479.2 477.9 453.8 458.8 432.9 435 432.9ZM587.1 432.9C563.3 432.9 544.6 453.8 544.6 479.2S563.8 525.4 587.1 525.4C610.8 525.4 629.6 504.6 629.6 479.2S610.8 432.9 587.1 432.9ZM789.6 83.3H231.3C184.2 83.3 145.8 121.7 145.8 169.2V732.5C145.8 780 184.2 818.3 231.3 818.3H703.8L681.7 741.3 735 790.8 785.4 837.5 875 916.7V169.2C875 121.7 836.7 83.3 789.6 83.3ZM628.8 627.5S613.8 609.6 601.3 593.8C655.8 578.3 676.7 544.2 676.7 544.2 659.6 555.4 643.3 563.3 628.8 568.8 607.9 577.5 587.9 583.3 568.3 586.7 528.3 594.2 491.7 592.1 460.4 586.3 436.7 581.7 416.3 575 399.2 568.3 389.6 564.6 379.2 560 368.8 554.2 367.5 553.3 366.3 552.9 365 552.1 364.2 551.7 363.8 551.3 363.3 550.8 355.8 546.7 351.7 543.8 351.7 543.8S371.7 577.1 424.6 592.9C412.1 608.8 396.7 627.5 396.7 627.5 304.6 624.6 269.6 564.2 269.6 564.2 269.6 430 329.6 321.3 329.6 321.3 389.6 276.3 446.7 277.5 446.7 277.5L450.8 282.5C375.8 304.2 341.3 337.1 341.3 337.1S350.4 332.1 365.8 325C410.4 305.4 445.8 300 460.4 298.8 462.9 298.3 465 297.9 467.5 297.9 492.9 294.6 521.7 293.8 551.7 297.1 591.3 301.7 633.8 313.3 677.1 337.1 677.1 337.1 644.2 305.8 573.3 284.2L579.2 277.5S636.3 276.3 696.3 321.3C696.3 321.3 756.3 430 756.3 564.2 756.3 564.2 720.8 624.6 628.8 627.5Z", + "width": 1021 + }, + "search": [ + "discord" + ] + }, + { + "uid": "881c3e2491c8027a5f192509ee97627e", + "css": "views", + "code": 59435, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M687.5 812.5H312.5L62.5 562.5V500 437.5L312.5 187.5H687.5L937.5 437.5V500 562.5L687.5 812.5ZM500 312.5C396.5 312.5 312.5 396.4 312.5 500 312.5 603.5 396.5 687.5 500 687.5 603.6 687.5 687.5 603.5 687.5 500 687.5 396.4 603.6 312.5 500 312.5ZM500 562.5C465.4 562.5 437.5 534.5 437.5 500S465.4 437.5 500 437.5 562.5 465.5 562.5 500 534.6 562.5 500 562.5Z", + "width": 1000 + }, + "search": [ + "views" + ] + }, + { + "uid": "939c45a003c91448640d96d8e366e0f5", + "css": "conversations", + "code": 59436, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M155 294.5A76.9 76.9 0 0 1 230.8 230.8H1307.7A76.9 76.9 0 0 1 1383.5 294.5L1384.6 293.5V923.1A76.9 76.9 0 0 1 1307.7 1000H515.9L219.5 1296.4A38.5 38.5 0 0 1 153.8 1269.2V293.5L155 294.5Z", + "width": 1000 + }, + "search": [ + "conversations" + ] + }, + { + "uid": "f9c8ea86275ca16128235c6452b67b8e", + "css": "user-secret", + "code": 61979, + "src": "fontawesome" + }, + { + "uid": "0f6a2573a7b6df911ed199bb63717e27", + "css": "github", + "code": 61595, + "src": "fontawesome" + }, + { + "uid": "a823417914833e03de5d756eb1563187", + "css": "channels", + "code": 59437, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M450 250H550A50 50 0 0 1 600 300V400A50 50 0 0 1 550 450H450A50 50 0 0 1 400 400V300A50 50 0 0 1 450 250M750 250H850A50 50 0 0 1 900 300V400A50 50 0 0 1 850 450H750A50 50 0 0 1 700 400V300A50 50 0 0 1 750 250M750 550H850A50 50 0 0 1 900 600V700A50 50 0 0 1 850 750H750A50 50 0 0 1 700 700V600A50 50 0 0 1 750 550M450 550H550A50 50 0 0 1 600 600V700A50 50 0 0 1 550 750H450A50 50 0 0 1 400 700V600A50 50 0 0 1 450 550M150 550H250A50 50 0 0 1 300 600V700A50 50 0 0 1 250 750H150A50 50 0 0 1 100 700V600A50 50 0 0 1 150 550M150 250H250A50 50 0 0 1 300 300V400A50 50 0 0 1 250 450H150A50 50 0 0 1 100 400V300A50 50 0 0 1 150 250", + "width": 1000 + }, + "search": [ + "channels" + ] + }, + { + "uid": "8276f8f6c1a9e58a5b6eb934a1d49d3e", + "css": "camera", + "code": 59438, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M560.3 250C581.9 250 599.3 267 600 288.1V711.9A39.6 39.6 0 0 1 560.3 750H140.1A39.8 39.8 0 0 1 100.1 710.5V289.5C100.1 267.7 117.9 250 140.1 250H560.3ZM882.9 305.5C893.6 312 900 323.3 900 335.6V664.5A35.3 35.3 0 0 1 882.9 694.5 37.3 37.3 0 0 1 847.7 696.5L700 641.7V357.7L847.6 303.4A37.4 37.4 0 0 1 882.9 305.4Z", + "width": 1000 + }, + "search": [ + "camera" + ] + }, + { + "uid": "d862a10e1448589215be19702f98f2c1", + "css": "smile", + "code": 61720, + "src": "fontawesome" + }, + { + "uid": "bc71f4c6e53394d5ba46b063040014f1", + "css": "cw", + "code": 59439, + "src": "fontawesome" + }, + { + "uid": "80cd1022bd9ea151d554bec1fa05f2de", + "css": "up-dir", + "code": 59440, + "src": "fontawesome" + }, + { + "uid": "95376bf082bfec6ce06ea1cda7bd7ead", + "css": "up-big", + "code": 59441, + "src": "fontawesome" + }, + { + "uid": "ce06b5805120d0c2f8d60cd3f1a4fdb5", + "css": "play", + "code": 59442, + "src": "fontawesome" + }, + { + "uid": "4fc9b8c122d1b5ca3df42a104a655e8b", + "css": "language", + "code": 61867, + "src": "fontawesome" + }, + { + "uid": "65b3ce930627cabfb6ac81ac60ec5ae4", + "css": "sort-up", + "code": 61662, + "src": "fontawesome" + }, + { + "uid": "94103e1b3f1e8cf514178ec5912b4469", + "css": "sort-down", + "code": 61661, + "src": "fontawesome" + }, + { + "uid": "0cd2582b8c93719d066ee0affd02ac78", + "css": "sort-alt-up", + "code": 61792, + "src": "fontawesome" + }, + { + "uid": "27b13eff5eb0ca15e01a6e65ffe6eeec", + "css": "sort-alt-down", + "code": 61793, + "src": "fontawesome" + }, + { + "uid": "8b80d36d4ef43889db10bc1f0dc9a862", + "css": "user", + "code": 59443, + "src": "fontawesome" + }, + { + "uid": "e0f6f5c837f46bc0cf7a448604452b3b", + "css": "clip", + "code": 59444, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M900 242L886 143A50.1 50.1 0 0 0 829.4 100.4L705.7 118 801 255.9 900 242ZM648.5 277L553.3 139 404.7 160 499.9 298 648.5 277ZM362 319L266.8 181 143.1 198.5A50 50 0 0 0 100.5 255L114.5 354 362 319ZM900 450V854.1C900 881.7 877.7 900 850 900H150C122.4 900 100 881.7 100 854.1V450H350L250 600H400L500 450H650L550 600H700L800 450H900Z", + "width": 1000 + }, + "search": [ + "clip" + ] + }, + { + "uid": "47a1f80457068fbeab69fdb83d7d0817", + "css": "youtube-play", + "code": 61802, + "src": "fontawesome" + } + ] +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2c8c5ede..c717d259 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "frankerfacez", - "version": "4.7.1", + "version": "4.12.3", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -436,6 +436,39 @@ "to-fast-properties": "^2.0.0" } }, + "@ffz/fontello-cli": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@ffz/fontello-cli/-/fontello-cli-1.0.3.tgz", + "integrity": "sha512-xdXNiaT5+wgnYWCrX5thonncE5bN9fFk+z5rGxr6AwCNXQQKzg2D24MngDY3DTT5LHRwLid3CQJ2GHJ5g9n0FQ==", + "dev": true, + "requires": { + "colors": "^1.4.0", + "commander": "^3.0.2", + "form-data": "^2.5.1", + "node-fetch": "^2.6.0", + "open": "^6.4.0", + "unzipper": "^0.10.5" + }, + "dependencies": { + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + } + } + }, "@ffz/icu-msgparser": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@ffz/icu-msgparser/-/icu-msgparser-1.0.1.tgz", @@ -1190,12 +1223,28 @@ "tweetnacl": "^0.14.3" } }, + "big-integer": { + "version": "1.6.45", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.45.tgz", + "integrity": "sha512-nmb9E7oEtVJ7SmSCH/DeJobXyuRmaofkpoQSimMFu3HKJ5MADtM825SPLhDuWhZ6TElLAQtgJbQmBZuHIRlZoA==", + "dev": true + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "dev": true, + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -1402,12 +1451,24 @@ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, + "buffer-indexof-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz", + "integrity": "sha1-qfuAbOgUXVQoUQznLyeLs2OmOL8=", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "dev": true + }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -1495,6 +1556,15 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "dev": true, + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -1664,6 +1734,12 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2264,6 +2340,15 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -2560,9 +2645,9 @@ } }, "eslint-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.0.tgz", - "integrity": "sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", + "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", "dev": true, "requires": { "eslint-visitor-keys": "^1.0.0" @@ -4837,6 +4922,12 @@ "uc.micro": "^1.0.1" } }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", + "dev": true + }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -5351,6 +5442,12 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "dev": true + }, "node-forge": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", @@ -5740,6 +5837,15 @@ } } }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, "opn": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", @@ -7921,6 +8027,12 @@ } } }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "dev": true + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -8087,6 +8199,38 @@ } } }, + "unzipper": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.5.tgz", + "integrity": "sha512-i5ufkXNjWZYxU/0nKKf6LkvW8kn9YzRvfwuPWjXP+JTFce/8bqeR0gEfbiN2IDdJa6ZU6/2IzFRLK0z1v0uptw==", + "dev": true, + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + }, + "dependencies": { + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", + "dev": true + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + } + } + }, "upath": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", diff --git a/package.json b/package.json index b1d2cea0..cd90141b 100755 --- a/package.json +++ b/package.json @@ -17,7 +17,11 @@ "build:clips:dev": "npm run clean && webpack --config webpack.clips.dev.js", "build:stats": "cross-env NODE_ENV=production webpack --config webpack.web.prod.js --json > stats.json", "build:prod": "cross-env NODE_ENV=production webpack --config webpack.web.prod.js", - "build:dev": "npm run clean && webpack --config webpack.web.dev.js" + "build:dev": "npm run clean && webpack --config webpack.web.dev.js", + "font": "npm run font:edit", + "font:edit": "fontello-cli --cli-config fontello.client.json edit", + "font:save": "fontello-cli --cli-config fontello.client.json save && npm run font:update", + "font:update": "node bin/update_fonts" }, "devDependencies": { "@babel/core": "^7.5.5", @@ -26,6 +30,7 @@ "@babel/plugin-proposal-optional-chaining": "^7.2.0", "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-transform-react-jsx": "^7.3.0", + "@ffz/fontello-cli": "^1.0.3", "babel-eslint": "^10.0.2", "babel-loader": "^8.0.6", "clean-webpack-plugin": "^3.0.0", diff --git a/res/font/ffz-fontello.eot b/res/font/ffz-fontello.eot index 9b5181ad32d03b56fbc868fd06a7a0751e714095..7ef8b8eed5314c4797d72867111fc7954e42f7b1 100644 GIT binary patch delta 59 zcmX?dn(@eK#tAkoyCq&)PjvXn{A!2WW*f#m{xa4tC3eU2+k9oA`2BD delta 50 ycmeA<#n^L-aY7?=Tz|;MmOcJ5wv1WxbOR+%&|Bs>z9k?$Mf5KW#DFh0Tf}lxoy`Q82$h2 aKU3CB<`5v4gMkSo3IM4Q4_>pUIi&@3tRGwe delta 68 zcmV-K0K5Ope$0N5!wE6~001@@UXN6<%&|BsTgI==@%%Pl8Mv8W07V#X7Az}<(f_~x aGiA+W4gqpG7??n!0Ak+_2mrIEIi&^h+#DPL diff --git a/res/font/ffz-fontello.woff2 b/res/font/ffz-fontello.woff2 index 83dc1ea239be627919b6e0c4609b22127f147ebe..797913f5a0ed22ab336bc8df4a3467965b1aac87 100644 GIT binary patch literal 13592 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 { + const proc = exec('npm run font:save'); + + proc.stdout.on('data', data => { + console.log('FONT>>', data); + }); + + proc.stderr.on('data', data => { + console.error('FONT>>', data); + }); + + proc.on('close', code => { + console.log('FONT>> Exited with code', code); + res.redirect(req.headers.referer); + }); + }); + app.get('/script/script.js', (req, res, next) => { req.url = req.url.replace(/^\/script/, '/script/clips'); next(); diff --git a/webpack.web.dev.js b/webpack.web.dev.js index 0314b1fc..3cae9011 100644 --- a/webpack.web.dev.js +++ b/webpack.web.dev.js @@ -3,6 +3,8 @@ const path = require('path'); const merge = require('webpack-merge'); const common = require('./webpack.web.common.js'); +const {exec} = require('child_process'); + const CopyPlugin = require('copy-webpack-plugin'); const webpack = require('webpack'); @@ -52,6 +54,23 @@ module.exports = merge(common, { next(); }); + app.get('/update_font', (req, res) => { + const proc = exec('npm run font:save'); + + proc.stdout.on('data', data => { + console.log('FONT>>', data); + }); + + proc.stderr.on('data', data => { + console.error('FONT>>', data); + }); + + proc.on('close', code => { + console.log('FONT>> Exited with code', code); + res.redirect(req.headers.referer); + }); + }); + app.get('/dev_server', (req, res) => { res.json({ path: process.cwd(), diff --git a/webpack.web.dev.prod.js b/webpack.web.dev.prod.js index 884d3e1e..6881ee61 100644 --- a/webpack.web.dev.prod.js +++ b/webpack.web.dev.prod.js @@ -49,6 +49,23 @@ module.exports = merge(prod, { next(); }); + app.get('/update_font', (req, res) => { + const proc = exec('npm run font:save'); + + proc.stdout.on('data', data => { + console.log('FONT>>', data); + }); + + proc.stderr.on('data', data => { + console.error('FONT>>', data); + }); + + proc.on('close', code => { + console.log('FONT>> Exited with code', code); + res.redirect(req.headers.referer); + }); + }); + app.get('/dev_server', (req, res) => { res.json({ path: process.cwd(),