[Common UI] Initial commonUI bundles

Bring in work on general-purpose and over-arching
user interface bundles from the sandbox transition
branch. WTD-574.
This commit is contained in:
Victor Woeltjen 2014-11-23 15:41:20 -08:00
parent 0cd331e8a5
commit 1b0303e517
73 changed files with 6035 additions and 0 deletions

View File

@ -0,0 +1,126 @@
{
"extensions": {
"routes": [
{
"when": "/browse",
"templateUrl": "templates/browse.html"
},
{
"when": "",
"templateUrl": "templates/browse.html"
}
],
"controllers": [
{
"key": "BrowseController",
"implementation": "BrowseController.js",
"depends": [ "$scope", "objectService", "navigationService" ]
},
{
"key": "ViewSwitcherController",
"implementation": "ViewSwitcherController.js",
"depends": [ "$scope" ]
},
{
"key": "CreateButtonController",
"implementation": "creation/CreateButtonController",
"depends": [ "$scope", "$document" ]
},
{
"key": "CreateMenuController",
"implementation": "creation/CreateMenuController",
"depends": [ "$scope" ]
}
],
"templates": [
{
"key": "topbar-browse",
"templateUrl": "templates/topbar-browse.html"
}
],
"representations": [
{
"key": "browse-object",
"templateUrl": "templates/browse-object.html",
"uses": [ "view" ]
},
{
"key": "create-button",
"templateUrl": "templates/create-button.html"
},
{
"key": "create-menu",
"templateUrl": "templates/create-menu.html",
"uses": [ "action" ]
},
{
"key": "grid-item",
"templateUrl": "templates/items/grid-item.html",
"uses": [ "type", "action" ]
},
{
"key": "object-header",
"templateUrl": "templates/browse/object-header.html",
"uses": [ "type" ]
}
],
"services": [
{
"key": "navigationService",
"implementation": "navigation/NavigationService.js"
},
{
"key": "creationService",
"implementation": "creation/CreationService.js",
"depends": [ "persistenceService", "uuidService", "$q", "$log" ]
},
{
"key": "uuidService",
"implementation": "creation/UUIDService.js"
}
],
"actions": [
{
"key": "navigate",
"implementation": "navigation/NavigateAction.js",
"depends": [ "navigationService" ]
},
{
"key": "window",
"implementation": "windowing/NewWindowAction.js",
"description": "Open this object in a new window.",
"category": "view-control",
"depends": [ "$window" ],
"group": "windowing",
"glyph": "y"
},
{
"key": "fullscreen",
"implementation": "windowing/FullscreenAction.js",
"category": "view-control",
"group": "windowing",
"glyph": "z"
}
],
"views": [
{
"key": "items",
"name": "Items",
"glyph": "i",
"description": "Grid of available items.",
"templateUrl": "templates/items/items.html",
"uses": [ "composition" ],
"gestures": [ "drop" ]
}
],
"components": [
{
"key": "CreateActionProvider",
"provides": "actionService",
"type": "provider",
"implementation": "creation/CreateActionProvider.js",
"depends": [ "typeService", "dialogService", "creationService" ]
}
]
}
}

View File

@ -0,0 +1,6 @@
/*!
* screenfull
* v1.2.0 - 2014-04-29
* (c) Sindre Sorhus; MIT License
*/
!function(){"use strict";var a="undefined"!=typeof module&&module.exports,b="undefined"!=typeof Element&&"ALLOW_KEYBOARD_INPUT"in Element,c=function(){for(var a,b,c=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]],d=0,e=c.length,f={};e>d;d++)if(a=c[d],a&&a[1]in document){for(d=0,b=a.length;b>d;d++)f[c[0][d]]=a[d];return f}return!1}(),d={request:function(a){var d=c.requestFullscreen;a=a||document.documentElement,/5\.1[\.\d]* Safari/.test(navigator.userAgent)?a[d]():a[d](b&&Element.ALLOW_KEYBOARD_INPUT)},exit:function(){document[c.exitFullscreen]()},toggle:function(a){this.isFullscreen?this.exit():this.request(a)},onchange:function(){},onerror:function(){},raw:c};return c?(Object.defineProperties(d,{isFullscreen:{get:function(){return!!document[c.fullscreenElement]}},element:{enumerable:!0,get:function(){return document[c.fullscreenElement]}},enabled:{enumerable:!0,get:function(){return!!document[c.fullscreenEnabled]}}}),document.addEventListener(c.fullscreenchange,function(a){d.onchange.call(d,a)}),document.addEventListener(c.fullscreenerror,function(a){d.onerror.call(d,a)}),void(a?module.exports=d:window.screenfull=d)):void(a?module.exports=!1:window.screenfull=!1)}();

View File

@ -0,0 +1,26 @@
<span ng-controller="ViewSwitcherController">
<div class="object-browse-bar bar abs">
<div class="items-select left abs">
<mct-representation key="'object-header'" mct-object="domainObject">
</mct-representation>
</div>
<div class="view-controls sort-controls btn-bar right abs">
<mct-representation key="'action-group'"
mct-object="domainObject"
parameters="{ category: 'view-control' }">
</mct-representation>
<mct-include key="'switcher'" ng-model="switcher" ng-if="switcher.options.length > 0">
</mct-include>
</div>
</div>
<div class='object-holder abs vscroll'>
<mct-representation key="switcher.selected.key" mct-object="domainObject">
</mct-representation>
</div>
</span>

View File

@ -0,0 +1,25 @@
<div content="jquery-wrapper" class="abs holder-all browse-mode">
<mct-include key="'topbar-browse'"></mct-include>
<div class="holder browse-area outline abs" ng-controller="BrowseController as browse">
<div class='split-layout vertical contents abs'>
<div class='split-pane-component treeview pane' style="width: 200px;">
<mct-representation key="'create-button'" mct-object="navigatedObject">
</mct-representation>
<div class='holder tree-holder abs'>
<mct-representation key="'tree'"
mct-object="domainObject"
parameters="{callback: browse.setNavigation}">
</mct-representation>
</div>
</div>
<div class="splitter" style="left: 200px"></div>
<div class='split-pane-component items pane' style="right:0; left:200px;">
<div class='holder abs' id='content-area'>
<mct-representation mct-object="navigatedObject" key="'browse-object'">
</mct-representation>
</div>
</div>
</div>
</div>
<mct-include key="'bottombar'"></mct-include>
</div>

View File

@ -0,0 +1,7 @@
<div class='object-header'>
<span class='type-icon icon ui-symbol'>{{type.getGlyph()}}</span>
<span class='action'>{{parameters.mode}}</span>
<span class='type'>{{type.getName()}}</span>
<span class='title'>{{model.name}}</span>
<a id='actions-menu' class='ui-symbol invoke-menu' onclick="alert('Not yet functional. This will display a dropdown menu of options for this object.');">v</a>
</div>

View File

@ -0,0 +1,9 @@
<div class="menu-element wrapper" ng-controller="CreateButtonController">
<div class="btn btn-menu create-btn major" ng-click="toggle()">
<span class='ui-symbol major' href=''>+</span> Create<!--span class='ui-symbol invoke-menu'>v</span-->
</div>
<div class="menu dropdown super-menu" ng-show="createState.visible">
<mct-representation mct-object="domainObject" key="'create-menu'">
</mct-representation>
</div>
</div>

View File

@ -0,0 +1,30 @@
<div class="contents" ng-controller="CreateMenuController">
<div class="pane left menu-items">
<ul>
<li ng-repeat="createAction in createActions">
<a href=''
ng-click="createAction.perform()"
ng-mouseover="representation.activeMetadata = createAction.getMetadata()"
ng-mouseleave="representation.activeMetadata = undefined">
<span class="ui-symbol icon type-icon">
{{createAction.getMetadata().glyph}}
</span>
{{createAction.getMetadata().name}}
</a>
</li>
</ul>
</div>
<div class="pane right menu-item-description">
<div class="desc-area ui-symbol icon type-icon">
{{representation.activeMetadata.glyph}}
</div>
<div class="desc-area title">
{{representation.activeMetadata.name}}
</div>
<div class="desc-area description">
{{representation.activeMetadata.description}}
</div>
</div>
</div>

View File

@ -0,0 +1,26 @@
<!-- For selected, add class 'selected' to outer div -->
<div class='item grid-item' ng-click='action.perform("navigate")'>
<div class="contents abs">
<div class='top-bar bar abs'>
<div class='left abs'>
<mct-include key="_checkbox"></mct-include>
</div>
<div class='right abs'>
<div class='ui-symbol icon alert hidden' onclick="alert('Not yet functional. When this is visible, it means that this object needs to be updated. Clicking will allow that action via a dialog.');">!</div>
<div class='ui-symbol icon profile' onclick="alert('Not yet functional. This will allow sharing and permissions to be controlled for this object.');">P</div>
</div>
</div>
<div class='item-main abs'>
<div class='ui-symbol icon lg abs item-type'>{{type.getGlyph()}}</div>
<div class='ui-symbol icon abs item-open'>}</div>
</div>
<div class='bottom-bar bar abs'>
<div class='title'>{{model.name}}</div>
<div class='details'>
<span ng-show="model.composition !== undefined">
{{model.composition.length}} Items
</span>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,6 @@
<div class='items-holder grid abs'>
<mct-representation key="'grid-item'"
ng-repeat="childObject in composition"
mct-object="childObject">
</mct-representation>
</div>

View File

@ -0,0 +1,15 @@
<div class='top-bar browse abs'>
<!-- TO-DO: replace JS placeholders for click actions -->
<div class='browse-main bar abs left'>
<a class="menu-element btn btn-menu browse-btn" onclick="alert('Not yet functional. This will allow filtering of browsed objects and search context.');">
<span class='ui-symbol badge major' href=''>*</span>Browse All<span class='ui-symbol invoke-menu'>v</span>
</a>
<input type='text' class='control filter' name='filter-available'/>
<a class='icon icon-filter ui-symbol' onclick="alert('Not yet functional. This will initiate a search.');">M</a>
</div>
<div class='icon-buttons-main bar abs right'>
<a class='ui-symbol icon major alert' onclick="alert('Not yet functional. This will allow updating of domain objects that need to be refreshed.');">!<span id='alert-actions-menu' class='ui-symbol invoke-menu'>v</span></a>
<!--a class='ui-symbol icon major profile' href=''>P<span id='profile-actions-menu' class='ui-symbol invoke-menu'>v</span></a-->
<a class='ui-symbol icon major settings' onclick="alert('Not yet functional. This will allow access to application configuration settings.');">G<span id='settings-actions-menu' class='ui-symbol invoke-menu'>v</span></a>
</div>
</div>

View File

@ -0,0 +1,53 @@
/*global define,Promise*/
/**
* Module defining BrowseController. Created by vwoeltje on 11/7/14.
*/
define(
[],
function () {
"use strict";
var ROOT_OBJECT = "ROOT";
/**
*
* @constructor
*/
function BrowseController($scope, objectService, navigationService) {
function setNavigation(domainObject) {
$scope.navigatedObject = domainObject;
//$scope.$apply("navigatedObject");
}
objectService.getObjects([ROOT_OBJECT]).then(function (objects) {
var composition = objects[ROOT_OBJECT].useCapability("composition");
$scope.domainObject = objects[ROOT_OBJECT];
if (composition) {
composition.then(function (c) {
// Navigate to the last root level component (usually "mine")
if (!navigationService.getNavigation()) {
navigationService.setNavigation(c[c.length - 1]);
} else {
$scope.navigatedObject = navigationService.getNavigation();
}
});
}
});
$scope.$on("$destroy", function () {
navigationService.removeListener(setNavigation);
});
navigationService.addListener(setNavigation);
return {
setNavigation: function (domainObject) {
navigationService.setNavigation(domainObject);
}
};
}
return BrowseController;
}
);

View File

@ -0,0 +1,48 @@
/*global define,Promise*/
/**
* Module defining ViewSwitcherController. Created by vwoeltje on 11/7/14.
*/
define(
[],
function () {
"use strict";
/**
*
* @constructor
*/
function ViewSwitcherController($scope) {
// If the view capability gets refreshed, try to
// keep the same option chosen.
function findMatchingOption(options, selected) {
var i;
if (selected) {
for (i = 0; i < options.length; i += 1) {
if (options[i].key === selected.key) {
return options[i];
}
}
}
return options[0];
}
// Get list of views, read from capability
$scope.$watch("view", function () {
var options = $scope.view || [ {} ];
$scope.switcher = {
options: options,
selected: findMatchingOption(
options,
($scope.switcher || {}).selected
)
};
});
}
return ViewSwitcherController;
}
);

View File

@ -0,0 +1,67 @@
/*global define,Promise*/
/**
* Module defining CreateAction. Created by vwoeltje on 11/10/14.
*/
define(
['./CreateWizard'],
function (CreateWizard) {
"use strict";
/**
*
* @constructor
*/
function CreateAction(type, parent, context, dialogService, creationService) {
/*
1. Show dialog
a. Prepare dialog contents
b. Invoke dialogService
2. Create new object in persistence service
a. Generate UUID
b. Store model
3. Mutate destination container
a. Get mutation capability
b. Add new id to composition
4. Persist destination container
a. ...use persistence capability.
*/
function perform() {
var wizard = new CreateWizard(type, parent);
function persistResult(formValue) {
var parent = wizard.getLocation(formValue),
newModel = wizard.createModel(formValue);
return creationService.createObject(newModel, parent);
}
function doNothing() {
// Create cancelled, do nothing
return false;
}
return dialogService.getUserInput(
wizard.getFormModel()
).then(persistResult, doNothing);
}
return {
perform: perform,
getMetadata: function () {
return {
key: 'create',
glyph: type.getGlyph(),
name: type.getName(),
description: type.getDescription(),
context: context
};
}
};
}
return CreateAction;
}
);

View File

@ -0,0 +1,41 @@
/*global define,Promise*/
/**
* Module defining CreateActionProvider.js. Created by vwoeltje on 11/10/14.
*/
define(
["./CreateAction"],
function (CreateAction) {
"use strict";
/**
*
* @constructor
*/
function CreateActionProvider(typeService, dialogService, creationService) {
return {
getActions: function (actionContext) {
var context = actionContext || {},
key = context.key,
destination = context.domainObject;
if (key !== 'create' || !destination) {
return [];
}
return typeService.listTypes().map(function (type) {
return new CreateAction(
type,
destination,
context,
dialogService,
creationService
);
});
}
};
}
return CreateActionProvider;
}
);

View File

@ -0,0 +1,36 @@
/*global define,Promise*/
/**
* Module defining CreateController. Created by vwoeltje on 11/10/14.
*/
define(
[],
function () {
"use strict";
/**
*
* @constructor
*/
function CreateButtonController($scope, $document) {
function collapse() {
$scope.createState.visible = false;
$scope.$apply("createState.visible");
$document.off("mouseup", collapse);
return false;
}
$scope.createState = { visible: false };
$scope.toggle = function () {
$scope.createState.visible = !$scope.createState.visible;
if ($scope.createState.visible) {
$document.on("mouseup", collapse);
}
};
}
return CreateButtonController;
}
);

View File

@ -0,0 +1,29 @@
/*global define,Promise*/
/**
* Module defining CreateMenuController. Created by vwoeltje on 11/10/14.
*/
define(
[],
function () {
"use strict";
/**
*
* @constructor
*/
function CreateMenuController($scope) {
function refreshActions() {
var actionCapability = $scope.action;
if (actionCapability) {
$scope.createActions =
actionCapability.getActions('create');
}
}
$scope.$watch("action", refreshActions);
}
return CreateMenuController;
}
);

View File

@ -0,0 +1,79 @@
/*global define*/
/**
* Defines the CreateWizard, used by the CreateAction to
* populate the form shown in dialog based on the created type.
*
* @module core/action/create-wizard
*/
define(
function () {
'use strict';
/**
* Construct a new CreateWizard.
*
* @param {TypeImpl} type the type of domain object to be created
* @param {DomainObject} parent the domain object to serve as
* the initial parent for the created object, in the dialog
* @constructor
* @memberof module:core/action/create-wizard
*/
function CreateWizard(type, parent) {
var model = type.getInitialModel(),
properties = type.getProperties();
return {
getFormModel: function () {
var parentRow = Object.create(parent),
sections = [];
sections.push({
name: "Properties",
rows: properties.map(function (property) {
// Property definition is same as form row definition
var row = Object.create(property.getDefinition());
// But pull an initial value from the model
row.value = property.getValue(model);
return row;
})
});
// Ensure there is always a "save in" section
parentRow.name = "Save In";
parentRow.cssclass = "selector-list";
parentRow.control = "_locator";
parentRow.key = "createParent";
sections.push({ label: 'Location', rows: [parentRow]});
return {
sections: sections,
name: "Create a New " + type.getName()
};
},
getLocation: function (formValue) {
return formValue.createParent || parent;
},
createModel: function (formValue) {
// Clone
var newModel = JSON.parse(JSON.stringify(model));
// Always use the type from the type definition
newModel.type = type.getKey();
// Update all properties
properties.forEach(function (property) {
var value = formValue[property.getDefinition().key];
property.setValue(newModel, value);
});
return newModel;
}
};
}
return CreateWizard;
}
);

View File

