├── 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 | 
19 |
20 | # Installation
21 |
22 | ### Using Sketchpacks
23 |
24 | [](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 | 
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 | 
73 |
74 | ### Edit Constraints (⌃ + ⇧ + C)
75 |
76 | 
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 | 
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 | 
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 | 
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
--------------------------------------------------------------------------------