├── .appcast.xml ├── .gitignore ├── .images ├── GGradient.gif └── Main.png ├── GGradient.sketchplugin └── Contents │ └── Sketch │ ├── getgradient.js │ ├── getgradient.js.map │ └── manifest.json ├── README.md ├── package-lock.json └── package.json /.appcast.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # build artifacts 2 | plugin.sketchplugin 3 | 4 | # npm 5 | node_modules 6 | .npm 7 | npm-debug.log 8 | 9 | # mac 10 | .DS_Store 11 | 12 | # WebStorm 13 | .idea 14 | 15 | #src 16 | src 17 | -------------------------------------------------------------------------------- /.images/GGradient.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andexds/ggradient/e6f59d85ead71229f113453d576b87abcbcf26f0/.images/GGradient.gif -------------------------------------------------------------------------------- /.images/Main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andexds/ggradient/e6f59d85ead71229f113453d576b87abcbcf26f0/.images/Main.png -------------------------------------------------------------------------------- /GGradient.sketchplugin/Contents/Sketch/getgradient.js: -------------------------------------------------------------------------------- 1 | var that = this; 2 | function __skpm_run (key, context) { 3 | that.context = context; 4 | 5 | var exports = 6 | /******/ (function(modules) { // webpackBootstrap 7 | /******/ // The module cache 8 | /******/ var installedModules = {}; 9 | /******/ 10 | /******/ // The require function 11 | /******/ function __webpack_require__(moduleId) { 12 | /******/ 13 | /******/ // Check if module is in cache 14 | /******/ if(installedModules[moduleId]) { 15 | /******/ return installedModules[moduleId].exports; 16 | /******/ } 17 | /******/ // Create a new module (and put it into the cache) 18 | /******/ var module = installedModules[moduleId] = { 19 | /******/ i: moduleId, 20 | /******/ l: false, 21 | /******/ exports: {} 22 | /******/ }; 23 | /******/ 24 | /******/ // Execute the module function 25 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 26 | /******/ 27 | /******/ // Flag the module as loaded 28 | /******/ module.l = true; 29 | /******/ 30 | /******/ // Return the exports of the module 31 | /******/ return module.exports; 32 | /******/ } 33 | /******/ 34 | /******/ 35 | /******/ // expose the modules object (__webpack_modules__) 36 | /******/ __webpack_require__.m = modules; 37 | /******/ 38 | /******/ // expose the module cache 39 | /******/ __webpack_require__.c = installedModules; 40 | /******/ 41 | /******/ // define getter function for harmony exports 42 | /******/ __webpack_require__.d = function(exports, name, getter) { 43 | /******/ if(!__webpack_require__.o(exports, name)) { 44 | /******/ Object.defineProperty(exports, name, { 45 | /******/ configurable: false, 46 | /******/ enumerable: true, 47 | /******/ get: getter 48 | /******/ }); 49 | /******/ } 50 | /******/ }; 51 | /******/ 52 | /******/ // define __esModule on exports 53 | /******/ __webpack_require__.r = function(exports) { 54 | /******/ Object.defineProperty(exports, '__esModule', { value: true }); 55 | /******/ }; 56 | /******/ 57 | /******/ // getDefaultExport function for compatibility with non-harmony modules 58 | /******/ __webpack_require__.n = function(module) { 59 | /******/ var getter = module && module.__esModule ? 60 | /******/ function getDefault() { return module['default']; } : 61 | /******/ function getModuleExports() { return module; }; 62 | /******/ __webpack_require__.d(getter, 'a', getter); 63 | /******/ return getter; 64 | /******/ }; 65 | /******/ 66 | /******/ // Object.prototype.hasOwnProperty.call 67 | /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 68 | /******/ 69 | /******/ // __webpack_public_path__ 70 | /******/ __webpack_require__.p = ""; 71 | /******/ 72 | /******/ 73 | /******/ // Load entry module and return exports 74 | /******/ return __webpack_require__(__webpack_require__.s = "./src/getgradient.js"); 75 | /******/ }) 76 | /************************************************************************/ 77 | /******/ ({ 78 | 79 | /***/ "./src/getgradient.js": 80 | /*!****************************!*\ 81 | !*** ./src/getgradient.js ***! 82 | \****************************/ 83 | /*! exports provided: default */ 84 | /***/ (function(module, __webpack_exports__, __webpack_require__) { 85 | 86 | "use strict"; 87 | __webpack_require__.r(__webpack_exports__); 88 | /* harmony default export */ __webpack_exports__["default"] = (function (context) { 89 | var UI = __webpack_require__(/*! sketch/ui */ "sketch/ui"); 90 | 91 | var options = ['scrim-gradient', 'cubic-bezier', 'ease-out-sine']; 92 | var selection = UI.getSelectionFromUser("Choose type of Gradient", options); 93 | var ok = selection[2]; 94 | var index = selection[1]; 95 | 96 | if (!ok) { 97 | UI.message("It was incorrect button 🤔"); 98 | return; 99 | } 100 | 101 | if (context.selection.length > 1) { 102 | UI.message("Only one shape at a time"); 103 | return; 104 | } 105 | 106 | if (context.selection.length < 1) { 107 | UI.message("You must selected shape"); 108 | return; 109 | } 110 | 111 | var selected = context.selection[0]; 112 | var color = selected.style().fills()[0].color().immutableModelObject().stringValueWithAlpha(true); 113 | var style = selected.style().addStylePartOfType(0); 114 | style.isEnabled = true; 115 | style.setFillType(1); 116 | var gradient = style.gradient(); 117 | var r = hexToRgb(color).r; 118 | var g = hexToRgb(color).g; 119 | var b = hexToRgb(color).b; 120 | var sketchStopArray = []; 121 | 122 | switch (index) { 123 | case 0: 124 | { 125 | sketchStopArray.push(makeStop([r, g, b, 0], 1)); 126 | sketchStopArray.push(makeStop([r, g, b, 0.002], 0.982)); 127 | sketchStopArray.push(makeStop([r, g, b, 0.008], 0.952)); 128 | sketchStopArray.push(makeStop([r, g, b, 0.021], 0.91)); 129 | sketchStopArray.push(makeStop([r, g, b, 0.042], 0.861)); 130 | sketchStopArray.push(makeStop([r, g, b, 0.075], 0.802)); 131 | sketchStopArray.push(makeStop([r, g, b, 0.126], 0.73)); 132 | sketchStopArray.push(makeStop([r, g, b, 0.194], 0.65)); 133 | sketchStopArray.push(makeStop([r, g, b, 0.278], 0.565)); 134 | sketchStopArray.push(makeStop([r, g, b, 0.382], 0.47)); 135 | sketchStopArray.push(makeStop([r, g, b, 0.541], 0.34)); 136 | sketchStopArray.push(makeStop([r, g, b, 0.738], 0.19)); 137 | sketchStopArray.push(makeStop([r, g, b, 1], 0)); 138 | break; 139 | } 140 | 141 | case 1: 142 | { 143 | sketchStopArray.push(makeStop([r, g, b, 0], 1)); 144 | sketchStopArray.push(makeStop([r, g, b, 0.01457], 0.912)); 145 | sketchStopArray.push(makeStop([r, g, b, 0.05882], 0.826)); 146 | sketchStopArray.push(makeStop([r, g, b, 0.12126], 0.752)); 147 | sketchStopArray.push(makeStop([r, g, b, 0.19309], 0.687)); 148 | sketchStopArray.push(makeStop([r, g, b, 0.2693], 0.628)); 149 | sketchStopArray.push(makeStop([r, g, b, 0.34817], 0.572)); 150 | sketchStopArray.push(makeStop([r, g, b, 0.42866], 0.517)); 151 | sketchStopArray.push(makeStop([r, g, b, 0.50925], 0.462)); 152 | sketchStopArray.push(makeStop([r, g, b, 0.58891], 0.406)); 153 | sketchStopArray.push(makeStop([r, g, b, 0.66692], 0.348)); 154 | sketchStopArray.push(makeStop([r, g, b, 0.7426], 0.287)); 155 | sketchStopArray.push(makeStop([r, g, b, 0.81522], 0.222)); 156 | sketchStopArray.push(makeStop([r, g, b, 0.88294], 0.153)); 157 | sketchStopArray.push(makeStop([r, g, b, 0.94505], 0.079)); 158 | sketchStopArray.push(makeStop([r, g, b, 1], 0)); 159 | break; 160 | } 161 | 162 | case 2: 163 | { 164 | sketchStopArray.push(makeStop([r, g, b, 0], 1)); 165 | sketchStopArray.push(makeStop([r, g, b, 0.011], 0.906)); 166 | sketchStopArray.push(makeStop([r, g, b, 0.042], 0.814)); 167 | sketchStopArray.push(makeStop([r, g, b, 0.089], 0.729)); 168 | sketchStopArray.push(makeStop([r, g, b, 0.147], 0.65)); 169 | sketchStopArray.push(makeStop([r, g, b, 0.213], 0.577)); 170 | sketchStopArray.push(makeStop([r, g, b, 0.283], 0.509)); 171 | sketchStopArray.push(makeStop([r, g, b, 0.357], 0.445)); 172 | sketchStopArray.push(makeStop([r, g, b, 0.433], 0.384)); 173 | sketchStopArray.push(makeStop([r, g, b, 0.511], 0.325)); 174 | sketchStopArray.push(makeStop([r, g, b, 0.591], 0.268)); 175 | sketchStopArray.push(makeStop([r, g, b, 0.672], 0.213)); 176 | sketchStopArray.push(makeStop([r, g, b, 0.753], 0.159)); 177 | sketchStopArray.push(makeStop([r, g, b, 0.834], 0.106)); 178 | sketchStopArray.push(makeStop([r, g, b, 0.917], 0.053)); 179 | sketchStopArray.push(makeStop([r, g, b, 1], 0)); 180 | break; 181 | } 182 | } 183 | 184 | gradient.setStops(sketchStopArray); 185 | UI.message("That's great 🔥"); 186 | selected.style().fills().splice(0, 1); 187 | }); 188 | 189 | function makeColor(c) { 190 | return MSImmutableColor.colorWithRed_green_blue_alpha(c[0] / 255, c[1] / 255, c[2] / 255, c[3]).newMutableCounterpart(); 191 | } 192 | 193 | function makeStop(color, position) { 194 | return MSGradientStop.stopWithPosition_color_(position, makeColor(color)); 195 | } 196 | 197 | function hexToRgb(hex) { 198 | var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); 199 | return result ? { 200 | r: parseInt(result[1], 16), 201 | g: parseInt(result[2], 16), 202 | b: parseInt(result[3], 16) 203 | } : null; 204 | } 205 | 206 | /***/ }), 207 | 208 | /***/ "sketch/ui": 209 | /*!****************************!*\ 210 | !*** external "sketch/ui" ***! 211 | \****************************/ 212 | /*! no static exports found */ 213 | /***/ (function(module, exports) { 214 | 215 | module.exports = require("sketch/ui"); 216 | 217 | /***/ }) 218 | 219 | /******/ }); 220 | if (key === 'default' && typeof exports === 'function') { 221 | exports(context); 222 | } else { 223 | exports[key](context); 224 | } 225 | } 226 | that['onRun'] = __skpm_run.bind(this, 'default') 227 | 228 | //# sourceMappingURL=getgradient.js.map -------------------------------------------------------------------------------- /GGradient.sketchplugin/Contents/Sketch/getgradient.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack://exports/webpack/bootstrap","webpack://exports/./src/getgradient.js","webpack://exports/external \"sketch/ui\""],"names":["context","UI","require","options","selection","getSelectionFromUser","ok","index","message","length","selected","color","style","fills","immutableModelObject","stringValueWithAlpha","addStylePartOfType","isEnabled","setFillType","gradient","r","hexToRgb","g","b","sketchStopArray","push","makeStop","setStops","splice","makeColor","c","MSImmutableColor","colorWithRed_green_blue_alpha","newMutableCounterpart","position","MSGradientStop","stopWithPosition_color_","hex","result","exec","parseInt"],"mappings":"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","file":"getgradient.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./src/getgradient.js\");\n","export default function(context) {\n const UI = require('sketch/ui')\n\n var options = [\n 'scrim-gradient',\n 'cubic-bezier',\n 'ease-out-sine',\n ]\n var selection = UI.getSelectionFromUser(\"Choose type of Gradient\", options)\n\n var ok = selection[2]\n var index = selection[1]\n if (!ok) {\n UI.message(\"It was incorrect button 🤔\")\n return\n }\n if (context.selection.length > 1) {\n UI.message(\"Only one shape at a time\")\n return\n }\n if (context.selection.length < 1) {\n UI.message(\"You must selected shape\")\n return\n }\n\n const selected = context.selection[0]\n const color = selected.style().fills()[0].color().immutableModelObject().stringValueWithAlpha(true);\n const style = selected.style().addStylePartOfType(0);\n\n style.isEnabled = true;\n style.setFillType(1);\n const gradient = style.gradient()\n\n let r = hexToRgb(color).r\n let g = hexToRgb(color).g\n let b = hexToRgb(color).b\n\n var sketchStopArray = []\n\n switch (index) {\n case 0: {\n sketchStopArray.push(makeStop([r, g, b, 0], 1))\n sketchStopArray.push(makeStop([r, g, b, 0.002], 0.982))\n sketchStopArray.push(makeStop([r, g, b, 0.008], 0.952))\n sketchStopArray.push(makeStop([r, g, b, 0.021], 0.91))\n sketchStopArray.push(makeStop([r, g, b, 0.042], 0.861))\n sketchStopArray.push(makeStop([r, g, b, 0.075], 0.802))\n sketchStopArray.push(makeStop([r, g, b, 0.126], 0.73))\n sketchStopArray.push(makeStop([r, g, b, 0.194], 0.65))\n sketchStopArray.push(makeStop([r, g, b, 0.278], 0.565))\n sketchStopArray.push(makeStop([r, g, b, 0.382], 0.47))\n sketchStopArray.push(makeStop([r, g, b, 0.541], 0.34))\n sketchStopArray.push(makeStop([r, g, b, 0.738], 0.19))\n sketchStopArray.push(makeStop([r, g, b, 1], 0))\n break\n }\n case 1: {\n sketchStopArray.push(makeStop([r, g, b, 0], 1))\n sketchStopArray.push(makeStop([r, g, b, 0.01457], 0.912))\n sketchStopArray.push(makeStop([r, g, b, 0.05882], 0.826))\n sketchStopArray.push(makeStop([r, g, b, 0.12126], 0.752))\n sketchStopArray.push(makeStop([r, g, b, 0.19309], 0.687))\n sketchStopArray.push(makeStop([r, g, b, 0.2693], 0.628))\n sketchStopArray.push(makeStop([r, g, b, 0.34817], 0.572))\n sketchStopArray.push(makeStop([r, g, b, 0.42866], 0.517))\n sketchStopArray.push(makeStop([r, g, b, 0.50925], 0.462))\n sketchStopArray.push(makeStop([r, g, b, 0.58891], 0.406))\n sketchStopArray.push(makeStop([r, g, b, 0.66692], 0.348))\n sketchStopArray.push(makeStop([r, g, b, 0.7426], 0.287))\n sketchStopArray.push(makeStop([r, g, b, 0.81522], 0.222))\n sketchStopArray.push(makeStop([r, g, b, 0.88294], 0.153))\n sketchStopArray.push(makeStop([r, g, b, 0.94505], 0.079))\n sketchStopArray.push(makeStop([r, g, b, 1], 0))\n break\n }\n case 2: {\n sketchStopArray.push(makeStop([r, g, b, 0], 1))\n sketchStopArray.push(makeStop([r, g, b, 0.011], 0.906))\n sketchStopArray.push(makeStop([r, g, b, 0.042], 0.814))\n sketchStopArray.push(makeStop([r, g, b, 0.089], 0.729))\n sketchStopArray.push(makeStop([r, g, b, 0.147], 0.65))\n sketchStopArray.push(makeStop([r, g, b, 0.213], 0.577))\n sketchStopArray.push(makeStop([r, g, b, 0.283], 0.509))\n sketchStopArray.push(makeStop([r, g, b, 0.357], 0.445))\n sketchStopArray.push(makeStop([r, g, b, 0.433], 0.384))\n sketchStopArray.push(makeStop([r, g, b, 0.511], 0.325))\n sketchStopArray.push(makeStop([r, g, b, 0.591], 0.268))\n sketchStopArray.push(makeStop([r, g, b, 0.672], 0.213))\n sketchStopArray.push(makeStop([r, g, b, 0.753], 0.159))\n sketchStopArray.push(makeStop([r, g, b, 0.834], 0.106))\n sketchStopArray.push(makeStop([r, g, b, 0.917], 0.053))\n sketchStopArray.push(makeStop([r, g, b, 1], 0))\n break\n }\n\n }\n\n gradient.setStops(sketchStopArray)\n\n UI.message(\"That's great 🔥\")\n selected.style().fills().splice(0,1)\n}\n\nfunction makeColor(c) {\n return MSImmutableColor.colorWithRed_green_blue_alpha(\n c[0] / 255,\n c[1] / 255,\n c[2] / 255,\n c[3]\n ).newMutableCounterpart()\n}\n\nfunction makeStop(color, position) {\n return MSGradientStop.stopWithPosition_color_(position, makeColor(color))\n}\n\nfunction hexToRgb(hex) {\n var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n } : null;\n}\n","module.exports = require(\"sketch/ui\");"],"sourceRoot":""} -------------------------------------------------------------------------------- /GGradient.sketchplugin/Contents/Sketch/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "GGradient", 3 | "identifier": "com.andexds.ggradient", 4 | "description": "Perfect Gradient", 5 | "authorEmail": "andexds@gmail.com", 6 | "author": "Andrey Anashkin", 7 | "compatibleVersion": 3, 8 | "bundleVersion": 1, 9 | "icon": "icon.png", 10 | "commands": [ 11 | { 12 | "script": "getgradient.js", 13 | "shortcut": "ctrl shift g", 14 | "name": "Get Gradient", 15 | "identifier": "andexds.getgradient" 16 | } 17 | ], 18 | "version": "0.4.0", 19 | "disableCocoaScriptPreprocessor": true, 20 | "appcast": "https://raw.githubusercontent.com/andex/ggradient/master/.appcast.xml" 21 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GGradient 2 | 3 | 4 | GGradient sketch plugin – simple way to create an ease-out gradient 5 | 6 | 7 | ![Using GGradient](.images/GGradient.gif) 8 | 9 | 10 | # Download GGradient Plugin 11 | 12 | 13 | Double click the downloaded file (*GGradient.sketchplugin*) to install it. 14 | 15 | ## Hot key 16 | 17 | Use CMD+SHIFT+G 18 | 19 | ## Do you like the plugin? 20 | 21 | **If you are using this plugin, please 'star' this project**. It's a simple way for me to be able to see how many people are using this, and how much effort I need to put into improving it further. 22 | 23 | If you ***love*** this plugin, why not shout me a coffee ☕️ via [PayPal](https://paypal.me/andexds/3) to share the love! 24 | It will definitely help me to be able to support this plugin further. 25 | 26 | 27 | ☕️ Shout me a coffee 28 | 29 | 30 | Follow me on https://www.facebook.com/andexds 31 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "GGradient", 3 | "version": "0.6.0", 4 | "description": "Simple way to create perfect gradient", 5 | "engines": { 6 | "sketch": ">=4.0" 7 | }, 8 | "skpm": { 9 | "name": "GGradient", 10 | "manifest": "src/manifest.json", 11 | "main": "GGradient.sketchplugin", 12 | "assets": [ 13 | "assets/**/*" 14 | ] 15 | }, 16 | "scripts": { 17 | "build": "skpm-build", 18 | "watch": "skpm-build --watch", 19 | "start": "skpm-build --watch --run", 20 | "postinstall": "npm run build && skpm-link" 21 | }, 22 | "devDependencies": { 23 | "@skpm/builder": "^0.5.2" 24 | }, 25 | "repository": { 26 | "type": "git", 27 | "url": "https://github.com/andex/ggradient.git" 28 | } 29 | } 30 | --------------------------------------------------------------------------------