@ -0,0 +1,90 @@
/*global define,Promise*/
/**
* Module defining CreateService. Created by vwoeltje on 11/10/14.
*/
define(
[],
function () {
"use strict";
var NON_PERSISTENT_WARNING =
"Tried to create an object in non-persistent container.",
NO_COMPOSITION_WARNING =
"Could not add to composition; no composition in ";
/**
*
* @constructor
*/
function CreationService(persistenceService, uuidService, $q, $log) {
function doPersist(space, id, model) {
return persistenceService.createObject(
space,
id,
model
).then(function () { return id; });
}
function addToComposition(id, parent) {
var mutatationResult = parent.useCapability("mutation", function (model) {
if (Array.isArray(model.composition)) {
if (model.composition.indexOf(id) === -1) {
model.composition.push(id);
}
} else {
$log.warn(NO_COMPOSITION_WARNING + parent.getId());
}
});
return $q.when(mutatationResult).then(function (result) {
var persistence = parent.getCapability("persistence");
if (!result) {
$log.error("Could not mutate " + parent.getId());
}
if (!persistence) {
$log.error([
"Expected to be able to persist ",
parent.getId(),
" but could not."
].join(""));
return undefined;
}
return persistence.persist();
});
}
function createObject(model, parent) {
var persistence = parent.getCapability("persistence"),
result = $q.defer(),
space;
if (persistence) {
space = persistence.getSpace();
return $q.when(
uuidService.getUUID()
).then(function (id) {
return doPersist(space, id, model);
}).then(function (id) {
return addToComposition(id, parent);
});
} else {
$log.warn(NON_PERSISTENT_WARNING);
$q.reject(new Error(NON_PERSISTENT_WARNING));
}
return result.promise;
}
return {
createObject: createObject
};
}
return CreationService;
}
);

View File

@ -0,0 +1,29 @@
/*global define,Promise*/
/**
* Module defining UUIDService. Created by vwoeltje on 11/12/14.
*/
define(
[],
function () {
"use strict";
/**
*
* @constructor
*/
function UUIDService() {
var counter = Date.now();
return {
getUUID: function () {
counter += 1;
return counter.toString(36);
}
};
}
return UUIDService;
}
);

View File

@ -0,0 +1,35 @@
/*global define,Promise*/
/**
* Module defining NavigateAction. Created by vwoeltje on 11/10/14.
*/
define(
[],
function () {
"use strict";
/**
*
* @constructor
*/
function NavigateAction(navigationService, context) {
var domainObject = context.domainObject;
function perform() {
return Promise.resolve(
navigationService.setNavigation(domainObject)
);
}
return {
perform: perform
};
}
NavigateAction.appliesTo = function (context) {
return context.domainObject !== undefined;
};
return NavigateAction;
}
);

View File

@ -0,0 +1,50 @@
/*global define,Promise*/
/**
* Module defining NavigationService. Created by vwoeltje on 11/10/14.
*/
define(
[],
function () {
"use strict";
/**
*
* @constructor
*/
function NavigationService() {
var navigated,
callbacks = [];
function getNavigation() {
return navigated;
}
function setNavigation(value) {
navigated = value;
callbacks.forEach(function (callback) {
callback(value);
});
}
function addListener(callback) {
callbacks.push(callback);
}
function removeListener(callback) {
callbacks = callbacks.filter(function (cb) {
return cb !== callback;
});
}
return {
getNavigation: getNavigation,
setNavigation: setNavigation,
addListener: addListener,
removeListener: removeListener
};
}
return NavigationService;
}
);

View File

@ -0,0 +1,41 @@
/*global define,screenfull,Promise*/
/**
* Module defining FullscreenAction. Created by vwoeltje on 11/18/14.
*/
define(
["../../lib/screenfull.min"],
function () {
"use strict";
var ENTER_FULLSCREEN = "Enter full screen mode.",
EXIT_FULLSCREEN = "Exit full screen mode.";
/**
*
* @constructor
*/
function FullscreenAction(context) {
return {
perform: function () {
screenfull.toggle();
},
getMetadata: function () {
// We override getMetadata, because the glyph and
// description need to be determined at run-time
// based on whether or not we are currently
// full screen.
var metadata = Object.create(FullscreenAction);
metadata.glyph = screenfull.isFullscreen ? "_" : "z";
metadata.description = screenfull.isFullscreen ?
EXIT_FULLSCREEN : ENTER_FULLSCREEN;
metadata.group = "windowing";
metadata.context = context;
return metadata;
}
};
}
return FullscreenAction;
}
);

View File

@ -0,0 +1,25 @@
/*global define,Promise*/
/**
* Module defining NewWindowAction. Created by vwoeltje on 11/18/14.
*/
define(
[],
function () {
"use strict";
/**
*
* @constructor
*/
function NewWindowAction($window) {
return {
perform: function () {
$window.alert("Not yet functional. This will open objects in a new window.");
}
};
}
return NewWindowAction;
}
);

View File

@ -0,0 +1,17 @@
{
"extensions": {
"services": [
{
"key": "dialogService",
"implementation": "DialogService.js",
"depends": [ "$document", "$compile", "$rootScope", "$timeout", "$q", "$log" ]
}
],
"templates": [
{
"key": "overlay-dialog",
"templateUrl": "templates/overlay.html"
}
]
}
}

View File

@ -0,0 +1,28 @@
<div class="abs overlay" ng-show="ngModel.visible">
<div class="abs blocker"></div>
<div class="abs holder">
<a href=""
ng-click="state.cancel()"
class="btn normal outline ui-symbol close">x</a>
<div class="abs contents">
<div class="abs top-bar">
<div class="title">{{ngModel.title}}</div>
<div class="hint">All fields marked <span class="ui-symbol req">*</span> are required.</div>
</div>
<div class="abs form outline editor">
<div class='abs contents'>
<!-- mct-include key="'form'" ng-model="" -->
<textarea ng-model="ngModel.value"></textarea>
</div>
</div>
<div class="abs bottom-bar">
<a class='btn lg major' href='' ng-click="ngModel.confirm()">
OK
</a>
<a class='btn lg subtle' href='' ng-click="ngModel.cancel()">
Cancel
</a>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,79 @@
/*global define,Promise*/
/**
* Module defining DialogService. Created by vwoeltje on 11/10/14.
*/
define(
[],
function () {
"use strict";
/**
*
* @constructor
*/
function DialogService($document, $compile, $rootScope, $timeout, $q, $log) {
var scope;
function addContent() {
scope = $rootScope.$new();
$document.find('body').prepend(
$compile(
"<mct-include ng-model=\"dialog\" key=\"'overlay-dialog'\"></mct-include>"
)(scope)
);
scope.dialog = { visible: false, value: {} };
}
function dismiss() {
scope.dialog = { visible: false, value: {} };
}
return {
getUserInput: function (formModel, value) {
var deferred = $q.defer();
if (!scope) {
addContent();
}
$timeout(function () {
if (scope.dialog.visible) {
$log.warn([
"Dialog already showing; ",
"unable to show ",
title
].join(""));
}
scope.dialog.visible = true;
scope.dialog.title = formModel.name;
scope.dialog.message = formModel.message;
scope.dialog.formModel = formModel;
scope.dialog.value = JSON.stringify(value);
scope.dialog.confirm = function () {
var resultingValue;
try {
resultingValue = JSON.parse(scope.dialog.value);
} catch (e) {
resultingValue = {};
}
deferred.resolve(resultingValue);
dismiss();
};
scope.dialog.cancel = function () {
deferred.reject();
dismiss();
};
});
return deferred.promise;
}
};
}
return DialogService;
}
);

View File

@ -0,0 +1 @@
Contains sources and resources associated with Edit mode.

View File

@ -0,0 +1,85 @@
{
"extensions": {
"routes": [
{
"when": "/edit",
"templateUrl": "templates/edit.html"
}
],
"controllers": [
{
"key": "EditController",
"implementation": "EditController.js",
"depends": [ "$scope", "navigationService" ]
},
{
"key": "EditActionController",
"implementation": "EditActionController.js",
"depends": [ "$scope" ]
}
],
"actions": [
{
"key": "edit",
"implementation": "actions/EditAction.js",
"depends": [ "$location", "navigationService", "$log" ],
"description": "Edit this object.",
"category": "view-control",
"glyph": "p"
},
{
"key": "remove",
"category": "contextual",
"implementation": "actions/RemoveAction.js",
"glyph": "Z",
"name": "Remove",
"description": "Remove this object from its containing object.",
"depends": [ "$q" ]
},
{
"key": "save",
"category": "conclude-editing",
"implementation": "actions/SaveAction.js",
"name": "Save",
"description": "Save changes made to these objects.",
"depends": [ "$location" ]
},
{
"key": "cancel",
"category": "conclude-editing",
"implementation": "actions/CancelAction.js",
"name": "Cancel",
"description": "Discard changes made to these objects.",
"depends": [ "$location" ]
}
],
"templates": [
{
"key": "topbar-edit",
"templateUrl": "templates/topbar-edit.html"
},
{
"key": "edit-library",
"templateUrl": "templates/library.html"
}
],
"representations": [
{
"key": "edit-object",
"templateUrl": "templates/edit-object.html",
"uses": [ "view", "context" ]
},
{
"key": "edit-action-buttons",
"templateUrl": "templates/edit-action-buttons.html",
"uses": [ "action" ]
},
{
"key": "edit-elements",
"templateUrl": "templates/elements.html",
"uses": [ "composition" ],
"gestures": [ "drop" ]
}
]
}
}

View File

@ -0,0 +1,9 @@
<span ng-controller="EditActionController">
<span ng-repeat="currentAction in editActions">
<a class='btn'
ng-click="currentAction.perform()"
ng-class="{ major: $index === 0, subtle: $index !== 0 }">
{{currentAction.getMetadata().name}}
</a>
</span>
</span>

View File

@ -0,0 +1,33 @@
<span ng-controller="ViewSwitcherController">
<mct-include key="'topbar-edit'"
parameters="{ switcher: switcher, object: domainObject }">
</mct-include>
<div class="holder edit-area outline abs">
<!-- edit toolbar goes here -->
<div class='split-layout vertical contents abs work-area'>
<div class='split-pane-component edit-main pane' style="right: 200px; left: 0px;">
<div class='holder abs object-holder'>
<mct-representation key="switcher.selected.key" mct-object="domainObject">
</mct-representation>
</div>
</div>
<div class="splitter" style="right: 200px"></div>
<div class='split-pane-component edit-objects pane menus-to-left'
style="right: 0px; width: 200px">
<div class='holder abs split-layout horizontal'>
<mct-container key="accordion" title="Library" style="position: relative; top: 0px;">
<mct-representation key="'tree'" mct-object="context.getRoot()">
</mct-representation>
</mct-container>
<mct-container key="accordion" title="Elements" style="position: relative; top: 200px;">
<mct-representation key="'edit-elements'" mct-object="domainObject">
</mct-representation>
</mct-container>
</div>
</div>
</div>
</div>
</span>

View File

@ -0,0 +1,10 @@
<div content="jquery-wrapper"
class="abs holder-all edit-mode"
ng-controller="EditController">
<mct-representation key="'edit-object'" mct-object="navigatedObject">
</mct-representation>
<mct-include key="'bottombar'"></mct-include>
</div>

View File

@ -0,0 +1,11 @@
<div class="current-elements abs" style="height: 100%;">
<!--p class="hint">Drop objects here to add them...</p-->
<ul class="tree">
<li ng-repeat="containedObject in composition">
<span class="tree-item">
<mct-representation key="'label'" mct-object="containedObject">
</mct-representation>
</span>
</li>
</ul>
</div>

View File

@ -0,0 +1,4 @@
<mct-representation key="'tree'"
mct-object="parameters.domainObject"
parameters="parameters">
</mct-representation>

View File

@ -0,0 +1,17 @@
<div class='top-bar edit abs'>
<mct-representation key="'object-header'" mct-object="parameters.object" parameters="{ mode: 'Edit' }">
</mct-representation>
<div class='buttons-main btn-bar buttons abs'>
<mct-include key="'switcher'"
ng-model="parameters.switcher"
ng-if="parameters.switcher.options.length > 0">
</mct-include>
<mct-representation key="'edit-action-buttons'"
mct-object="parameters.object"
class='conclude-editing'>
<!--a class='btn major' href=''>Save<span id='save-actions-menu' class='ui-symbol invoke-menu'>v</span></a>
<a class='btn subtle' href=''>Cancel</a-->
</mct-representation>
</div>
</div>

View File

@ -0,0 +1,31 @@
/*global define,Promise*/
/**
* Module defining EditActionController. Created by vwoeltje on 11/17/14.
*/
define(
[],
function () {
"use strict";
/**
* Controller which supplies action instances for Save/Cancel.
* @constructor
*/
function EditActionController($scope) {
function updateActions() {
if (!$scope.action) {
$scope.editActions = [];
} else {
$scope.editActions = $scope.action.getActions({
category: 'conclude-editing'
});
}
}
$scope.$watch("action", updateActions);
}
return EditActionController;
}
);

View File

@ -0,0 +1,27 @@
/*global define,Promise*/
/**
* Module defining EditController. Created by vwoeltje on 11/14/14.
*/
define(
["./objects/EditableDomainObject"],
function (EditableDomainObject) {
"use strict";
/**
*
* @constructor
*/
function EditController($scope, navigationService) {
function setNavigation(domainObject) {
$scope.navigatedObject =
domainObject && new EditableDomainObject(domainObject);
}
setNavigation(navigationService.getNavigation());
navigationService.addListener(setNavigation);
}
return EditController;
}
);

View File

@ -0,0 +1,51 @@
/*global define*/
/**
* The "Save" action; the action triggered by clicking Save from
* Edit Mode. Exits the editing user interface and invokes object
* capabilities to persist the changes that have been made.
*/
define(
function () {
'use strict';
function CancelAction($location, context) {
var domainObject = context.domainObject;
// Look up the object's "editor.completion" capability;
// this is introduced by EditableDomainObject which is
// used to insulate underlying objects from changes made
// during editing.
function getEditorCapability() {
return domainObject.getCapability("editor");
}
// Invoke any save behavior introduced by the editor.completion
// capability.
function doCancel(editor) {
return editor.cancel();
}
// Discard the current root view (which will be the editing
// UI, which will have been pushed atop the Browise UI.)
function returnToBrowse() {
$location.path("/browse");
}
return {
perform: function () {
return doCancel(getEditorCapability())
.then(returnToBrowse);
}
};
}
CancelAction.appliesTo = function (context) {
var domainObject = (context || {}).domainObject;
return domainObject !== undefined &&
domainObject.hasCapability("editor");
};
return CancelAction;
}
);

View File

@ -0,0 +1,47 @@
/*global define,Promise*/
/**
* Module defining EditAction. Created by vwoeltje on 11/14/14.
*/
define(
[],
function () {
"use strict";
var NULL_ACTION = {
perform: function () {
return undefined;
}
};
/**
*
* @constructor
*/
function EditAction($location, navigationService, $log, context) {
var domainObject = (context || {}).domainObject;
if (!domainObject) {
$log.error([
"No domain object to edit; ",
"edit action is not valid."
].join(""));
return NULL_ACTION;
}
return {
perform: function () {
navigationService.setNavigation(domainObject);
$location.path("/edit");
}
};
}
EditAction.appliesTo = function (context) {
return (context || {}).domainObject !== undefined;
};
return EditAction;
}
);

View File

@ -0,0 +1,90 @@
/*global define*/
/**
* Module defining RemoveAction. Created by vwoeltje on 11/17/14.
*/
define(
[],
function () {
"use strict";
/**
* Construct an action which will remove the provided object manifestation.
* The object will be removed from its parent's composition; the parent
* is looked up via the "context" capability (so this will be the
* immediate ancestor by which this specific object was reached.)
*
* @param {DomainObject} object the object to be removed
* @param {ActionContext} context the context in which this action is performed
* @constructor
* @memberof module:editor/actions/remove-action
*/
function RemoveAction($q, context) {
var object = (context || {}).domainObject;
/**
* Check whether an object ID matches the ID of the object being
* removed (used to filter a parent's composition to handle the
* removal.)
*/
function isNotObject(otherObjectId) {
return otherObjectId !== object.getId();
}
/**
* Mutate a parent object such that it no longer contains the object
* which is being removed.
*/
function doMutate(model) {
model.composition = model.composition.filter(isNotObject);
}
/**
* Invoke persistence on a domain object. This will be called upon
* the removed object's parent (as its composition will have changed.)
*/
function doPersist(domainObject) {
var persistence = domainObject.getCapability('persistence');
return persistence && persistence.persist();
}
/**
* Remove the object from its parent, as identified by its context
* capability.
* @param {ContextCapability} contextCapability the "context" capability
* of the domain object being removed.
*/
function removeFromContext(contextCapability) {
var parent = contextCapability.getParent();
$q.when(
parent.useCapability('mutation', doMutate)
).then(function () {
return doPersist(parent);
});
}
return {
/**
* Perform this action.
* @return {module:core/promises.Promise} a promise which will be
* fulfilled when the action has completed.
*/
perform: function () {
return $q.when(object.getCapability('context'))
.then(removeFromContext);
}
};
}
// Object needs to have a parent for Remove to be applicable
/*RemoveAction.appliesTo = function (context) {
var object = context.domainObject,
contextCapability = object && object.getCapability("context"),
parent = contextCapability && contextCapability.getParent();
return parent !== undefined &&
Array.isArray(parent.getModel().composition);
};*/
return RemoveAction;
}
);

View File

@ -0,0 +1,50 @@
/*global define*/
/**
* The "Save" action; the action triggered by clicking Save from
* Edit Mode. Exits the editing user interface and invokes object
* capabilities to persist the changes that have been made.
*/
define(
function () {
'use strict';
function SaveAction($location, context) {
var domainObject = context.domainObject;
// Look up the object's "editor.completion" capability;
// this is introduced by EditableDomainObject which is
// used to insulate underlying objects from changes made
// during editing.
function getEditorCapability() {
return domainObject.getCapability("editor");
}
// Invoke any save behavior introduced by the editor.completion
// capability.
function doSave(editor) {
return editor.save();
}
// Discard the current root view (which will be the editing
// UI, which will have been pushed atop the Browise UI.)
function returnToBrowse() {
$location.path("/browse");
}
return {
perform: function () {
return doSave(getEditorCapability()).then(returnToBrowse);
}
};
}
SaveAction.appliesTo = function (context) {
var domainObject = (context || {}).domainObject;
return domainObject !== undefined &&
domainObject.hasCapability("editor");
};
return SaveAction;
}
);

