diff --git a/README.md b/README.md index 214a226..801ad3f 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ The tool doesn't have the power to modify *any* of your files, but *always* do b * Use bloodorca's amazing [Online Save File Editor](https://bloodorca.github.io/hollow) to decode your Hollow Knight **user\*.dat** save file into text. - * Left-click anywhere inside the text box in the Editor after decoding the save and press **CTRL+A** (or Right-click -> Select All). Only the text inside the text box (decoded save file contents) should be selected. + * Left-click inside the text box in the Editor after decoding the save and press **CTRL+A** (or Right-click -> Select All). Only the text inside the text box (decoded save file contents) should be selected. * Press **CTRL+C** (or Right-click -> Copy) to copy the whole contents inside the text box. diff --git a/docs/app.js b/docs/app.js index 80e46c3..a8206c2 100644 --- a/docs/app.js +++ b/docs/app.js @@ -26,7 +26,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _img \********************************/ /***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { -eval("/* global require HKReadTextArea */\n// AES JS\nvar aesjs = __webpack_require__(/*! ./aes-js.js */ \"./src/js/aes-js.js\");\n/* \r\n Parts of the code thanks to bloodorca https://github.com/bloodorca/hollow (base64.js, functions.js) with slight modifications.\r\n The steps used there for decryption were taken from KayDeeTee https://github.com/KayDeeTee/Hollow-Knight-SaveManager\r\n Without these two people the existence of this tool wouldn't be possible :)\r\n*/\n// ---------------- Constants ----------------- //\n\n\nvar CSHARP_HEADER = [0, 1, 0, 0, 0, 255, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0]; // 22 bytes\n\nvar BASE64_ARRAY = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".split(\"\").map(function (c) {\n return c.charCodeAt(0);\n});\nvar BASE64_DECODE_TABLE = new Map(BASE64_ARRAY.map(function (ord, i) {\n return [ord, i];\n}));\nvar AES_KEY = new TextEncoder().encode('UKu52ePUBwetZ9wNX88o54dnfKRu0T1l'); // encodes a string to Uint8Array (prepare for AES JS)\n\nvar ECB_STREAM_CIPHER = new aesjs.ModeOfOperation.ecb(AES_KEY); // create a new AES stream cipher object using the encoded key\n// ---------------- Variables ----------------- //\n\nvar benchLSFBegin, benchLSFEnd, benchTotal; // ---------------- Functions ----------------- //\n\n/**\r\n * Main input tag file function. Selects the first file, reads it as an Array Buffer, starts the processing of the file when loaded.\r\n * Starts benchmarking.\r\n * @param {FileList} input FileList object containing a list of File objects. The FileList behaves like an array, so you can check its length property to get the number of selected files.\r\n */\n// eslint-disable-next-line no-unused-vars\n\nfunction LoadSaveFile(input) {\n var startTime = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date();\n // console.info(\"Input length: \" + input.files.length)\n // Cease further processing if user canceled the file input dialog\n if (input.files.length < 1) return false; // start benchmark\n\n benchLSFBegin = startTime; // Prepares a File object from the first file of the input files for reading as an Array Buffer\n\n var inputFileObject = input.files[0]; // Cleans the file list to avoid problems after subsequent use\n // document.getElementById(\"save-area-file\").value = \"\";\n // 1. read file\n // The ArrayBuffer object is used to represent a generic, fixed-length raw binary data buffer.\n // It is an array of bytes, often referred to in other languages as a \"byte array\".\n // new FileReader()\n\n var inputReader = new FileReader(); // readAsArrayBuffer(file)\n\n inputReader.readAsArrayBuffer(inputFileObject); // addEventListener(\"load\", function) - to decode the file when loaded\n\n inputReader.addEventListener(\"load\", ProcessFileObject);\n}\n/**\r\n * Reads the File object as an Array Buffer and does all other operations (decoding, decryption, conversion to string, pasting to text area).\r\n * Launches the HKReadTextArea() function automatically after pasting the string to text area\r\n */\n\n\nfunction ProcessFileObject() {\n var inputArrayBuffer = this.result;\n var decodedString; // 2. Decode file\n\n try {\n // Uint8Array(ArrayBuffer) uint8_t equivalent in C\n inputArrayBuffer = new Uint8Array(inputArrayBuffer); // ArrayBuffer.slice()\n // The slice() method copies up to, but not including, the byte indicated by the end parameter.\n\n inputArrayBuffer.slice(); // remove C# header and LengthPrefixedString header (ArrayBuffer)\n\n inputArrayBuffer = RemoveHeaders(inputArrayBuffer); // base64 Decoding (ArrayBuffer)\n\n inputArrayBuffer = Base64Decode(inputArrayBuffer); // AES decryption (ECB) removes pkcs7 padding (ArrayBuffer)\n\n inputArrayBuffer = AESDecryption(inputArrayBuffer); // Convert ArrayBuffer to string/text TextDecoder().decode(ArrayBuffer)\n\n decodedString = new TextDecoder().decode(inputArrayBuffer); // 4. Paste decoded string file to text area\n\n document.getElementById(\"save-area\").value = \"\";\n document.getElementById(\"save-area\").value = decodedString; // finish and show benchmark\n\n benchLSFEnd = new Date();\n console.info(\"LoadSaveFile() time (ms) =\", benchLSFEnd - benchLSFBegin); // after pasting the decoded string, launch the main analyzing function immediately\n\n HKReadTextArea(); // finish total and show benchmark\n\n benchTotal = new Date();\n console.info(\"Total time (ms) =\", benchTotal - benchLSFBegin); // alert(`Decoded String: ${decodedString}`);\n // alert(`Array Buffer: ${inputArrayBuffer}`);\n } catch (error) {\n alert(\"The file cannot be decoded. \".concat(error));\n console.info(\"The file cannot be decoded. \".concat(error));\n }\n}\n/**\r\n * Removes C# header, LengthPrefixedString header and byte 11 at the end of the Uint8 Array Buffer\r\n * @param {Uint8Array} buffer Uint8Array buffer for removing the header from\r\n * @param {Uint8Array} csHeader Uint8Array for the C# header length calculation\r\n * @returns {Uint8Array}\r\n */\n\n\nfunction RemoveHeaders(buffer) {\n var csHeader = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : CSHARP_HEADER;\n // Remove the fixed C# header and byte 11 at the end. \n buffer = buffer.subarray(csHeader.length, buffer.length - 1); // Remove LengthPrefixedString header\n\n var lengthCount = 0;\n\n for (var i = 0; i < 5; i++) {\n lengthCount++;\n\n if ((buffer[i] & 0x80) == 0) {\n break;\n }\n }\n\n return buffer.subarray(lengthCount);\n}\n/**\r\n * Decodes an Array Buffer using a Base64 decode table\r\n * @param {Uint8Array} buffer Uint8Array Buffer to decode\r\n * @returns {Uint8Array}\r\n */\n\n\nfunction Base64Decode(buffer) {\n buffer = new Uint8Array(buffer).slice();\n buffer = buffer.map(function (v) {\n return BASE64_DECODE_TABLE.get(v);\n }); // The indexOf() method returns the first index at which a given element can be found in the array, or -1 if it is not present.\n\n var p = buffer.indexOf(64);\n var end;\n\n if (p != -1) {\n end = p;\n } else {\n end = buffer.length;\n }\n\n buffer = buffer.subarray(0, end);\n var output = new Uint8Array(3 * buffer.length / 4);\n var continuous = Math.floor(buffer.length / 4) * 4;\n\n for (var i = 0; i < continuous; i += 4) {\n var k = 3 * i / 4;\n output[k] = buffer[i] << 2 | buffer[i + 1] >> 4;\n output[k + 1] = (buffer[i + 1] & 0x0F) << 4 | buffer[i + 2] >> 2;\n output[k + 2] = (buffer[i + 2] & 0x03) << 6 | buffer[i + 3];\n }\n\n if (buffer[continuous] != undefined) {\n var _k = 3 * continuous / 4;\n\n output[_k] = buffer[continuous] << 2 | buffer[continuous + 1] >> 4;\n\n if (buffer[continuous + 2] != undefined) {\n output[_k + 1] = (buffer[continuous + 1] & 0x0F) << 4 | buffer[continuous + 2] >> 2;\n }\n }\n\n return output;\n}\n/**\r\n * Decrypt an Uint8Array Buffer using aesjs (ECB) and a predefined AES key + remove pkcs7 padding\r\n * @param {Uint8Array} buffer Uint8Array buffer to decrypt\r\n * @returns {Uint8Array}\r\n */\n\n\nfunction AESDecryption(buffer) {\n var cipherObject = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ECB_STREAM_CIPHER;\n var output = cipherObject.decrypt(buffer);\n return output.subarray(0, -output[output.length - 1]);\n} // Make functions global so they can be used on click and change events (for Webpack)\n\n\nwindow.LoadSaveFile = LoadSaveFile;\n\n//# sourceURL=webpack://hollow-knight-completion-check/./src/js/LoadSaveFile.js?"); +eval("/* global require HKReadTextArea */\n\n/* \r\n Parts of the code thanks to bloodorca https://github.com/bloodorca/hollow (base64.js, functions.js) with slight modifications.\r\n The steps used there for decryption were taken from KayDeeTee https://github.com/KayDeeTee/Hollow-Knight-SaveManager\r\n Without these two people the existence of this tool wouldn't be possible :)\r\n*/\n// ---------------- Constants ----------------- //\n// AES JS for file decryption\nvar aesjs = __webpack_require__(/*! ./aes-js.js */ \"./src/js/aes-js.js\");\n\nvar CSHARP_HEADER = [0, 1, 0, 0, 0, 255, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0]; // 22 bytes\n\nvar BASE64_ARRAY = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".split(\"\").map(function (c) {\n return c.charCodeAt(0);\n});\nvar BASE64_DECODE_TABLE = new Map(BASE64_ARRAY.map(function (ord, i) {\n return [ord, i];\n}));\nvar AES_KEY = new TextEncoder().encode('UKu52ePUBwetZ9wNX88o54dnfKRu0T1l'); // encodes a string to Uint8Array (prepare for AES JS)\n\nvar ECB_STREAM_CIPHER = new aesjs.ModeOfOperation.ecb(AES_KEY); // create a new AES stream cipher object using the encoded key\n// ---------------- Variables ----------------- //\n\nvar benchLSFBegin, benchLSFEnd, benchTotal; // ---------------- Functions ----------------- //\n\n/**\r\n * Main input tag file function. Selects the first file, reads it as an Array Buffer, starts the processing of the file when loaded.\r\n * Starts benchmarking.\r\n * @param {FileList} input FileList object containing a list of File objects. The FileList behaves like an array, so you can check its length property to get the number of selected files.\r\n */\n// eslint-disable-next-line no-unused-vars\n\nfunction LoadSaveFile(input) {\n var startTime = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date();\n // console.info(\"Input length: \" + input.files.length)\n // Cease further processing if user canceled the file input dialog\n if (input.files.length < 1) return false; // start benchmark\n\n benchLSFBegin = startTime; // Prepares a File object from the first file of the input files for reading as an Array Buffer\n\n var inputFileObject = input.files[0]; // Cleans the file list to avoid problems after subsequent use\n // document.getElementById(\"save-area-file\").value = \"\";\n // 1. read file\n // The ArrayBuffer object is used to represent a generic, fixed-length raw binary data buffer.\n // It is an array of bytes, often referred to in other languages as a \"byte array\".\n // new FileReader()\n\n var inputReader = new FileReader(); // readAsArrayBuffer(file)\n\n inputReader.readAsArrayBuffer(inputFileObject); // addEventListener(\"load\", function) - to decode the file when loaded\n\n inputReader.addEventListener(\"load\", ProcessFileObject);\n}\n/**\r\n * Reads the File object as an Array Buffer and does all other operations (decoding, decryption, conversion to string, pasting to text area).\r\n * Launches the HKReadTextArea() function automatically after pasting the string to text area\r\n */\n\n\nfunction ProcessFileObject() {\n var inputArrayBuffer = this.result;\n var decodedString; // 2. Decode file\n\n try {\n // Uint8Array(ArrayBuffer) uint8_t equivalent in C\n inputArrayBuffer = new Uint8Array(inputArrayBuffer); // ArrayBuffer.slice()\n // The slice() method copies up to, but not including, the byte indicated by the end parameter.\n\n inputArrayBuffer.slice(); // remove C# header and LengthPrefixedString header (ArrayBuffer)\n\n inputArrayBuffer = RemoveHeaders(inputArrayBuffer); // base64 Decoding (ArrayBuffer)\n\n inputArrayBuffer = Base64Decode(inputArrayBuffer); // AES decryption (ECB) removes pkcs7 padding (ArrayBuffer)\n\n inputArrayBuffer = AESDecryption(inputArrayBuffer); // Convert ArrayBuffer to string/text TextDecoder().decode(ArrayBuffer)\n\n decodedString = new TextDecoder().decode(inputArrayBuffer); // 4. Paste decoded string file to text area\n\n document.getElementById(\"save-area\").value = \"\";\n document.getElementById(\"save-area\").value = decodedString; // finish and show benchmark\n\n benchLSFEnd = new Date();\n console.info(\"LoadSaveFile() time (ms) =\", benchLSFEnd - benchLSFBegin); // after pasting the decoded string, launch the main analyzing function immediately\n\n HKReadTextArea(); // finish total and show benchmark\n\n benchTotal = new Date();\n console.info(\"Total time (ms) =\", benchTotal - benchLSFBegin); // alert(`Decoded String: ${decodedString}`);\n // alert(`Array Buffer: ${inputArrayBuffer}`);\n } catch (error) {\n alert(\"The file cannot be decoded. \".concat(error));\n console.info(\"The file cannot be decoded. \".concat(error));\n }\n}\n/**\r\n * Removes C# header, LengthPrefixedString header and byte 11 at the end of the Uint8 Array Buffer\r\n * @param {Uint8Array} buffer Uint8Array buffer for removing the header from\r\n * @param {Uint8Array} csHeader Uint8Array for the C# header length calculation\r\n * @returns {Uint8Array}\r\n */\n\n\nfunction RemoveHeaders(buffer) {\n var csHeader = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : CSHARP_HEADER;\n // Remove the fixed C# header and byte 11 at the end. \n buffer = buffer.subarray(csHeader.length, buffer.length - 1); // Remove LengthPrefixedString header\n\n var lengthCount = 0;\n\n for (var i = 0; i < 5; i++) {\n lengthCount++;\n\n if ((buffer[i] & 0x80) == 0) {\n break;\n }\n }\n\n return buffer.subarray(lengthCount);\n}\n/**\r\n * Decodes an Array Buffer using a Base64 decode table\r\n * @param {Uint8Array} buffer Uint8Array Buffer to decode\r\n * @returns {Uint8Array}\r\n */\n\n\nfunction Base64Decode(buffer) {\n buffer = new Uint8Array(buffer).slice();\n buffer = buffer.map(function (v) {\n return BASE64_DECODE_TABLE.get(v);\n }); // The indexOf() method returns the first index at which a given element can be found in the array, or -1 if it is not present.\n\n var p = buffer.indexOf(64);\n var end;\n\n if (p != -1) {\n end = p;\n } else {\n end = buffer.length;\n }\n\n buffer = buffer.subarray(0, end);\n var output = new Uint8Array(3 * buffer.length / 4);\n var continuous = Math.floor(buffer.length / 4) * 4;\n\n for (var i = 0; i < continuous; i += 4) {\n var k = 3 * i / 4;\n output[k] = buffer[i] << 2 | buffer[i + 1] >> 4;\n output[k + 1] = (buffer[i + 1] & 0x0F) << 4 | buffer[i + 2] >> 2;\n output[k + 2] = (buffer[i + 2] & 0x03) << 6 | buffer[i + 3];\n }\n\n if (buffer[continuous] != undefined) {\n var _k = 3 * continuous / 4;\n\n output[_k] = buffer[continuous] << 2 | buffer[continuous + 1] >> 4;\n\n if (buffer[continuous + 2] != undefined) {\n output[_k + 1] = (buffer[continuous + 1] & 0x0F) << 4 | buffer[continuous + 2] >> 2;\n }\n }\n\n return output;\n}\n/**\r\n * Decrypt an Uint8Array Buffer using aesjs (ECB) and a predefined AES key + remove pkcs7 padding\r\n * @param {Uint8Array} buffer Uint8Array buffer to decrypt\r\n * @returns {Uint8Array}\r\n */\n\n\nfunction AESDecryption(buffer) {\n var cipherObject = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ECB_STREAM_CIPHER;\n var output = cipherObject.decrypt(buffer);\n return output.subarray(0, -output[output.length - 1]);\n} // Make functions global so they can be used on click and change events (for Webpack)\n\n\nwindow.LoadSaveFile = LoadSaveFile;\n\n//# sourceURL=webpack://hollow-knight-completion-check/./src/js/LoadSaveFile.js?"); /***/ }), @@ -52,6 +52,17 @@ eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extr /***/ }), +/***/ "./src/css/simpleicon.css": +/*!********************************!*\ + !*** ./src/css/simpleicon.css ***! + \********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://hollow-knight-completion-check/./src/css/simpleicon.css?"); + +/***/ }), + /***/ "./src/css/style.css": /*!***************************!*\ !*** ./src/css/style.css ***! @@ -192,7 +203,7 @@ eval("module.exports = __webpack_require__.p + \"img/thumbnail1200x628.jpg\";\n\ /*!*************************!*\ !*** ./src/js/index.js ***! \*************************/ -eval("/* global require */\n// CSS\n__webpack_require__(/*! ../css/fontello.css */ \"./src/css/fontello.css\");\n\n__webpack_require__(/*! ../css/style.css */ \"./src/css/style.css\"); // meta tags (social)\n\n\n__webpack_require__(/*! ../img/thumbnail1200x628.jpg */ \"./src/img/thumbnail1200x628.jpg\"); // Instantly load test file (Debugging script)\n// require(\"./LoadJson.js\");\n// Load Save File for opening files, decoding, decryption\n\n\n__webpack_require__(/*! ./LoadSaveFile.js */ \"./src/js/LoadSaveFile.js\"); // Main script for analyzing the decoded save file\n\n\n__webpack_require__(/*! ./HKCheckCompletion.js */ \"./src/js/HKCheckCompletion.js\");\n\n//# sourceURL=webpack://hollow-knight-completion-check/./src/js/index.js?"); +eval("/* global require */\n// CSS\n__webpack_require__(/*! ../css/fontello.css */ \"./src/css/fontello.css\");\n\n__webpack_require__(/*! ../css/simpleicon.css */ \"./src/css/simpleicon.css\");\n\n__webpack_require__(/*! ../css/style.css */ \"./src/css/style.css\"); // meta tags (social)\n\n\n__webpack_require__(/*! ../img/thumbnail1200x628.jpg */ \"./src/img/thumbnail1200x628.jpg\"); // Instantly load test file (Debugging script)\n// require(\"./LoadJson.js\");\n// Load Save File for opening files, decoding, decryption\n\n\n__webpack_require__(/*! ./LoadSaveFile.js */ \"./src/js/LoadSaveFile.js\"); // Main script for analyzing the decoded save file\n\n\n__webpack_require__(/*! ./HKCheckCompletion.js */ \"./src/js/HKCheckCompletion.js\");\n\n//# sourceURL=webpack://hollow-knight-completion-check/./src/js/index.js?"); })(); /******/ })() diff --git a/docs/index.html b/docs/index.html index 899926d..f2ef430 100644 --- a/docs/index.html +++ b/docs/index.html @@ -38,7 +38,7 @@

💰 Support Tool (PayPal)
- ⭐ Official Steam Guide 🉑 Youtube 🉑 Source Code
+ ⭐ Official Steam Guide Youtube 🉑 Source Code
%USERPROFILE%\AppData\LocalLow\Team Cherry\Hollow Knight\
Choose a HK user*.dat save OR [ Decode ] it manually. [ HK Steam Cloud storage ] diff --git a/docs/main.css b/docs/main.css index 12dd4d1..44af802 100644 --- a/docs/main.css +++ b/docs/main.css @@ -62,6 +62,38 @@ .icon-clock:before { content: '\e804'; } /* '' */ .icon-info-circled:before { content: '\e805'; } /* '' */ .icon-ok-squared:before { content: '\f14a'; } /* '' */ +/* SVG from Simple Icons https://github.com/simple-icons/simple-icons */ + +[class^="simpleicon-"], +[class*=" simpleicon-"] { + position: relative; + padding-left: 1.6em; +} + +[class^="simpleicon-"]:before, +[class*=" simpleicon-"]:before { + position: absolute; + display: inline-block; + left: 0; + width: 1.2em; + height: 1.2em; + margin-right: .2em; + text-align: center; + + /* fix buttons height, for twitter bootstrap */ + line-height: 0; + + /* remove if not needed */ + margin-left: .2em; + + /* Uncomment for 3D effect */ + /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ +} + +.simpleicon-youtube:before { + padding-top: 0.2em; + content: url(data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI0IDI0Ij48dGl0bGU+WW91VHViZSBpY29uPC90aXRsZT48cGF0aCBmaWxsPSIjRkYwMDAwIiBkPSJNMjMuNDk4IDYuMTg2YTMuMDE2IDMuMDE2IDAgMCAwLTIuMTIyLTIuMTM2QzE5LjUwNSAzLjU0NSAxMiAzLjU0NSAxMiAzLjU0NXMtNy41MDUgMC05LjM3Ny41MDVBMy4wMTcgMy4wMTcgMCAwIDAgLjUwMiA2LjE4NkMwIDguMDcgMCAxMiAwIDEyczAgMy45My41MDIgNS44MTRhMy4wMTYgMy4wMTYgMCAwIDAgMi4xMjIgMi4xMzZjMS44NzEuNTA1IDkuMzc2LjUwNSA5LjM3Ni41MDVzNy41MDUgMCA5LjM3Ny0uNTA1YTMuMDE1IDMuMDE1IDAgMCAwIDIuMTIyLTIuMTM2QzI0IDE1LjkzIDI0IDEyIDI0IDEyczAtMy45My0uNTAyLTUuODE0ek05LjU0NSAxNS41NjhWOC40MzJMMTUuODE4IDEybC02LjI3MyAzLjU2OHoiLz48L3N2Zz4=); +} /* Font license info ## Font Awesome diff --git a/src/css/simpleicon.css b/src/css/simpleicon.css new file mode 100644 index 0000000..7069817 --- /dev/null +++ b/src/css/simpleicon.css @@ -0,0 +1,32 @@ +/* SVG from Simple Icons https://github.com/simple-icons/simple-icons */ + +[class^="simpleicon-"], +[class*=" simpleicon-"] { + position: relative; + padding-left: 1.6em; +} + +[class^="simpleicon-"]:before, +[class*=" simpleicon-"]:before { + position: absolute; + display: inline-block; + left: 0; + width: 1.2em; + height: 1.2em; + margin-right: .2em; + text-align: center; + + /* fix buttons height, for twitter bootstrap */ + line-height: 0; + + /* remove if not needed */ + margin-left: .2em; + + /* Uncomment for 3D effect */ + /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ +} + +.simpleicon-youtube:before { + padding-top: 0.2em; + content: url("../img/youtube.svg"); +} \ No newline at end of file diff --git a/src/img/github.svg b/src/img/github.svg new file mode 100644 index 0000000..3899712 --- /dev/null +++ b/src/img/github.svg @@ -0,0 +1 @@ +GitHub icon \ No newline at end of file diff --git a/src/img/paypal.svg b/src/img/paypal.svg new file mode 100644 index 0000000..57e5560 --- /dev/null +++ b/src/img/paypal.svg @@ -0,0 +1 @@ +PayPal icon \ No newline at end of file diff --git a/src/img/steam.svg b/src/img/steam.svg new file mode 100644 index 0000000..1a66672 --- /dev/null +++ b/src/img/steam.svg @@ -0,0 +1 @@ +Steam icon \ No newline at end of file diff --git a/src/img/youtube.svg b/src/img/youtube.svg new file mode 100644 index 0000000..4bd6bff --- /dev/null +++ b/src/img/youtube.svg @@ -0,0 +1 @@ +YouTube icon \ No newline at end of file diff --git a/src/index.html b/src/index.html index 7b31333..1ac20cb 100644 --- a/src/index.html +++ b/src/index.html @@ -38,7 +38,7 @@

💰 Support Tool (PayPal)
- ⭐ Official Steam Guide 🉑 Youtube 🉑 Source Code
+ ⭐ Official Steam Guide Youtube 🉑 Source Code
%USERPROFILE%\AppData\LocalLow\Team Cherry\Hollow Knight\
Choose a HK user*.dat save OR [ Decode ] it manually. [ HK Steam Cloud storage ] diff --git a/src/js/index.js b/src/js/index.js index 9f080ba..3e6a4dd 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -1,6 +1,7 @@ /* global require */ // CSS require("../css/fontello.css"); +require("../css/simpleicon.css"); require("../css/style.css"); // meta tags (social)