├── Constraint Demos.sketch ├── Fluid.sketchplugin └── Contents │ ├── Resources │ └── Fluid.bundle │ │ └── Contents │ │ ├── Info.plist │ │ ├── MacOS │ │ └── Fluid │ │ └── Resources │ │ ├── Assets.car │ │ ├── MCArtboardPreviewWindowController.nib │ │ ├── MCLayerConstraintsInspector.nib │ │ ├── MCSActionBar.nib │ │ ├── MCSSettingsWindow.nib │ │ ├── MCSizePresetsListView.nib │ │ └── MCSketchPluginFramework.framework │ │ ├── Headers │ │ ├── MCSketchPluginFramework │ │ ├── Modules │ │ ├── Resources │ │ └── Versions │ │ ├── A │ │ ├── Headers │ │ │ ├── MCSPluginController.h │ │ │ ├── MCSPluginUpdater.h │ │ │ ├── MCSPluginUserDefaults.h │ │ │ ├── MCSPluginUserDefaultsController.h │ │ │ ├── MCSketchPluginFramework.h │ │ │ ├── MochaRuntime.h │ │ │ ├── SketchRuntime.h │ │ │ └── Utilities.h │ │ ├── MCSketchPluginFramework │ │ ├── Modules │ │ │ └── module.modulemap │ │ └── Resources │ │ │ ├── Info.plist │ │ │ └── MCSPluginUpdatePromptWindow.nib │ │ └── Current │ └── Sketch │ ├── SketchLibrary.js │ ├── commands.js │ ├── dynamicCommands.js │ ├── main.js │ └── manifest.json ├── README.md └── README ├── constraint-inspector-relativity.png ├── constraint-inspector.png ├── fluid-runner.png ├── preview-mode.png ├── screenshot.png ├── sizes-popover.png └── toolbar.png /Constraint Demos.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/Constraint Demos.sketch -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 15G31 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | Fluid 11 | CFBundleIdentifier 12 | matt-curtis.Fluid 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Fluid 17 | CFBundlePackageType 18 | BNDL 19 | CFBundleShortVersionString 20 | 1.7.6 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 1 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 8C1002 33 | DTPlatformVersion 34 | GM 35 | DTSDKBuild 36 | 16C58 37 | DTSDKName 38 | macosx10.12 39 | DTXcode 40 | 0821 41 | DTXcodeBuild 42 | 8C1002 43 | NSHumanReadableCopyright 44 | Copyright © 2015 Matt. All rights reserved. 45 | 46 | 47 | -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/MacOS/Fluid: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/MacOS/Fluid -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/Assets.car: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/Assets.car -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCArtboardPreviewWindowController.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCArtboardPreviewWindowController.nib -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCLayerConstraintsInspector.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCLayerConstraintsInspector.nib -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSActionBar.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSActionBar.nib -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSSettingsWindow.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSSettingsWindow.nib -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSizePresetsListView.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSizePresetsListView.nib -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/MCSketchPluginFramework: -------------------------------------------------------------------------------- 1 | Versions/Current/MCSketchPluginFramework -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Modules: -------------------------------------------------------------------------------- 1 | Versions/Current/Modules -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Versions/A/Headers/MCSPluginController.h: -------------------------------------------------------------------------------- 1 | // 2 | // MCSPluginController.h 3 | // MCSketchPluginFramework 4 | // 5 | // Created by Matt Curtis on 10/11/15. 6 | // Copyright © 2015 Matt. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "SketchRuntime.h" 12 | 13 | #import "MochaRuntime.h" 14 | 15 | #import "MCSPluginUserDefaults.h" 16 | 17 | #import "MCSPluginUpdater.h" 18 | 19 | 20 | // Notifications 21 | 22 | extern NSString *const MCSPluginSelectionDidChangeNotification; 23 | 24 | extern NSString *const MCSPluginCurrentArtboardDidChangeNotification; 25 | 26 | extern NSString *const MCSPluginCurrentDocumentDidChangeNotification; 27 | 28 | extern NSString *const MCSPluginAllDocumentsClosedNotification; 29 | 30 | // Notification Keys 31 | 32 | extern NSString *const MCSPluginNotificationDocumentKey; 33 | 34 | extern NSString *const MCSPluginNotificationDocumentWindowKey; 35 | 36 | 37 | @interface MCSPluginController : NSObject 38 | 39 | @property (nonatomic, readonly) NSString *loadedVersion; 40 | 41 | 42 | @property (nonatomic) MSPluginCommand *pluginCommand; 43 | 44 | @property (nonatomic) MSPluginBundle *plugin; 45 | 46 | @property (nonatomic, readonly) MCSPluginUserDefaults *userDefaults; 47 | 48 | 49 | + (instancetype) pluginController:(MSPluginBundle*)plugin pluginCommand:(MSPluginCommand*)pluginCommand; 50 | 51 | + (instancetype) pluginController; 52 | 53 | 54 | + (NSAlert*) alertWithTitle:(NSString*)title information:(NSString*)information run:(BOOL)run; 55 | 56 | + (NSAlert*) alertWithTitle:(NSString*)title information:(NSString*)information; 57 | 58 | 59 | - (void) allDocumentsDidClose; 60 | 61 | - (void) currentDocumentDidChange:(NSNotification*)notification; 62 | 63 | - (void) currentSelectionDidChange:(NSNotification*)notification; 64 | 65 | - (void) currentArtboardDidChange:(NSNotification*)notification; 66 | 67 | @end 68 | -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Versions/A/Headers/MCSPluginUpdater.h: -------------------------------------------------------------------------------- 1 | // 2 | // MCSPluginUpdater.h 3 | // MCSketchPluginFramework 4 | // 5 | // Created by Matt Curtis on 11/23/15. 6 | // Copyright © 2015 Matt. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @interface MCSPluginUpdater : NSObject 13 | 14 | @property (nonatomic) NSString *pluginIdentifier; 15 | 16 | @property (nonatomic) NSString *pluginName; 17 | 18 | 19 | - (BOOL) isNewerPluginBundleAvailableLocally:(NSString*)loadedVersion; 20 | 21 | - (void) showUpdateRestartPrompt; 22 | 23 | - (void) relaunchSketch; 24 | 25 | @end -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Versions/A/Headers/MCSPluginUserDefaults.h: -------------------------------------------------------------------------------- 1 | // 2 | // MCSPluginUserDefaults.h 3 | // MCSketchPluginFramework 4 | // 5 | // Created by Matt Curtis on 11/23/15. 6 | // Copyright © 2015 Matt. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface MCSPluginUserDefaults : NSUserDefaults 12 | 13 | @property (nonatomic) NSString *pluginIdentifier; 14 | 15 | @end -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Versions/A/Headers/MCSPluginUserDefaultsController.h: -------------------------------------------------------------------------------- 1 | // 2 | // MCSPluginUserDefaultsController.h 3 | // MCSketchPluginFramework 4 | // 5 | // Created by Matt Curtis on 11/23/15. 6 | // Copyright © 2015 Matt. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "MCSPluginUserDefaults.h" 12 | 13 | 14 | @interface MCSPluginUserDefaultsController : NSUserDefaultsController 15 | 16 | - (MCSPluginUserDefaults*) userDefaultsProxy; 17 | 18 | @end -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Versions/A/Headers/MCSketchPluginFramework.h: -------------------------------------------------------------------------------- 1 | // 2 | // MCSketchPluginFramework.h 3 | // MCSketchPluginFramework 4 | // 5 | // Created by Matt Curtis on 10/2/15. 6 | // Copyright © 2015 Matt. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for MCSketchPluginFramework. 12 | FOUNDATION_EXPORT double MCSketchPluginFrameworkVersionNumber; 13 | 14 | //! Project version string for MCSketchPluginFramework. 15 | FOUNDATION_EXPORT const unsigned char MCSketchPluginFrameworkVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | #import 20 | 21 | #import 22 | 23 | #import 24 | 25 | #import 26 | 27 | #import 28 | 29 | #import 30 | 31 | #import -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Versions/A/Headers/MochaRuntime.h: -------------------------------------------------------------------------------- 1 | // 2 | // MochaRuntime.h 3 | // MCSketchPluginFramework 4 | // 5 | // Created by Matt Curtis on 10/2/15. 6 | // Copyright © 2015 Matt. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import 12 | 13 | 14 | #define MOJavaScriptObject_Class GetClass(@"MOJavaScriptObject") 15 | 16 | @interface MOJavaScriptObject : NSObject 17 | 18 | @property (readonly) JSObjectRef JSObject; 19 | 20 | @property (readonly) JSContextRef JSContext; 21 | 22 | @end -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Versions/A/Headers/SketchRuntime.h: -------------------------------------------------------------------------------- 1 | // 2 | // Sketch.h 3 | // 4 | // Created by Matt Curtis on 9/9/15. 5 | // Copyright (c) 2015 Matt. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | #import 11 | 12 | 13 | #pragma mark - 14 | #pragma mark Foward Classes 15 | 16 | @class MSPage, MSLayer, MSArtboardGroup, MSContentDrawView, MSArray, MSLayerGroup, MSDocumentWindow; 17 | 18 | 19 | #pragma mark - 20 | #pragma mark Protocols 21 | 22 | @protocol MSPageDelegate 23 | 24 | - (void) layerSelectionDidChange; 25 | 26 | - (void) currentArtboardDidChange; 27 | 28 | @end 29 | 30 | 31 | #pragma mark - 32 | #pragma mark Data Structures 33 | 34 | #define MSArray_Class GetClass(@"MSArray") 35 | 36 | @interface MSArray : NSObject 37 | 38 | @property (readonly, copy, nonatomic) NSArray *array; 39 | 40 | @end 41 | 42 | #define MSLayerArray_Class GetClass(@"MSLayerArray") 43 | 44 | @interface MSLayerArray : NSObject 45 | 46 | @property (copy, nonatomic) NSArray *layers; 47 | 48 | + (instancetype) arrayWithLayers:(NSArray*)layers; 49 | 50 | @end 51 | 52 | 53 | #pragma mark - 54 | #pragma mark Event Handler 55 | 56 | #define MSEventHandler_Class GetClass(@"MSEventHandler") 57 | 58 | @interface MSEventHandler : NSObject 59 | 60 | - (void) writeLayers:(MSLayerArray*)layers toPasteboard:(NSPasteboard*)pasteboard; 61 | 62 | @end 63 | 64 | #define MSEventHandlerManager_Class GetClass(@"MSEventHandlerManager") 65 | 66 | @interface MSEventHandlerManager : NSObject 67 | 68 | //@property (nonatomic) MSNormalEventHandler *normalHandler; 69 | @property (nonatomic) MSEventHandler *normalHandler; 70 | 71 | @end 72 | 73 | 74 | 75 | #pragma mark - 76 | #pragma mark Document Classes 77 | 78 | #define MSDocument_Class GetClass(@"MSDocument") 79 | 80 | @interface MSDocument : NSDocument 81 | 82 | - (void) saveArtboardOrSlice:(id)artboardOrSlice toFile:(NSString*)filePath; 83 | 84 | - (MSPage*) currentPage; 85 | 86 | - (void) setCurrentPage:(MSPage*)page; 87 | 88 | - (NSArray*) pages; 89 | 90 | 91 | - (MSEventHandler*) currentHandler; 92 | 93 | 94 | @property (retain, nonatomic) MSEventHandlerManager *eventHandlerManager; 95 | 96 | 97 | - (MSDocumentWindow*) window; 98 | 99 | + (MSDocument*) currentDocument; 100 | 101 | - (NSArray*) selectedLayers; 102 | 103 | 104 | - (MSContentDrawView*) currentView; 105 | 106 | 107 | - (NSUndoManager*) undoManager; 108 | 109 | @end 110 | 111 | #define MSRect_Class GetClass(@"MSRect") 112 | 113 | @interface MSRect : NSObject 114 | 115 | @property (nonatomic) double y; 116 | @property (nonatomic) double x; 117 | @property (nonatomic) double width; 118 | @property (nonatomic) double height; 119 | 120 | @property (nonatomic) CGPoint origin; 121 | @property (nonatomic) CGSize size; 122 | @property (nonatomic) CGRect rect; 123 | 124 | @property (nonatomic) BOOL constrainProportions; 125 | 126 | - (instancetype) scaleBy:(double)scaleBy; 127 | 128 | - (void) makeRectIntegral; 129 | 130 | - (void) makeOriginIntegral; 131 | 132 | @end 133 | 134 | #define MSAbsoluteRect_Class GetClass(@"MSAbsoluteRect") 135 | 136 | @interface MSAbsoluteRect : NSObject 137 | 138 | - (CGRect) rect; 139 | 140 | @end 141 | 142 | #define MSLayer_Class GetClass(@"MSLayer") 143 | 144 | @interface MSLayer : NSObject 145 | 146 | @property (nonatomic) NSString *name; 147 | 148 | @property (readonly, nonatomic) BOOL nameIsFixed; 149 | 150 | 151 | @property (nonatomic) id sharedObjectID; 152 | 153 | @property (readonly, copy, nonatomic) NSObject *objectID; 154 | 155 | @property (readonly, nonatomic) NSObject *originalObjectID; 156 | 157 | 158 | @property (nonatomic) CGPoint origin; 159 | 160 | @property (nonatomic) CGRect rect; 161 | 162 | @property (retain, nonatomic) MSRect *frame; 163 | 164 | @property (nonatomic) MSAbsoluteRect *absoluteRect; 165 | 166 | 167 | @property (nonatomic) BOOL isSelected; 168 | 169 | @property (nonatomic) BOOL isHovering; 170 | 171 | 172 | - (void) select:(BOOL)select byExpandingSelection:(BOOL)expandSelection showSelection:(BOOL)showSelection; 173 | 174 | - (void) select:(BOOL)select byExpandingSelection:(BOOL)expandSelection; 175 | 176 | 177 | - (MSLayerGroup*) parentGroup; 178 | 179 | - (MSPage*) parentPage; 180 | 181 | - (MSArtboardGroup*) parentArtboard; 182 | 183 | 184 | - (instancetype) duplicate; 185 | 186 | 187 | - (void) removeFromParent; 188 | 189 | 190 | - (BOOL) isSharedObject; 191 | 192 | - (BOOL) isSymbol; 193 | 194 | - (BOOL) containsSymbols; 195 | 196 | - (BOOL) parentOrSelfIsSymbol; 197 | 198 | @end 199 | 200 | #define MSLayerGroup_Class GetClass(@"MSLayerGroup") 201 | 202 | @interface MSLayerGroup : MSLayer 203 | 204 | @property (nonatomic) MSArray *layers; 205 | 206 | - (void) removeAllLayers; 207 | - (void) removeLayerAtIndex:(NSInteger)index; 208 | - (void) removeLayer:(MSLayer*)layer; 209 | 210 | - (void) insertLayers:(NSArray*)layers atIndex:(NSInteger)index; 211 | - (void) insertLayers:(NSArray*)layers afterLayer:(MSLayer*)afterLayer; 212 | - (void) insertLayers:(NSArray*)arg1 beforeLayer:(MSLayer*)beforeLayer; 213 | 214 | - (void) replaceLayersWithLayers:(NSArray*)layers; 215 | - (void) addLayers:(NSArray*)layers; 216 | 217 | - (MSLayer*) addLayerOfType:(NSString*)type; 218 | 219 | - (BOOL) resizeToFitChildrenWithOption:(long long)arg1; 220 | 221 | @end 222 | 223 | #define MSPage_Class GetClass(@"MSPage") 224 | 225 | @interface MSPage : MSLayerGroup 226 | 227 | @property (nonatomic) double zoomValue; 228 | 229 | @property(nonatomic) CGPoint scrollOrigin; 230 | 231 | - (NSArray*) artboards; 232 | 233 | - (MSArtboardGroup*) currentArtboard; 234 | 235 | @end 236 | 237 | #define MSExportFormat_Class GetClass(@"MSExportFormat") 238 | 239 | @interface MSExportFormat : NSObject 240 | 241 | + (instancetype) formatWithScale:(double)scale name:(NSString*)name fileFormat:(NSString*)fileFormat; 242 | 243 | @end 244 | 245 | #define MSExportRequest_Class GetClass(@"MSExportRequest") 246 | 247 | @interface MSExportRequest : NSObject 248 | 249 | + (NSArray*) exportRequestsFromExportableLayer:(MSLayer*)layer exportFormats:(NSArray*)formats useIDForName:(BOOL)useIDForName; 250 | 251 | @property (nonatomic) BOOL includeArtboardBackground; 252 | 253 | @end 254 | 255 | #define MSExporter_Class GetClass(@"MSExporter") 256 | 257 | @interface MSExporter : NSObject 258 | 259 | + (instancetype) exporterForRequest:(MSExportRequest*)exportRequest colorSpace:(NSColorSpace*)colorSpace; 260 | 261 | - (NSData*) PNGData; 262 | 263 | @end 264 | 265 | #define MSArtboardGroup_Class GetClass(@"MSArtboardGroup") 266 | 267 | @interface MSArtboardGroup : MSLayerGroup 268 | 269 | @property (nonatomic) BOOL includeBackgroundColorInExport; 270 | @property (nonatomic) BOOL hasBackgroundColor; 271 | 272 | @end 273 | 274 | #define MSTextLayer_Class GetClass(@"MSTextLayer") 275 | 276 | @interface MSTextLayer : MSLayer 277 | 278 | @property (nonatomic) double fontSize; 279 | 280 | @property (nonatomic, copy) NSAttributedString *attributedStringValue; 281 | 282 | @end 283 | 284 | #define MSShapeGroup_Class GetClass(@"MSShapeGroup") 285 | 286 | @interface MSShapeGroup : MSLayerGroup 287 | 288 | - (void) prepareAsMask; 289 | 290 | @end 291 | 292 | 293 | #pragma mark - 294 | #pragma mark Plugins 295 | 296 | #define MSPluginCommand_Class GetClass(@"MSPluginCommand") 297 | 298 | @interface MSPluginCommand : NSObject 299 | 300 | // Supports arrays, dictionaries, numbers and strings 301 | 302 | - (void) setValue:(id)value forKey:(NSString*)key onLayer:(MSLayer*)layer; 303 | - (id) valueForKey:(NSString*)key onLayer:(MSLayer*)layer; 304 | 305 | - (void) setValue:(id)value forKey:(NSString*)key onLayer:(MSLayer*)layer forPluginIdentifier:(NSString*)pluginIdentifier; 306 | - (id) valueForKey:(NSString*)key onLayer:(MSLayer*)layer forPluginIdentifier:(NSString*)pluginIdentifier; 307 | 308 | @end 309 | 310 | #define MSPluginBundle_Class GetClass(@"MSPluginBundle") 311 | 312 | @interface MSPluginBundle : NSObject 313 | 314 | @property (readonly, nonatomic) NSURL *manifestURL; 315 | @property (readonly, nonatomic) NSString *authorEmail; 316 | @property (readonly, nonatomic) NSString *author; 317 | @property (readonly, nonatomic) NSURL *homepageURL; 318 | @property (readonly, nonatomic) NSString *pluginDescription; 319 | @property (readonly, nonatomic) NSString *identifier; 320 | @property (readonly, nonatomic) NSString *name; 321 | @property (readonly, nonatomic) NSString *version; 322 | @property (readonly, nonatomic) NSDictionary *commands; 323 | @property (readonly, nonatomic) NSURL *url; 324 | 325 | - (id) urlForResourceNamed:(NSString*)resourceName; 326 | 327 | @end 328 | 329 | #define MSPluginManager_Class GetClass(@"MSPluginManager") 330 | 331 | @interface MSPluginManager : NSObject 332 | 333 | + (id) pluginsURL; 334 | 335 | @property (readonly, copy, nonatomic) NSURL *pluginsFolderURL; // @synthesize pluginsFolderURL=_pluginsFolderURL; 336 | @property (copy, nonatomic) NSDictionary *plugins; 337 | 338 | - (void) reloadPlugins; 339 | - (NSDictionary*) pluginsFromFolderAtURL:(NSURL*)url visitedURLs:(NSArray*)visitedURLs relativeFolderPath:(NSString*)relativeFolderPath; 340 | 341 | @end 342 | 343 | 344 | #pragma mark - 345 | #pragma mark Interface Classes 346 | 347 | #define MSDocumentWindow_Class GetClass(@"MSDocumentWindow") 348 | 349 | @interface MSDocumentWindow : NSWindow 350 | 351 | @end 352 | 353 | #define MSContentDrawView_Class GetClass(@"MSContentDrawView") 354 | 355 | @interface MSContentDrawView : NSView 356 | 357 | @end 358 | 359 | 360 | #pragma mark - 361 | #pragma mark Application 362 | 363 | @interface AppController : NSObject 364 | 365 | @property (retain, nonatomic) MSPluginManager *pluginManager; 366 | 367 | //@property (retain, nonatomic) MSPasteboardManager *pasteboardManager; 368 | 369 | @end 370 | 371 | #define MSArtboardPresetStore_Class GetClass(@"MSArtboardPresetStore") 372 | 373 | @interface MSArtboardPresetStore : NSObject 374 | 375 | + (NSURL*) systemPresetsURL; 376 | - (NSURL*) userPresetsURL; 377 | 378 | @end 379 | -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Versions/A/Headers/Utilities.h: -------------------------------------------------------------------------------- 1 | // 2 | // Utilities.h 3 | // MCSketchPluginFramework 4 | // 5 | // Created by Matt Curtis on 10/2/15. 6 | // Copyright © 2015 Matt. All rights reserved. 7 | // 8 | 9 | #import "SketchRuntime.h" 10 | 11 | #import "MochaRuntime.h" 12 | 13 | 14 | #ifndef Utilities_h 15 | #define Utilities_h 16 | 17 | #pragma mark - 18 | #pragma mark General 19 | 20 | Class GetClass(NSString *className); 21 | 22 | 23 | #pragma mark - 24 | #pragma mark Mocha 25 | 26 | JSContext *JSContextOfMochaObject(MOJavaScriptObject *mochaObject); 27 | 28 | JSValue *JSValueFromMochaObject(MOJavaScriptObject *mochaObject); 29 | 30 | 31 | #pragma mark - 32 | #pragma mark Text 33 | 34 | CGFloat Sketch_GetTextHeight(CGFloat desiredTextWidth, MSTextLayer *textLayer); 35 | 36 | CGSize Sketch_GetTextSize(MSTextLayer *textLayer); 37 | 38 | 39 | #pragma mark - 40 | #pragma mark Layer Creation 41 | 42 | MSShapeGroup *Sketch_CreateShapeLayer(); 43 | 44 | MSTextLayer *Sketch_CreateTextLayer(); 45 | 46 | 47 | #pragma mark - 48 | #pragma mark Document 49 | 50 | MSDocument *Sketch_GetCurrentDocument(); 51 | 52 | 53 | #pragma mark - 54 | #pragma mark Page 55 | 56 | MSPage *Sketch_GetCurrentPage(); 57 | 58 | 59 | #pragma mark - 60 | #pragma mark Undo Registration 61 | 62 | void Sketch_DisableUndoRegistration(MSDocument *document); 63 | 64 | void Sketch_EnableUndoRegistration(MSDocument *document); 65 | 66 | void Sketch_DisableUndoRegistrationInBlock(MSDocument *document, void(^block)()); 67 | 68 | 69 | #pragma mark - 70 | #pragma mark Selection 71 | 72 | NSArray *Sketch_GetSelectedLayers(MSDocument *document); 73 | 74 | NSArray *Sketch_GetSelectedArtboards(MSDocument *document, BOOL linear, BOOL includeCurrentOrOnly); 75 | 76 | 77 | #pragma mark - 78 | #pragma mark Artboards 79 | 80 | MSArtboardGroup *Sketch_GetCurrentArtboard(MSDocument *document); 81 | 82 | MSArtboardGroup *Sketch_GetCurrentOrOnlyArtboard(MSDocument *document); 83 | 84 | 85 | #pragma mark - 86 | #pragma mark Geometry 87 | 88 | CGRect Sketch_MSRectToCGRect(MSRect *rect); 89 | 90 | NSRect Sketch_MSRectToNSRect(MSRect *rect); 91 | 92 | void Sketch_SetMSRectWithCGRect(MSRect *msrect, CGRect cgrect); 93 | 94 | void Sketch_SetMSRectWithNSRect(MSRect *msrect, NSRect nsrect); 95 | 96 | 97 | CGRect Sketch_GetAbsoluteLayerFrame(MSLayer *layer); 98 | 99 | CGRect Sketch_GetLayerFrameInContentDrawView(MSLayer *layer); 100 | 101 | CGRect Sketch_GetLayerFrameInWindow(MSLayer *layer, MSDocument *document); 102 | 103 | CGRect Sketch_GetLayerFrameInScreen(MSLayer *layer, MSDocument *document); 104 | 105 | 106 | #pragma mark - 107 | #pragma mark Layer to Images 108 | 109 | NSData *Sketch_GetImageDataFromLayer(MSLayer *layer, double scale); 110 | 111 | NSImage *Sketch_GetImageFromLayer(MSLayer *layer, double scale); 112 | 113 | #endif /* Utilities_h */ 114 | -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Versions/A/MCSketchPluginFramework: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Versions/A/MCSketchPluginFramework -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Versions/A/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module MCSketchPluginFramework { 2 | umbrella header "MCSketchPluginFramework.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 15G31 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | MCSketchPluginFramework 11 | CFBundleIdentifier 12 | matt-curtis.MCSketchPluginFramework 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | MCSketchPluginFramework 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.1.2 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 1 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 8C1002 33 | DTPlatformVersion 34 | GM 35 | DTSDKBuild 36 | 16C58 37 | DTSDKName 38 | macosx10.12 39 | DTXcode 40 | 0821 41 | DTXcodeBuild 42 | 8C1002 43 | NSHumanReadableCopyright 44 | Copyright © 2015 Matt. All rights reserved. 45 | 46 | 47 | -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Versions/A/Resources/MCSPluginUpdatePromptWindow.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Versions/A/Resources/MCSPluginUpdatePromptWindow.nib -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Resources/Fluid.bundle/Contents/Resources/MCSketchPluginFramework.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /Fluid.sketchplugin/Contents/Sketch/SketchLibrary.js: -------------------------------------------------------------------------------- 1 | // 2 | // SketchLibrary.js 3 | // 4 | // Created by Matt Curtis 5 | // Copyright (c) 2015. All rights reserved. 6 | // 7 | 8 | (function(){ 9 | var global = this; 10 | 11 | // 12 | // EXTEND DEFAULT OBJECTS 13 | // ---------------------- 14 | // 15 | 16 | String.prototype.toNSString = function(){ 17 | return NSString.alloc().initWithString(this+""); 18 | }; 19 | 20 | // 21 | // INTERNAL UTILITIES 22 | // ------------------ 23 | // 24 | 25 | var createProp = function(object, propertyName, config){ 26 | if(typeof config.enumerable == "undefined"){ 27 | config.enumerable = true; 28 | } 29 | 30 | Object.defineProperty(object, propertyName, config); 31 | }; 32 | 33 | // 34 | // DEFINE CORE 35 | // ----------- 36 | // 37 | 38 | var core = function(layer){ 39 | return new LayerWrapper(layer); 40 | }; 41 | 42 | global.$ = core; 43 | 44 | // 45 | // CONTEXT 46 | // ------- 47 | // 48 | 49 | var ctx; 50 | 51 | createProp(core, "context", { 52 | get: function(){ 53 | return ctx; 54 | }, 55 | 56 | set: function(value){ 57 | ctx = value; 58 | } 59 | }); 60 | 61 | createProp(core, "ctx", { 62 | get: function(){ 63 | return ctx; 64 | }, 65 | 66 | set: function(value){ 67 | ctx = value; 68 | } 69 | }); 70 | 71 | // 72 | // LAYER WRAPPER 73 | // ------------- 74 | // 75 | 76 | var LayerWrapper = function(layer){ 77 | // 78 | // STATIC VARIABLES 79 | // ---------------- 80 | // 81 | 82 | this.layer = layer; 83 | 84 | this.className = layer.class()+""; 85 | 86 | this.canHaveLayers = (layer.layers != null); 87 | 88 | this.isGroup = (this.className == "MSLayerGroup"); 89 | this.isArtboard = (this.className == "MSArtboardGroup"); 90 | this.isText = (this.className == "MSTextLayer"); 91 | 92 | // 93 | // PROPERTIES 94 | // ---------- 95 | // 96 | 97 | // Frame 98 | 99 | createProp(this, "frame", { 100 | get: function(){ 101 | return layer.frame(); 102 | }, 103 | set: function(frame){ 104 | this.setFrame(frame); 105 | } 106 | }); 107 | 108 | // 109 | // FUNCTIONS 110 | // --------- 111 | // 112 | 113 | // Data Storage & Retrieval 114 | 115 | this.data = function(key, value){ 116 | return this.dataFromPlugin(null, key, value); 117 | }; 118 | 119 | this.dataFromPlugin = function(pluginId, key, value){ 120 | var command = ctx.command; 121 | 122 | // Read 123 | 124 | if(typeof value != "undefined"){ 125 | if(pluginId){ 126 | return [command valueForKey:key onLayer:layer forPluginIdentifier:pluginId]; 127 | } else { 128 | return [command valueForKey:key onLayer:layer]; 129 | } 130 | } 131 | 132 | // Write 133 | 134 | if(pluginId){ 135 | [command setValue:value forKey:key onLayer:layer forPluginIdentifier:pluginId]; 136 | } else { 137 | [command setValue:value forKey:key onLayer:layer]; 138 | } 139 | }; 140 | 141 | // Frame 142 | 143 | this.setFrame = function(){ 144 | var args = arguments; 145 | var layerFrame = layer.frame(); 146 | 147 | if(args.length == 1 && typeof args[0] == "object"){ 148 | var frame = args[0]; 149 | 150 | for(var prop in frame){ 151 | layerFrame[prop] = frame[prop]; 152 | } 153 | } else if(args.length > 0){ 154 | var order = ["x", "y", "width", "height"]; 155 | 156 | for(var i in args){ 157 | var prop = order[i]; 158 | layerFrame[prop] = Number(args[i]); 159 | } 160 | } 161 | }; 162 | }; 163 | 164 | // 165 | // UTILITIES 166 | // --------- 167 | // 168 | 169 | // JS 170 | 171 | var js = core.js = {}; 172 | 173 | js.execute = function(js, basePath){ 174 | var baseURL; 175 | 176 | if(!basePath){ 177 | baseURL = coscript.env().scriptURL; 178 | } else { 179 | baseURL = [NSURL fileURLWithPath:basePath]; 180 | } 181 | 182 | [coscript executeString:js baseURL:baseURL]; 183 | }; 184 | 185 | js.executeFile = function(filePath){ 186 | var scriptURL = coscript.env().scriptURL, scriptPath = scriptURL.path(); 187 | 188 | var jsPath = scriptPath.stringByDeletingLastPathComponent()+"/commands.js"; 189 | var script = [NSString stringWithContentsOfFile:jsPath encoding:NSUTF8StringEncoding error:nil]; 190 | 191 | js.execute(script, jsPath); 192 | }; 193 | 194 | // Paths 195 | 196 | var paths = core.paths = {}; 197 | 198 | createProp(paths, "scriptPath", { 199 | get: function(){ 200 | return coscript.env().scriptURL.path()+""; 201 | } 202 | }); 203 | 204 | createProp(paths, "scriptFolderPath", { 205 | get: function(){ 206 | return paths.scriptPath.toNSString().stringByDeletingLastPathComponent()+""; 207 | } 208 | }); 209 | 210 | paths.pluginPath = (function(){ 211 | var NSScriptPath = paths.scriptPath.toNSString(); 212 | 213 | while(NSScriptPath.lastPathComponent().pathExtension() != "sketchplugin"){ 214 | NSScriptPath = NSScriptPath.stringByDeletingLastPathComponent(); 215 | } 216 | 217 | return NSScriptPath+""; 218 | })(); 219 | 220 | paths.resourcesPath = paths.pluginPath+"/Contents/Resources"; 221 | 222 | paths.joinPathComponents = function(){ 223 | var args = arguments; 224 | 225 | if(args.length == 0) return; 226 | 227 | var path = NSString.new(); 228 | 229 | for(var i = 0, len = args.length; i *A collaborative project brought to you by [Matt Curtis](https://twitter.com/matt_sven) & [Cat Noone](https://twitter.com/imcatnoone)* 10 | 11 | Fluid is a Sketch plugin that provides a means to create more constraint-based, responsive designs. It is based on Auto Layout constraints. 12 | 13 | :package: [Download Plugin (.zip)](https://github.com/matt-curtis/Fluid-for-Sketch/releases/download/v1.7.6/Fluid.sketchplugin.zip) | :star: [Changelog](https://github.com/matt-curtis/Fluid-for-Sketch/releases) | :arrow_down: [Download the Demo Sketch Document](https://github.com/matt-curtis/Fluid-for-Sketch/raw/master/Constraint%20Demos.sketch) 14 | --- | --- | --- 15 | 16 | --- 17 | 18 | ![](README/screenshot.png) 19 | 20 | # Installation 21 | 22 | ### Using Sketchpacks 23 | 24 | [![Install Fluid for Sketch with Sketchpacks](http://sketchpacks-com.s3.amazonaws.com/assets/badges/sketchpacks-badge-install.png "Install Fluid for Sketch with Sketchpacks")](https://sketchpacks.com/matt-curtis/fluid-for-sketch/install) 25 | 26 | ### Using Sketch Runner 27 | 28 | With Sketch Runner, just go to the `install` command and search for `Fluid`. Runner allows you to manage plugins and do much more to speed up your workflow in Sketch. [Download Runner here](http://www.sketchrunner.com). 29 | 30 | ![Install with Sketch Runner](README/fluid-runner.png) 31 | 32 | ### Using Sketch Plugin Manager 33 | 34 | Installation via [Sketch Plugin Manager](https://mludowise.github.io/Sketch-Plugin-Manager/): 35 | 36 | 1. In the 'Catalog' tab, click in the 'Search' field and type 'Fluid', to filter the list 37 | 2. You will see the 'Fluid for Sketch' plugin listed. Click the 'Install' button. 38 | 39 | ### Using Sketch Toolbox 40 | 41 | ⚠️ Sketch Toolbox is no longer officially supported due to a lack of updates and several bugs. If you usually use Sketch Toolbox, please install manually or through another plugin manager. 42 | 43 | ### Manually 44 | 45 | 1. Download the `.zip` above and extract it. 46 | 2. Double-click `Fluid.sketchplugin`. 47 | 3. ??? 48 | 4. Profit!!! 49 | 50 | # Updating 51 | 52 | 1. After updating Fluid (whether manually or via other manager) restart Sketch to receive goodness. 53 | 54 | # Features 55 | 56 | - Pin, Offset, Center, and Size relative to Parent Group, Parent Artboard, or Previous Sibling Layer 57 | - Utilize simple [mathematic expressions](#mathematic-values) as values, such as `50% - 10` 58 | - Quickly resize artboards and update their layout 59 | - Preview, export and copy artboards at different sizes in [Preview Mode](#preview-mode) 60 | - Constraints are stored directly on a layer, so no worries with layer names 61 | 62 | # Usage 63 | 64 | First and foremost, we recommend downloading the example Sketch document included in this repo (linked to it above). There are several examples included there. Examining the constraints used and playing around with the different options (i.e. Changing constraints, re-sizing artboards and pressing `Update Layout`) makes things clearer. 65 | 66 | There are 5 primary actions: Show/Hide Toolbar, Update Layout, Edit Constraints, Preview, and Toggle Size. All of the features the plugin provides are available via `Plugins > Fluid`. 67 | 68 | ### Show/Hide Toolbar (⌃ + ⇧ + T) 69 | 70 | For convenience, the plugin provides a toolbar that floats above the current document, giving you quick access to all of the above actions. 71 | 72 | ![Toolbar](README/toolbar.png) 73 | 74 | ### Edit Constraints (⌃ + ⇧ + C) 75 | 76 | ![Constraint Inspector](README/constraint-inspector.png) 77 | 78 | This option shows the Constraint Inspector. Here you can edit all of the constraints for the currently selected layer. 79 | 80 | Next to each section (Align, Fixed Size and Pinning) is a dropdown button. Pressing it opens a menu where you can set relativity: 81 | 82 | ![Constraint Inspector Relativity](README/constraint-inspector-relativity.png) 83 | 84 | ### Update Layout (⌃ + ⇧ + L) 85 | 86 | Adjusts the layers in the currently selected artboards to reflect your constraints. 87 | 88 | Pressing `L` while the Constraint Inspector is focused will also Update Layout. 89 | 90 | ### Preview (⌃ + ⇧ + P) 91 | 92 | ![Preview Mode](README/preview-mode.png) 93 | 94 | Opens a window allowing you to preview the selected artboard at a range of preset device and icon sizes. You can also copy the preview artboard to paste into Sketch (Didn't have a mobile design? Now you do!), or export an image of the preview artboard at different scales (@1x, @2x, @3x, and so on). 95 | 96 | ### Toggle Sizes (⌃ + ⇧ + S) 97 | 98 | ![Toggle Sizes](README/sizes-popover.png) 99 | 100 | Opens a popup where you can toggle the size of the current artboard between different presets, or flip its orientation. 101 | 102 | # Additional Notes 103 | 104 | ### Fade UI 105 | 106 | 107 | You can have Fluid fade its floating UI (Inspector & Toolbar) when they are not focused. See `Plugins > Fluid > Settings`. 108 | 109 | ### Width & Height 110 | 111 | If you have Fixed Width or Fixed Height checked, and leave the value blank, the plugin will lock the width or height to whatever the current height or width is in Sketch. This is useful in some cases where you want to ensure the height and width do not change, but don't want to enter the existing height/width manually. 112 | 113 | ### Groups 114 | 115 | Since the width and height of Groups in Sketch are dependent on their sub-layers, Fluid does not actually resize the height or width of a group, as that causes Sketch to distort the layers within it. Rather, it simulates that sizing when calculating the geometry of sub-layers. 116 | 117 | ### Symbols 118 | 119 | It's worth noting that while constraints you set on a Symbol *itself* will not propagate to other instances of that Symbol, any constraints you set on its *sub-layers* will. 120 | 121 | ### Text 122 | 123 | If you set the width of a text layer but not its height, the plugin will set the height of the text layer to the height of the text after reflow. 124 | 125 | > This feature was available in former versions of Fluid, but has been removed in 1.7.4. [See this issue](https://github.com/matt-curtis/Fluid-for-Sketch/issues/111) for more info. **Restored in Fluid 1.7.5!** 🎉 126 | 127 | ### Mathematic Values 128 | 129 | All of the values in Fluid support mathematic expressions, such as `20 * 2` or `(50 / 2) + 10` and so on. This becomes even more useful when you add percentages to the mix. 130 | 131 | Percentages are relative to the dimension of the axis they're on. Here's how that shakes out: 132 | 133 | - Using `100%` as your **fixed width** equals `100%` of the relative layer's **width** 134 | - Using `100%` as your **fixed height** equals `100%` of the relative layer's **height** 135 | - Using `100%` in the **top or bottom** pinnings equals `100%` of the relative layer's **height** 136 | - Using `100%` in the **right or left** pinnings equals `100%` of the relative layer's **width** 137 | 138 | One neat application of this is that it enables padding between sibling layers, e.g: 139 | 140 | - Parent Group or Artboard 141 | - Layer B (`top pinning = 100% + 20`, `relativity = Previous Sibling (Layer A)`) 142 | - Layer A 143 | 144 | ### Text Field Tricks n' Tips 145 | 146 | - Numbers in the Constraint Inspector text fields can be incremented or deincrement by 1 by pressing the up and down keys. Holding down Shift (⇧) and Up or Down will increment by 10. 147 | - Pressing space while a text field is focused will toggle that constraint's checkbox. 148 | 149 | ### Preset Sizes 150 | 151 | You can search through the section names of the preset sizes list (in both Preview Mode and when toggling sizes) by prefixing your searches with `s:`, i.e.: `s:iOS` or `s:Material`. Normally Fluid only searches among the preset names themselves. 152 | 153 | # Contact 154 | 155 | If you have any questions, comments, become attacked by technical bugs, or have ideas to improve the plugin, ping us on twitter: 156 | [@matt_sven](http://twitter.com/matt_sven) and [@imcatnoone](http://twitter.com/imcatnoone). 157 | -------------------------------------------------------------------------------- /README/constraint-inspector-relativity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/README/constraint-inspector-relativity.png -------------------------------------------------------------------------------- /README/constraint-inspector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/README/constraint-inspector.png -------------------------------------------------------------------------------- /README/fluid-runner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/README/fluid-runner.png -------------------------------------------------------------------------------- /README/preview-mode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/README/preview-mode.png -------------------------------------------------------------------------------- /README/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/README/screenshot.png -------------------------------------------------------------------------------- /README/sizes-popover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/README/sizes-popover.png -------------------------------------------------------------------------------- /README/toolbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matt-curtis/Fluid-for-Sketch/de1a31967f70f64ef89f26f4be8093a8331235cb/README/toolbar.png --------------------------------------------------------------------------------