View File

@ -0,0 +1,56 @@
/*global define*/
/**
* Wrapper for both "context" and "composition" capabilities;
* ensures that any domain objects reachable in Edit mode
* are also wrapped as EditableDomainObjects
*/
define(
[],
function () {
'use strict';
return function EditableContextCapability(
contextCapability,
editableObject,
domainObject,
factory
) {
var capability = Object.create(contextCapability);
function isDomainObject(obj) {
return typeof obj.getId === 'function' &&
typeof obj.getModel === 'function' &&
typeof obj.getCapability === 'function';
}
function makeEditableObject(obj) {
return isDomainObject(obj) ?
factory.getEditableObject(obj) :
obj;
}
function makeEditable(obj) {
return Array.isArray(obj) ?
obj.map(makeEditableObject) :
makeEditableObject(obj);
}
// Replace all methods; return only editable domain objects.
Object.keys(contextCapability).forEach(function (k) {
capability[k] = function () {
var result = contextCapability[k].apply(
capability,
arguments
);
return result.then ? // promise-like
result.then(makeEditable) :
makeEditable(result);
};
});
return capability;
};
}
);

View File

@ -0,0 +1,30 @@
/*global define*/
/**
* Editable Persistence Capability. Overrides the persistence capability
* normally exhibited by a domain object to ensure that changes made
* during edit mode are not immediately stored to the database or other
* backing storage.
*/
define(
function () {
'use strict';
return function EditablePersistenceCapability(
persistenceCapability,
editableObject,
domainObject,
cache
) {
var persistence = Object.create(persistenceCapability);
// Simply trigger refresh of in-view objects; do not
// write anything to database.
persistence.persist = function () {
cache.markDirty(editableObject);
};
return persistence;
};
}
);

View File

@ -0,0 +1,55 @@
/*global define*/
/**
* Implements "save" and "cancel" as capabilities of
* the object. In editing mode, user is seeing/using
* a copy of the object (an EditableDomainObject)
* which is disconnected from persistence; the Save
* and Cancel actions can use this capability to
* propagate changes from edit mode to the underlying
* actual persistable object.
*/
define(
[],
function () {
'use strict';
return function EditorCapability(
persistenceCapability,
editableObject,
domainObject,
cache
) {
function doMutate() {
return domainObject.useCapability('mutation', function () {
return editableObject.getModel();
});
}
function doPersist() {
return persistenceCapability.persist();
}
function saveOthers() {
return cache.saveAll();
}
function markClean() {
return cache.markClean(editableObject);
}
return {
save: function () {
return Promise.resolve(doMutate())
.then(doPersist)
.then(markClean)
.then(saveOthers);
},
cancel: function () {
return Promise.resolve(undefined);
}
};
};
}
);

View File

@ -0,0 +1,84 @@
/*global define*/
/**
* Defines EditableDomainObject, which wraps domain objects
* such that user code may work with and mutate a copy of the
* domain object model; these changes may then be propagated
* up to the real domain object (or not) by way of invoking
* save or cancel behaviors of the "editor.completion"
* capability (a capability intended as internal to edit
* mode; invoked by way of the Save and Cancel actions.)
*/
define(
[
'../capabilities/EditablePersistenceCapability',
'../capabilities/EditableContextCapability',
'../capabilities/EditorCapability',
'./EditableDomainObjectCache'
],
function (
EditablePersistenceCapability,
EditableContextCapability,
EditorCapability,
EditableDomainObjectCache
) {
"use strict";
var capabilityFactories = {
persistence: EditablePersistenceCapability,
context: EditableContextCapability,
composition: EditableContextCapability,
editor: EditorCapability
};
// Handle special case where "editor.completion" wraps persistence
// (other capability overrides wrap capabilities of the same type.)
function getDelegateArguments(name, args) {
return name === "editor" ? ['persistence'] : args;
}
/**
* An EditableDomainObject overrides capabilities
* which need to behave differently in edit mode,
* and provides a "working copy" of the object's
* model to allow changes to be easily cancelled.
*/
function EditableDomainObject(domainObject) {
// The cache will hold all domain objects reached from
// the initial EditableDomainObject; this ensures that
// different versions of the same editable domain object
// are not shown in different sections of the same Edit
// UI, which might thereby fall out of sync.
var cache;
// Constructor for EditableDomainObject, which adheres
// to the same shared cache.
function EditableDomainObjectImpl(domainObject) {
var model = JSON.parse(JSON.stringify(domainObject.getModel())),
editableObject = Object.create(domainObject);
// Only provide the cloned model.
editableObject.getModel = function () { return model; };
// Override certain capabilities
editableObject.getCapability = function (name) {
var delegateArguments = getDelegateArguments(name, arguments),
capability = domainObject.getCapability.apply(this, delegateArguments),
factory = capabilityFactories[name];
return (factory && capability) ?
factory(capability, editableObject, domainObject, cache) :
capability;
};
return editableObject;
}
cache = new EditableDomainObjectCache(EditableDomainObjectImpl);
return cache.getEditableObject(domainObject);
}
return EditableDomainObject;
}
);

View File

@ -0,0 +1,102 @@
/*global define*/
/**
* An editable domain object cache stores domain objects that have been
* made editable, in a group that can be saved all-at-once. This supports
* Edit mode, which is launched for a specific object but may contain
* changes across many objects.
*
* Editable domain objects have certain specific capabilities overridden
* to ensure that changes made while in edit mode do not propagate up
* to the objects used in browse mode (or to persistence) until the user
* initiates a Save.
*
* @module editor/object/editable-domain-object-cache
*/
define(
function () {
'use strict';
/**
* Construct a new cache for editable domain objects. This can be used
* to get-or-create editable objects, particularly to support wrapping
* of objects retrieved via composition or context capabilities as
* editable domain objects.
*
* @param {Constructor<EditableDomainObject>} EditableDomainObject a
* constructor function which takes a regular domain object as
* an argument, and returns an editable domain object as its
* result.
* @constructor
* @memberof module:editor/object/editable-domain-object-cache
*/
function EditableDomainObjectCache(EditableDomainObject) {
var cache = {},
dirty = {};
return {
/**
* Wrap this domain object in an editable form, or pull such
* an object from the cache if one already exists.
*
* @param {DomainObject} domainObject the regular domain object
* @returns {DomainObject} the domain object in an editable form
*/
getEditableObject: function (domainObject) {
var id = domainObject.getId();
return (cache[id] =
cache[id] || new EditableDomainObject(domainObject));
},
/**
* Mark an editable domain object (presumably already cached)
* as having received modifications during editing; it should be
* included in the bulk save invoked when editing completes.
*
* @param {DomainObject} domainObject the domain object
*/
markDirty: function (domainObject) {
dirty[domainObject.getId()] = domainObject;
},
/**
* Mark an object (presumably already cached) as having had its
* changes saved (and thus no longer needing to be subject to a
* save operation.)
*
* @param {DomainObject} domainObject the domain object
*/
markClean: function (domainObject) {
delete dirty[domainObject.getId()];
},
/**
* Initiate a save on all objects that have been cached.
*/
saveAll: function () {
var object;
// Most save logic is handled by the "editor.completion"
// capability, but this in turn will typically invoke
// Save All. An infinite loop is avoided by marking
// objects as clean as we go.
function doSave(editCapability) {
return editCapability.save();
}
while (Object.keys(dirty).length > 0) {
// Pick the first dirty object
object = dirty[Object.keys(dirty)[0]];
// Mark non-dirty to avoid successive invocations
this.markClean(object);
// Invoke its save behavior
object.getCapability('editor.completion').then(doSave);
}
}
};
}
return EditableDomainObjectCache;
}
);

View File

@ -0,0 +1,94 @@
{
"name": "General UI elements",
"description": "General UI elements, meant to be reused across modes.",
"resources": "res",
"extensions": {
"templates": [
{
"key": "bottombar",
"templateUrl": "templates/bottombar.html"
},
{
"key": "switcher",
"templateUrl": "templates/controls/switcher.html"
},
{
"key": "action-button",
"templateUrl": "templates/controls/action-button.html"
}
],
"controllers": [
{
"key": "TreeNodeController",
"implementation": "TreeNodeController.js",
"depends": [ "$scope", "navigationService" ]
},
{
"key": "ActionGroupController",
"implementation": "ActionGroupController.js",
"depends": [ "$scope" ]
},
{
"key": "AccordionController",
"implementation": "AccordionController.js"
},
{
"key": "ContextMenuController",
"implementation": "ContextMenuController.js",
"depends": [ "$scope" ]
}
],
"directives": [
{
"key": "mctContainer",
"implementation": "MCTContainer.js",
"depends": [ "containers[]" ]
}
],
"containers": [
{
"key": "accordion",
"templateUrl": "templates/containers/accordion.html",
"attributes": [ "title" ]
}
],
"representations": [
{
"key": "tree",
"templateUrl": "templates/tree.html",
"uses": [ "composition" ]
},
{
"key": "test",
"templateUrl": "templates/test.html"
},
{
"key": "tree-item",
"templateUrl": "templates/tree-item.html",
"uses": [ "action" ]
},
{
"key": "label",
"templateUrl": "templates/label.html",
"uses": [ "type" ],
"gestures": [ "drag", "menu" ]
},
{
"key": "node",
"templateUrl": "templates/label.html",
"uses": [ "type" ],
"gestures": [ "drag", "menu" ]
},
{
"key": "action-group",
"templateUrl": "templates/controls/action-group.html",
"uses": [ "action" ]
},
{
"key": "context-menu",
"templateUrl": "templates/menu/context-menu.html",
"uses": [ "action" ]
}
]
}
}

View File

