├── .DS_Store ├── README.md └── Stacker.sketchplugin └── Contents └── Sketch ├── manifest.json ├── stackerx-zero.cocoascript ├── stackerx.cocoascript ├── stackery-zero.cocoascript └── stackery.cocoascript /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ScottSavarie/stacker/acf900dd65b0a45a6e663e472cb0b6a27e5b0d95/.DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Stacker 2 | Stack things in Sketch vertically or horizontally 3 | 4 | 5 | 6 | ![img](http://g.recordit.co/ouzulck483.gif) 7 | 8 | 9 | ## Installation 10 | 11 | 1. Download plugin and double click to install 12 | 13 | 14 | ## Usage 15 | (ctrl + alt + cmd + y) to stack things vertically 16 | (ctrl + alt + cmd + x) to stack things horizontally 17 | 18 | (shift + ctrl + alt + cmd + y) to stack things vertically with no margin 19 | (shift + ctrl + alt + cmd + x) to stack things horizontally with no margin 20 | 21 | You can do this with our without selection on any layers, artboards, or groups. 22 | 23 | 24 | ## Contact 25 | Scott: [@ScottSavarie](https://www.twitter.com/scottsavarie) 26 | 27 | ## Props 28 | Payam [@payamrajabi](https://twitter.com/payamrajabi)for suggesting to make this plugin 29 | -------------------------------------------------------------------------------- /Stacker.sketchplugin/Contents/Sketch/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "author" : "Scott Savarie", 3 | "commands" : [ 4 | { 5 | "name": "Stack Horizontal", 6 | "identifier": "com.bohemiancoding.sketch.stackx", 7 | "shortcut": "ctrl + option + cmd + x", 8 | "script": "stackerx.cocoascript", 9 | "handlers" : { 10 | "run" : "onStackerX" 11 | } 12 | }, 13 | 14 | { 15 | "name": "Stack Vertical", 16 | "identifier": "com.bohemiancoding.sketch.stacky", 17 | "shortcut": "ctrl + option + cmd + y", 18 | "script": "stackery.cocoascript", 19 | "handlers" : { 20 | "run" : "onStackerY" 21 | } 22 | }, 23 | 24 | { 25 | "name": "Stack Horizontal Tight", 26 | "identifier": "com.bohemiancoding.sketch.stackx-zero", 27 | "shortcut": "shift + ctrl + option + cmd + x", 28 | "script": "stackerx-zero.cocoascript", 29 | "handlers" : { 30 | "run" : "onStackerXZero" 31 | } 32 | }, 33 | 34 | { 35 | "name": "Stack Vertical Tight", 36 | "identifier": "com.bohemiancoding.sketch.stacky-zero", 37 | "shortcut": "shift+ ctrl + option + cmd + y", 38 | "script": "stackery-zero.cocoascript", 39 | "handlers" : { 40 | "run" : "onStackerYZero" 41 | } 42 | } 43 | 44 | ], 45 | "menu" : { 46 | "items" : [ 47 | "com.bohemiancoding.sketch.stackx", 48 | "com.bohemiancoding.sketch.stacky", 49 | "com.bohemiancoding.sketch.stackx-zero", 50 | "com.bohemiancoding.sketch.stacky-zero" 51 | ], 52 | "title" : "Stacker" 53 | }, 54 | "identifier" : "com.example.sketch.6bc9eb72-4338-4b17-8cc1-2c19cce9f619", 55 | "version" : "1.1", 56 | "description" : "Stack Selection Vertically or Horizontally", 57 | "authorEmail" : "scottsavarie@gmail.com", 58 | "name" : "Stacker" 59 | } 60 | 61 | -------------------------------------------------------------------------------- /Stacker.sketchplugin/Contents/Sketch/stackerx-zero.cocoascript: -------------------------------------------------------------------------------- 1 | var onStackerXZero = function(context) { 2 | var selection = context.selection; 3 | var doc = context.document 4 | var selectionCount = selection.count(); 5 | var selectedObjects = Array(); 6 | var pageArtboards = doc.currentPage().artboards(); 7 | var artboards = Array(); 8 | 9 | 10 | if(selectionCount > 0) { 11 | for(var i=0; i < selectionCount; i++) { 12 | selectedObjects[i] = context.selection[i]; 13 | } 14 | 15 | selectedObjects.sort(function(a,b){ return a.frame().y() - b.frame().y()}); 16 | 17 | 18 | for (var i = 0; i < selectionCount; i++){ 19 | if(i > 0){ 20 | newX = selectedObjects[i - 1].frame().maxX(); 21 | selectedObjects[i].frame().setX(newX); 22 | } 23 | } 24 | } 25 | 26 | else{ 27 | for(var i=0; i < pageArtboards.count(); i++) { 28 | artboards[i] = pageArtboards[i]; 29 | } 30 | artboards.sort(function(a,b){ return a.frame().x() - b.frame().x()}); 31 | 32 | for (var i = 0; i < pageArtboards.count(); i++){ 33 | if (i > 0){ 34 | newX = artboards[i - 1].frame().maxX(); 35 | artboards[i].frame().setX(newX) 36 | } 37 | } 38 | } 39 | 40 | 41 | 42 | }; 43 | -------------------------------------------------------------------------------- /Stacker.sketchplugin/Contents/Sketch/stackerx.cocoascript: -------------------------------------------------------------------------------- 1 | var onStackerX = function(context) { 2 | var selection = context.selection; 3 | var doc = context.document 4 | var value = doc.askForUserInput_initialValue("Space things by", 5); 5 | var selectionCount = selection.count(); 6 | var selectedObjects = Array(); 7 | var pageArtboards = doc.currentPage().artboards(); 8 | var artboards = Array(); 9 | 10 | 11 | if(selectionCount > 0) { 12 | for(var i=0; i < selectionCount; i++) { 13 | selectedObjects[i] = context.selection[i]; 14 | } 15 | 16 | selectedObjects.sort(function(a,b){ return a.frame().y() - b.frame().y()}); 17 | 18 | 19 | for (var i = 0; i < selectionCount; i++){ 20 | if(i > 0){ 21 | newX = selectedObjects[i - 1].frame().maxX() + value.intValue(); 22 | selectedObjects[i].frame().setX(newX); 23 | } 24 | } 25 | } 26 | 27 | else{ 28 | for(var i=0; i < pageArtboards.count(); i++) { 29 | artboards[i] = pageArtboards[i]; 30 | } 31 | artboards.sort(function(a,b){ return a.frame().x() - b.frame().x()}); 32 | 33 | for (var i = 0; i < pageArtboards.count(); i++){ 34 | if (i > 0){ 35 | newX = artboards[i - 1].frame().maxX() + value.intValue(); 36 | artboards[i].frame().setX(newX) 37 | } 38 | } 39 | } 40 | 41 | 42 | 43 | }; 44 | -------------------------------------------------------------------------------- /Stacker.sketchplugin/Contents/Sketch/stackery-zero.cocoascript: -------------------------------------------------------------------------------- 1 | var onStackerYZero = function(context) { 2 | var selection = context.selection; 3 | var doc = context.document 4 | var selectionCount = selection.count(); 5 | var selectedObjects = Array(); 6 | var pageArtboards = doc.currentPage().artboards(); 7 | var artboards = Array(); 8 | 9 | 10 | if(selectionCount > 0) { 11 | for(var i=0; i < selectionCount; i++) { 12 | selectedObjects[i] = context.selection[i]; 13 | } 14 | 15 | selectedObjects.sort(function(a,b){ return a.frame().y() - b.frame().y()}); 16 | 17 | 18 | for (var i = 0; i < selectionCount; i++){ 19 | yPos = selectedObjects[i].frame().y(); 20 | 21 | if(i > 0){ 22 | newY = selectedObjects[i - 1].frame().maxY(); 23 | selectedObjects[i].frame().setY(newY); 24 | } 25 | } 26 | } 27 | 28 | else{ 29 | for(var i=0; i < pageArtboards.count(); i++) { 30 | artboards[i] = pageArtboards[i]; 31 | } 32 | artboards.sort(function(a,b){ return a.frame().y() - b.frame().y()}); 33 | 34 | for (var i = 0; i < pageArtboards.count(); i++){ 35 | if (i > 0){ 36 | newY = artboards[i - 1].frame().maxY(); 37 | artboards[i].frame().setY(newY) 38 | } 39 | } 40 | } 41 | 42 | }; 43 | -------------------------------------------------------------------------------- /Stacker.sketchplugin/Contents/Sketch/stackery.cocoascript: -------------------------------------------------------------------------------- 1 | var onStackerY = function(context) { 2 | var selection = context.selection; 3 | var doc = context.document 4 | var value = doc.askForUserInput_initialValue("Space things by", 5); 5 | var selectionCount = selection.count(); 6 | var selectedObjects = Array(); 7 | var pageArtboards = doc.currentPage().artboards(); 8 | var artboards = Array(); 9 | 10 | 11 | if(selectionCount > 0) { 12 | for(var i=0; i < selectionCount; i++) { 13 | selectedObjects[i] = context.selection[i]; 14 | } 15 | 16 | selectedObjects.sort(function(a,b){ return a.frame().y() - b.frame().y()}); 17 | 18 | 19 | for (var i = 0; i < selectionCount; i++){ 20 | yPos = selectedObjects[i].frame().y(); 21 | 22 | if(i > 0){ 23 | newY = selectedObjects[i - 1].frame().maxY() + value.intValue(); 24 | selectedObjects[i].frame().setY(newY); 25 | } 26 | } 27 | } 28 | 29 | else{ 30 | for(var i=0; i < pageArtboards.count(); i++) { 31 | artboards[i] = pageArtboards[i]; 32 | } 33 | artboards.sort(function(a,b){ return a.frame().y() - b.frame().y()}); 34 | 35 | for (var i = 0; i < pageArtboards.count(); i++){ 36 | if (i > 0){ 37 | newY = artboards[i - 1].frame().maxY() + value.intValue(); 38 | artboards[i].frame().setY(newY) 39 | } 40 | } 41 | } 42 | 43 | }; 44 | --------------------------------------------------------------------------------