diff --git a/css/flo.css b/css/flo.css index 21934eb..45ca00a 100755 --- a/css/flo.css +++ b/css/flo.css @@ -330,10 +330,10 @@ max-width: 38em; } .CodeMirror-vertical-ruler-error { - background-color: rgba(188, 0, 0, 0.4); + background-color: rgba(188, 0, 0, 0.5); } .CodeMirror-vertical-ruler-warning { - background-color: rgba(255, 188, 0, 0.4); + background-color: rgba(255, 188, 0, 0.5); } diff --git a/dist/spring-flo.css b/dist/spring-flo.css index 83b6aab..a40a752 100644 --- a/dist/spring-flo.css +++ b/dist/spring-flo.css @@ -432,6 +432,73 @@ li.CodeMirror-hint-active { color: white; } +.CodeMirror-simplescroll-horizontal div, .CodeMirror-simplescroll-vertical div { + position: absolute; + background: #ccc; + -moz-box-sizing: border-box; + box-sizing: border-box; + border: 1px solid #bbb; + border-radius: 2px; +} + +.CodeMirror-simplescroll-horizontal, .CodeMirror-simplescroll-vertical { + position: absolute; + z-index: 6; + background: #eee; +} + +.CodeMirror-simplescroll-horizontal { + bottom: 0; left: 0; + height: 8px; +} +.CodeMirror-simplescroll-horizontal div { + bottom: 0; + height: 100%; +} + +.CodeMirror-simplescroll-vertical { + right: 0; top: 0; + width: 8px; +} +.CodeMirror-simplescroll-vertical div { + right: 0; + width: 100%; +} + + +.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler, .CodeMirror-overlayscroll .CodeMirror-gutter-filler { + display: none; +} + +.CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div { + position: absolute; + background: #bcd; + border-radius: 3px; +} + +.CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical { + position: absolute; + z-index: 6; +} + +.CodeMirror-overlayscroll-horizontal { + bottom: 0; left: 0; + height: 6px; +} +.CodeMirror-overlayscroll-horizontal div { + bottom: 0; + height: 100%; +} + +.CodeMirror-overlayscroll-vertical { + right: 0; top: 0; + width: 6px; +} +.CodeMirror-overlayscroll-vertical div { + right: 0; + width: 100%; +} + /*! JointJS v0.9.6 - JavaScript diagramming library 2015-12-19 @@ -1005,10 +1072,10 @@ Do not allow adding new vertices: .connection-wrap { pointer-events: none; } max-width: 38em; } .CodeMirror-vertical-ruler-error { - background-color: rgba(188, 0, 0, 0.4); + background-color: rgba(188, 0, 0, 0.5); } .CodeMirror-vertical-ruler-warning { - background-color: rgba(255, 188, 0, 0.4); + background-color: rgba(255, 188, 0, 0.5); } diff --git a/dist/spring-flo.js b/dist/spring-flo.js index d185fe0..49779ca 100644 --- a/dist/spring-flo.js +++ b/dist/spring-flo.js @@ -9506,6 +9506,148 @@ define('codemirror', ['codemirror/lib/codemirror'], function (main) { return mai }; }); +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define('codemirror/addon/scroll/simplescrollbars',["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + + + function Bar(cls, orientation, scroll) { + this.orientation = orientation; + this.scroll = scroll; + this.screen = this.total = this.size = 1; + this.pos = 0; + + this.node = document.createElement("div"); + this.node.className = cls + "-" + orientation; + this.inner = this.node.appendChild(document.createElement("div")); + + var self = this; + CodeMirror.on(this.inner, "mousedown", function(e) { + if (e.which != 1) return; + CodeMirror.e_preventDefault(e); + var axis = self.orientation == "horizontal" ? "pageX" : "pageY"; + var start = e[axis], startpos = self.pos; + function done() { + CodeMirror.off(document, "mousemove", move); + CodeMirror.off(document, "mouseup", done); + } + function move(e) { + if (e.which != 1) return done(); + self.moveTo(startpos + (e[axis] - start) * (self.total / self.size)); + } + CodeMirror.on(document, "mousemove", move); + CodeMirror.on(document, "mouseup", done); + }); + + CodeMirror.on(this.node, "click", function(e) { + CodeMirror.e_preventDefault(e); + var innerBox = self.inner.getBoundingClientRect(), where; + if (self.orientation == "horizontal") + where = e.clientX < innerBox.left ? -1 : e.clientX > innerBox.right ? 1 : 0; + else + where = e.clientY < innerBox.top ? -1 : e.clientY > innerBox.bottom ? 1 : 0; + self.moveTo(self.pos + where * self.screen); + }); + + function onWheel(e) { + var moved = CodeMirror.wheelEventPixels(e)[self.orientation == "horizontal" ? "x" : "y"]; + var oldPos = self.pos; + self.moveTo(self.pos + moved); + if (self.pos != oldPos) CodeMirror.e_preventDefault(e); + } + CodeMirror.on(this.node, "mousewheel", onWheel); + CodeMirror.on(this.node, "DOMMouseScroll", onWheel); + } + + Bar.prototype.moveTo = function(pos, update) { + if (pos < 0) pos = 0; + if (pos > this.total - this.screen) pos = this.total - this.screen; + if (pos == this.pos) return; + this.pos = pos; + this.inner.style[this.orientation == "horizontal" ? "left" : "top"] = + (pos * (this.size / this.total)) + "px"; + if (update !== false) this.scroll(pos, this.orientation); + }; + + Bar.prototype.update = function(scrollSize, clientSize, barSize) { + this.screen = clientSize; + this.total = scrollSize; + this.size = barSize; + + // FIXME clip to min size? + this.inner.style[this.orientation == "horizontal" ? "width" : "height"] = + this.screen * (this.size / this.total) + "px"; + this.inner.style[this.orientation == "horizontal" ? "left" : "top"] = + this.pos * (this.size / this.total) + "px"; + }; + + function SimpleScrollbars(cls, place, scroll) { + this.addClass = cls; + this.horiz = new Bar(cls, "horizontal", scroll); + place(this.horiz.node); + this.vert = new Bar(cls, "vertical", scroll); + place(this.vert.node); + this.width = null; + } + + SimpleScrollbars.prototype.update = function(measure) { + if (this.width == null) { + var style = window.getComputedStyle ? window.getComputedStyle(this.horiz.node) : this.horiz.node.currentStyle; + if (style) this.width = parseInt(style.height); + } + var width = this.width || 0; + + var needsH = measure.scrollWidth > measure.clientWidth + 1; + var needsV = measure.scrollHeight > measure.clientHeight + 1; + this.vert.node.style.display = needsV ? "block" : "none"; + this.horiz.node.style.display = needsH ? "block" : "none"; + + if (needsV) { + this.vert.update(measure.scrollHeight, measure.clientHeight, + measure.viewHeight - (needsH ? width : 0)); + this.vert.node.style.display = "block"; + this.vert.node.style.bottom = needsH ? width + "px" : "0"; + } + if (needsH) { + this.horiz.update(measure.scrollWidth, measure.clientWidth, + measure.viewWidth - (needsV ? width : 0) - measure.barLeft); + this.horiz.node.style.right = needsV ? width + "px" : "0"; + this.horiz.node.style.left = measure.barLeft + "px"; + } + + return {right: needsV ? width : 0, bottom: needsH ? width : 0}; + }; + + SimpleScrollbars.prototype.setScrollTop = function(pos) { + this.vert.moveTo(pos, false); + }; + + SimpleScrollbars.prototype.setScrollLeft = function(pos) { + this.horiz.moveTo(pos, false); + }; + + SimpleScrollbars.prototype.clear = function() { + var parent = this.horiz.node.parentNode; + parent.removeChild(this.horiz.node); + parent.removeChild(this.vert.node); + }; + + CodeMirror.scrollbarModel.simple = function(place, scroll) { + return new SimpleScrollbars("CodeMirror-simplescroll", place, scroll); + }; + CodeMirror.scrollbarModel.overlay = function(place, scroll) { + return new SimpleScrollbars("CodeMirror-overlayscroll", place, scroll); + }; +}); + /* * Copyright 2016 the original author or authors. * @@ -9523,169 +9665,178 @@ define('codemirror', ['codemirror/lib/codemirror'], function (main) { return mai */ -define('controllers/dsl-editor',['require','angular','codemirror','codemirror/addon/lint/lint','codemirror/addon/hint/show-hint','codemirror/addon/display/placeholder','codemirror/addon/scroll/annotatescrollbar'],function(require) { - +define('controllers/dsl-editor',['require','angular','codemirror','codemirror/addon/lint/lint','codemirror/addon/hint/show-hint','codemirror/addon/display/placeholder','codemirror/addon/scroll/annotatescrollbar','codemirror/addon/scroll/simplescrollbars'],function (require) { + - var angular = require('angular'); + var angular = require('angular'); return ['$scope', '$http', '$injector', '$log', function ($scope, $http, $injector, $log) { - var CodeMirror = require('codemirror'); - var enableTextToGraphSyncing = false; - - var doc; + var CodeMirror = require('codemirror'); + var enableTextToGraphSyncing = false; - var errorMarkerRuler; + var doc; - require('codemirror/addon/lint/lint'); - require('codemirror/addon/hint/show-hint'); - require('codemirror/addon/display/placeholder'); - require('codemirror/addon/scroll/annotatescrollbar'); + var errorMarkerRuler; + require('codemirror/addon/lint/lint'); + require('codemirror/addon/hint/show-hint'); + require('codemirror/addon/display/placeholder'); + require('codemirror/addon/scroll/annotatescrollbar'); + require('codemirror/addon/scroll/simplescrollbars'); - /** - * Control graph-to-text syncing. When it is active the graph will be automatically - * updated as the text is modified. - */ - function enableGraphToTextSyncing(enable) { - $scope.flo.enableSyncing(enable); - enableTextToGraphSyncing = !enable; - } + /** + * Control graph-to-text syncing. When it is active the graph will be automatically + * updated as the text is modified. + */ + function enableGraphToTextSyncing(enable) { + $scope.flo.enableSyncing(enable); + enableTextToGraphSyncing = !enable; + } - //TODO: using a controller to setup codemirror is probably not the 'nice' - // way to do that. (angular docs say that dom manipulations are not the job of a controller - // so probably this should be a directive rather than a controller. + //TODO: using a controller to setup codemirror is probably not the 'nice' + // way to do that. (angular docs say that dom manipulations are not the job of a controller + // so probably this should be a directive rather than a controller. - // A bit dirty, we store the callback for codemirror linter here. - // that way we can update markers each time error objects are - // changed. - var updateLinting; - - /** - * If new parse errors are discovered, this will create markers against - * the editor text for them and call code mirror to update those markers. - */ - function refreshMarkers() { - var markers = []; - var parseErrors = $scope.definition.parseError; - if (parseErrors && parseErrors.length) { - for (var i = 0; i < parseErrors.length; i++) { - var parseError = parseErrors[i]; - if (parseError.message && parseError.range) { - var range = parseError.range; - markers.push({ - from: range.start, - to: range.end, - message: parseError.message.split(/\r?\n/)[0], - severity: 'error' - }); - } - } - } - updateLinting(doc, markers); - errorMarkerRuler.update(markers); - } - - function isDelimiter(c) { - return c && (/\s|\|/).test(c); - } - - function findLast(string, predicate, start) { - var pos = start || string.length-1; - while (pos>=0 && !predicate(string[pos])) { - pos--; - } - return pos; - } - - /** - * The suggestions provided by rest api are very long and include the whole command typed - * from the start of the line. This function determines the start of the 'interesting' part - * at the end of the prefix, so that we can use it to chop-off the suggestion there. - */ - function interestingPrefixStart(prefix, completions) { - var cursor = prefix.length; - if (completions.every(function (completion) { return isDelimiter(completion[cursor]);})) { - return cursor; - } - return findLast(prefix, isDelimiter); - } - - function contentAssist(doc, callback) { - var cursor = doc.getCursor(); - var startOfLine = {line: cursor.line, ch: 0}; - var prefix = doc.getRange(startOfLine, cursor); - - if ($scope.contentAssistServiceName) { - var caService = $injector.get($scope.contentAssistServiceName); - if (caService && angular.isFunction(caService.getProposals)) { - return caService.getProposals(prefix).then(function(completions) { - var chopAt = interestingPrefixStart(prefix, completions); - return callback({ - list: completions.map(function (longCompletion) { - var text = typeof longCompletion === 'string' ? longCompletion : longCompletion.text; - return text.substring(chopAt); - }), - from: {line: startOfLine.line, ch:chopAt}, - to: cursor - }); - }, function(err) { - $log.error('Cannot get content assist: ' + err); - }); - } - } - } - - $scope.init = function(textarea) { - contentAssist.async = true; - doc = CodeMirror.fromTextArea(textarea, { - gutters: ['CodeMirror-lint-markers'], - lint: { - async: true, - getAnnotations: function (text, updateFun) { - if (!updateLinting) { - updateLinting = updateFun; - $scope.$watch('definition.parseError', refreshMarkers); - } - } - }, - extraKeys: {'Ctrl-Space': 'autocomplete'}, - hintOptions: { - async: 'true', - hint: contentAssist - }, - lineNumbers: true, - lineWrapping: true - }); + // A bit dirty, we store the callback for codemirror linter here. + // that way we can update markers each time error objects are + // changed. + var updateLinting; + + /** + * If new parse errors are discovered, this will create markers against + * the editor text for them and call code mirror to update those markers. + */ + function refreshMarkers() { + var markers = []; + var parseErrors = $scope.definition.parseError; + if (parseErrors && parseErrors.length) { + for (var i = 0; i < parseErrors.length; i++) { + var parseError = parseErrors[i]; + if (parseError.message && parseError.range) { + var range = parseError.range; + markers.push({ + from: range.start, + to: range.end, + message: parseError.message.split(/\r?\n/)[0], + severity: 'error' + }); + } + } + } + updateLinting(doc, markers); + errorMarkerRuler.update($scope.overviewRuler ? markers : []); + } + + function isDelimiter(c) { + return c && (/\s|\|/).test(c); + } + + function findLast(string, predicate, start) { + var pos = start || string.length - 1; + while (pos >= 0 && !predicate(string[pos])) { + pos--; + } + return pos; + } + + /** + * The suggestions provided by rest api are very long and include the whole command typed + * from the start of the line. This function determines the start of the 'interesting' part + * at the end of the prefix, so that we can use it to chop-off the suggestion there. + */ + function interestingPrefixStart(prefix, completions) { + var cursor = prefix.length; + if (completions.every(function (completion) { + return isDelimiter(completion[cursor]); + })) { + return cursor; + } + return findLast(prefix, isDelimiter); + } + + function contentAssist(doc, callback) { + var cursor = doc.getCursor(); + var startOfLine = {line: cursor.line, ch: 0}; + var prefix = doc.getRange(startOfLine, cursor); + + if ($scope.contentAssistServiceName) { + var caService = $injector.get($scope.contentAssistServiceName); + if (caService && angular.isFunction(caService.getProposals)) { + return caService.getProposals(prefix).then(function (completions) { + var chopAt = interestingPrefixStart(prefix, completions); + return callback({ + list: completions.map(function (longCompletion) { + var text = typeof longCompletion === 'string' ? longCompletion : longCompletion.text; + return text.substring(chopAt); + }), + from: {line: startOfLine.line, ch: chopAt}, + to: cursor + }); + }, function (err) { + $log.error('Cannot get content assist: ' + err); + }); + } + } + } + + $scope.init = function (textarea) { + contentAssist.async = true; + + var options = { + gutters: ['CodeMirror-lint-markers'], + lint: { + async: true, + getAnnotations: function (text, updateFun) { + if (!updateLinting) { + updateLinting = updateFun; + $scope.$watch('definition.parseError', refreshMarkers); + } + } + }, + extraKeys: {'Ctrl-Space': 'autocomplete'}, + hintOptions: { + async: 'true', + hint: contentAssist + }, + lineNumbers: true, + lineWrapping: true + }; + + if ($scope.scrollbarStyle) { + options.scrollbarStyle = $scope.scrollbarStyle; + } + + doc = CodeMirror.fromTextArea(textarea, options); + + // CodeMirror would set 'placeholder` value at construction time based on the string value of placeholder attribute in the DOM + // Thus, set the correct placeholder value in case value is angular expression. + if (angular.isString($scope.placeholder)) { + doc.setOption('placeholder', $scope.placeholder); + } + + doc.on('change', function () { + if (enableTextToGraphSyncing) { + $scope.definition.text = doc.getValue(); + $scope.flo.scheduleUpdateGraphRepresentation(); + } + }); + doc.on('focus', function () { + enableGraphToTextSyncing(false); + }); + doc.on('blur', function () { + enableGraphToTextSyncing(true); + }); + errorMarkerRuler = doc.annotateScrollbar('CodeMirror-vertical-ruler-error'); + $scope.$watch('definition.text', function (newValue) { + if (newValue !== doc.getValue()) { + var cursorPosition = doc.getCursor(); + doc.setValue(newValue); + doc.setCursor(cursorPosition); + } + }); + }; - // CodeMirror would set 'placeholder` value at construction time based on the string value of placeholder attribute in the DOM - // Thus, set the correct placeholder value in case value is angular expression. - if (angular.isString($scope.placeholder)) { - doc.setOption('placeholder', $scope.placeholder); - } - - doc.on('change', function () { - if (enableTextToGraphSyncing) { - $scope.definition.text = doc.getValue(); - $scope.flo.scheduleUpdateGraphRepresentation(); - } - }); - doc.on('focus', function () { - enableGraphToTextSyncing(false); - }); - doc.on('blur', function () { - enableGraphToTextSyncing(true); - }); - errorMarkerRuler = doc.annotateScrollbar('CodeMirror-vertical-ruler-error'); - $scope.$watch('definition.text', function (newValue) { - if (newValue!==doc.getValue()) { - var cursorPosition = doc.getCursor(); - doc.setValue(newValue); - doc.setCursor(cursorPosition); - } - }); - }; - }]; }); @@ -9719,6 +9870,12 @@ define('directives/dsl-editor',['controllers/dsl-editor'],function () { if (attrs.placeholder) { scope.placeholder = $interpolate(attrs.placeholder)(scope); } + if (attrs.scrollbarStyle) { + scope.scrollbarStyle = $interpolate(attrs.scrollbarStyle)(scope); + } + if (attrs.overviewRuler) { + scope.overviewRuler = $interpolate(attrs.overviewRuler)(scope); + } scope.init(element.context); } }; @@ -24918,7 +25075,7 @@ define("jshint", ["lodash"], function(){}); * benefit from the use of a real editor that can provide features like syntax highlighting and mark * errors/warnings. */ -define('controllers/code-editor',['require','angular','codemirror','codemirror/mode/meta','codemirror/addon/lint/lint','codemirror/addon/hint/show-hint','codemirror/addon/mode/loadmode','codemirror/addon/edit/matchbrackets','codemirror/addon/edit/closebrackets','codemirror/addon/display/placeholder','codemirror/addon/scroll/annotatescrollbar','codemirror/mode/groovy/groovy','codemirror/mode/javascript/javascript','codemirror/mode/python/python','codemirror/mode/ruby/ruby','codemirror/mode/clike/clike','jshint','codemirror/addon/lint/javascript-lint'],function (require) { +define('controllers/code-editor',['require','angular','codemirror','codemirror/mode/meta','codemirror/addon/lint/lint','codemirror/addon/hint/show-hint','codemirror/addon/mode/loadmode','codemirror/addon/edit/matchbrackets','codemirror/addon/edit/closebrackets','codemirror/addon/display/placeholder','codemirror/addon/scroll/annotatescrollbar','codemirror/addon/scroll/simplescrollbars','codemirror/mode/groovy/groovy','codemirror/mode/javascript/javascript','codemirror/mode/python/python','codemirror/mode/ruby/ruby','codemirror/mode/clike/clike','jshint','codemirror/addon/lint/javascript-lint'],function (require) { return ['$scope', function ($scope) { @@ -24934,6 +25091,8 @@ define('controllers/code-editor',['require','angular','codemirror','codemirror/m require('codemirror/addon/edit/closebrackets'); require('codemirror/addon/display/placeholder'); require('codemirror/addon/scroll/annotatescrollbar'); + require('codemirror/addon/scroll/simplescrollbars'); + // languages require('codemirror/mode/groovy/groovy'); @@ -24961,16 +25120,18 @@ define('controllers/code-editor',['require','angular','codemirror','codemirror/m onUpdateLinting: function (annotations) { var warnings = []; var errors = []; - if (angular.isArray(annotations)) { - annotations.forEach(function(a) { - if (a.to && a.from && a.from.line >= 0 && a.from.ch >= 0 && a.to.line >= a.from.line && a.from.ch >= 0) { - if (a.severity === 'error') { - errors.push(a); - } else if (a.severity === 'warning') { - warnings.push(a); + if ($scope.overviewRuler) { + if (angular.isArray(annotations)) { + annotations.forEach(function (a) { + if (a.to && a.from && a.from.line >= 0 && a.from.ch >= 0 && a.to.line >= a.from.line && a.from.ch >= 0) { + if (a.severity === 'error') { + errors.push(a); + } else if (a.severity === 'warning') { + warnings.push(a); + } } - } - }); + }); + } } warningRuler.update(warnings); errorRuler.update(errors); @@ -24985,9 +25146,13 @@ define('controllers/code-editor',['require','angular','codemirror','codemirror/m lineNumbers: true, lineWrapping: true, matchBrackets: true, - autoCloseBrackets: true, + autoCloseBrackets: true }); + if ($scope.scrollbarStyle) { + doc.setOption('scrollbarStyle', $scope.scrollbarStyle); + } + // CodeMirror would set 'placeholder` value at construction time based on the string value of placeholder attribute in the DOM // Thus, set the correct placeholder value in case value is angular expression. if (angular.isString($scope.placeholder)) { @@ -25098,7 +25263,9 @@ define('directives/code-editor',['controllers/code-editor'],function () { text: '=codeText', decodeFunction: '&', encodeFunction: '&', - placeholder: '@' + placeholder: '@', + scrollbarStyle: '@', + overviewRuler: '@' } }; }]; @@ -28915,7 +29082,7 @@ define('directives/graph-editor',['controllers/graph-editor'],function () { * See the License for the specific language governing permissions and * limitations under the License. */ -define('directives/generic-dsl-editor',['underscore','angular','codemirror','codemirror/addon/lint/lint','codemirror/addon/hint/show-hint','codemirror/addon/display/placeholder','codemirror/addon/scroll/annotatescrollbar'],function () { +define('directives/generic-dsl-editor',['underscore','angular','codemirror','codemirror/addon/lint/lint','codemirror/addon/hint/show-hint','codemirror/addon/display/placeholder','codemirror/addon/scroll/annotatescrollbar','codemirror/addon/scroll/simplescrollbars'],function () { var _ = require('underscore'); @@ -28933,6 +29100,7 @@ define('directives/generic-dsl-editor',['underscore','angular','codemirror','cod require('codemirror/addon/hint/show-hint'); require('codemirror/addon/display/placeholder'); require('codemirror/addon/scroll/annotatescrollbar'); + require('codemirror/addon/scroll/simplescrollbars'); return { restrict: 'A', @@ -28940,7 +29108,8 @@ define('directives/generic-dsl-editor',['underscore','angular','codemirror','cod dsl: '=', hint: '=', lint: '=', - placeholder: '@' + placeholder: '@', + scrollbarStyle: '@' }, link: function (scope, element, attrs) { @@ -28953,9 +29122,13 @@ define('directives/generic-dsl-editor',['underscore','angular','codemirror','cod gutters: ['CodeMirror-lint-markers'], extraKeys: {'Ctrl-Space': 'autocomplete'}, lineNumbers: attrs.lineNumbers && attrs.lineNumbers.toLowerCase() === 'true', - lineWrapping: attrs.lineWrapping && attrs.lineWrapping.toLowerCase() === 'true' + lineWrapping: attrs.lineWrapping && attrs.lineWrapping.toLowerCase() === 'true', }; + if (scope.scrollbarStyle) { + options.scrollbarStyle = scope.scrollbarStyle; + } + if (scope.lint) { options.lint = scope.lint; } diff --git a/dist/spring-flo.min.css b/dist/spring-flo.min.css index fab9339..51ec88b 100644 --- a/dist/spring-flo.min.css +++ b/dist/spring-flo.min.css @@ -1,7 +1,7 @@ -.CodeMirror{font-family:monospace;color:#000}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror div.CodeMirror-cursor{border-left:1px solid #000}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.CodeMirror.cm-fat-cursor div.CodeMirror-cursor{width:auto;border:0;background:#7e7}.CodeMirror.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}@-moz-keyframes blink{0%{background:#7e7}50%{background:0 0}100%{background:#7e7}}@-webkit-keyframes blink{0%{background:#7e7}50%{background:0 0}100%{background:#7e7}}@keyframes blink{0%{background:#7e7}50%{background:0 0}100%{background:#7e7}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-ruler{border-left:1px solid #ccc;position:absolute}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-invalidchar,.cm-s-default .cm-error{color:red}div.CodeMirror span.CodeMirror-matchingbracket{color:#0f0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#f22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative;-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-sizer{position:relative;border-right:30px solid transparent;-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;-moz-box-sizing:content-box;box-sizing:content-box;display:inline-block;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;height:100%}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;overflow:auto}.CodeMirror-code{outline:0}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-measure pre{position:static}.CodeMirror div.CodeMirror-cursor{position:absolute;border-right:none;width:0}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror ::selection{background:#d7d4f0}.CodeMirror ::-moz-selection{background:#d7d4f0}.cm-searching{background:#ffa;background:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:infobackground;border:1px solid #000;border-radius:4px;color:infotext;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;overflow:hidden;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}/*! JointJS v0.9.6 - JavaScript diagramming library 2015-12-19 +.CodeMirror{font-family:monospace;color:#000}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror div.CodeMirror-cursor{border-left:1px solid #000}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.CodeMirror.cm-fat-cursor div.CodeMirror-cursor{width:auto;border:0;background:#7e7}.CodeMirror.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}@-moz-keyframes blink{0%{background:#7e7}50%{background:0 0}100%{background:#7e7}}@-webkit-keyframes blink{0%{background:#7e7}50%{background:0 0}100%{background:#7e7}}@keyframes blink{0%{background:#7e7}50%{background:0 0}100%{background:#7e7}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-ruler{border-left:1px solid #ccc;position:absolute}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-invalidchar,.cm-s-default .cm-error{color:red}div.CodeMirror span.CodeMirror-matchingbracket{color:#0f0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#f22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative;-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-sizer{position:relative;border-right:30px solid transparent;-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;-moz-box-sizing:content-box;box-sizing:content-box;display:inline-block;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;height:100%}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;overflow:auto}.CodeMirror-code{outline:0}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-measure pre{position:static}.CodeMirror div.CodeMirror-cursor{position:absolute;border-right:none;width:0}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror ::selection{background:#d7d4f0}.CodeMirror ::-moz-selection{background:#d7d4f0}.cm-searching{background:#ffa;background:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}.CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:infobackground;border:1px solid #000;border-radius:4px;color:infotext;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;overflow:hidden;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}.CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}/*! JointJS v0.9.6 - JavaScript diagramming library 2015-12-19 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. - */.viewport{-webkit-user-select:none;-moz-user-select:none;user-select:none}[magnet=true]:not(.element){cursor:crosshair}[magnet=true]:not(.element):hover{opacity:.7}.element{cursor:move}.element *{vector-effect:non-scaling-stroke;user-drag:none}.connection-wrap{fill:none;stroke:#000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;opacity:0;cursor:move}.connection-wrap:hover{opacity:.4;stroke-opacity:.4}.connection{fill:none;stroke-linejoin:round}.marker-source,.marker-target{vector-effect:non-scaling-stroke}.marker-vertices{opacity:0;cursor:move}.marker-arrowheads{opacity:0;cursor:move;cursor:-webkit-grab;cursor:-moz-grab}.link-tools{opacity:0;cursor:pointer}.link-tools .tool-remove circle{fill:red}.link-tools .tool-remove path{fill:#fff}.link:hover .link-tools,.link:hover .marker-arrowheads,.link:hover .marker-vertices{opacity:1}.marker-vertex{fill:#1ABC9C}.marker-vertex:hover{fill:#34495E;stroke:none}.marker-arrowhead{fill:#1ABC9C}.marker-arrowhead:hover{fill:#F39C12;stroke:none}.marker-vertex-remove{cursor:pointer;opacity:.1;fill:#fff}.marker-vertex-group:hover .marker-vertex-remove{opacity:1}.marker-vertex-remove-area{opacity:.1;cursor:pointer}.marker-vertex-group:hover .marker-vertex-remove-area{opacity:1}.highlighted{opacity:.7}text.highlighted{fill:red}@media screen and (-webkit-min-device-pixel-ratio:0){.highlighted{outline:red solid 2px;opacity:initial}}.element .fobj{overflow:hidden}.element .fobj body{background-color:transparent;margin:0}.element .fobj div{text-align:center;vertical-align:middle;display:table-cell;padding:0 5px}.flo-view{width:100%;height:100%;margin:0;background-color:#eee;font-family:"Varela Round",sans-serif;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none}.canvas{border:1px solid;border-color:#6db33f;border-radius:2px;margin-top:3px}.paper{padding:0;background-color:#fff}#sidebar-resizer{background-color:#34302d;position:absolute;top:0;bottom:0;width:6px;cursor:e-resize}#palette-container{background-color:#EEE;position:absolute;top:0;bottom:0;left:0;overflow:auto}#paper-container{position:absolute;top:0;bottom:0;right:0;overflow:hidden;color:#FFF}#palette-floater{width:170px;height:60px;opacity:.75;float:left;position:absolute;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none}.palette-filter{border:3px solid #6db33f}.palette-filter-textfield{width:100%;font-size:24px;font-family:"Varela Round",sans-serif}.palette-paper{background-color:#eee;border-color:#6db33f}.node-tooltip .tooltip-description{margin-top:5px;margin-left:0;margin-bottom:5px}.node-tooltip{display:none;position:absolute;border:1px solid #333;background-color:#34302d;border-radius:5px;padding:5px;color:#fff;font-family:"Varela Round",sans-serif;font-size:19px;z-index:100}.tooltip-title-type{font-size:24px;font-weight:700}.tooltip-title-group{padding-left:5px;font-size:20px;font-style:italic}.node-tooltip-option-name{font-family:monospace;font-size:17px;font-weight:700;padding-right:20px}.node-tooltip-option-description{font-family:"Varela Round",sans-serif;font-size:18px}.properties td{border-top:1px solid #34302d}.properties{border:8px #eee;border-color:#6db33f;margin-top:3px;background-color:#eee;font-family:monospace;z-index:2;position:absolute}.properties-node-name{width:100%;background:#34302d;color:#fff;padding-left:2px;border:0;font-size:18px;font-family:"Varela Round",sans-serif;font-weight:700}.properties-node-name-row{background:#34302d;width:100%;padding-left:2px}.properties-row-even{width:100%;border-top:1px #34302d;background-color:#fff}.properties-row-odd{width:100%;border-top:1px #34302d;background-color:#eee}.properties-row-text-even{background-color:#fff;border-left:0;border-right:0;border-bottom:0;border-top:1px #34302d}.properties-row-text-odd{background-color:#eee;border-left:0;border-right:0;border-bottom:0;border-top:1px #34302d}.properties-input{width:100%;font-size:18px;font-family:"Varela Round",sans-serif}.properties-key{width:30%;padding-left:2px;padding-right:4px}.properties-value{width:70%;padding-left:2px;padding-right:2px}.properties-table{border:1px solid #d1d1d1;padding:3px}.properties-new-property{color:#888}.error-tooltip p{margin-top:5px;margin-left:0;margin-bottom:5px;color:#fff}.error-tooltip{display:none;position:absolute;border:1px solid #333;background-color:red;border-radius:5px;padding:5px;color:#fff;font-family:"Varela Round",sans-serif;font-size:20px;z-index:100}.canvas-controls-container{position:absolute;right:15px;top:5px}.canvas-control{background:0 0;font-family:"Varela Round",sans-serif;font-size:11px;vertical-align:middle;margin:0}.zoom-canvas-control{border:0;padding:0;margin:0;outline:0}.zoom-canvas-input{text-align:right;font-weight:700}.zoom-canvas-label{padding-right:4px}.CodeMirror{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none;height:100%}.CodeMirror-hint{max-width:38em}.CodeMirror-vertical-ruler-error{background-color:rgba(188,0,0,.4)}.CodeMirror-vertical-ruler-warning{background-color:rgba(255,188,0,.4)}.highlighted{outline:0}.element.highlighted rect{stroke:#34302d;stroke-width:3}.handle{cursor:pointer}.available-magnet{stroke-width:3}.link{fill:none;stroke:#ccc;stroke-width:1.5px}.link-tools .tool-options{display:none} \ No newline at end of file + */.viewport{-webkit-user-select:none;-moz-user-select:none;user-select:none}[magnet=true]:not(.element){cursor:crosshair}[magnet=true]:not(.element):hover{opacity:.7}.element{cursor:move}.element *{vector-effect:non-scaling-stroke;user-drag:none}.connection-wrap{fill:none;stroke:#000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;opacity:0;cursor:move}.connection-wrap:hover{opacity:.4;stroke-opacity:.4}.connection{fill:none;stroke-linejoin:round}.marker-source,.marker-target{vector-effect:non-scaling-stroke}.marker-vertices{opacity:0;cursor:move}.marker-arrowheads{opacity:0;cursor:move;cursor:-webkit-grab;cursor:-moz-grab}.link-tools{opacity:0;cursor:pointer}.link-tools .tool-remove circle{fill:red}.link-tools .tool-remove path{fill:#fff}.link:hover .link-tools,.link:hover .marker-arrowheads,.link:hover .marker-vertices{opacity:1}.marker-vertex{fill:#1ABC9C}.marker-vertex:hover{fill:#34495E;stroke:none}.marker-arrowhead{fill:#1ABC9C}.marker-arrowhead:hover{fill:#F39C12;stroke:none}.marker-vertex-remove{cursor:pointer;opacity:.1;fill:#fff}.marker-vertex-group:hover .marker-vertex-remove{opacity:1}.marker-vertex-remove-area{opacity:.1;cursor:pointer}.marker-vertex-group:hover .marker-vertex-remove-area{opacity:1}.highlighted{opacity:.7}text.highlighted{fill:red}@media screen and (-webkit-min-device-pixel-ratio:0){.highlighted{outline:red solid 2px;opacity:initial}}.element .fobj{overflow:hidden}.element .fobj body{background-color:transparent;margin:0}.element .fobj div{text-align:center;vertical-align:middle;display:table-cell;padding:0 5px}.flo-view{width:100%;height:100%;margin:0;background-color:#eee;font-family:"Varela Round",sans-serif;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none}.canvas{border:1px solid;border-color:#6db33f;border-radius:2px;margin-top:3px}.paper{padding:0;background-color:#fff}#sidebar-resizer{background-color:#34302d;position:absolute;top:0;bottom:0;width:6px;cursor:e-resize}#palette-container{background-color:#EEE;position:absolute;top:0;bottom:0;left:0;overflow:auto}#paper-container{position:absolute;top:0;bottom:0;right:0;overflow:hidden;color:#FFF}#palette-floater{width:170px;height:60px;opacity:.75;float:left;position:absolute;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none}.palette-filter{border:3px solid #6db33f}.palette-filter-textfield{width:100%;font-size:24px;font-family:"Varela Round",sans-serif}.palette-paper{background-color:#eee;border-color:#6db33f}.node-tooltip .tooltip-description{margin-top:5px;margin-left:0;margin-bottom:5px}.node-tooltip{display:none;position:absolute;border:1px solid #333;background-color:#34302d;border-radius:5px;padding:5px;color:#fff;font-family:"Varela Round",sans-serif;font-size:19px;z-index:100}.tooltip-title-type{font-size:24px;font-weight:700}.tooltip-title-group{padding-left:5px;font-size:20px;font-style:italic}.node-tooltip-option-name{font-family:monospace;font-size:17px;font-weight:700;padding-right:20px}.node-tooltip-option-description{font-family:"Varela Round",sans-serif;font-size:18px}.properties td{border-top:1px solid #34302d}.properties{border:8px #eee;border-color:#6db33f;margin-top:3px;background-color:#eee;font-family:monospace;z-index:2;position:absolute}.properties-node-name{width:100%;background:#34302d;color:#fff;padding-left:2px;border:0;font-size:18px;font-family:"Varela Round",sans-serif;font-weight:700}.properties-node-name-row{background:#34302d;width:100%;padding-left:2px}.properties-row-even{width:100%;border-top:1px #34302d;background-color:#fff}.properties-row-odd{width:100%;border-top:1px #34302d;background-color:#eee}.properties-row-text-even{background-color:#fff;border-left:0;border-right:0;border-bottom:0;border-top:1px #34302d}.properties-row-text-odd{background-color:#eee;border-left:0;border-right:0;border-bottom:0;border-top:1px #34302d}.properties-input{width:100%;font-size:18px;font-family:"Varela Round",sans-serif}.properties-key{width:30%;padding-left:2px;padding-right:4px}.properties-value{width:70%;padding-left:2px;padding-right:2px}.properties-table{border:1px solid #d1d1d1;padding:3px}.properties-new-property{color:#888}.error-tooltip p{margin-top:5px;margin-left:0;margin-bottom:5px;color:#fff}.error-tooltip{display:none;position:absolute;border:1px solid #333;background-color:red;border-radius:5px;padding:5px;color:#fff;font-family:"Varela Round",sans-serif;font-size:20px;z-index:100}.canvas-controls-container{position:absolute;right:15px;top:5px}.canvas-control{background:0 0;font-family:"Varela Round",sans-serif;font-size:11px;vertical-align:middle;margin:0}.zoom-canvas-control{border:0;padding:0;margin:0;outline:0}.zoom-canvas-input{text-align:right;font-weight:700}.zoom-canvas-label{padding-right:4px}.CodeMirror{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-o-user-select:none;user-select:none;height:100%}.CodeMirror-hint{max-width:38em}.CodeMirror-vertical-ruler-error{background-color:rgba(188,0,0,.5)}.CodeMirror-vertical-ruler-warning{background-color:rgba(255,188,0,.5)}.highlighted{outline:0}.element.highlighted rect{stroke:#34302d;stroke-width:3}.handle{cursor:pointer}.available-magnet{stroke-width:3}.link{fill:none;stroke:#ccc;stroke-width:1.5px}.link-tools .tool-options{display:none} \ No newline at end of file diff --git a/dist/spring-flo.min.js b/dist/spring-flo.min.js index 9489955..2b9123d 100644 --- a/dist/spring-flo.min.js +++ b/dist/spring-flo.min.js @@ -99,4 +99,4 @@ * */ -define("directives/resizer",[],function(){return["$document",function(e){return function(t,n,r){function i(e){if(r.resizer==="vertical"){var t=e;r.resizerMax&&t>r.resizerMax&&(t=parseInt(r.resizerMax)),n.css({left:t+"px"}),$(r.resizerLeft).css({width:t+"px"}),$(r.resizerRight).css({left:t+parseInt(r.resizerWidth)+"px"})}else{var i=e;n.css({bottom:i+"px"}),$(r.resizerTop).css({bottom:i+parseInt(r.resizerHeight)+"px"}),$(r.resizerBottom).css({height:i+"px"})}}function s(e){var n;r.resizer==="vertical"?n=e.pageX-$(r.resizerLeft).offset().left:n=window.innerHeight-e.pageY-$(r.resizerTop).offset().top,t.flo.paletteSize=n,t.$apply()}function o(){e.unbind("mousemove",s),e.unbind("mouseup",o)}n.on("mousedown",function(t){t.preventDefault(),e.on("mousemove",s),e.on("mouseup",o)}),t.$watch(function(){return t.flo.paletteSize},function(e){i(e)}),t.flo.paletteSize&&i(t.flo.paletteSize)}}]}),function(e){if(typeof exports=="object"&&typeof module=="object")module.exports=e();else{if(typeof define=="function"&&define.amd)return define("codemirror/lib/codemirror",[],e);this.CodeMirror=e()}}(function(){function E(e,t){if(!(this instanceof E))return new E(e,t);this.options=t=t?nu(t):{},nu(Ei,t,!1),P(t);var n=t.value;typeof n=="string"&&(n=new Ks(n,t.mode)),this.doc=n;var o=new E.inputStyles[t.inputStyle](this),u=this.display=new S(e,n,o);u.wrapper.CodeMirror=this,O(this),L(this),t.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),t.autofocus&&!p&&u.input.focus(),F(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,draggingText:!1,highlight:new Xo,keySeq:null};var a=this;r&&i<11&&setTimeout(function(){a.display.input.reset(!0)},20),dr(this),Su(),Vn(this),this.curOp.forceUpdate=!0,Zs(this,n),t.autofocus&&!p||a.hasFocus()?setTimeout(ru(Vr,this),20):$r(this);for(var f in Si)Si.hasOwnProperty(f)&&Si[f](this,t[f],Ti);z(this),t.finishInit&&t.finishInit(this);for(var l=0;l