@ -0,0 +1,333 @@
/* line 2, ../sass/forms/_elems.scss */
.form .section-header {
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
background: rgba(255, 255, 255, 0.1);
font-size: 0.8em;
margin-top: 5px;
padding: 5px; }
/* line 8, ../sass/forms/_elems.scss */
.form .section-header:first-child {
margin-top: 0; }
/* line 12, ../sass/forms/_elems.scss */
.form .form-section {
position: relative; }
/* line 16, ../sass/forms/_elems.scss */
.form .form-row {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
overflow: hidden;
*zoom: 1;
border-top: 1px solid #4d4d4d;
margin-top: 5px;
padding: 5px;
position: relative; }
/* line 25, ../sass/forms/_elems.scss */
.form .form-row:first-child {
border-top: none; }
/* line 29, ../sass/forms/_elems.scss */
.form .form-row .label,
.form .form-row .controls {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
overflow: hidden;
*zoom: 1;
box-sizing: border-box;
font-size: 0.75rem;
line-height: 22px;
min-height: 22px; }
/* line 39, ../sass/forms/_elems.scss */
.form .form-row > .label {
float: left;
position: relative;
white-space: nowrap;
width: 20%; }
/* line 47, ../sass/forms/_elems.scss */
.form .form-row .value {
color: #cccccc; }
/* line 51, ../sass/forms/_elems.scss */
.form .form-row .controls {
float: left;
position: relative;
width: 79%; }
/* line 58, ../sass/forms/_elems.scss */
.form .form-row .field-hints {
color: #666666; }
/* line 62, ../sass/forms/_elems.scss */
.form .form-row .selector-list {
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
background: rgba(0, 0, 0, 0.2);
position: relative;
height: 150px;
max-width: 50%; }
/* line 70, ../sass/forms/_elems.scss */
.form .form-row .selector-list .wrapper {
overflow-y: auto;
position: absolute;
top: 5px;
right: 5px;
bottom: 5px;
left: 5px; }
/* line 84, ../sass/forms/_elems.scss */
label.form-control.checkbox input {
margin-right: 5px;
vertical-align: top; }
/* line 90, ../sass/forms/_elems.scss */
.hint {
font-size: 0.9em; }
/* line 1, ../sass/forms/_textarea.scss */
.edit-main textarea {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-box-shadow: inset rgba(0, 0, 0, 0.5) 0 1px 5px;
-moz-box-shadow: inset rgba(0, 0, 0, 0.5) 0 1px 5px;
box-shadow: inset rgba(0, 0, 0, 0.5) 0 1px 5px;
background: #666666;
border: none;
border-bottom: 1px solid #999999;
color: #cccccc;
outline: none;
padding: 5px;
position: absolute;
height: 100%;
width: 100%; }
/* line 11, ../sass/forms/_mixins.scss */
.edit-main textarea.error {
background: rgba(255, 0, 0, 0.5); }
/* line 1, ../sass/forms/_text-input.scss */
input[type="text"] {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-box-shadow: inset rgba(0, 0, 0, 0.5) 0 1px 5px;
-moz-box-shadow: inset rgba(0, 0, 0, 0.5) 0 1px 5px;
box-shadow: inset rgba(0, 0, 0, 0.5) 0 1px 5px;
background: #666666;
border: none;
border-bottom: 1px solid #999999;
color: #cccccc;
outline: none;
padding: 0 3px;
height: 22px;
line-height: 22px;
vertical-align: middle; }
/* line 11, ../sass/forms/_mixins.scss */
input[type="text"].error {
background: rgba(255, 0, 0, 0.5); }
/* line 6, ../sass/forms/_text-input.scss */
input[type="text"].numeric {
text-align: right; }
/* line 1, ../sass/forms/_selects.scss */
.form-control.select {
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4d4d4d), color-stop(100%, #404040));
background-image: -webkit-linear-gradient(#4d4d4d, #404040);
background-image: -moz-linear-gradient(#4d4d4d, #404040);
background-image: -o-linear-gradient(#4d4d4d, #404040);
background-image: linear-gradient(#4d4d4d, #404040);
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;
-moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;
box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;
border-top: 1px solid #666666;
color: #999999;
display: inline-block;
margin-right: 5px;
margin-top: 1px;
padding: 0 25px 0 0;
position: relative;
overflow: hidden;
vertical-align: middle; }
/* line 82, ../sass/_mixins.scss */
.form-control.select:not(.disabled):hover {
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #666666), color-stop(100%, #4d4d4d));
background-image: -webkit-linear-gradient(#666666, #4d4d4d);
background-image: -moz-linear-gradient(#666666, #4d4d4d);
background-image: -o-linear-gradient(#666666, #4d4d4d);
background-image: linear-gradient(#666666, #4d4d4d); }
/* line 11, ../sass/forms/_selects.scss */
.form-control.select span.arw {
display: block;
pointer-events: none;
position: absolute;
right: 8%;
top: 10%; }
/* line 18, ../sass/forms/_selects.scss */
.form-control.select select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
border: none;
box-shadow: none;
background-color: transparent;
background-image: none;
cursor: pointer;
padding: 3px 5px 4px 5px;
width: 150%; }
/* line 32, ../sass/forms/_selects.scss */
.form-control.select select:focus {
outline: none; }
/* line 2, ../sass/forms/_channel-selector.scss */
.channel-selector .line {
margin-bottom: 5px;
min-height: 22px; }
/* line 6, ../sass/forms/_channel-selector.scss */
.channel-selector .treeview {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-box-shadow: inset rgba(0, 0, 0, 0.5) 0 1px 5px;
-moz-box-shadow: inset rgba(0, 0, 0, 0.5) 0 1px 5px;
box-shadow: inset rgba(0, 0, 0, 0.5) 0 1px 5px;
background: #666666;
border: none;
border-bottom: 1px solid #999999;
color: #cccccc;
outline: none;
padding: 0 3px;
background: #3b3b3b;
border-bottom: 1px solid #4d4d4d;
min-height: 300px;
max-height: 400px;
overflow: auto;
padding: 5px; }
/* line 11, ../sass/forms/_mixins.scss */
.channel-selector .treeview.error {
background: rgba(255, 0, 0, 0.5); }
/* line 15, ../sass/forms/_channel-selector.scss */
.channel-selector .btns-add-remove {
margin-top: 150px; }
/* line 18, ../sass/forms/_channel-selector.scss */
.channel-selector .btns-add-remove .btn {
display: block;
font-size: 1.5em;
margin-bottom: 5px;
padding: 10px;
text-align: center; }
/* line 2, ../sass/forms/_datetime.scss */
.complex.datetime span {
display: inline-block;
margin-right: 5px; }
/* line 15, ../sass/forms/_datetime.scss */
.complex.datetime .fields {
margin-top: 3px 0;
padding: 3px 0; }
/* line 20, ../sass/forms/_datetime.scss */
.complex.datetime .date {
width: 85px; }
/* line 23, ../sass/forms/_datetime.scss */
.complex.datetime .date input {
width: 80px; }
/* line 29, ../sass/forms/_datetime.scss */
.complex.datetime .time.sm {
width: 45px; }
/* line 32, ../sass/forms/_datetime.scss */
.complex.datetime .time.sm input {
width: 40px; }
/* line 2, ../sass/forms/_filter.scss */
.filter input.filter {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-box-shadow: inset rgba(0, 0, 0, 0.5) 0 1px 5px;
-moz-box-shadow: inset rgba(0, 0, 0, 0.5) 0 1px 5px;
box-shadow: inset rgba(0, 0, 0, 0.5) 0 1px 5px;
background: #666666;
border: none;
border-bottom: 1px solid #999999;
color: #cccccc;
outline: none;
padding: 0 3px;
background: #3b3b3b;
border-bottom: 1px solid #4d4d4d; }
/* line 11, ../sass/forms/_mixins.scss */
.filter input.filter.error {
background: rgba(255, 0, 0, 0.5); }
/* line 5, ../sass/forms/_filter.scss */
.filter .icon.ui-symbol {
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
display: inline-block;
font-size: 1.3em;
height: 22px;
line-height: 22px;
padding: 0px 5px;
vertical-align: middle; }
/* line 13, ../sass/forms/_filter.scss */
.filter .icon.ui-symbol:hover {
background: rgba(255, 255, 255, 0.1); }
/* line 20, ../sass/forms/_filter.scss */
.top-bar input.filter {
font-size: .8em;
height: 35px;
line-height: 35px;
margin-right: 5px;
margin-top: -5px;
padding-left: 10px;
padding-right: 10px; }
/* line 31, ../sass/forms/_filter.scss */
.top-bar .icon-filter {
font-size: 1.4em; }

View File

@ -0,0 +1,136 @@
/* line 1, ../sass/items/_item.scss */
.items-holder {
overflow: hidden;
*zoom: 1;
overflow-y: auto; }
/* line 5, ../sass/items/_item.scss */
.items-holder .item.grid-item {
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #595959), color-stop(100%, #4d4d4d));
background-image: -webkit-linear-gradient(#595959, #4d4d4d);
background-image: -moz-linear-gradient(#595959, #4d4d4d);
background-image: -o-linear-gradient(#595959, #4d4d4d);
background-image: linear-gradient(#595959, #4d4d4d);
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;
-moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;
box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;
border-top: 1px solid #737373;
color: #999999;
display: inline-block;
box-sizing: border-box;
cursor: pointer;
float: left;
height: 200px;
width: 200px;
margin-bottom: 3px;
margin-right: 3px;
position: relative; }
/* line 82, ../sass/_mixins.scss */
.items-holder .item.grid-item:not(.disabled):hover {
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #737373), color-stop(100%, #595959));
background-image: -webkit-linear-gradient(#737373, #595959);
background-image: -moz-linear-gradient(#737373, #595959);
background-image: -o-linear-gradient(#737373, #595959);
background-image: linear-gradient(#737373, #595959); }
/* line 18, ../sass/items/_item.scss */
.items-holder .item.grid-item:hover .item-main .item-type {
color: #0099cc !important; }
/* line 21, ../sass/items/_item.scss */
.items-holder .item.grid-item:hover .item-main .item-open {
display: block; }
/* line 26, ../sass/items/_item.scss */
.items-holder .item.grid-item .bar.top-bar.abs {
bottom: auto;
height: 20px;
line-height: 20px;
z-index: 5; }
/* line 31, ../sass/items/_item.scss */
.items-holder .item.grid-item .bar.top-bar.abs .left, .items-holder .item.grid-item .bar.top-bar.abs .right {
width: auto; }
/* line 33, ../sass/items/_item.scss */
.items-holder .item.grid-item .bar.top-bar.abs .left .icon, .items-holder .item.grid-item .bar.top-bar.abs .right .icon {
margin-left: 5px; }
/* line 38, ../sass/items/_item.scss */
.items-holder .item.grid-item .bar.bottom-bar.abs {
top: auto;
height: 40px;
padding: 5px; }
/* line 44, ../sass/items/_item.scss */
.items-holder .item.grid-item .item-main {
z-index: 1; }
/* line 52, ../sass/items/_item.scss */
.items-holder .item.grid-item .item-main .item-type {
color: #737373;
text-align: center;
font-size: 7em;
line-height: 180px; }
/* line 58, ../sass/items/_item.scss */
.items-holder .item.grid-item .item-main .item-open {
display: none;
font-size: 5em;
line-height: 180px;
left: auto;
width: 30px; }
/* line 66, ../sass/items/_item.scss */
.items-holder .item.grid-item .title {
text-shadow: rgba(0, 0, 0, 0.1) 0 1px 2px;
color: #cccccc;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis; }
/* line 74, ../sass/items/_item.scss */
.items-holder .item.grid-item .details {
font-size: 0.8em; }
/* line 77, ../sass/items/_item.scss */
.items-holder .item.grid-item.selected {
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #00bfff), color-stop(100%, #00ace6));
background-image: -webkit-linear-gradient(#00bfff, #00ace6);
background-image: -moz-linear-gradient(#00bfff, #00ace6);
background-image: -o-linear-gradient(#00bfff, #00ace6);
background-image: linear-gradient(#00bfff, #00ace6);
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;
-moz-box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;
box-shadow: rgba(0, 0, 0, 0.3) 0 1px 3px;
border-top: 1px solid #33ccff;
color: #999999;
display: inline-block;
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #33ccff), color-stop(100%, #0099cc));
background-image: -webkit-linear-gradient(#33ccff, #0099cc);
background-image: -moz-linear-gradient(#33ccff, #0099cc);
background-image: -o-linear-gradient(#33ccff, #0099cc);
background-image: linear-gradient(#33ccff, #0099cc);
color: #80dfff; }
/* line 90, ../sass/_mixins.scss */
.items-holder .item.grid-item.selected:not(.disabled):hover {
background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #66d9ff), color-stop(100%, #00bfff));
background-image: -webkit-linear-gradient(#66d9ff, #00bfff);
background-image: -moz-linear-gradient(#66d9ff, #00bfff);
background-image: -o-linear-gradient(#66d9ff, #00bfff);
background-image: linear-gradient(#66d9ff, #00bfff); }
/* line 82, ../sass/items/_item.scss */
.items-holder .item.grid-item.selected .item-type, .items-holder .item.grid-item.selected .top-bar .icon:not(.alert) {
color: #80dfff; }
/* line 83, ../sass/items/_item.scss */
.items-holder .item.grid-item.selected .item-main .item-open {
color: #80dfff; }
/* line 84, ../sass/items/_item.scss */
.items-holder .item.grid-item.selected .title {
color: white; }
/* line 86, ../sass/items/_item.scss */
.items-holder .item.grid-item.selected:hover .item-main .item-type {
color: white !important; }

View File

@ -0,0 +1,99 @@
/*
Syntax error: Undefined variable: "$colorBodyBg".
on line 66 of /Users/iMac/dev/nasa/wtd-dev/platform/sass/_effects.scss, in `boxOutline'
from line 7 of /Users/iMac/dev/nasa/wtd-dev/platform/sass/_effects.scss
from line 10 of /Users/iMac/dev/nasa/wtd-dev/platform/sass/main.scss
Backtrace:
/Users/iMac/dev/nasa/wtd-dev/platform/sass/_effects.scss:66:in `boxOutline'
/Users/iMac/dev/nasa/wtd-dev/platform/sass/_effects.scss:7
/Users/iMac/dev/nasa/wtd-dev/platform/sass/main.scss:10
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/script/variable.rb:49:in `_perform'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/script/node.rb:40:in `perform'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/script/funcall.rb:93:in `_perform'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/script/funcall.rb:93:in `map'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/script/funcall.rb:93:in `_perform'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/script/node.rb:40:in `perform'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:56:in `perform_arguments'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:50:in `zip'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:50:in `perform_arguments'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:261:in `visit_mixin'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:37:in `send'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:37:in `visit'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:98:in `visit'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:53:in `visit_children'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:53:in `map'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:53:in `visit_children'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:107:in `visit_children'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:119:in `with_environment'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:106:in `visit_children'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:37:in `visit'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:318:in `visit_rule'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:37:in `send'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:37:in `visit'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:98:in `visit'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:225:in `visit_import'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:225:in `map'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:225:in `visit_import'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:37:in `send'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:37:in `visit'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:98:in `visit'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:53:in `visit_children'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:53:in `map'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:53:in `visit_children'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:107:in `visit_children'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:119:in `with_environment'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:106:in `visit_children'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:37:in `visit'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:126:in `visit_root'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:37:in `send'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/base.rb:37:in `visit'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:98:in `visit'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:7:in `send'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/visitors/perform.rb:7:in `visit'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/tree/root_node.rb:20:in `render'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/engine.rb:315:in `_render'
/Library/Ruby/Gems/1.8/gems/sass-3.2.5/lib/sass/../sass/engine.rb:262:in `render'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/compiler.rb:140:in `compile'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/compiler.rb:126:in `timed'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/compiler.rb:139:in `compile'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/logger.rb:45:in `red'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/compiler.rb:138:in `compile'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/compiler.rb:118:in `compile_if_required'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/compiler.rb:103:in `run'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/compiler.rb:101:in `each'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/compiler.rb:101:in `run'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/compiler.rb:126:in `timed'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/compiler.rb:100:in `run'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/commands/watch_project.rb:147:in `recompile'
/Library/Ruby/Site/1.8/rubygems/custom_require.rb:36:in `to_proc'
/Library/Ruby/Gems/1.8/gems/fssm-0.2.9/lib/fssm/path.rb:73:in `call'
/Library/Ruby/Gems/1.8/gems/fssm-0.2.9/lib/fssm/path.rb:73:in `run_callback'
/Library/Ruby/Gems/1.8/gems/fssm-0.2.9/lib/fssm/path.rb:55:in `callback_action'
/Library/Ruby/Gems/1.8/gems/fssm-0.2.9/lib/fssm/path.rb:35:in `update'
/Library/Ruby/Gems/1.8/gems/fssm-0.2.9/lib/fssm/state/directory.rb:39:in `modified'
/Library/Ruby/Gems/1.8/gems/fssm-0.2.9/lib/fssm/state/directory.rb:37:in `each'
/Library/Ruby/Gems/1.8/gems/fssm-0.2.9/lib/fssm/state/directory.rb:37:in `modified'
/Library/Ruby/Gems/1.8/gems/fssm-0.2.9/lib/fssm/state/directory.rb:18:in `refresh'
/Library/Ruby/Gems/1.8/gems/fssm-0.2.9/lib/fssm/backends/polling.rb:17:in `run'
/Library/Ruby/Gems/1.8/gems/fssm-0.2.9/lib/fssm/backends/polling.rb:17:in `each'
/Library/Ruby/Gems/1.8/gems/fssm-0.2.9/lib/fssm/backends/polling.rb:17:in `run'
/Library/Ruby/Gems/1.8/gems/fssm-0.2.9/lib/fssm/backends/polling.rb:15:in `loop'
/Library/Ruby/Gems/1.8/gems/fssm-0.2.9/lib/fssm/backends/polling.rb:15:in `run'
/Library/Ruby/Gems/1.8/gems/fssm-0.2.9/lib/fssm/monitor.rb:26:in `run'
/Library/Ruby/Gems/1.8/gems/fssm-0.2.9/lib/fssm.rb:70:in `monitor'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/commands/watch_project.rb:87:in `perform'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/commands/base.rb:18:in `execute'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/commands/project_base.rb:19:in `execute'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/exec/sub_command_ui.rb:43:in `perform!'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/lib/compass/exec/sub_command_ui.rb:15:in `run!'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/bin/compass:30
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/bin/compass:44:in `call'
/Library/Ruby/Gems/1.8/gems/compass-0.12.2/bin/compass:44
/usr/bin/compass:23:in `load'
/usr/bin/compass:23
*/
body:before {
white-space: pre;
font-family: monospace;
content: "Syntax error: Undefined variable: \"$colorBodyBg\".\A on line 66 of /Users/iMac/dev/nasa/wtd-dev/platform/sass/_effects.scss, in `boxOutline'\A from line 7 of /Users/iMac/dev/nasa/wtd-dev/platform/sass/_effects.scss\A from line 10 of /Users/iMac/dev/nasa/wtd-dev/platform/sass/main.scss"; }

View File

@ -0,0 +1 @@
/*! normalize.css v1.1.2 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:'courier new',monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:'';content:none}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}

View File

@ -0,0 +1,205 @@
/* line 10, ../sass/plots/_plots-main.scss */
.gl-plot {
color: #999999;
font-size: 0.7rem;
position: relative;
width: 100%;
height: 100%; }
/* line 17, ../sass/plots/_plots-main.scss */
.gl-plot .gl-plot-axis-area {
position: absolute; }
/* line 20, ../sass/plots/_plots-main.scss */
.gl-plot .gl-plot-axis-area.gl-plot-x {
top: auto;
right: 0;
bottom: 5px;
left: 60px;
height: 32px;
width: auto;
overflow: hidden; }
/* line 29, ../sass/plots/_plots-main.scss */
.gl-plot .gl-plot-axis-area.gl-plot-y {
top: 29px;
right: auto;
bottom: 37px;
left: 0;
width: 60px; }
/* line 38, ../sass/plots/_plots-main.scss */
.gl-plot .gl-plot-coords {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
background: rgba(255, 199, 0, 0.5);
color: #e6e6e6;
padding: 2px 5px;
position: absolute;
top: 39px;
right: auto;
bottom: auto;
left: 70px;
z-index: 10; }
/* line 50, ../sass/plots/_plots-main.scss */
.gl-plot .gl-plot-coords:empty {
display: none; }
/* line 55, ../sass/plots/_plots-main.scss */
.gl-plot .gl-plot-display-area {
position: absolute;
top: 29px;
right: 0;
bottom: 37px;
left: 60px;
cursor: crosshair;
border: 1px solid #4d4d4d; }
/* line 65, ../sass/plots/_plots-main.scss */
.gl-plot .gl-plot-label {
color: #cccccc;
position: absolute;
text-align: center; }
/* line 72, ../sass/plots/_plots-main.scss */
.gl-plot .gl-plot-label.gl-plot-x-label {
top: auto;
right: 0;
bottom: 0;
left: 0;
height: auto; }
/* line 80, ../sass/plots/_plots-main.scss */
.gl-plot .gl-plot-label.gl-plot-y-label {
-webkit-transform-origin: 50% 0;
-moz-transform-origin: 50% 0;
-ms-transform-origin: 50% 0;
-o-transform-origin: 50% 0;
transform-origin: 50% 0;
-webkit-transform: translateX(-50%) rotate(-90deg);
-moz-transform: translateX(-50%) rotate(-90deg);
-ms-transform: translateX(-50%) rotate(-90deg);
-o-transform: translateX(-50%) rotate(-90deg);
transform: translateX(-50%) rotate(-90deg);
display: inline-block;
margin-left: 5px;
left: 0;
top: 50%;
white-space: nowrap; }
/* line 93, ../sass/plots/_plots-main.scss */
.gl-plot .gl-plot-y-options {
position: absolute;
top: 50%;
right: auto;
bottom: auto;
left: auto5px;
margin-top: -16px;
height: auto;
min-height: 32px;
width: 32px; }
/* line 107, ../sass/plots/_plots-main.scss */
.gl-plot .gl-plot-hash {
position: absolute;
border: 0 rgba(255, 255, 255, 0.3) dashed; }
/* line 110, ../sass/plots/_plots-main.scss */
.gl-plot .gl-plot-hash.hash-v {
border-right-width: 1px;
height: 100%; }
/* line 114, ../sass/plots/_plots-main.scss */
.gl-plot .gl-plot-hash.hash-h {
border-bottom-width: 1px;
width: 100%; }
/* line 120, ../sass/plots/_plots-main.scss */
.gl-plot .gl-plot-legend {
position: absolute;
top: 0;
right: 0;
bottom: auto;
left: 0;
height: 24px;
overflow-x: hidden;
overflow-y: auto; }
/* line 148, ../sass/plots/_plots-main.scss */
.gl-plot-legend .plot-legend-item,
.gl-plot-legend .legend-item,
.legend .plot-legend-item,
.legend .legend-item {
display: inline-block;
margin-right: 10px; }
/* line 151, ../sass/plots/_plots-main.scss */
.gl-plot-legend .plot-legend-item span,
.gl-plot-legend .legend-item span,
.legend .plot-legend-item span,
.legend .legend-item span {
vertical-align: middle; }
/* line 155, ../sass/plots/_plots-main.scss */
.gl-plot-legend .plot-legend-item .plot-color-swatch,
.gl-plot-legend .plot-legend-item .color-swatch,
.gl-plot-legend .legend-item .plot-color-swatch,
.gl-plot-legend .legend-item .color-swatch,
.legend .plot-legend-item .plot-color-swatch,
.legend .plot-legend-item .color-swatch,
.legend .legend-item .plot-color-swatch,
.legend .legend-item .color-swatch {
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
-ms-border-radius: 2px;
-o-border-radius: 2px;
border-radius: 2px;
display: inline-block;
height: 8px;
width: 8px;
margin-right: 3px; }
/* line 169, ../sass/plots/_plots-main.scss */
.tick {
position: absolute;
border: 0 rgba(255, 255, 255, 0.3) solid; }
/* line 172, ../sass/plots/_plots-main.scss */
.tick.tick-x {
border-right-width: 1px;
height: 100%; }
/* line 180, ../sass/plots/_plots-main.scss */
.gl-plot-tick,
.tick-label {
font-size: 0.7rem;
position: absolute;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis; }
/* line 188, ../sass/plots/_plots-main.scss */
.gl-plot-tick.gl-plot-x-tick-label, .gl-plot-tick.tick-label-x,
.tick-label.gl-plot-x-tick-label,
.tick-label.tick-label-x {
right: auto;
bottom: auto;
left: auto;
height: auto;
width: 20%;
margin-left: -10%;
text-align: center; }
/* line 198, ../sass/plots/_plots-main.scss */
.gl-plot-tick.gl-plot-y-tick-label, .gl-plot-tick.tick-label-y,
.tick-label.gl-plot-y-tick-label,
.tick-label.tick-label-y {
top: auto;
height: 1em;
width: auto;
margin-bottom: -0.5em;
text-align: right; }
/* line 209, ../sass/plots/_plots-main.scss */
.gl-plot-tick.gl-plot-x-tick-label {
top: 5px; }
/* line 212, ../sass/plots/_plots-main.scss */
.gl-plot-tick.gl-plot-y-tick-label {
right: 5px;
left: 5px; }
/* line 219, ../sass/plots/_plots-main.scss */
.tick-label.tick-label-x {
top: 0; }
/* line 222, ../sass/plots/_plots-main.scss */
.tick-label.tick-label-y {
right: 0;
left: 0; }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,102 @@
/* line 1, ../sass/tree/_tree.scss */
ul.tree {
margin: 0;
padding: 0; }
/* line 131, ../sass/_mixins.scss */
ul.tree li {
list-style-type: none;
margin: 0;
padding: 0; }
/* line 4, ../sass/tree/_tree.scss */
ul.tree li .tree-item {
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
-webkit-transition: background-color 0.25s;
-moz-transition: background-color 0.25s;
-o-transition: background-color 0.25s;
transition: background-color 0.25s;
display: block;
font-size: 0.80rem;
height: 1.5rem;
line-height: 1.5rem;
margin-bottom: 3px;
position: relative; }
/* line 17, ../sass/tree/_tree.scss */
ul.tree li .tree-item.loading {
color: #666666;
font-style: italic; }
/* line 20, ../sass/tree/_tree.scss */
ul.tree li .tree-item.loading .wait-spinner {
margin-left: 14px; }
/* line 24, ../sass/tree/_tree.scss */
ul.tree li .tree-item:not(.loading) {
cursor: pointer; }
/* line 26, ../sass/tree/_tree.scss */
ul.tree li .tree-item:not(.loading):hover {
background: #404040;
color: #cccccc; }
/* line 29, ../sass/tree/_tree.scss */
ul.tree li .tree-item:not(.loading):hover .context-trigger {
display: block; }
/* line 32, ../sass/tree/_tree.scss */
ul.tree li .tree-item:not(.loading):hover .icon {
color: #33ccff; }
/* line 37, ../sass/tree/_tree.scss */
ul.tree li .tree-item .selected {
color: #fff; }
/* line 40, ../sass/tree/_tree.scss */
ul.tree li .tree-item .view-control {
display: inline-block;
width: 10px; }
/* line 46, ../sass/tree/_tree.scss */
ul.tree li .tree-item .view-control:hover {
color: #ffc700; }
/* line 50, ../sass/tree/_tree.scss */
ul.tree li .tree-item .context-trigger {
display: none;
top: -1px;
position: absolute;
right: 3px; }
/* line 56, ../sass/tree/_tree.scss */
ul.tree li .tree-item .context-trigger .btn-invoke-menu {
font-size: 0.75em;
height: 0.9rem;
line-height: 0.9rem; }
/* line 62, ../sass/tree/_tree.scss */
ul.tree li .tree-item .icon {
text-shadow: rgba(0, 0, 0, 0.6) 0 1px 2px;
color: #0099cc;
left: 15px; }
/* line 67, ../sass/tree/_tree.scss */
ul.tree li .tree-item .icon .alert {
text-shadow: rgba(0, 0, 0, 0.3) 0 1px 2px;
background: #333333;
color: #ff3c00;
font-size: 0.7em;
margin-top: -3px;
top: 0;
right: auto;
bottom: auto;
left: 9px;
height: auto;
width: auto;
position: absolute;
z-index: 2; }
/* line 83, ../sass/tree/_tree.scss */
ul.tree li .tree-item .title-label {
display: block;
position: absolute;
top: 0;
left: 37px;
right: 25px;
overflow: hidden;
text-overflow: ellipsis;
height: 1.5rem;
bottom: auto;
white-space: nowrap; }
/* line 98, ../sass/tree/_tree.scss */
ul.tree ul.tree {
margin-left: 15px; }

Binary file not shown.

View File

@ -0,0 +1,381 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="wtdsymbolsregular" horiz-adv-x="930" >
<font-face units-per-em="2048" ascent="1638" descent="-410" />
<missing-glyph horiz-adv-x="720" />
<glyph horiz-adv-x="2048" />
<glyph horiz-adv-x="2048" />
<glyph unicode="&#xd;" horiz-adv-x="2048" />
<glyph unicode=" " horiz-adv-x="720" />
<glyph unicode="&#x09;" horiz-adv-x="720" />
<glyph unicode="&#xa0;" horiz-adv-x="720" />
<glyph unicode="!" horiz-adv-x="1302" d="M0 325v847q0 67 25.5 125.5t70 102.5t103.5 69.5t126 25.5h650q67 0 126.5 -25.5t104 -69.5t70.5 -102.5t26 -125.5v-847q0 -67 -26 -126t-70.5 -103.5t-104 -70t-126.5 -25.5h-650q-67 0 -126 25.5t-103.5 70t-70 103.5t-25.5 126zM439 1294l57 -726q0 -18 14 -28.5 t26 -10.5h222q18 0 28.5 10.5t10.5 28.5l56 726q0 18 -11 28.5t-29 10.5h-333q-20 0 -30.5 -10.5t-10.5 -28.5zM470 222q0 -21 12.5 -33t30.5 -12h276q13 0 26.5 12t13.5 33v129q0 18 -13.5 28.5t-26.5 10.5h-276q-18 0 -30.5 -10.5t-12.5 -28.5v-129z" />
<glyph unicode="*" horiz-adv-x="1452" d="M0 499l530 250l-530 252l144 250l485 -340l-47 590h285l-48 -584l486 334l144 -250l-538 -252l538 -250l-144 -249l-486 332l48 -582h-285l47 589l-485 -339z" />
<glyph unicode="+" horiz-adv-x="1506" d="M0 611v283q0 35 24 57.5t56 22.5h451v451q0 32 22.5 56t57.5 24h283q35 0 57.5 -24t22.5 -56v-451h451q32 0 56 -22.5t24 -57.5v-283q0 -35 -24 -57.5t-56 -22.5h-451v-451q0 -32 -22.5 -56t-57.5 -24h-283q-35 0 -57.5 24t-22.5 56v451h-451q-32 0 -56 22.5t-24 57.5z " />
<glyph unicode="," horiz-adv-x="745" d="M147 -370l174 655h254l-282 -655h-146z" />
<glyph unicode="-" d="M153 561v181h624v-181h-624z" />
<glyph unicode="." horiz-adv-x="2343" d="M0 670l578 533v-1073zM800 670q0 76 29 143t79 117t116.5 79.5t142.5 29.5q79 0 148 -29.5t120 -79.5t80 -117t29 -143q0 -78 -29 -147t-80 -120t-120 -80.5t-148 -29.5q-76 0 -142.5 29.5t-116.5 80.5t-79 120t-29 147zM1765 130l576 540l-576 533v-1073z" />
<glyph unicode="/" d="M-30 -304l714 1860h176l-717 -1860h-173z" />
<glyph unicode="0" horiz-adv-x="1096" d="M0 0l544 1277l546 -1277h-1090z" />
<glyph unicode="1" horiz-adv-x="1094" d="M0 1276h1090l-544 -1277z" />
<glyph unicode="2" horiz-adv-x="1404" d="M0 503v596l503 -497l901 903v-604l-901 -901z" />
<glyph unicode="3" horiz-adv-x="1302" d="M167 63v209h15q85 -56 200 -93t222 -37q63 0 134 21t115 62q46 44 68.5 97t22.5 134q0 80 -25.5 132.5t-70.5 82.5q-45 31 -109 42.5t-138 11.5h-90v166h70q152 0 242.5 63.5t90.5 185.5q0 54 -23 94.5t-64 66.5q-43 26 -92 36t-111 10q-95 0 -202 -34t-202 -96h-10v209 q71 35 189.5 64.5t229.5 29.5q109 0 192 -20t150 -64q72 -48 109 -116t37 -159q0 -124 -87.5 -216.5t-206.5 -116.5v-14q48 -8 110 -33.5t105 -63.5q48 -43 79 -108t31 -168q0 -102 -37 -187t-104 -148q-75 -70 -176.5 -103.5t-222.5 -33.5q-124 0 -244 29.5t-197 64.5z" />
<glyph unicode="4" horiz-adv-x="1648" d="M0 0v325h699v-325h-699zM0 587v325h699v-325h-699zM0 1174v325h699v-325h-699zM952 0v325h699v-325h-699zM952 587v325h699v-325h-699zM952 1174v325h699v-325h-699z" />
<glyph unicode="5" horiz-adv-x="1653" d="M0 636h1653l-825 -636zM0 858l828 636l825 -636h-1653z" />
<glyph unicode="6" horiz-adv-x="1651" d="M0 750l9 37l2 2q44 161 88.5 279t91.5 203q55 95 116 150q26 23 51.5 37.5t49 23t44 11.5t36.5 3q34 0 82.5 -14.5t100.5 -60.5q31 -27 59.5 -64.5t56.5 -85.5q47 -85 91.5 -203t88.5 -279q34 -119 64 -202.5t55 -138.5t44 -86t31 -46q11 15 29 43.5t41 79t51 126.5 t60 185h309l-11 -43q-45 -161 -90 -278.5t-92 -202.5q-28 -49 -55.5 -86t-58.5 -65q-27 -23 -52.5 -38t-49 -23t-44 -11t-37.5 -3t-38 3t-44.5 11t-49 23t-51.5 38q-31 28 -59.5 65t-56.5 86q-47 85 -91 202.5t-89 278.5q-34 120 -64 203.5t-54.5 138.5t-43.5 86t-32 45 q-11 -14 -28.5 -42.5t-40.5 -79t-50.5 -126t-58.5 -182.5h-310z" />
<glyph unicode="7" horiz-adv-x="1371" d="M0 0v396h396v-396h-396zM0 606v400h396v-400h-396zM0 1217v395h396v-395h-396zM580 114v168h794v-168h-794zM580 725v165h794v-165h-794zM580 1331v168h794v-168h-794z" />
<glyph unicode="8" horiz-adv-x="1302" d="M0 0v645h1281v-645h-1281zM0 854v651h1281v-651h-1281z" />
<glyph unicode="9" horiz-adv-x="1302" d="M0 0v645h546v-645h-546zM0 851v654h546v-654h-546zM744 0v645h546v-645h-546zM744 851v654h546v-654h-546z" />
<glyph unicode=":" horiz-adv-x="1279" d="M0 44v1505h355v-1505h-355zM467 775l812 812v-1625z" />
<glyph unicode=";" horiz-adv-x="1278" d="M-1 -39v1625l812 -813zM923 -1v1505h355v-1505h-355z" />
<glyph unicode="&#x3c;" horiz-adv-x="720" d="M0 752l720 753v-1505z" />
<glyph unicode="=" horiz-adv-x="1676" d="M245 362v160h1186v-160h-1186zM245 782v160h1186v-160h-1186z" />
<glyph unicode="&#x3e;" horiz-adv-x="723" d="M0 0v1505l720 -755z" />
<glyph unicode="?" horiz-adv-x="1117" d="M160 1245v204q70 27 177.5 48.5t203.5 21.5q215 0 339.5 -104.5t124.5 -275.5q0 -98 -35 -174.5t-92 -135.5q-56 -57 -129 -107t-155 -97v-225h-179v305q65 37 140.5 81t123.5 89q58 52 90 107.5t32 141.5q0 113 -76.5 168.5t-197.5 55.5q-108 0 -204.5 -34t-152.5 -69 h-10zM406 0v211h204v-211h-204z" />
<glyph unicode="@" horiz-adv-x="2048" d="M176 647q0 185 67 344.5t183 276.5t275 184t340 67q196 0 350 -62t260 -174t162.5 -269.5t56.5 -350.5q0 -139 -40.5 -269t-115.5 -237h-440l-27 116q-74 -60 -142 -92t-156 -32q-168 0 -268.5 127t-100.5 355q0 227 123 362t294 135q73 0 129 -16.5t121 -49.5v48h159 v-842h243q42 75 63.5 187.5t21.5 201.5q0 164 -45.5 298t-133.5 230t-218 147.5t-295 51.5q-160 0 -292.5 -58t-227.5 -156q-96 -98 -150.5 -234.5t-54.5 -290.5q0 -165 52 -301.5t147 -233.5q99 -101 232 -152.5t290 -51.5q86 0 177.5 11t175.5 35v-142q-97 -21 -181 -28.5 t-173 -7.5q-186 0 -345 63.5t-273 177.5q-115 115 -179 276t-64 356zM750 634q0 -163 58 -246.5t181 -83.5q67 0 134 31t122 73v518q-63 29 -113 41.5t-107 12.5q-129 0 -202 -90t-73 -256z" />
<glyph unicode="A" horiz-adv-x="1662" d="M0 752q0 70 27 132t73.5 108.5t108.5 73t133 26.5q45 0 87 -11t78.5 -31.5t67 -49t53.5 -63.5h320l-301 301l267 267l748 -753l-748 -752l-267 267l301 301h-320q-23 -35 -53.5 -64t-67 -49.5t-78.5 -32t-87 -11.5q-71 0 -133 26.5t-108.5 73t-73.5 108.5t-27 133z M191 752q0 -30 12.5 -57t33 -47.5t48 -32t57.5 -11.5q31 0 58 11.5t47 32t31.5 47.5t11.5 57q0 31 -11.5 58t-31.5 47t-47 32t-58 12q-30 0 -57.5 -12t-48 -32t-33 -47t-12.5 -58z" />
<glyph unicode="B" horiz-adv-x="1404" d="M200 0v1489h441q163 0 244 -12t155 -50q82 -43 119 -110.5t37 -161.5q0 -106 -54 -180.5t-144 -119.5v-8q151 -31 238 -132.5t87 -256.5q0 -111 -42 -196t-113 -140q-84 -66 -184.5 -94t-255.5 -28h-528zM398 169h262q130 0 213 13.5t136 49.5q56 39 82 89t26 129 q0 90 -27 143t-98 90q-48 25 -116.5 32.5t-166.5 7.5h-311v-554zM398 890h256q93 0 148 9.5t102 39.5t66.5 77.5t19.5 112.5q0 54 -18 91t-58 60q-47 27 -114 33.5t-166 6.5h-236v-430z" />
<glyph unicode="C" horiz-adv-x="1537" d="M0 766q0 108 27.5 207.5t77.5 185t120 155t155 118.5t182.5 76t203.5 27t204.5 -27t184 -76t155.5 -118.5t120 -155t77.5 -185t27.5 -207.5q0 -105 -27.5 -203t-77.5 -183t-120 -155t-155.5 -120t-184 -77.5t-204.5 -27.5q-105 0 -203 27.5t-183 77.5t-155 120t-120 155 t-77.5 182.5t-27.5 203.5zM692 721l342 -174q14 -7 22.5 -8t19.5 -1q23 0 39.5 10t27.5 27q8 18 8 37q0 11 -3 23q-7 31 -36 48l-268 138v532q0 34 -20.5 54t-57.5 20q-34 0 -54 -20t-20 -54v-632z" />
<glyph unicode="D" horiz-adv-x="1660" d="M0 296q0 -57 65.5 -106t178.5 -85t265 -56.5t326 -20.5t325 20.5t262 56.5t174.5 85t63.5 106v642q-28 -26 -76 -43t-111 -39q-126 -42 -291 -65.5t-347 -23.5q-181 0 -345.5 23.5t-290.5 65.5q-51 13 -100 34.5t-99 47.5v-642zM0 1259q0 53 65.5 100.5t178.5 83 t265 56.5t326 21t325 -21t262 -56.5t174.5 -83t63.5 -100.5q0 -56 -63.5 -106t-174.5 -88t-262 -60t-325 -22t-326 22t-265 60t-178.5 88t-65.5 106z" />
<glyph unicode="E" horiz-adv-x="1295" d="M200 0v1489h981v-176h-783v-408h783v-176h-783v-553h783v-176h-981z" />
<glyph unicode="F" horiz-adv-x="1738" d="M0 404v522v195v336q0 20 8 38t21.5 31.5t31.5 21.5t38 8h478q47 0 77 -29t30 -70v-127h514q59 0 108 -26t72 -73h-913q-43 0 -85 -15t-78 -39.5t-62 -57t-38 -67.5zM88 112q-2 11 -2 23q0 22 8 44l224 718q12 37 39.5 69.5t65 56.5t81 38t88.5 14h987q45 0 79.5 -14 t55.5 -38q21 -25 28 -57q3 -13 3 -25q0 -21 -7 -44l-227 -718q-12 -35 -38.5 -67.5t-62.5 -57.5t-79 -39.5t-86 -14.5h-996q-44 0 -78 14.5t-55.5 40t-27.5 57.5z" />
<glyph unicode="G" horiz-adv-x="1482" d="M0 537l140 148q-6 23 -7 47.5t-1 47.5q0 29 1 53t7 49l-140 141l156 279l204 -48q35 29 74.5 52.5t87.5 40.5l54 195h329l54 -195q48 -17 87.5 -40.5t74.5 -52.5l195 48l85 -140l80 -139l-140 -141q5 -25 5.5 -49t0.5 -53q0 -23 -0.5 -47.5t-5.5 -47.5l140 -148l-80 -140 l-85 -140l-195 45q-35 -28 -74.5 -54.5t-87.5 -43.5l-54 -204h-329l-54 204q-48 17 -87.5 48t-74.5 59l-204 -54l-78 140zM413 780q0 -68 26 -126.5t70.5 -102t104 -68.5t125.5 -25q67 0 127 25t105 68.5t71 102t26 126.5q0 67 -26 126.5t-71 104t-105 70.5t-127 26 q-66 0 -125.5 -26t-104 -70.5t-70.5 -104t-26 -126.5z" />
<glyph unicode="H" horiz-adv-x="1539" d="M200 0v1489h198v-584h743v584h198v-1489h-198v729h-743v-729h-198z" />
<glyph unicode="I" horiz-adv-x="1746" d="M-45 786l391 357v-714zM402 379h899l-449 -408zM402 1192l450 409l449 -409h-899zM1357 429v714l389 -357z" />
<glyph unicode="J" horiz-adv-x="931" d="M44 8v185h11q41 -14 101 -29t123 -15q92 0 146.5 21t80.5 60q27 40 34.5 98t7.5 134v869h-315v158h513v-1102q0 -196 -119.5 -302t-320.5 -106q-48 0 -128 8.5t-134 20.5z" />
<glyph unicode="K" horiz-adv-x="1419" d="M205 0v1489h198v-777l723 777h240l-665 -700l696 -789h-257l-589 663l-148 -158v-505h-198z" />
<glyph unicode="L" horiz-adv-x="1674" d="M0 327v851q0 69 26 128.5t70.5 103.5t104.5 69.5t128 25.5h621v-1505h-621q-68 0 -128 26t-104.5 70.5t-70.5 104t-26 126.5zM1109 0v664h557v-337q0 -67 -26.5 -126.5t-71.5 -104t-105 -70.5t-128 -26h-226zM1109 826v679h226q68 0 128 -25.5t105 -69.5t71.5 -103.5 t26.5 -128.5v-352h-557z" />
<glyph unicode="M" horiz-adv-x="1572" d="M30 928.5q0 116.5 44.5 229t133.5 201.5q88 92 198.5 135t225.5 43q116 0 227 -42.5t203 -135.5q75 -75 118.5 -168t54.5 -193q4 -33 4 -65q1 -67 -15 -133q-22 -100 -78 -187l408 -415l-201 -199l-408 415q-67 -46 -146.5 -68.5t-166.5 -22.5q-115 0 -225.5 44.5 t-198.5 131.5q-89 89 -133.5 201t-44.5 228.5zM309 930q0 -64 23 -124.5t68 -108.5q48 -46 108.5 -73t123.5 -27q69 0 127 27t104 73q47 48 73 108.5t26 124.5q0 69 -26 126.5t-73 103.5q-46 47 -104 73.5t-127 26.5q-63 0 -123.5 -26.5t-108.5 -73.5q-91 -93 -91 -230z" />
<glyph unicode="N" horiz-adv-x="1593" d="M0 215v989q42 3 83 3q85 1 161 -11q114 -16 207.5 -48t166 -74t119.5 -85v-989q-47 43 -119.5 85t-166.5 73q-93 32 -207 48q-76 11 -161 12q-41 0 -83 -3zM215 1303v202q101 -15 185.5 -53.5t152.5 -93.5t120 -121.5t88 -137.5q-44 34 -100.5 67t-125 60.5t-149 47.5 t-171.5 29zM856 0v989q48 43 121 85t167 74q92 32 206 48q76 11 161 11q41 0 84 -3v-989q-43 3 -84 3q-85 0 -161 -12q-114 -16 -207 -47.5t-166 -73.5t-121 -85z" />
<glyph unicode="O" horiz-adv-x="1738" d="M0 0h1005v406q0 105 -39.5 197t-107.5 160.5t-159 108t-194 39.5q-104 0 -196 -39.5t-160.5 -108t-108.5 -160.5t-40 -197v-406zM216 1242q0 59 22.5 111.5t62 91.5t92 61.5t112.5 22.5q57 0 107.5 -22.5t89 -61.5t60.5 -91.5t22 -111.5q0 -58 -22 -109.5t-60.5 -90 t-89 -61t-107.5 -22.5q-60 0 -112.5 22.5t-92 61t-62 90t-22.5 109.5zM937 815q48 -35 87 -79.5t66.5 -96.5t43 -111t15.5 -122v-406h587v406q0 105 -40 197t-108.5 160.5t-160 108t-195.5 39.5q-81 0 -156.5 -25.5t-138.5 -70.5zM946 1242q0 -58 23 -109.5t62.5 -90 t91.5 -61t109 -22.5q58 0 110 22.5t91 61t62 90t23 109.5q0 59 -23 111.5t-62 91.5t-91 61.5t-110 22.5q-57 0 -109 -22.5t-91.5 -61.5t-62.5 -91.5t-23 -111.5z" />
<glyph unicode="P" horiz-adv-x="1150" d="M0 0h1150v248q0 120 -45 225t-122.5 183.5t-182.5 123.5t-225 45q-119 0 -223.5 -45t-182.5 -123.5t-123.5 -183.5t-45.5 -225v-248zM248 1208q0 66 25.5 125.5t69.5 104t104 71t128 26.5q65 0 124.5 -26.5t104.5 -71t72 -104t27 -125.5q0 -68 -27 -127t-72 -102.5 t-104.5 -68.5t-124.5 -25q-68 0 -128 25t-104 68.5t-69.5 102.5t-25.5 127z" />
<glyph unicode="Q" horiz-adv-x="1655" d="M0 258v989q0 53 20.5 100t55.5 82t82 55.5t100 20.5h688v-458l228 114l230 -114v458h144q22 0 41.5 -8.5t34 -23.5t23 -34.5t8.5 -41.5v-797q-4 -22 -15 -40.5t-27.5 -32t-37 -21t-42.5 -7.5h-1157q-26 0 -48.5 -10t-39.5 -27t-26.5 -39.5t-9.5 -48.5t9.5 -48.5 t26.5 -39.5t39.5 -27t48.5 -10h1157q22 0 42.5 7.5t37 21t27.5 32t15 40.5v-243q0 -23 -8.5 -42.5t-23 -33.5t-34 -22.5t-41.5 -8.5h-710h-580q-53 0 -100 20.5t-82 55.5t-55.5 82t-20.5 100z" />
<glyph unicode="R" horiz-adv-x="1424" d="M200 0v1489h417q135 0 225 -17.5t162 -62.5q81 -51 126.5 -128.5t45.5 -196.5q0 -161 -81 -269.5t-223 -163.5l560 -651h-257l-498 592h-279v-592h-198zM398 757h200q94 0 164 16.5t119 61.5q45 42 66.5 96.5t21.5 138.5q0 64 -22.5 113.5t-74.5 83.5q-43 29 -102 40.5 t-139 11.5h-233v-562z" />
<glyph unicode="S" horiz-adv-x="1669" d="M-1 132v1239q0 29 10.5 54t29 43.5t44 29t54.5 10.5h316v-232h-209v-1045h209v-232h-316q-29 0 -54.5 10.5t-44 28.5t-29 42.5t-10.5 51.5zM360 756q0 98 37.5 184.5t101.5 151t149.5 102t182.5 37.5q98 0 184.5 -37.5t150.5 -102t101 -151t37 -184.5q0 -97 -37 -182.5 t-101 -149.5t-150.5 -101.5t-184.5 -37.5q-97 0 -182.5 37.5t-149.5 101.5t-101.5 149.5t-37.5 182.5zM784 726l217 -108q6 -3 10.5 -3.5t10.5 -0.5q11 0 24.5 6t18.5 18q10 17 2 36.5t-25 27.5l-164 86v331q0 18 -13 30.5t-34 12.5q-18 0 -32.5 -12.5t-14.5 -30.5v-393z M1216 -1v232h208v1045h-208v232h316q27 0 52 -10.5t44 -29t30.5 -43.5t11.5 -54v-1239q0 -27 -11.5 -51.5t-30.5 -42.5t-44 -28.5t-52 -10.5h-316z" />
<glyph unicode="T" horiz-adv-x="1522" d="M0 694h708q2 -102 19 -195.5t48 -165t75.5 -114t103.5 -42.5q57 0 101.5 44t76 116.5t48 165.5t18.5 191h324q-13 -145 -77 -271.5t-165.5 -220.5t-234 -148t-282.5 -54q-151 0 -283.5 54t-234.5 148t-166.5 220.5t-78.5 271.5zM0 845q14 145 78.5 271t166.5 220 t234.5 148t283.5 54q150 0 282.5 -54t234 -148t165.5 -220t77 -271h-698q-6 98 -24 191t-48 166t-73.5 117t-100.5 44q-60 0 -104.5 -44t-75.5 -117t-49.5 -166t-24.5 -191h-324zM453 845q3 95 17 168t33 122.5t39.5 74.5t35.5 25q10 0 28 -25t36.5 -74.5t34 -122.5 t21.5 -168h-245zM831 694h244q-6 -96 -21.5 -169t-33.5 -122.5t-36 -74.5t-30 -25t-31 25t-38.5 74.5t-34.5 122.5t-19 169z" />
<glyph unicode="U" horiz-adv-x="1639" d="M-1 142q0 -29 11 -55t30 -45.5t45 -30.5t56 -11h1374q29 0 54.5 11t45 30.5t31 45.5t11.5 55v251q0 29 -11.5 55t-31 45.5t-45 30.5t-54.5 11h-1374q-30 0 -56 -11t-45 -30.5t-30 -45.5t-11 -55v-251zM14 1501h1625l-812 -813z" />
<glyph unicode="V" horiz-adv-x="1400" d="M26 1489h212l467 -1310l467 1310h202l-542 -1489h-264z" />
<glyph unicode="W" horiz-adv-x="2025" d="M92 1489h203l313 -1238l308 1238h201l311 -1250l311 1250h194l-387 -1489h-223l-313 1236l-306 -1236h-218z" />
<glyph unicode="X" horiz-adv-x="1403" d="M68 0l519 744l-507 745h228l401 -605l410 605h217l-514 -736l513 -753h-229l-406 613l-416 -613h-216z" />
<glyph unicode="Y" horiz-adv-x="1260" d="M6 1489h219l407 -666l411 666h211l-524 -836v-653h-198v632z" />
<glyph unicode="Z" horiz-adv-x="1655" d="M0 909v265q0 31 12 58t32 47.5t47.5 32.5t58.5 12h506v82q0 21 8.5 39.5t23 32t34 21.5t41.5 8h127q22 0 42 -8t34.5 -21.5t23 -32t8.5 -39.5v-82h507q31 0 58 -12t47.5 -32.5t32.5 -47.5t12 -58v-265h-163v-759q0 -30 -12 -57.5t-32.5 -48t-48 -32.5t-57.5 -12h-1028 q-32 0 -59.5 12t-47.5 32.5t-32 48t-12 57.5v759h-163zM353 181h169v728h-169v-728zM742 181h170v728h-170v-728zM1131 181h170v728h-170v-728z" />
<glyph unicode="[" horiz-adv-x="1520" d="M12 747.5q0 37.5 14 73.5t42 64l555 554q29 29 65 44t75 15q37 0 72.5 -15t64.5 -44l553 -552q29 -28 43.5 -64t14.5 -73.5t-14.5 -74t-43.5 -65.5l-555 -555q-27 -28 -63.5 -42t-73.5 -14q-38 0 -74.5 14t-63.5 42l-555 555q-28 28 -42 64t-14 73.5zM277 747l484 -484 l485 486l-483 484z" />
<glyph unicode="\" horiz-adv-x="1659" d="M0 1499h365l284 -332q21 5 42 8t44 3q67 0 126 -25.5t103.5 -69t70 -102t25.5 -125.5q0 -36 -7.5 -69.5t-20.5 -64.5l619 -722h-365l-467 542q-41 -11 -84 -11q-67 0 -125.5 25.5t-102 70t-69 103.5t-25.5 126q0 34 6 67t20 62zM585 856q0 -32 11.5 -59.5t32 -48.5 t47.5 -33t59 -12q31 0 59 12t49 33t33 48.5t12 59.5q0 31 -12 58.5t-33 48t-49 32t-59 11.5q-32 0 -59 -11.5t-47.5 -32t-32 -48t-11.5 -58.5z" />
<glyph unicode="]" horiz-adv-x="1653" d="M-68 1l1496 1497h304l-1497 -1497h-303zM82 747.5q0 37.5 14 73.5t42 64l555 554q29 29 65 44t75 15q37 0 72.5 -15t64.5 -44l125 -122l-174 -174l-88 90l-486 -486l90 -90l-174 -172l-125 125q-28 28 -42 64t-14 73.5zM568 182l172 172l91 -91l486 486l-91 91l172 172 l125 -125q29 -28 43.5 -64t14.5 -73.5t-14.5 -74t-43.5 -65.5l-555 -555q-27 -28 -63.5 -42t-73.5 -14q-38 0 -74 14t-64 42z" />
<glyph unicode="^" horiz-adv-x="1676" d="M0 235l806 772l806 -772h-1612z" />
<glyph unicode="_" horiz-adv-x="1653" d="M0 264v250h295q48 0 91 -19t75.5 -51t51 -75.5t18.5 -91.5v-277h-249v264h-282zM0 985v249h282v265h249v-278q0 -49 -18.5 -92t-51 -75t-75.5 -50.5t-91 -18.5h-295zM1122 0v277q0 48 19 91.5t51 75.5t75.5 51t91.5 19h294v-250h-281v-264h-250zM1122 1221v278h250v-265 h281v-249h-294q-48 0 -91.5 18.5t-75.5 50.5t-51 75t-19 92z" />
<glyph unicode="`" horiz-adv-x="1302" d="M340 1676h243l179 -374h-149z" />
<glyph unicode="a" horiz-adv-x="1354" d="M0 479q0 59 29 112.5t81 99.5t125 82t161 59v475q-76 34 -121 85t-45 113h894q0 -62 -44.5 -113t-120.5 -85v-475q87 -23 159.5 -59t125 -82t81.5 -99.5t29 -112.5h-569v-372l-108 -107l-109 107v372h-568z" />
<glyph unicode="d" horiz-adv-x="1517" d="M0 250v1034q0 47 60 90.5t163.5 77t242 53.5t295.5 20q156 0 293.5 -20t240 -53.5t162.5 -77t60 -90.5v-1034q0 -23 -6.5 -39.5t-23.5 -29.5l-311 311q42 72 59 152q11 54 11 108q0 28 -2 54q-8 80 -42.5 156t-94.5 138q-72 74 -162 109.5t-184 35.5q-99 0 -188 -35.5 t-162 -109.5q-72 -72 -108 -163t-36 -186t36 -186t108 -162q73 -75 162 -110t188 -35q68 0 130.5 18t125.5 58l258 -265q-104 -29 -235.5 -49t-278.5 -20q-157 0 -295.5 20t-242 54t-163.5 79.5t-60 96.5zM492 752q0 49 21 98t55 91q42 35 91.5 55.5t101.5 20.5 q49 0 98 -20.5t89 -55.5q35 -42 56.5 -91t21.5 -98q0 -52 -21.5 -101.5t-56.5 -89.5q-40 -35 -89 -56t-98 -21q-52 0 -101.5 21t-91.5 56q-34 40 -55 89.5t-21 101.5z" />
<glyph unicode="e" horiz-adv-x="1220" d="M106 552q0 274 149.5 435t393.5 161q226 0 348.5 -132t122.5 -375v-102h-823q0 -103 31 -179.5t85 -125.5q52 -48 123.5 -72t157.5 -24q114 0 229.5 45.5t164.5 89.5h10v-205q-95 -40 -194 -67t-208 -27q-278 0 -434 150.5t-156 427.5zM297 683h640q-1 148 -74.5 229 t-223.5 81q-151 0 -240.5 -89t-101.5 -221z" />
<glyph unicode="f" horiz-adv-x="1752" d="M0 401v522v196v334q0 22 8 41t22.5 33t33.5 22.5t41 8.5h476q22 0 41 -8.5t33 -22.5t22 -33t8 -41v-124h519q58 0 106 -29t74 -77h-914q-44 0 -86.5 -14t-79 -38t-63 -56.5t-38.5 -69.5zM92 108q-2 11 -2 23q0 22 8 47l227 716q12 37 38.5 69.5t62.5 56.5t78.5 38 t85.5 14h995q43 0 77 -14t54.5 -38t27.5 -56q2 -12 2 -24q0 -22 -8 -46l-225 -716q-12 -37 -38.5 -69.5t-63 -56.5t-79.5 -38t-86 -14h-994q-44 0 -78 14t-55 38t-27 56zM523 456q-2 -7 -2 -13q0 -10 5 -17q8 -12 26 -12h238l-76 -238q-5 -17 2.5 -29.5t26.5 -12.5h151 q17 0 33 12.5t23 29.5l74 238h238q17 0 33.5 12t22.5 30l46 150q4 8 4 15q0 8 -5 15q-9 12 -28 12h-236l74 238q7 18 -1.5 30t-27.5 12h-149q-19 0 -35 -12t-21 -30l-76 -238h-238q-17 0 -33.5 -12.5t-22.5 -29.5z" />
<glyph unicode="g" horiz-adv-x="1664" d="M13 750.5q0 34.5 9.5 68.5t29.5 62l384 495q19 27 49.5 51t65 41t71 27t68.5 10h815q33 0 62 -13t50.5 -34.5t34 -51t12.5 -62.5v-1185q0 -33 -12.5 -62t-34 -50.5t-50.5 -34t-62 -12.5h-815q-32 0 -68.5 10t-71 27t-65 40t-49.5 50l-384 496q-20 27 -29.5 60t-9.5 67.5z M312 750q0 -42 15.5 -78.5t42.5 -63.5t63.5 -42.5t78.5 -15.5t78.5 15.5t63.5 42.5t42.5 63.5t15.5 78.5q0 43 -15.5 80t-42.5 64t-63.5 42.5t-78.5 15.5t-78.5 -15.5t-63.5 -42.5t-42.5 -64t-15.5 -80z" />
<glyph unicode="h" horiz-adv-x="1296" d="M185 0v1556h188v-563q88 73 182 114t193 41q181 0 276 -109t95 -314v-725h-188v636q0 77 -9 144.5t-33 105.5q-25 42 -72 62.5t-122 20.5q-77 0 -161 -38t-161 -97v-834h-188z" />
<glyph unicode="i" horiz-adv-x="1538" d="M0 769q0 106 27.5 204t77.5 183.5t120.5 156t156 120.5t183.5 77.5t204 27.5t204 -27.5t183.5 -77.5t156 -120.5t120.5 -156t77.5 -183.5t27.5 -204t-27.5 -204t-77.5 -183.5t-120.5 -156t-156 -120.5t-183.5 -77.5t-204 -27.5t-204 27.5t-183.5 77.5t-156 120.5 t-120.5 156t-77.5 183.5t-27.5 204zM455 307q0 -19 11.5 -30t30.5 -11h586q17 0 29 11t12 30v142q0 14 -12 27.5t-29 13.5h-183v475q0 18 -11 29.5t-31 11.5h-361q-19 0 -30.5 -11.5t-11.5 -29.5v-139q0 -17 11.5 -29.5t30.5 -12.5h183v-294h-183q-19 0 -30.5 -13.5 t-11.5 -27.5v-142zM680 1148q0 -18 11 -30t30 -12h137q20 0 31 12t11 30v139q0 19 -11 31t-31 12h-137q-19 0 -30 -12t-11 -31v-139z" />
<glyph unicode="j" horiz-adv-x="1633" d="M0 252v301l252 -252l451 451v-301l-451 -451zM0 1004v301l252 -252l451 452v-301l-451 -452zM993 346v146h641v-146h-641zM993 1099v146h641v-146h-641z" />
<glyph unicode="k" horiz-adv-x="1634" d="M0 442v301l252 -252l451 451v-301l-451 -451zM993 536v146h641v-146h-641z" />
<glyph unicode="l" horiz-adv-x="1264" d="M0 0v791h129v217q0 102 39.5 192t108 158t159.5 107.5t194 39.5q102 0 192.5 -39.5t158.5 -107.5t108 -158t40 -192v-217h135v-791h-1264zM355 791h546v217q0 57 -21 106t-57.5 86t-86 58t-106.5 21t-107 -21t-87.5 -58t-59 -86t-21.5 -106v-217z" />
<glyph unicode="m" horiz-adv-x="1658" d="M0 0v325h1658v-325h-1658zM0 587v331h1658v-331h-1658zM0 1182v323h1658v-323h-1658z" />
<glyph unicode="n" horiz-adv-x="1511" d="M0 275v1148q43 -39 104.5 -77.5t138.5 -71.5t168.5 -58t196.5 -36l-49 -51l-34 -35l-15 -45l-274 -797l622 212v-440q-48 -3 -94 -3q-100 -1 -190 13q-132 20 -241 56.5t-193.5 85.5t-139.5 99zM514 527l157 466l4 9l7 6l496 497q6 6 16 12q9 7 23 9q7 1 15 1q8 1 18 -1 q19 -2 44 -15q29 -13 59.5 -34.5t59.5 -48.5q45 -48 71.5 -96t26.5 -85q0 -21 -6.5 -34t-14.5 -20l-497 -496l-6 -7l-9 -4zM677 759l69 -67l198 67l2 4l-6 103l-69 5h-20v19v58l-103 13l-4 -2z" />
<glyph unicode="o" horiz-adv-x="1469" d="M0 393v785l733 393l736 -393v-785l-736 -393zM190 1078l543 -290l546 290l-546 292z" />
<glyph unicode="p" horiz-adv-x="1590" d="M0 0l254 727v32l789 789q12 12 29.5 22.5t41.5 13.5q7 1 14 1q19 0 40 -5q30 -8 66 -32q47 -23 94 -50t95 -75q36 -36 65 -76t49.5 -78.5t31.5 -73t11 -58.5q0 -12 -5 -23.5t-11 -23.5t-11 -23.5t-5 -23.5l-789 -789h-32zM254 378l124 -124l286 124h30l-30 159h-96h-31 v31v96l-159 30v-30z" />
<glyph unicode="q" horiz-adv-x="1276" />
<glyph unicode="r" horiz-adv-x="1885" d="M-45 626l439 324l445 -324h-261q12 -59 42 -109t73.5 -86.5t98.5 -57t115 -20.5q59 0 112.5 18.5t98.5 56.5l32 26l250 -250l-37 -32q-94 -85 -211.5 -128.5t-244.5 -43.5q-132 0 -250.5 48.5t-211 133t-151 198.5t-70.5 246h-269zM495 1299l36 32q96 85 212.5 129.5 t243.5 44.5t245 -47t215 -138q97 -88 155 -201t69 -238h268l-436 -324l-447 324h262q-11 59 -41.5 108.5t-74.5 85.5t-99 56.5t-116 20.5q-58 0 -112 -20t-99 -57l-32 -26z" />
<glyph unicode="s" horiz-adv-x="1865" d="M-1 132v1239q0 29 10.5 54t29 43.5t44 29t54.5 10.5h316v-232h-209v-1045h209v-232h-316q-29 0 -54.5 10.5t-44 28.5t-29 42.5t-10.5 51.5zM418 459v395q31 -16 61.5 -29.5t62.5 -21.5q76 -26 177 -40.5t213 -14.5t213.5 14.5t179.5 40.5q38 14 68 24.5t47 26.5v-395 q0 -36 -39 -66t-107.5 -52t-161.5 -34.5t-200 -12.5t-200.5 12.5t-163.5 34.5t-110 52t-40 66zM418 1051q0 33 40 62.5t110 51t163.5 34.5t200.5 13t200 -13t161.5 -34.5t107.5 -51t39 -62.5q0 -34 -39 -65t-107.5 -54t-161.5 -37t-200 -14t-200.5 14t-163.5 37t-110 54 t-40 65zM1406 -1v232h208v1045h-208v232h316q27 0 52 -10.5t44 -29t30.5 -43.5t11.5 -54v-1239q0 -27 -11.5 -51.5t-30.5 -42.5t-44 -28.5t-52 -10.5h-316z" />
<glyph unicode="t" horiz-adv-x="1677" d="M0 340v339h776q3 -98 22.5 -189.5t55 -162.5t86 -114t113.5 -43q67 0 117.5 43t85.5 114t55 162.5t26 189.5h340v-339q0 -64 -14.5 -112.5t-37.5 -84.5t-52.5 -60.5t-60.5 -40.5q-72 -38 -164 -42h-1008q-64 0 -112.5 14.5t-84.5 38.5t-60.5 54.5t-40.5 62.5 q-38 75 -42 170zM0 828v348q0 61 14.5 108t38.5 82t54.5 59t62.5 39q75 36 170 41h1008q61 0 108 -14.5t82 -37.5t59 -52.5t39 -60.5q36 -72 41 -164v-348h-768q-4 65 -14.5 129t-27 121.5t-39.5 107t-53 85.5t-67.5 56.5t-81.5 20.5q-45 0 -82.5 -20.5t-68 -56.5t-54 -85.5 t-40 -107t-27 -121.5t-14.5 -129h-340zM484 828q6 94 24 167t39.5 123.5t43 76.5t35.5 26q13 0 34.5 -26t43 -76.5t38.5 -123.5t23 -167h-281zM909 679h284q-6 -94 -24 -166t-39.5 -120.5t-42.5 -73t-34 -24.5q-14 0 -36 24.5t-43.5 73t-39.5 120.5t-25 166z" />
<glyph unicode="u" horiz-adv-x="1657" d="M-1 1107v251q0 29 11.5 55t31 45.5t45 30.5t54.5 11h1374q30 0 56 -11t45 -30.5t30 -45.5t11 -55v-251q0 -29 -11 -55t-30 -45.5t-45 -30.5t-56 -11h-1374q-29 0 -54.5 11t-45 30.5t-31 45.5t-11.5 55zM17 -1l812 813l813 -813h-1625z" />
<glyph unicode="v" horiz-adv-x="1612" d="M0 1186h1612q-201 -193 -402 -385t-404 -387z" />
<glyph unicode="w" horiz-adv-x="1676" d="M86 1117h196l205 -865l279 865h155l286 -865l194 865h189l-291 -1117h-174l-287 861l-285 -861h-173z" />
<glyph unicode="x" horiz-adv-x="1486" d="M4 195q0 18 13 31l525 526l-525 527q-13 13 -13 30t13 30l146 149q14 13 32 13t31 -13l526 -527l527 527q11 13 29 13t31 -13l147 -149q13 -13 13 -30t-13 -30l-525 -527l525 -526q13 -13 13 -31t-13 -29l-147 -149q-13 -13 -31 -13t-29 13l-527 527l-526 -527 q-13 -13 -31 -13t-32 13l-146 149q-13 11 -13 29z" />
<glyph unicode="y" horiz-adv-x="1651" d="M0 236v654q0 49 18.5 92t50.5 75.5t75 51t92 18.5h618l-250 -250h-355v-628h785v198l250 250v-461q0 -49 -19 -92t-51 -75t-75.5 -50.5t-91.5 -18.5h-811q-49 0 -92 18.5t-75 50.5t-50.5 75t-18.5 92zM714 746l563 563h-563v187h937v-937h-187v563l-561 -563z" />
<glyph unicode="z" horiz-adv-x="1651" d="M0 236v278h249v-265h280v-249h-293q-48 0 -91 18.5t-75.5 50.5t-51 75t-18.5 92zM0 985v277q0 49 18.5 92t51 75.5t75.5 51t91 18.5h293v-250h-280v-264h-249zM1122 0v249h280v265h249v-278q0 -49 -18.5 -92t-50.5 -75t-75 -50.5t-92 -18.5h-293zM1122 1249v250h293 q49 0 92 -18.5t75 -51t50.5 -75.5t18.5 -92v-277h-249v264h-280z" />
<glyph unicode="{" horiz-adv-x="456" d="M0 537l269 538h187l-269 -538l269 -537h-187z" />
<glyph unicode="|" d="M378 -392v1948h174v-1948h-174z" />
<glyph unicode="}" horiz-adv-x="456" d="M0 -1l269 538l-269 537h187l269 -537l-269 -538h-187z" />
<glyph unicode="~" horiz-adv-x="1636" d="M0 744q29 123 64 244t80 220q51 117 118 181q28 29 57 47.5t56 29t51.5 15.5t44.5 7q58 2 112.5 -19t102.5 -63q69 -66 122 -176q23 -48 43 -102t37.5 -112t33.5 -119t30 -121q13 -51 27.5 -105t30 -105.5t33 -99.5t36.5 -88q15 -30 27.5 -49.5t22 -30.5t15.5 -15t8 -4 q3 0 11 5t19 18.5t25.5 36t30.5 57.5q32 71 59.5 162.5t50.5 185.5h288q-29 -124 -64 -244.5t-80 -220.5q-54 -116 -118 -180q-28 -29 -56.5 -48t-55.5 -30t-52 -15.5t-45 -5.5h-13q-114 0 -202 82q-69 63 -122 176q-48 96 -82.5 214t-63.5 240q-13 51 -27.5 105t-30 105.5 t-32.5 99.5t-35 87q-15 31 -28 50t-22.5 30t-15.5 15t-7 4q-3 0 -11 -5t-19.5 -18t-25.5 -35.5t-30 -57.5q-32 -71 -59.5 -162.5t-50.5 -185.5h-288z" />
<glyph unicode="&#xad;" d="M153 561v181h624v-181h-624z" />
<glyph unicode="&#x2000;" horiz-adv-x="838" />
<glyph unicode="&#x2001;" horiz-adv-x="1676" />
<glyph unicode="&#x2002;" horiz-adv-x="838" />
<glyph unicode="&#x2003;" horiz-adv-x="1676" />
<glyph unicode="&#x2004;" horiz-adv-x="558" />
<glyph unicode="&#x2005;" horiz-adv-x="419" />
<glyph unicode="&#x2006;" horiz-adv-x="279" />
<glyph unicode="&#x2007;" horiz-adv-x="279" />
<glyph unicode="&#x2008;" horiz-adv-x="209" />
<glyph unicode="&#x2009;" horiz-adv-x="335" />
<glyph unicode="&#x200a;" horiz-adv-x="93" />
<glyph unicode="&#x2010;" d="M153 561v181h624v-181h-624z" />
<glyph unicode="&#x2011;" d="M153 561v181h624v-181h-624z" />
<glyph unicode="&#x2012;" d="M153 561v181h624v-181h-624z" />
<glyph unicode="&#x2013;" horiz-adv-x="1330" d="M153 561v181h1024v-181h-1024z" />
<glyph unicode="&#x2014;" horiz-adv-x="2354" d="M153 561v181h2048v-181h-2048z" />
<glyph unicode="&#x202f;" horiz-adv-x="335" />
<glyph unicode="&#x205f;" horiz-adv-x="419" />
<hkern u1="&#x2d;" u2="z" k="40" />
<hkern u1="&#x2d;" u2="y" k="40" />
<hkern u1="&#x2d;" u2="x" k="50" />
<hkern u1="&#x2d;" u2="w" k="20" />
<hkern u1="&#x2d;" u2="v" k="40" />
<hkern u1="&#x2d;" u2="a" k="20" />
<hkern u1="&#x2d;" u2="Z" k="30" />
<hkern u1="&#x2d;" u2="Y" k="140" />
<hkern u1="&#x2d;" u2="X" k="80" />
<hkern u1="&#x2d;" u2="W" k="50" />
<hkern u1="&#x2d;" u2="V" k="50" />
<hkern u1="&#x2d;" u2="T" k="150" />
<hkern u1="&#x2d;" u2="S" k="20" />
<hkern u1="&#x2d;" u2="J" k="100" />
<hkern u1="&#x2d;" u2="I" k="30" />
<hkern u1="&#x2d;" u2="A" k="50" />
<hkern u1="&#x2e;" u2="&#x2d;" k="160" />
<hkern u1="&#x2e;" u2="&#x2c;" k="130" />
<hkern u1="A" u2="y" k="50" />
<hkern u1="A" u2="w" k="30" />
<hkern u1="A" u2="v" k="50" />
<hkern u1="A" u2="u" k="10" />
<hkern u1="A" u2="t" k="20" />
<hkern u1="A" u2="Y" k="80" />
<hkern u1="A" u2="W" k="50" />
<hkern u1="A" u2="V" k="60" />
<hkern u1="A" u2="U" k="10" />
<hkern u1="A" u2="T" k="120" />
<hkern u1="A" u2="S" k="10" />
<hkern u1="A" u2="&#x2d;" k="50" />
<hkern u1="B" u2="T" k="60" />
<hkern u1="B" u2="&#x2e;" k="20" />
<hkern u1="B" u2="&#x2d;" k="-10" />
<hkern u1="B" u2="&#x2c;" k="20" />
<hkern u1="C" u2="&#x2d;" k="50" />
<hkern u1="D" u2="Z" k="20" />
<hkern u1="D" u2="Y" k="20" />
<hkern u1="D" u2="X" k="10" />
<hkern u1="D" u2="W" k="20" />
<hkern u1="D" u2="T" k="50" />
<hkern u1="D" u2="&#x2e;" k="50" />
<hkern u1="D" u2="&#x2c;" k="50" />
<hkern u1="F" u2="o" k="50" />
<hkern u1="F" u2="e" k="50" />
<hkern u1="F" u2="a" k="100" />
<hkern u1="F" u2="T" k="-30" />
<hkern u1="F" u2="A" k="100" />
<hkern u1="F" u2="&#x3f;" k="-60" />
<hkern u1="F" u2="&#x3b;" k="60" />
<hkern u1="F" u2="&#x3a;" k="60" />
<hkern u1="F" u2="&#x2e;" k="300" />
<hkern u1="F" u2="&#x2c;" k="300" />
<hkern u1="I" u2="&#x2d;" k="30" />
<hkern u1="J" u2="A" k="10" />
<hkern u1="J" u2="&#x2e;" k="20" />
<hkern u1="J" u2="&#x2c;" k="20" />
<hkern u1="K" u2="y" k="80" />
<hkern u1="K" u2="w" k="70" />
<hkern u1="K" u2="v" k="80" />
<hkern u1="K" u2="u" k="50" />
<hkern u1="K" u2="o" k="70" />
<hkern u1="K" u2="e" k="70" />
<hkern u1="K" u2="a" k="60" />
<hkern u1="K" u2="O" k="20" />
<hkern u1="K" u2="&#x2d;" k="110" />
<hkern u1="L" u2="y" k="110" />
<hkern u1="L" u2="v" k="110" />
<hkern u1="L" u2="Y" k="160" />
<hkern u1="L" u2="W" k="100" />
<hkern u1="L" u2="V" k="110" />
<hkern u1="L" u2="T" k="170" />
<hkern u1="L" u2="O" k="20" />
<hkern u1="L" u2="J" k="-100" />
<hkern u1="L" u2="G" k="20" />
<hkern u1="L" u2="C" k="20" />
<hkern u1="L" u2="&#x2d;" k="160" />
<hkern u1="O" u2="Z" k="20" />
<hkern u1="O" u2="Y" k="20" />
<hkern u1="O" u2="X" k="10" />
<hkern u1="O" u2="T" k="50" />
<hkern u1="O" u2="&#x2e;" k="30" />
<hkern u1="O" u2="&#x2c;" k="30" />
<hkern u1="P" u2="o" k="50" />
<hkern u1="P" u2="e" k="50" />
<hkern u1="P" u2="a" k="50" />
<hkern u1="P" u2="Y" k="-20" />
<hkern u1="P" u2="A" k="50" />
<hkern u1="P" u2="&#x2e;" k="300" />
<hkern u1="P" u2="&#x2c;" k="300" />
<hkern u1="Q" u2="&#x2e;" k="30" />
<hkern u1="Q" u2="&#x2c;" k="30" />
<hkern u1="R" u2="y" k="55" />
<hkern u1="R" u2="u" k="20" />
<hkern u1="R" u2="o" k="50" />
<hkern u1="R" u2="e" k="50" />
<hkern u1="R" u2="a" k="40" />
<hkern u1="R" u2="Y" k="20" />
<hkern u1="R" u2="T" k="60" />
<hkern u1="R" u2="&#x2d;" k="100" />
<hkern u1="S" u2="y" k="30" />
<hkern u1="S" u2="w" k="20" />
<hkern u1="S" u2="v" k="30" />
<hkern u1="S" u2="S" k="22" />
<hkern u1="S" u2="A" k="20" />
<hkern u1="S" u2="&#x2e;" k="20" />
<hkern u1="S" u2="&#x2c;" k="20" />
<hkern u1="T" u2="z" k="170" />
<hkern u1="T" u2="y" k="200" />
<hkern u1="T" u2="w" k="200" />
<hkern u1="T" u2="v" k="200" />
<hkern u1="T" u2="u" k="200" />
<hkern u1="T" u2="s" k="180" />
<hkern u1="T" u2="r" k="200" />
<hkern u1="T" u2="o" k="220" />
<hkern u1="T" u2="g" k="210" />
<hkern u1="T" u2="e" k="220" />
<hkern u1="T" u2="a" k="240" />
<hkern u1="T" u2="T" k="70" />
<hkern u1="T" u2="S" k="12" />
<hkern u1="T" u2="O" k="50" />
<hkern u1="T" u2="G" k="40" />
<hkern u1="T" u2="C" k="40" />
<hkern u1="T" u2="A" k="120" />
<hkern u1="T" u2="&#x3f;" k="-60" />
<hkern u1="T" u2="&#x3b;" k="200" />
<hkern u1="T" u2="&#x3a;" k="200" />
<hkern u1="T" u2="&#x2e;" k="290" />
<hkern u1="T" u2="&#x2d;" k="150" />
<hkern u1="T" u2="&#x2c;" k="290" />
<hkern u1="U" u2="A" k="10" />
<hkern u1="U" u2="&#x2e;" k="20" />
<hkern u1="U" u2="&#x2c;" k="20" />
<hkern u1="V" u2="y" k="65" />
<hkern u1="V" u2="u" k="60" />
<hkern u1="V" u2="o" k="100" />
<hkern u1="V" u2="e" k="100" />
<hkern u1="V" u2="a" k="100" />
<hkern u1="V" u2="A" k="60" />
<hkern u1="V" u2="&#x3b;" k="80" />
<hkern u1="V" u2="&#x3a;" k="80" />
<hkern u1="V" u2="&#x2e;" k="290" />
<hkern u1="V" u2="&#x2d;" k="50" />
<hkern u1="V" u2="&#x2c;" k="290" />
<hkern u1="W" u2="y" k="65" />
<hkern u1="W" u2="u" k="60" />
<hkern u1="W" u2="r" k="60" />
<hkern u1="W" u2="o" k="100" />
<hkern u1="W" u2="e" k="100" />
<hkern u1="W" u2="a" k="100" />
<hkern u1="W" u2="A" k="50" />
<hkern u1="W" u2="&#x3b;" k="80" />
<hkern u1="W" u2="&#x3a;" k="80" />
<hkern u1="W" u2="&#x2e;" k="220" />
<hkern u1="W" u2="&#x2d;" k="50" />
<hkern u1="W" u2="&#x2c;" k="290" />
<hkern u1="X" u2="y" k="80" />
<hkern u1="X" u2="u" k="30" />
<hkern u1="X" u2="o" k="60" />
<hkern u1="X" u2="e" k="60" />
<hkern u1="X" u2="a" k="50" />
<hkern u1="X" u2="O" k="10" />
<hkern u1="X" u2="G" k="10" />
<hkern u1="X" u2="C" k="10" />
<hkern u1="X" u2="&#x2d;" k="80" />
<hkern u1="Y" u2="v" k="100" />
<hkern u1="Y" u2="u" k="110" />
<hkern u1="Y" u2="s" k="110" />
<hkern u1="Y" u2="r" k="100" />
<hkern u1="Y" u2="q" k="130" />
<hkern u1="Y" u2="p" k="100" />
<hkern u1="Y" u2="o" k="130" />
<hkern u1="Y" u2="n" k="100" />
<hkern u1="Y" u2="m" k="100" />
<hkern u1="Y" u2="g" k="130" />
<hkern u1="Y" u2="e" k="130" />
<hkern u1="Y" u2="d" k="120" />
<hkern u1="Y" u2="a" k="140" />
<hkern u1="Y" u2="O" k="20" />
<hkern u1="Y" u2="A" k="80" />
<hkern u1="Y" u2="&#x3b;" k="200" />
<hkern u1="Y" u2="&#x3a;" k="200" />
<hkern u1="Y" u2="&#x2e;" k="290" />
<hkern u1="Y" u2="&#x2d;" k="140" />
<hkern u1="Y" u2="&#x2c;" k="290" />
<hkern u1="Z" u2="y" k="65" />
<hkern u1="Z" u2="w" k="40" />
<hkern u1="Z" u2="o" k="60" />
<hkern u1="Z" u2="e" k="60" />
<hkern u1="Z" u2="a" k="50" />
<hkern u1="Z" u2="Z" k="10" />
<hkern u1="Z" u2="O" k="20" />
<hkern u1="Z" u2="G" k="20" />
<hkern u1="Z" u2="C" k="20" />
<hkern u1="Z" u2="&#x2d;" k="60" />
<hkern u1="a" u2="y" k="16" />
<hkern u1="a" u2="w" k="10" />
<hkern u1="a" u2="v" k="16" />
<hkern u1="e" u2="T" k="140" />
<hkern u1="f" u2="y" k="10" />
<hkern u1="f" u2="]" k="-100" />
<hkern u1="f" u2="\" k="-100" />
<hkern u1="f" u2="&#x3f;" k="-110" />
<hkern u1="f" u2="&#x2e;" k="120" />
<hkern u1="f" u2="&#x2d;" k="50" />
<hkern u1="f" u2="&#x2c;" k="130" />
<hkern u1="f" u2="&#x2a;" k="-50" />
<hkern u1="h" u2="y" k="20" />
<hkern u1="h" u2="w" k="10" />
<hkern u1="h" u2="v" k="20" />
<hkern u1="k" u2="o" k="20" />
<hkern u1="k" u2="e" k="20" />
<hkern u1="k" u2="&#x2d;" k="100" />
<hkern u1="m" u2="y" k="20" />
<hkern u1="m" u2="w" k="10" />
<hkern u1="m" u2="v" k="20" />
<hkern u1="n" u2="y" k="20" />
<hkern u1="n" u2="w" k="10" />
<hkern u1="n" u2="v" k="20" />
<hkern u1="o" u2="y" k="15" />
<hkern u1="o" u2="x" k="20" />
<hkern u1="o" u2="v" k="15" />
<hkern u1="o" u2="&#x2e;" k="20" />
<hkern u1="o" u2="&#x2c;" k="30" />
<hkern u1="p" u2="y" k="5" />
<hkern u1="p" u2="&#x2e;" k="20" />
<hkern u1="p" u2="&#x2c;" k="30" />
<hkern u1="r" u2="a" k="36" />
<hkern u1="r" u2="&#x2e;" k="290" />
<hkern u1="r" u2="&#x2d;" k="20" />
<hkern u1="r" u2="&#x2c;" k="290" />
<hkern u1="t" u2="y" k="10" />
<hkern u1="t" u2="&#x2d;" k="40" />
<hkern u1="v" u2="o" k="18" />
<hkern u1="v" u2="e" k="18" />
<hkern u1="v" u2="a" k="40" />
<hkern u1="v" u2="&#x2e;" k="180" />
<hkern u1="v" u2="&#x2d;" k="40" />
<hkern u1="v" u2="&#x2c;" k="180" />
<hkern u1="w" u2="a" k="20" />
<hkern u1="w" u2="&#x2e;" k="70" />
<hkern u1="w" u2="&#x2d;" k="20" />
<hkern u1="w" u2="&#x2c;" k="70" />
<hkern u1="x" u2="o" k="24" />
<hkern u1="x" u2="g" k="10" />
<hkern u1="x" u2="e" k="24" />
<hkern u1="x" u2="d" k="10" />
<hkern u1="x" u2="&#x2d;" k="50" />
<hkern u1="y" u2="q" k="10" />
<hkern u1="y" u2="o" k="18" />
<hkern u1="y" u2="g" k="10" />
<hkern u1="y" u2="e" k="18" />
<hkern u1="y" u2="d" k="10" />
<hkern u1="y" u2="a" k="40" />
<hkern u1="y" u2="&#x2e;" k="190" />
<hkern u1="y" u2="&#x2d;" k="40" />
<hkern u1="y" u2="&#x2c;" k="190" />
<hkern u1="z" u2="q" k="10" />
<hkern u1="z" u2="o" k="12" />
<hkern u1="z" u2="g" k="10" />
<hkern u1="z" u2="e" k="12" />
<hkern u1="z" u2="d" k="10" />
<hkern u1="z" u2="&#x2d;" k="20" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,13 @@
<div class='abs bottom-bar ue-bottom-bar'>
<div id='status' class='status-holder abs'>
<div id='status_data_flow' class='status block data-flow'>
<span class='ui-symbol status-indicator ok'>.</span>
<span class='label'>Connected</span>
</div>
<!--div id='status_data_connection' class='status block data-connection'>
<span class='ui-symbol status-indicator caution'>D</span>
<span class='label'>Connected CPU 0.1% / Mem 1.9%</span>
</div-->
</div>
<!--mct-include key="'app-logo'"></mct-include-->
</div>

View File

@ -0,0 +1,10 @@
<div class="accordion" ng-controller="AccordionController as accordion">
<div class="accordion-head" ng-click="accordion.toggle()">
{{container.title}}
</div>
<div class="accordion-contents"
ng-show="accordion.expanded()"
style="height: 180px;"
ng-transclude>
</div>
</div>

View File

@ -0,0 +1,12 @@
<a href=""
class="t-btn l-btn s-btn s-icon-btn s-very-subtle"
ng-class="{ labeled: parameters.labeled }"
title="{{parameters.action.getMetadata().description}}"
ng-click="parameters.action.perform()">
<span class="ui-symbol icon">
{{parameters.action.getMetadata().glyph}}
</span>
<span class="title-label" ng-if="parameters.labeled">
{{parameters.action.getMetadata().name}}
</span>
</a>

View File

@ -0,0 +1,15 @@
<span ng-controller="ActionGroupController">
<span ng-repeat="action in ungrouped">
<mct-include key="'action-button'" parameters="{ action: action }">
</mct-include>
</span>
<span class="btn-set" ng-repeat="group in groups">
<span ng-repeat="action in group">
<mct-include key="'action-button'" parameters="{ action: action }">
</mct-include>
</span>
</span>
</span>

View File

@ -0,0 +1,28 @@
<div class="menu-element btn icon-btn very-subtle btn-menu dropdown click-invoke"
ng-if="ngModel.options.length > 1">
<span ng-click="ngModel.expanded = !ngModel.expanded">
<span class="ui-symbol icon type-icon">{{ngModel.selected.glyph}}</span>
<span>{{ngModel.selected.name}}</span>
<span class='ui-symbol icon invoke-menu'>v</span>
</span>
<div class="menu dropdown" ng-show="ngModel.expanded">
<ul>
<li ng-repeat="option in ngModel.options">
<a href="" ng-click="ngModel.selected = option; ngModel.expanded = false;">
<span class="ui-symbol type-icon icon">
{{option.glyph}}
</span>
{{option.name}}
</a>
</li>
</ul>
</div>
</div>
<span class="btn"
ng-if="ngModel.options.length === 1">
<span class="ui-symbol icon type-icon">{{ngModel.selected.glyph}}</span>
<span>{{ngModel.selected.name}}</span>
</span>

View File

@ -0,0 +1,7 @@
<span class="label">
<span class='ui-symbol icon type-icon'>
{{type.getGlyph()}}
<span class='ui-symbol icon alert hidden'>!</span>
</span>
<span class='title-label'>{{model.name}}</span>
</span>

View File

@ -0,0 +1,18 @@
<div class="menu-element context-menu-wrapper" ng-controller="ContextMenuController">
<div class="menu context-menu dropdown">
<ul>
<li ng-repeat="menuAction in menuActions">
<a href=""
ng-click="menuAction.perform()"
title="{{menuAction.getMetadata().description}}">
<span class="ui-symbol icon type-icon">
{{menuAction.getMetadata().glyph}}
</span>
{{menuAction.getMetadata().name}}
</a>
</li>
</ul>
</div>
</div>

View File

@ -0,0 +1,3 @@
<b>
<div style="width: 400px; border: 4px green solid; text-align:right;">{{model.name}}</div>
</b>

View File

@ -0,0 +1,19 @@
<span ng-controller="TreeNodeController">
<span class="tree-item menus-to-left">
<span class='ui-symbol view-control' ng-click="toggle()" ng-if="model.composition !== undefined">
{{node.expanded ? "v" : ">"}}
</span>
<mct-representation key="'label'"
mct-object="domainObject"
parameters="parameters"
ng-click="parameters.callback(domainObject)"
ng-class="{selected: node.isSelected}">
</mct-representation>
</span>
<span class="tree-item-subtree" ng-show="node.expanded" ng-if="model.composition !== undefined">
<mct-representation key="'tree'"
parameters="parameters"
mct-object="node.domainObject">
</mct-representation>
</span>
</span>

View File

@ -0,0 +1,6 @@
<ul class="tree">
<li ng-repeat="child in composition">
<mct-representation key="'tree-item'" mct-object="child" parameters="parameters">
</mct-representation>
</li>
</ul>

View File

@ -0,0 +1,29 @@
/*global define,Promise*/
/**
* Module defining AccordionController. Created by vwoeltje on 11/14/14.
*/
define(
[],
function () {
"use strict";
/**
*
* @constructor
*/
function AccordionController() {
var isExpanded = true;
return {
toggle: function () {
isExpanded = !isExpanded;
},
expanded: function () {
return isExpanded;
}
};
}
return AccordionController;
}
);

View File

@ -0,0 +1,59 @@
/*global define,Promise*/
/**
* Module defining ActionGroupController. Created by vwoeltje on 11/14/14.
*/
define(
[],
function () {
"use strict";
/**
*
* @constructor
*/
function ActionGroupController($scope) {
function groupActions(actions) {
var groups = {},
ungrouped = [];
function assignToGroup(action) {
var metadata = action.getMetadata(),
group = metadata.group;
if (group) {
groups[group] = groups[group] || [];
groups[group].push(action);
} else {
ungrouped.push(action);
}
}
actions.forEach(assignToGroup);
$scope.ungrouped = ungrouped;
$scope.groups = Object.keys(groups).map(function (k) {
return groups[k];
});
}
function updateGroups() {
var actionCapability = $scope.action,
params = $scope.parameters ? $scope.parameters : {},
category = params.category;
if (actionCapability && category) {
groupActions(actionCapability.getActions({ category: category }));
}
}
$scope.$watch("domainObject", updateGroups);
$scope.$watch("action", updateGroups);
$scope.$watch("parameters.category", updateGroups);
$scope.ungrouped = [];
$scope.groups = [];
}
return ActionGroupController;
}
);

View File

@ -0,0 +1,27 @@
/*global define,Promise*/
/**
* Module defining ContextMenuController. Created by vwoeltje on 11/17/14.
*/
define(
[],
function () {
"use strict";
/**
*
* @constructor
*/
function ContextMenuController($scope) {
function updateActions() {
$scope.menuActions = $scope.action ?
$scope.action.getActions({ category: 'contextual' }) :
[];
}
$scope.$watch("action", updateActions);
}
return ContextMenuController;
}
);

View File

@ -0,0 +1,57 @@
/*global define,Promise*/
/**
* Module defining MCTContainer. Created by vwoeltje on 11/17/14.
*/
define(
[],
function () {
"use strict";
/**
*
* @constructor
*/
function MCTContainer(containers) {
var containerMap = {};
// Initialize container map from extensions
containers.forEach(function (container) {
var key = container.key;
containerMap[key] = Object.create(container);
containerMap[key].templateUrl = [
container.bundle.path,
container.bundle.resources,
container.templateUrl
].join("/");
});
return {
restrict: 'E',
transclude: true,
scope: true,
link: function (scope, element, attrs) {
var key = attrs.key,
container = containerMap[key],
alias = "container",
copiedAttributes = {};
if (container) {
alias = container.alias || alias;
(container.attributes || []).forEach(function (attr) {
copiedAttributes[attr] = attrs[attr];
});
}
scope[alias] = copiedAttributes;
},
templateUrl: function (element, attrs) {
var key = attrs.key;
return containerMap[key].templateUrl;
}
};
}
return MCTContainer;
}
);

View File

@ -0,0 +1,90 @@
/*global define,Promise*/
/**
* Module defining TreeNodeController. Created by vwoeltje on 11/10/14.
*/
define(
[],
function () {
"use strict";
/**
*
* @constructor
*/
function TreeNodeController($scope, navigationService) {
var navigatedObject = navigationService.getNavigation();
function idsEqual(objA, objB) {
return objA && objB && (objA.getId() === objB.getId());
}
function parentOf(domainObject) {
var context = domainObject &&
domainObject.getCapability("context");
return context && context.getParent();
}
function getId(obj) {
return obj.getId();
}
function isOnNavigationPath(nodeObject, navObject) {
var nodeContext = nodeObject &&
nodeObject.getCapability('context'),
navContext = navObject &&
navObject.getCapability('context'),
nodePath,
navPath;
if (nodeContext && navContext) {
nodePath = nodeContext.getPath().map(getId);
navPath = navContext.getPath().map(getId);
return (navPath.length > nodePath.length) &&
nodePath.map(function (id, i) {
return id === navPath[i];
}).reduce(function (a, b) {
return a && b;
}, true);
}
return false; // No context to judge by
}
function checkNavigation() {
var nodeObject = $scope.domainObject;
$scope.node.isSelected =
idsEqual(nodeObject, navigatedObject) &&
idsEqual(parentOf(nodeObject), parentOf(navigatedObject));
// Expand if necessary
if (!$scope.node.expanded && isOnNavigationPath(nodeObject, navigatedObject)) {
$scope.toggle();
}
}
function setNavigation(object) {
navigatedObject = object;
checkNavigation();
}
$scope.node = { expanded: false };
$scope.toggle = function () {
var expanded = !$scope.node.expanded;
$scope.node.expanded = expanded;
// Trigger load of composition, if needed
$scope.node.domainObject = $scope.domainObject;
};
navigationService.addListener(setNavigation);
$scope.$on("$destroy", function () {
navigationService.removeListener(setNavigation);
});
$scope.$watch("domainObject", checkNavigation);
}
return TreeNodeController;
}
);