From ac7fa1ad98e2edfb8d42ed54144dfabdd578f14a Mon Sep 17 00:00:00 2001 From: Frederick Borges Date: Mon, 8 Jun 2020 18:07:17 +0200 Subject: [PATCH] F #2312: Add HTML5 console Signed-off-by: Frederick Borges --- src/sunstone/public/app/main.js | 15 + src/sunstone/public/app/opennebula/vm.js | 21 + src/sunstone/public/app/tabs/vms-tab.js | 1 + .../public/app/tabs/vms-tab/actions.js | 30 + .../public/app/tabs/vms-tab/buttons.js | 6 + .../public/app/tabs/vms-tab/dialogs/vmrc.js | 95 +++ .../app/tabs/vms-tab/dialogs/vmrc/dialogId.js | 19 + .../app/tabs/vms-tab/dialogs/vmrc/html.hbs | 40 ++ src/sunstone/public/app/utils/vmrc.js | 130 ++++ .../app/utils/webmks/css/extended-keypad.css | 314 +++++++++ .../public/app/utils/webmks/css/main-ui.css | 155 ++++ .../public/app/utils/webmks/css/trackpad.css | 192 +++++ .../public/app/utils/webmks/css/wmks-all.css | 661 ++++++++++++++++++ .../app/utils/webmks/img/touch_sprite.png | Bin 0 -> 24870 bytes .../webmks/img/touch_sprite_feedback.png | Bin 0 -> 17962 bytes .../public/app/utils/webmks/wmks.min.js | 6 + src/sunstone/public/bower.json | 3 +- src/sunstone/views/index.erb | 1 + 18 files changed, 1688 insertions(+), 1 deletion(-) create mode 100644 src/sunstone/public/app/tabs/vms-tab/dialogs/vmrc.js create mode 100644 src/sunstone/public/app/tabs/vms-tab/dialogs/vmrc/dialogId.js create mode 100644 src/sunstone/public/app/tabs/vms-tab/dialogs/vmrc/html.hbs create mode 100644 src/sunstone/public/app/utils/vmrc.js create mode 100644 src/sunstone/public/app/utils/webmks/css/extended-keypad.css create mode 100644 src/sunstone/public/app/utils/webmks/css/main-ui.css create mode 100644 src/sunstone/public/app/utils/webmks/css/trackpad.css create mode 100644 src/sunstone/public/app/utils/webmks/css/wmks-all.css create mode 100644 src/sunstone/public/app/utils/webmks/img/touch_sprite.png create mode 100644 src/sunstone/public/app/utils/webmks/img/touch_sprite_feedback.png create mode 100644 src/sunstone/public/app/utils/webmks/wmks.min.js diff --git a/src/sunstone/public/app/main.js b/src/sunstone/public/app/main.js index 4469292ea47..b108036625d 100644 --- a/src/sunstone/public/app/main.js +++ b/src/sunstone/public/app/main.js @@ -71,6 +71,9 @@ require.config({ "flot.time": "../bower_components/flot/jquery.flot.time", "flot.tooltip": "../bower_components/flot.tooltip/js/jquery.flot.tooltip", + /* WMKS */ + "wmks" : "../bower_components/wmks/wmks.min", + /* VNC */ "vnc-rfb": "../bower_components/no-vnc/lib/rfb", @@ -119,6 +122,8 @@ require.config({ deps: [ "foundation", "jquery", + "jquery-ui", + "wmks", "tabs/provision-tab", "tabs/dashboard-tab", "tabs/system-top-tab", @@ -168,6 +173,16 @@ require.config({ deps: ["jquery"] }, + /* JQuery-UI */ + "jquery-ui": { + deps: ["jquery"] + }, + + /* WMKS */ + "wmks": { + deps: ["jquery", "jquery-ui"] + }, + /* Foundation */ "foundation": { deps: ["jquery"] diff --git a/src/sunstone/public/app/opennebula/vm.js b/src/sunstone/public/app/opennebula/vm.js index 50518570966..58330c450a0 100644 --- a/src/sunstone/public/app/opennebula/vm.js +++ b/src/sunstone/public/app/opennebula/vm.js @@ -525,6 +525,27 @@ define(function(require) { } }); }, + "vmrc" : function(params, startstop) { + var callback = params.success; + var callback_error = params.error; + var id = params.data.id; + var resource = RESOURCE; + + var method = startstop; + var request = OpenNebulaHelper.request(resource, method, params.data); + $.ajax({ + url: "vm/" + id + "/startvnc", + type: "POST", + dataType: "json", + success: function(response) { + return callback ? callback(request, response) : null; + }, + error: function(response) { + return callback_error ? + callback_error(request, OpenNebulaError(response)) : null; + } + }); + }, "append": function(params) { var action_obj = {"template_raw" : params.data.extra_param, append : true}; OpenNebulaAction.simple_action(params, RESOURCE, "update", action_obj); diff --git a/src/sunstone/public/app/tabs/vms-tab.js b/src/sunstone/public/app/tabs/vms-tab.js index 3d47c846835..3e328041eda 100644 --- a/src/sunstone/public/app/tabs/vms-tab.js +++ b/src/sunstone/public/app/tabs/vms-tab.js @@ -36,6 +36,7 @@ define(function(require) { require("./vms-tab/dialogs/snapshot"), require("./vms-tab/dialogs/revert"), require("./vms-tab/dialogs/vnc"), + require("./vms-tab/dialogs/vmrc"), require("./vms-tab/dialogs/spice"), require("./vms-tab/dialogs/saveas-template") ]; diff --git a/src/sunstone/public/app/tabs/vms-tab/actions.js b/src/sunstone/public/app/tabs/vms-tab/actions.js index 69b5cf50f37..f553ce8c23b 100644 --- a/src/sunstone/public/app/tabs/vms-tab/actions.js +++ b/src/sunstone/public/app/tabs/vms-tab/actions.js @@ -22,6 +22,7 @@ define(function(require) { var OpenNebulaVM = require('opennebula/vm'); var CommonActions = require('utils/common-actions'); var Vnc = require('utils/vnc'); + var Vmrc = require('utils/vmrc'); var Spice = require('utils/spice'); var Files = require('utils/files'); @@ -30,6 +31,7 @@ define(function(require) { var DEPLOY_DIALOG_ID = require('./dialogs/deploy/dialogId'); var MIGRATE_DIALOG_ID = require('./dialogs/migrate/dialogId'); var VNC_DIALOG_ID = require('./dialogs/vnc/dialogId'); + var VMRC_DIALOG_ID = require('./dialogs/vmrc/dialogId'); var SPICE_DIALOG_ID = require('./dialogs/spice/dialogId'); var SAVE_AS_TEMPLATE_DIALOG_ID = require('./dialogs/saveas-template/dialogId'); var UPDATECONF_FORM_ID = require('./form-panels/updateconf/formPanelId'); @@ -282,6 +284,34 @@ define(function(require) { }, notify: true }, + "VM.startvmrc" : { + type: "custom", + call: function() { + $.each(Sunstone.getDataTable(TAB_ID).elements(), function(index, elem) { + if (!Vmrc.lockStatus()) { + Vmrc.lock(); + Sunstone.runAction("VM.startvmrc_action", elem); + } else { + Notifier.notifyError(Locale.tr("VMRC Connection in progress")) + return false; + } + }); + } + }, + "VM.startvmrc_action" : { + type: "single", + call: OpenNebulaVM.vmrc, + callback: function(request, response) { + var dialog = Sunstone.getDialog(VMRC_DIALOG_ID); + dialog.setElement(response); + dialog.show(); + }, + error: function(req, resp) { + Notifier.onError(req, resp); + Vmrc.unlock(); + }, + notify: true + }, "VM.startspice" : { type: "custom", call: function() { diff --git a/src/sunstone/public/app/tabs/vms-tab/buttons.js b/src/sunstone/public/app/tabs/vms-tab/buttons.js index 1e7d2fa1581..58dd4c846ce 100644 --- a/src/sunstone/public/app/tabs/vms-tab/buttons.js +++ b/src/sunstone/public/app/tabs/vms-tab/buttons.js @@ -200,6 +200,12 @@ define(function(require) { layout: "vmsremote_buttons", custom_classes: "only-sunstone-info vnc-sunstone-info" }, + "VM.startvmrc" : { + type: "action", + text: Locale.tr("VMRC"), + layout: "vmsremote_buttons", + custom_classes: "only-sunstone-info vmrc-sunstone-info" + }, "VM.startspice" : { type: "action", text: Locale.tr("SPICE"), diff --git a/src/sunstone/public/app/tabs/vms-tab/dialogs/vmrc.js b/src/sunstone/public/app/tabs/vms-tab/dialogs/vmrc.js new file mode 100644 index 00000000000..6a9a572cad5 --- /dev/null +++ b/src/sunstone/public/app/tabs/vms-tab/dialogs/vmrc.js @@ -0,0 +1,95 @@ +/* -------------------------------------------------------------------------- */ +/* Copyright 2002-2020, OpenNebula Project, OpenNebula Systems */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); you may */ +/* not use this file except in compliance with the License. You may obtain */ +/* a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ +/* See the License for the specific language governing permissions and */ +/* limitations under the License. */ +/* -------------------------------------------------------------------------- */ + +define(function(require) { + /* + DEPENDENCIES + */ + + var BaseDialog = require('utils/dialogs/dialog'); + var TemplateHTML = require('hbs!./vmrc/html'); + var Sunstone = require('sunstone'); + var Vmrc = require('utils/vmrc'); + + /* + CONSTANTS + */ + + var DIALOG_ID = require('./vmrc/dialogId'); + var TAB_ID = require('../tabId') + + /* + CONSTRUCTOR + */ + + function Dialog() { + this.dialogId = DIALOG_ID; + + BaseDialog.call(this); + }; + + Dialog.DIALOG_ID = DIALOG_ID; + Dialog.prototype = Object.create(BaseDialog.prototype); + Dialog.prototype.constructor = Dialog; + Dialog.prototype.html = _html; + Dialog.prototype.onShow = _onShow; + Dialog.prototype.onClose = _onClose; + Dialog.prototype.setup = _setup; + Dialog.prototype.setElement = _setElement; + + return Dialog; + + /* + FUNCTION DEFINITIONS + */ + + function _html() { + return TemplateHTML({ + 'dialogId': this.dialogId + }); + } + + function _setup(context) { + var that = this; + + $("#open_in_a_new_window", context).on("click", function() { + var dialog = Sunstone.getDialog(DIALOG_ID); + dialog.hide(); + }); + + $('#sendCtrlAltDelButton', context).click(function() { + Vmrc.sendCtrlAltDel(); + return false; + }); + + return false; + } + + function _onShow(context) { + Vmrc.vmrcCallback(this.element); + return false; + } + + function _onClose(context) { + Vmrc.disconnect(); + Vmrc.unlock(); + return false; + } + + function _setElement(element) { + this.element = element + } +}); diff --git a/src/sunstone/public/app/tabs/vms-tab/dialogs/vmrc/dialogId.js b/src/sunstone/public/app/tabs/vms-tab/dialogs/vmrc/dialogId.js new file mode 100644 index 00000000000..a392271ea5c --- /dev/null +++ b/src/sunstone/public/app/tabs/vms-tab/dialogs/vmrc/dialogId.js @@ -0,0 +1,19 @@ +/* -------------------------------------------------------------------------- */ +/* Copyright 2002-2020, OpenNebula Project, OpenNebula Systems */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); you may */ +/* not use this file except in compliance with the License. You may obtain */ +/* a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ +/* See the License for the specific language governing permissions and */ +/* limitations under the License. */ +/* -------------------------------------------------------------------------- */ + +define(function(require) { + return 'vmrcVMDialog'; +}); diff --git a/src/sunstone/public/app/tabs/vms-tab/dialogs/vmrc/html.hbs b/src/sunstone/public/app/tabs/vms-tab/dialogs/vmrc/html.hbs new file mode 100644 index 00000000000..a88426b0698 --- /dev/null +++ b/src/sunstone/public/app/tabs/vms-tab/dialogs/vmrc/html.hbs @@ -0,0 +1,40 @@ +{{! -------------------------------------------------------------------------- }} +{{! Copyright 2002-2020, OpenNebula Project, OpenNebula Systems }} +{{! }} +{{! Licensed under the Apache License, Version 2.0 (the "License"); you may }} +{{! not use this file except in compliance with the License. You may obtain }} +{{! a copy of the License at }} +{{! }} +{{! http://www.apache.org/licenses/LICENSE-2.0 }} +{{! }} +{{! Unless required by applicable law or agreed to in writing, software }} +{{! distributed under the License is distributed on an "AS IS" BASIS, }} +{{! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. }} +{{! See the License for the specific language governing permissions and }} +{{! limitations under the License. }} +{{! -------------------------------------------------------------------------- }} + +
+
+
+
+ + + + + + + + +
+
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/src/sunstone/public/app/utils/vmrc.js b/src/sunstone/public/app/utils/vmrc.js new file mode 100644 index 00000000000..f29ec2354db --- /dev/null +++ b/src/sunstone/public/app/utils/vmrc.js @@ -0,0 +1,130 @@ +/* -------------------------------------------------------------------------- */ +/* Copyright 2002-2020, OpenNebula Project, OpenNebula Systems */ +/* */ +/* Licensed under the Apache License, Version 2.0 (the "License"); you may */ +/* not use this file except in compliance with the License. You may obtain */ +/* a copy of the License at */ +/* */ +/* http://www.apache.org/licenses/LICENSE-2.0 */ +/* */ +/* Unless required by applicable law or agreed to in writing, software */ +/* distributed under the License is distributed on an "AS IS" BASIS, */ +/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ +/* See the License for the specific language governing permissions and */ +/* limitations under the License. */ +/* -------------------------------------------------------------------------- */ + +define(function(require) { + // var WMKS = requiere("wmks"); + var Config = require("sunstone-config"); + var _lock = false; + var _rfb; + var _wmks; + var _message = ""; + var _status = "Loading"; + var _is_encrypted = ""; + + return { + "lockStatus": lockStatus, + "lock": lock, + "unlock": unlock, + "vmrcCallback": vmrcCallback, + "disconnect": disconnect, + "sendCtrlAltDel": sendCtrlAltDel + }; + + function lockStatus() { + return _lock; + } + + function lock() { + _lock = true; + } + + function unlock() { + _lock = false; + } + + function setStatus(message="", status=""){ + _message = message; + _status = status; + $(".VMRC_message").text(_message); + $("#VMRC_status").text(_status); + } + + function connected(){ + setStatus(null, "VMRC " + _rfb._rfb_connection_state + " (" + _is_encrypted + ") to: " + _rfb._fb_name); + } + + function disconnectedFromServer(e){ + if (e.detail.clean) { + setStatus(null, "VMRC " + _rfb._rfb_connection_state + " (" + _is_encrypted + ") to: " + _rfb._fb_name); + } else { + setStatus("Something went wrong, connection is closed", "Failed"); + } + } + + function desktopNameChange(e) { + if (e.detail.name) { + setStatus(null, "VMRC " + _rfb._rfb_connection_state + " (" + _is_encrypted + ") to: " + e.detail.name); + } + } + + function credentialsRequired(e) { + setStatus("Something went wrong, more credentials must be given to continue", "Failed"); + } + + function vmrcCallback(response) { + var URL = ""; + var proxy_port = Config.vncProxyPort; + var pw = response["password"]; + var token = response["token"]; + var vm_name = response["vm_name"]; + var protocol = window.location.protocol; + var hostname = window.location.hostname; + var port = window.location.port; + + if (protocol === "https:") { + URL = "wss"; + _is_encrypted ="encrypted"; + } else { + URL = "ws"; + _is_encrypted ="unencrypted"; + } + URL += "://" + hostname; + URL += ":" + proxy_port; + URL += "/ticket/" + token; + // URL += "/?vm=" + vm_name; + + // if (!Config.requestVNCPassword) { + // URL += "&password=" + pw; + // } + var re = new RegExp("^(ws|wss):\\/\\/[\\w\\D]*?\\?", "gi"); + var link = URL.replace(re, protocol + "//" + hostname + ":" + port + "/vnc?"); + + try{ + var wmks = WMKS.createWMKS("VMRC_canvas",{}) + .register(WMKS.CONST.Events.CONNECTION_STATE_CHANGE, + function(event,data){ + if(typeof cons !== 'undefined' && data.state == cons.ConnectionState.CONNECTED) + { + console.log("connection state change : connected"); + } + }); + wmks.connect(URL); + }catch(err){ + setStatus("Something went wrong, connection is closed", "Failed"); + console.log("error start VMRC ", err); + } + + $("#open_in_a_new_window").attr("href", link); + } + + function disconnect() { + if (_rfb) { _rfb.disconnect(); } + } + + function sendCtrlAltDel() { + if (_rfb) { _rfb.sendCtrlAltDel(); } + } +}); diff --git a/src/sunstone/public/app/utils/webmks/css/extended-keypad.css b/src/sunstone/public/app/utils/webmks/css/extended-keypad.css new file mode 100644 index 00000000000..3dbc0824f88 --- /dev/null +++ b/src/sunstone/public/app/utils/webmks/css/extended-keypad.css @@ -0,0 +1,314 @@ +/****************************************************************************** + * Copyright 2013 VMware, Inc. All rights reserved. + *****************************************************************************/ + +/* + * extended-keypad.css + * + * Defines style for the virtual keys on the control pane. + */ + +.ctrl-pane-wrapper { + width: 290px !important; /* Needed as the default is a bit larger than this */ + border: 1px solid #333 !important; + -moz-border-radius: 6px; -webkit-border-radius: 6px; -khtml-border-radius: 6px; border-radius: 6px; + background: rgb(170,171,182); /* Old browsers */ + background: -webkit-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* W3C */ +} + +.fnKey-pane-wrapper { + width: 427px; + border: 1px solid #333; + -moz-border-radius: 6px; -webkit-border-radius: 6px; -khtml-border-radius: 6px; border-radius: 6px; + background: #c1c4d1; /* Old browsers */ + background: -webkit-linear-gradient(top, #c1c4d1 0%,#b0b1bd 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #c1c4d1 0%,#b0b1bd 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #c1c4d1 0%,#b0b1bd 100%); /* IE10+ */ + background: linear-gradient(top, #c1c4d1 0%, #b0b1bd 100%); /* W3C */ + position: absolute; + padding: 0; + -moz-box-shadow: 0px 5px 7px rgba(0,0,0,.5); + -webkit-box-shadow: 0px 5px 7px rgba(0,0,0,.5); + box-shadow: 0px 5px 7px rgba(0,0,0,.5); +} + +.fnKey-pane-wrapper-down { + width: 427px; + border: 1px solid #333; + -moz-border-radius: 6px; -webkit-border-radius: 6px; -khtml-border-radius: 6px; border-radius: 6px; + background: #6e6e77; /* Old browsers */ + background: -webkit-linear-gradient(top, #6e6e77 0%,#656565 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #6e6e77 0%,#656565 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #6e6e77 0%,#656565 100%); /* IE10+ */ + background: linear-gradient(top, #6e6e77 0%, #656565 100%); /* W3C */ + position: absolute; + padding: 0; + -moz-box-shadow: 0px 5px 7px rgba(0,0,0,.5); + -webkit-box-shadow: 0px 5px 7px rgba(0,0,0,.5); + box-shadow: 0px 5px 7px rgba(0,0,0,.5); +} + +/* Hide jquery ui title bar. */ +.ctrl-pane-wrapper .ui-dialog-titlebar { + border-top: 1px solid #ccc; + border-left: 1px solid #aaa; + border-right: 1px solid #aaa; + border-bottom: 0; + padding: .6em .8em 0 .8em; + background: none !important; + -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; -khtml-border-top-left-radius: 5px; border-top-left-radius: 5px; + -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; -khtml-border-top-right-radius: 5px; border-top-right-radius: 5px; +} + +/* Replace jquery ui title bar close icon. */ +.ctrl-pane-wrapper .ui-dialog-titlebar-close { + margin-top: -9px; + border: 0 !important; + background: none !important; +} + +/* Background-image is defined along with touch-sprite in 1 place. */ +.ctrl-pane-wrapper .ui-dialog-titlebar-close .ui-icon { + background-position: -9px -239px; + background-repeat: no-repeat; +} + +.ctrl-pane-wrapper .ui-dialog-titlebar-close .ui-icon:active { + background-position-x: -24px; + background-repeat: no-repeat; +} + +/* The grabber icon indicating the dialog could be moved around */ +.ctrl-pane-wrapper .ui-dialog-titlebar .ui-dialog-title { + background-position: -10px -255px; + background-repeat: no-repeat; + width: 40px; + height: 14px; + margin: 0 0 0 42%; +} + +.ctrl-pane-wrapper .ui-dialog-titlebar .ui-dialog-title:active { + background-position-x: -52px; +} + +.ctrl-pane-wrapper .ui-dialog-content { + background: none !important; + padding: 0 0; + border-style: solid; + border-color: #aaaaaa; + border-width: 0 1px 1px 1px; + -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; -khtml-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; + -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; -khtml-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; +} + +.fnKey-inner-border-helper { + position: relative; + background: none !important; + border-style: solid; + border-color: #d5d5d5; + border-width: 1px; + -moz-border-radius: 5px; -webkit-border-radius: 5px; -khtml-border-radius: 5px; border-radius: 5px; + pointer-events:none; +} + +.ctrl-pane-wrapper .ctrl-pane { + padding: 3px 0 3px 6px; + height: 140px; + width: 280px; +} + +.ctrl-pane .baseKey { + float: left; + border: 0; + padding: 0; + width: 57px; + height: 57px; + margin: 6px; + -moz-border-radius: 6px; -webkit-border-radius: 6px; -khtml-border-radius: 6px; border-radius: 6px; + font-family: "HelveticaNeue", "Helvetica Neue", "HelveticaNeue", "Helvetica Neue", 'TeXGyreHeros', "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; + font-size: 18px; + text-shadow: 0 1px 1px #eeeeee; + -moz-box-shadow: 0px 1px 3px rgba(0, 0, 0, .7); + -webkit-box-shadow: 0px 1px 3px rgba(0,0,0,.7); + box-shadow: 0px 1px 3px rgba(0,0,0,.7); +} + +.ctrl-pane .ctrl-key-top-row { + background: -webkit-linear-gradient(top, #fff 0%,#f3f5fb 2%,#d2d2d8 98%,#999 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #fff 0%,#f3f5fb 2%,#d2d2d8 98%,#999 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #fff 0%,#f3f5fb 2%,#d2d2d8 98%,#999 100%); /* IE10+ */ + background: linear-gradient(top, #fff 0%,#f3f5fb 2%,#d2d2d8 98%,#999 100%); /* W3C */ +} + +.ctrl-pane .ctrl-key-bottom-row { + background: -webkit-linear-gradient(top, #fff 0%,#e1e1e3 2%,#d1d1d4 50%,#bebec3 98%,#838387 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #fff 0%,#e1e1e3 2%,#d1d1d4 50%,#bebec3 98%,#838387 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #fff 0%,#e1e1e3 2%,#d1d1d4 50%,#bebec3 98%,#838387 100%); /* IE10+ */ + background: linear-gradient(top, #fff 0%,#e1e1e3 2%,#d1d1d4 50%,#bebec3 98%,#838387 100%); /* W3C */ +} + +.ctrl-pane .up-position .fn-key-top-row { + color:#333; + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#f7f7f7 2%,#dcdde3 96%,#999999 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ffffff 0%,#f7f7f7 2%,#dcdde3 96%,#999999 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#f7f7f7 2%,#dcdde3 96%,#999999 100%); /* IE10+ */ + background: linear-gradient(top, #ffffff 0%,#f7f7f7 2%,#dcdde3 96%,#999999 100%); /* W3C */ +} + +.ctrl-pane .up-position .fn-key-bottom-row { + color:#333; + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#f3f5fb 2%,#d2d2d8 98%,#999999 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ffffff 0%,#f3f5fb 2%,#d2d2d8 98%,#999999 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#f3f5fb 2%,#d2d2d8 98%,#999999 100%); /* IE10+ */ + background: linear-gradient(top, #ffffff 0%,#f3f5fb 2%,#d2d2d8 98%,#999999 100%); /* W3C */ +} + +.ctrl-pane .down-position .fn-key-top-row { + color:#333; + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#e1e1e3 4%,#d1d1d4 45%,#b7b8bd 98%,#838387 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ffffff 0%,#e1e1e3 4%,#d1d1d4 45%,#b7b8bd 98%,#838387 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#e1e1e3 4%,#d1d1d4 45%,#b7b8bd 98%,#838387 100%); /* IE10+ */ + background: linear-gradient(top, #ffffff 0%,#e1e1e3 4%,#d1d1d4 45%,#b7b8bd 98%,#838387 100%); /* W3C */ +} + +.ctrl-pane .down-position .fn-key-bottom-row { + color:#333; + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#d9dadd 4%,#c8c8cd 45%,#b0b0b7 98%,#838387 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ffffff 0%,#d9dadd 4%,#c8c8cd 45%,#b0b0b7 98%,#838387 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#d9dadd 4%,#c8c8cd 45%,#b0b0b7 98%,#838387 100%); /* IE10+ */ + background: linear-gradient(top, #ffffff 0%,#d9dadd 4%,#c8c8cd 45%,#b0b0b7 98%,#838387 100%); /* W3C */ +} + +.ctrl-pane .fn-key-top-row { + margin: 12px 6px 6px 6px; +} + +.ctrl-pane .border-key-top-left .fn-key-top-row { + margin: 12px 6px 6px 12px; +} + +.ctrl-pane .border-key-top-right .fn-key-top-row { + margin: 12px 12px 6px 6px; +} + +.ctrl-pane .fn-key-bottom-row { + margin: 5px 6px 12px 6px; +} + +.ctrl-pane .border-key-bottom-left .fn-key-bottom-row { + margin: 5px 6px 12px 12px; +} + +.ctrl-pane .border-key-bottom-right .fn-key-bottom-row { + margin: 5px 12px 12px 6px; +} + +.ctrl-pane .ctrl-key-top-row:active, .ctrl-pane .fn-key-top-row:active, +.ctrl-pane .ctrl-key-bottom-row:active, .ctrl-pane .fn-key-bottom-row:active { + background: #bbbbbb; + background: -webkit-linear-gradient(bottom, #888888 25%, #CCCCCC 68%); + background: -ms-linear-gradient(bottom, #888888 25%, #CCCCCC 68%); + background: -o-linear-gradient(bottom, #888888 25%, #CCCCCC 68%); + background: linear-gradient(bottom, #888888 25%, #CCCCCC 68%); +} + +.ctrl-pane .ctrl-key-top-row div, .ctrl-pane .ctrl-key-bottom-row div, +.ctrl-pane .fn-key-top-row div, .ctrl-pane .fn-key-bottom-row div { + width: 100%; + text-align: center; + padding-top: 17px; + overflow-x: hidden; +} + +/* Highlight selected modifier key */ +.ctrl-pane .ab-modifier-key-down { + color: #4D8DFF; +} + +.ctrl-pane .baseKey img { /* use .touch-sprite for image */ + background-repeat: no-repeat; + width: 57px; + height: 57px; + border: 0; + -moz-border-radius: 6px; -webkit-border-radius: 6px; -khtml-border-radius: 6px; border-radius: 6px; +} + +.ctrl-pane .baseKey .right-arrow { + background-position: -242px -182px; +} + +.ctrl-pane .baseKey .left-arrow { + background-position: -126px -182px; +} + +.ctrl-pane .baseKey .up-arrow { + background-position: -299px -182px; +} + +.ctrl-pane .baseKey .down-arrow { + background-position: -183px -182px; +} + +.ctrl-pane .baseKey .more-keys { + background-position: -10px -182px; +} + +/* Ctrl - pane flip transition. */ +.ctrl-pane.flip-container { + perspective: 1000; + -webkit-perspective: 1000; + -moz-perspective: 1000; + -ms-perspective: 1000; +} + + /* flip the ctrl-pane when this class toggles. */ +.flip-container.perform-flip .flipper { + transform: rotateY(180deg); + -webkit-transform: rotateY(180deg); + -moz-transform: rotateY(180deg); + -ms-transform: rotateY(180deg); +} + +/* flip speed goes here */ +.flip-container .flipper { + transition: 0.6s; + transform-style: preserve-3d; + -webkit-transition: 0.6s; + -webkit-transform-style: preserve-3d; + -moz-transition: 0.6s; + -moz-transform-style: preserve-3d; + -ms-transition: 0.6s; + -ms-transform-style: preserve-3d; + position: relative; +} + +/* hide back of pane during swap */ +.flip-container .front, .flip-container .back { + backface-visibility: hidden; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + position: absolute; + top: 0; + left: 0; +} + +/* front pane, placed above back */ +.flip-container .front { + z-index: 200; +} + +/* back, initially hidden pane */ +.flip-container .back { + transform: rotateY(180deg); + -webkit-transform: rotateY(180deg); + -moz-transform: rotateY(180deg); + -ms-transform: rotateY(180deg); +} diff --git a/src/sunstone/public/app/utils/webmks/css/main-ui.css b/src/sunstone/public/app/utils/webmks/css/main-ui.css new file mode 100644 index 00000000000..772112a7d37 --- /dev/null +++ b/src/sunstone/public/app/utils/webmks/css/main-ui.css @@ -0,0 +1,155 @@ +/****************************************************************************** + * Copyright 2013 VMware, Inc. All rights reserved. + *****************************************************************************/ + +/* + * main-ui.css + * + * Defines style for the wmks ui widgets. + * + * Use CSS3 for touch devices as jquery effects break when browser handles + * orientation changes, or page bouncing. + * + * TODO: Need to handle Retina mode for iPad. + */ + +/* + * jQuery UI Dialog 1.8.16 + */ +.ui-dialog { + padding: 0; + box-shadow: 0px 5px 7px rgba(0,0,0,.5); +} + +.ui-dialog .ui-dialog-titlebar { + padding: .8em .8em; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.ui-dialog .ui-dialog-titlebar-close { + right: .4em; + margin-top: -11px; +} + +.ui-widget-content { + border: 0; + background: #ffffff; + color: #333333; +} + +.ui-widget-header a { + color: #333333; +} + + +/* Touch feedback indicator */ +.ui-touch-feedback-icon { + background-image: url('../img/touch_sprite_feedback.png'); + width: 300px; + height: 120px; + position: absolute; + left: -9999px; + top: -9999px; + z-index: 2; +} + +.feedback-container { + z-index: 2; + position: absolute; + display: none; +} + +.feedback-container.cursor-icon { + background: url('../img/touch_sprite_feedback.png') -260px -15px no-repeat; + width: 17px; + height: 23px; +} + +.feedback-container.tap-icon { + background: url('../img/touch_sprite_feedback.png') -300px -15px no-repeat; + width: 36px; + height: 36px; +} + +.feedback-container.drag-icon { + background: url('../img/touch_sprite_feedback.png') -10px -10px no-repeat; + width: 100px; + height: 100px; +} + +.feedback-container.pulse-icon { + background: url('../img/touch_sprite_feedback.png') -111px -10px no-repeat; + width: 100px; + height: 100px; +} + +.feedback-container.scroll-icon { + background: url('../img/touch_sprite_feedback.png') -212px -10px no-repeat; + width: 27px; + height: 100px; +} + +/* CSS3 feedback indicator animation. Keep it simple (uses lower cpu cycles) + as there may be multiple animation requests made in quick successions. */ +.animate-feedback-indicator { + display: block; + opacity: 0; + animation-name: showfadeout; + animation-duration: 350ms; + -webkit-animation-name: showfadeout; + -webkit-animation-duration: 350ms; + -moz-animation-name: showfadeout; + -moz-animation-duration: 350ms; + -ms-animation-name: showfadeout; + -ms-animation-duration: 350ms; +} + +@-webkit-keyframes showfadeout { + 0% { opacity: 1; } + 100% { opacity: 0; } +} + +@-moz-keyframes showfadeout { + 0% { opacity: 1; } + 100% { opacity: 0; } +} + +@-ms-keyframes showfadeout { + 0% { opacity: 1; } + 100% { opacity: 0; } +} + +.animate-double-feedback-indicator { + display: block; + opacity: 0; + animation-name: showdoublefadeout; + animation-duration: 400ms; + -webkit-animation-name: showdoublefadeout; + -webkit-animation-duration: 400ms; + -moz-animation-name: showdoublefadeout; + -moz-animation-duration: 400ms; + -ms-animation-name: showdoublefadeout; + -ms-animation-duration: 400ms; +} + +@-webkit-keyframes showdoublefadeout { + 0% { opacity: 1; } + 40% { opacity: 0; } + 70% { opacity: 1; } + 100% { opacity: 0; } +} + +@-moz-keyframes showdoublefadeout { + 0% { opacity: 1; } + 40% { opacity: 0; } + 70% { opacity: 1; } + 100% { opacity: 0; } +} + +@-ms-keyframes showdoublefadeout { + 0% { opacity: 1; } + 40% { opacity: 0; } + 70% { opacity: 1; } + 100% { opacity: 0; } +} diff --git a/src/sunstone/public/app/utils/webmks/css/trackpad.css b/src/sunstone/public/app/utils/webmks/css/trackpad.css new file mode 100644 index 00000000000..efccae414ad --- /dev/null +++ b/src/sunstone/public/app/utils/webmks/css/trackpad.css @@ -0,0 +1,192 @@ +/****************************************************************************** + * Copyright 2013 VMware, Inc. All rights reserved. + *****************************************************************************/ + +/* + * trackpad.css + * + * Defines style for the trackpad widget. + */ + +/* + * jQuery UI Dialog 1.8.16 + */ +.ui-dialog { + padding: 0; + box-shadow: 0px 5px 7px rgba(0,0,0,.5); +} + +.ui-dialog .ui-dialog-titlebar { + padding: .8em .8em; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.ui-dialog .ui-dialog-titlebar-close { + right: .4em; + margin-top: -11px; +} + +.ui-widget-content { + border: 0; + background: #ffffff; + color: #333333; +} + +.ui-widget-header a { + color: #333333; +} + +/* + * Touch sprite is loaded in a single class (as we have disabled caching images). + * We do this for the iOS case, due to extreme limitations in terms of image size. + * This form of grouped declaration forces all these definitions to load the same + * sprite. (This is also loaded upfront for the navbar so its always visible). + * For details see PR - 978390. + */ +.trackpad-wrapper .ui-dialog-titlebar-close .ui-icon, +.trackpad-wrapper .ui-dialog-titlebar .ui-dialog-title, +.touch-sprite { + background-image: url('../img/touch_sprite.png'); +} + +/* Replace jquery ui title bar close icon. */ +.trackpad-wrapper .ui-dialog-titlebar-close { + margin-top: -9px; + border: 0 !important; + background: none !important; +} + +.trackpad-wrapper .ui-dialog-titlebar-close { + margin-top: -11px; +} + +/* Background-image is defined along with touch-sprite in 1 place. */ +.trackpad-wrapper .ui-dialog-titlebar-close .ui-icon { + background-position: -9px -239px; + background-repeat: no-repeat; +} + +.trackpad-wrapper .ui-dialog-titlebar-close .ui-icon:active { + background-position-x: -24px; + background-repeat: no-repeat; +} + +/* The grabber icon indicating the dialog could be moved around */ +.trackpad-wrapper .ui-dialog-titlebar .ui-dialog-title { + background-position: -10px -255px; + background-repeat: no-repeat; + width: 40px; + height: 14px; + margin: 0 0 0 42%; +} +.trackpad-wrapper .ui-dialog-titlebar .ui-dialog-title:active { + background-position-x: -52px; +} + +.trackpad-wrapper { + width: 289px !important; /* As this is less than the default value */ + border: 1px solid #333 !important; + background: none !important; + border-radius: 6px; + box-shadow: 0px 4px 9px rgba(0,0,0,.6); +} + +.trackpad-wrapper .ui-dialog-titlebar { + border-top: 1px solid #ccc; + border-left: 1px solid #aaa; + border-right: 1px solid #aaa; + border-bottom: 0; + padding: .5em .8em .4em .8em; + background: rgb(175,176,187); /* Old browsers */ + background: -webkit-linear-gradient(top, rgba(175,176,187,.93) 0%,rgba(170,171,182,.93) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(175,176,187,.93) 0%,rgba(170,171,182,.93) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(175,176,187,.93) 0%,rgba(170,171,182,.93) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(175,176,187,.93) 0%,rgba(170,171,182,.93) 100%); /* W3C */ + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +.trackpad-wrapper .trackpad-container { + padding: 0 !important; +} + +.trackpad-wrapper .left-border { + background: rgb(170,171,182); /* Old browsers */ + background: -webkit-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* W3C */ + margin-top: -1px; + float: left; + width: 12px; + height: 209px; + border: 0; +} + +.trackpad-wrapper .touch-area { + background: rgba(255,255,255,0.8); + background: -webkit-linear-gradient(-70deg, rgba(255,255,255,0.8) 0%, rgba(238,238,240,0.8) 22%, rgba(210,210,216,0.8) 71%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(-70deg, rgba(255,255,255,0.8) 0%, rgba(238,238,240,0.8) 22%, rgba(210,210,216,0.8) 71%); /* Opera 11.10+ */ + background: -ms-linear-gradient(-70deg, rgba(255,255,255,0.8) 0%, rgba(238,238,240,0.8) 22%, rgba(210,210,216,0.8) 71%); /* IE10+ */ + background: linear-gradient(110deg, rgba(255,255,255,0.8) 0%, rgba(238,238,240,0.8) 22%, rgba(210,210,216,0.8) 71%); /* W3C */ + border: 1px solid #555; + box-shadow: 0 2px 6px 1px #888 inset; + float: left; + width: 263px; + height: 206px; +} + +.trackpad-wrapper .right-border { + background: rgb(170,171,182); /* Old browsers */ + background: -webkit-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* W3C */ + margin-top: -1px; + float: left; + width: 12px; + height: 209px; + border: 0; + } + +.trackpad-wrapper .bottom-border { + background: rgb(123,123,133); /* Old browsers */ + background: -webkit-linear-gradient(top, rgba(123,123,133,.93) 0%,rgba(110,110,119,.93) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(123,123,133,.93) 0%,rgba(110,110,119,.93) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(123,123,133,.93) 0%,rgba(110,110,119,.93) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(123,123,133,.93) 0%,rgba(110,110,119,.93) 100%); /* W3C */ + width: 289px; + height: 73px; + margin-top: 208px; + border: 0; +} + +.trackpad-wrapper .button-left, .trackpad-wrapper .button-right { + background: rgb(255,255,255); /* Old browsers */ + background: -webkit-linear-gradient(top, rgba(255,255,255,.7) 0%,rgba(225,225,227,.7) 3%,rgba(204,204,204,.7) 45%,rgba(190,190,195,.7) 96%,rgba(131,131,135,.7) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(255,255,255,.7) 0%,rgba(225,225,227,.7) 3%,rgba(204,204,204,.7) 45%,rgba(190,190,195,.7) 96%,rgba(131,131,135,.7) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(255,255,255,.7) 0%,rgba(225,225,227,.7) 3%,rgba(204,204,204,.7) 45%,rgba(190,190,195,.7) 96%,rgba(131,131,135,.7) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(255,255,255,.7) 0%,rgba(225,225,227,.7) 3%,rgba(204,204,204,.7) 45%,rgba(190,190,195,.7) 96%,rgba(131,131,135,.7) 100%); /* W3C */ + border-radius: 6px; + box-shadow: 0 2px 5px #333; + float: left; + width: 126px; + height: 47px; +} + +.trackpad-wrapper .button-left { + margin: 12px 0px auto 12px; +} + +.trackpad-wrapper .button-right { + margin: 12px; +} + +.trackpad-wrapper .button-left.button-highlight, +.trackpad-wrapper .button-right.button-highlight { + background: -webkit-linear-gradient(top, rgba(170,171,182,.7) 0%,rgba(123,123,133,.7) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(170,171,182,.7) 0%,rgba(123,123,133,.7) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(170,171,182,.7) 0%,rgba(123,123,133,.7) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(170,171,182,.7) 0%,rgba(123,123,133,.7) 100%); /* W3C */ +} diff --git a/src/sunstone/public/app/utils/webmks/css/wmks-all.css b/src/sunstone/public/app/utils/webmks/css/wmks-all.css new file mode 100644 index 00000000000..b12feed8571 --- /dev/null +++ b/src/sunstone/public/app/utils/webmks/css/wmks-all.css @@ -0,0 +1,661 @@ +/****************************************************************************** + * Copyright 2013 VMware, Inc. All rights reserved. + *****************************************************************************/ + +/* + * main-ui.css + * + * Defines style for the wmks ui widgets. + * + * Use CSS3 for touch devices as jquery effects break when browser handles + * orientation changes, or page bouncing. + * + * TODO: Need to handle Retina mode for iPad. + */ + +/* + * jQuery UI Dialog 1.8.16 + */ +.ui-dialog { + padding: 0; + box-shadow: 0px 5px 7px rgba(0,0,0,.5); +} + +.ui-dialog .ui-dialog-titlebar { + padding: .8em .8em; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.ui-dialog .ui-dialog-titlebar-close { + right: .4em; + margin-top: -11px; +} + +.ui-widget-content { + border: 0; + background: #ffffff; + color: #333333; +} + +.ui-widget-header a { + color: #333333; +} + + +/* Touch feedback indicator */ +.ui-touch-feedback-icon { + background-image: url('../img/touch_sprite_feedback.png'); + width: 300px; + height: 120px; + position: absolute; + left: -9999px; + top: -9999px; + z-index: 2; +} + +.feedback-container { + z-index: 2; + position: absolute; + display: none; +} + +.feedback-container.cursor-icon { + background: url('../img/touch_sprite_feedback.png') -260px -15px no-repeat; + width: 17px; + height: 23px; +} + +.feedback-container.tap-icon { + background: url('../img/touch_sprite_feedback.png') -300px -15px no-repeat; + width: 36px; + height: 36px; +} + +.feedback-container.drag-icon { + background: url('../img/touch_sprite_feedback.png') -10px -10px no-repeat; + width: 100px; + height: 100px; +} + +.feedback-container.pulse-icon { + background: url('../img/touch_sprite_feedback.png') -111px -10px no-repeat; + width: 100px; + height: 100px; +} + +.feedback-container.scroll-icon { + background: url('../img/touch_sprite_feedback.png') -212px -10px no-repeat; + width: 27px; + height: 100px; +} + +/* CSS3 feedback indicator animation. Keep it simple (uses lower cpu cycles) + as there may be multiple animation requests made in quick successions. */ +.animate-feedback-indicator { + display: block; + opacity: 0; + animation-name: showfadeout; + animation-duration: 350ms; + -webkit-animation-name: showfadeout; + -webkit-animation-duration: 350ms; + -moz-animation-name: showfadeout; + -moz-animation-duration: 350ms; + -ms-animation-name: showfadeout; + -ms-animation-duration: 350ms; +} + +@-webkit-keyframes showfadeout { + 0% { opacity: 1; } + 100% { opacity: 0; } +} + +@-moz-keyframes showfadeout { + 0% { opacity: 1; } + 100% { opacity: 0; } +} + +@-ms-keyframes showfadeout { + 0% { opacity: 1; } + 100% { opacity: 0; } +} + +.animate-double-feedback-indicator { + display: block; + opacity: 0; + animation-name: showdoublefadeout; + animation-duration: 400ms; + -webkit-animation-name: showdoublefadeout; + -webkit-animation-duration: 400ms; + -moz-animation-name: showdoublefadeout; + -moz-animation-duration: 400ms; + -ms-animation-name: showdoublefadeout; + -ms-animation-duration: 400ms; +} + +@-webkit-keyframes showdoublefadeout { + 0% { opacity: 1; } + 40% { opacity: 0; } + 70% { opacity: 1; } + 100% { opacity: 0; } +} + +@-moz-keyframes showdoublefadeout { + 0% { opacity: 1; } + 40% { opacity: 0; } + 70% { opacity: 1; } + 100% { opacity: 0; } +} + +@-ms-keyframes showdoublefadeout { + 0% { opacity: 1; } + 40% { opacity: 0; } + 70% { opacity: 1; } + 100% { opacity: 0; } +} +/****************************************************************************** + * Copyright 2013 VMware, Inc. All rights reserved. + *****************************************************************************/ + +/* + * trackpad.css + * + * Defines style for the trackpad widget. + */ + +/* + * jQuery UI Dialog 1.8.16 + */ +.ui-dialog { + padding: 0; + box-shadow: 0px 5px 7px rgba(0,0,0,.5); +} + +.ui-dialog .ui-dialog-titlebar { + padding: .8em .8em; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.ui-dialog .ui-dialog-titlebar-close { + right: .4em; + margin-top: -11px; +} + +.ui-widget-content { + border: 0; + background: #ffffff; + color: #333333; +} + +.ui-widget-header a { + color: #333333; +} + +/* + * Touch sprite is loaded in a single class (as we have disabled caching images). + * We do this for the iOS case, due to extreme limitations in terms of image size. + * This form of grouped declaration forces all these definitions to load the same + * sprite. (This is also loaded upfront for the navbar so its always visible). + * For details see PR - 978390. + */ +.trackpad-wrapper .ui-dialog-titlebar-close .ui-icon, +.trackpad-wrapper .ui-dialog-titlebar .ui-dialog-title, +.touch-sprite { + background-image: url('../img/touch_sprite.png'); +} + +/* Replace jquery ui title bar close icon. */ +.trackpad-wrapper .ui-dialog-titlebar-close { + margin-top: -9px; + border: 0 !important; + background: none !important; +} + +.trackpad-wrapper .ui-dialog-titlebar-close { + margin-top: -11px; +} + +/* Background-image is defined along with touch-sprite in 1 place. */ +.trackpad-wrapper .ui-dialog-titlebar-close .ui-icon { + background-position: -9px -239px; + background-repeat: no-repeat; +} + +.trackpad-wrapper .ui-dialog-titlebar-close .ui-icon:active { + background-position-x: -24px; + background-repeat: no-repeat; +} + +/* The grabber icon indicating the dialog could be moved around */ +.trackpad-wrapper .ui-dialog-titlebar .ui-dialog-title { + background-position: -10px -255px; + background-repeat: no-repeat; + width: 40px; + height: 14px; + margin: 0 0 0 42%; +} +.trackpad-wrapper .ui-dialog-titlebar .ui-dialog-title:active { + background-position-x: -52px; +} + +.trackpad-wrapper { + width: 289px !important; /* As this is less than the default value */ + border: 1px solid #333 !important; + background: none !important; + border-radius: 6px; + box-shadow: 0px 4px 9px rgba(0,0,0,.6); +} + +.trackpad-wrapper .ui-dialog-titlebar { + border-top: 1px solid #ccc; + border-left: 1px solid #aaa; + border-right: 1px solid #aaa; + border-bottom: 0; + padding: .5em .8em .4em .8em; + background: rgb(175,176,187); /* Old browsers */ + background: -webkit-linear-gradient(top, rgba(175,176,187,.93) 0%,rgba(170,171,182,.93) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(175,176,187,.93) 0%,rgba(170,171,182,.93) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(175,176,187,.93) 0%,rgba(170,171,182,.93) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(175,176,187,.93) 0%,rgba(170,171,182,.93) 100%); /* W3C */ + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +.trackpad-wrapper .trackpad-container { + padding: 0 !important; +} + +.trackpad-wrapper .left-border { + background: rgb(170,171,182); /* Old browsers */ + background: -webkit-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* W3C */ + margin-top: -1px; + float: left; + width: 12px; + height: 209px; + border: 0; +} + +.trackpad-wrapper .touch-area { + background: rgba(255,255,255,0.8); + background: -webkit-linear-gradient(-70deg, rgba(255,255,255,0.8) 0%, rgba(238,238,240,0.8) 22%, rgba(210,210,216,0.8) 71%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(-70deg, rgba(255,255,255,0.8) 0%, rgba(238,238,240,0.8) 22%, rgba(210,210,216,0.8) 71%); /* Opera 11.10+ */ + background: -ms-linear-gradient(-70deg, rgba(255,255,255,0.8) 0%, rgba(238,238,240,0.8) 22%, rgba(210,210,216,0.8) 71%); /* IE10+ */ + background: linear-gradient(110deg, rgba(255,255,255,0.8) 0%, rgba(238,238,240,0.8) 22%, rgba(210,210,216,0.8) 71%); /* W3C */ + border: 1px solid #555; + box-shadow: 0 2px 6px 1px #888 inset; + float: left; + width: 263px; + height: 206px; +} + +.trackpad-wrapper .right-border { + background: rgb(170,171,182); /* Old browsers */ + background: -webkit-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* W3C */ + margin-top: -1px; + float: left; + width: 12px; + height: 209px; + border: 0; + } + +.trackpad-wrapper .bottom-border { + background: rgb(123,123,133); /* Old browsers */ + background: -webkit-linear-gradient(top, rgba(123,123,133,.93) 0%,rgba(110,110,119,.93) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(123,123,133,.93) 0%,rgba(110,110,119,.93) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(123,123,133,.93) 0%,rgba(110,110,119,.93) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(123,123,133,.93) 0%,rgba(110,110,119,.93) 100%); /* W3C */ + width: 289px; + height: 73px; + margin-top: 208px; + border: 0; +} + +.trackpad-wrapper .button-left, .trackpad-wrapper .button-right { + background: rgb(255,255,255); /* Old browsers */ + background: -webkit-linear-gradient(top, rgba(255,255,255,.7) 0%,rgba(225,225,227,.7) 3%,rgba(204,204,204,.7) 45%,rgba(190,190,195,.7) 96%,rgba(131,131,135,.7) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(255,255,255,.7) 0%,rgba(225,225,227,.7) 3%,rgba(204,204,204,.7) 45%,rgba(190,190,195,.7) 96%,rgba(131,131,135,.7) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(255,255,255,.7) 0%,rgba(225,225,227,.7) 3%,rgba(204,204,204,.7) 45%,rgba(190,190,195,.7) 96%,rgba(131,131,135,.7) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(255,255,255,.7) 0%,rgba(225,225,227,.7) 3%,rgba(204,204,204,.7) 45%,rgba(190,190,195,.7) 96%,rgba(131,131,135,.7) 100%); /* W3C */ + border-radius: 6px; + box-shadow: 0 2px 5px #333; + float: left; + width: 126px; + height: 47px; +} + +.trackpad-wrapper .button-left { + margin: 12px 0px auto 12px; +} + +.trackpad-wrapper .button-right { + margin: 12px; +} + +.trackpad-wrapper .button-left.button-highlight, +.trackpad-wrapper .button-right.button-highlight { + background: -webkit-linear-gradient(top, rgba(170,171,182,.7) 0%,rgba(123,123,133,.7) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(170,171,182,.7) 0%,rgba(123,123,133,.7) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(170,171,182,.7) 0%,rgba(123,123,133,.7) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(170,171,182,.7) 0%,rgba(123,123,133,.7) 100%); /* W3C */ +} +/****************************************************************************** + * Copyright 2013 VMware, Inc. All rights reserved. + *****************************************************************************/ + +/* + * extended-keypad.css + * + * Defines style for the virtual keys on the control pane. + */ + +.ctrl-pane-wrapper { + width: 290px !important; /* Needed as the default is a bit larger than this */ + border: 1px solid #333 !important; + -moz-border-radius: 6px; -webkit-border-radius: 6px; -khtml-border-radius: 6px; border-radius: 6px; + background: rgb(170,171,182); /* Old browsers */ + background: -webkit-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* W3C */ +} + +.fnKey-pane-wrapper { + width: 427px; + border: 1px solid #333; + -moz-border-radius: 6px; -webkit-border-radius: 6px; -khtml-border-radius: 6px; border-radius: 6px; + background: #c1c4d1; /* Old browsers */ + background: -webkit-linear-gradient(top, #c1c4d1 0%,#b0b1bd 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #c1c4d1 0%,#b0b1bd 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #c1c4d1 0%,#b0b1bd 100%); /* IE10+ */ + background: linear-gradient(top, #c1c4d1 0%, #b0b1bd 100%); /* W3C */ + position: absolute; + padding: 0; + -moz-box-shadow: 0px 5px 7px rgba(0,0,0,.5); + -webkit-box-shadow: 0px 5px 7px rgba(0,0,0,.5); + box-shadow: 0px 5px 7px rgba(0,0,0,.5); +} + +.fnKey-pane-wrapper-down { + width: 427px; + border: 1px solid #333; + -moz-border-radius: 6px; -webkit-border-radius: 6px; -khtml-border-radius: 6px; border-radius: 6px; + background: #6e6e77; /* Old browsers */ + background: -webkit-linear-gradient(top, #6e6e77 0%,#656565 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #6e6e77 0%,#656565 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #6e6e77 0%,#656565 100%); /* IE10+ */ + background: linear-gradient(top, #6e6e77 0%, #656565 100%); /* W3C */ + position: absolute; + padding: 0; + -moz-box-shadow: 0px 5px 7px rgba(0,0,0,.5); + -webkit-box-shadow: 0px 5px 7px rgba(0,0,0,.5); + box-shadow: 0px 5px 7px rgba(0,0,0,.5); +} + +/* Hide jquery ui title bar. */ +.ctrl-pane-wrapper .ui-dialog-titlebar { + border-top: 1px solid #ccc; + border-left: 1px solid #aaa; + border-right: 1px solid #aaa; + border-bottom: 0; + padding: .6em .8em 0 .8em; + background: none !important; + -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; -khtml-border-top-left-radius: 5px; border-top-left-radius: 5px; + -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; -khtml-border-top-right-radius: 5px; border-top-right-radius: 5px; +} + +/* Replace jquery ui title bar close icon. */ +.ctrl-pane-wrapper .ui-dialog-titlebar-close { + margin-top: -9px; + border: 0 !important; + background: none !important; +} + +/* Background-image is defined along with touch-sprite in 1 place. */ +.ctrl-pane-wrapper .ui-dialog-titlebar-close .ui-icon { + background-position: -9px -239px; + background-repeat: no-repeat; +} + +.ctrl-pane-wrapper .ui-dialog-titlebar-close .ui-icon:active { + background-position-x: -24px; + background-repeat: no-repeat; +} + +/* The grabber icon indicating the dialog could be moved around */ +.ctrl-pane-wrapper .ui-dialog-titlebar .ui-dialog-title { + background-position: -10px -255px; + background-repeat: no-repeat; + width: 40px; + height: 14px; + margin: 0 0 0 42%; +} + +.ctrl-pane-wrapper .ui-dialog-titlebar .ui-dialog-title:active { + background-position-x: -52px; +} + +.ctrl-pane-wrapper .ui-dialog-content { + background: none !important; + padding: 0 0; + border-style: solid; + border-color: #aaaaaa; + border-width: 0 1px 1px 1px; + -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; -khtml-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; + -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; -khtml-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; +} + +.fnKey-inner-border-helper { + position: relative; + background: none !important; + border-style: solid; + border-color: #d5d5d5; + border-width: 1px; + -moz-border-radius: 5px; -webkit-border-radius: 5px; -khtml-border-radius: 5px; border-radius: 5px; + pointer-events:none; +} + +.ctrl-pane-wrapper .ctrl-pane { + padding: 3px 0 3px 6px; + height: 140px; + width: 280px; +} + +.ctrl-pane .baseKey { + float: left; + border: 0; + padding: 0; + width: 57px; + height: 57px; + margin: 6px; + -moz-border-radius: 6px; -webkit-border-radius: 6px; -khtml-border-radius: 6px; border-radius: 6px; + font-family: "HelveticaNeue", "Helvetica Neue", "HelveticaNeue", "Helvetica Neue", 'TeXGyreHeros', "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; + font-size: 18px; + text-shadow: 0 1px 1px #eeeeee; + -moz-box-shadow: 0px 1px 3px rgba(0, 0, 0, .7); + -webkit-box-shadow: 0px 1px 3px rgba(0,0,0,.7); + box-shadow: 0px 1px 3px rgba(0,0,0,.7); +} + +.ctrl-pane .ctrl-key-top-row { + background: -webkit-linear-gradient(top, #fff 0%,#f3f5fb 2%,#d2d2d8 98%,#999 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #fff 0%,#f3f5fb 2%,#d2d2d8 98%,#999 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #fff 0%,#f3f5fb 2%,#d2d2d8 98%,#999 100%); /* IE10+ */ + background: linear-gradient(top, #fff 0%,#f3f5fb 2%,#d2d2d8 98%,#999 100%); /* W3C */ +} + +.ctrl-pane .ctrl-key-bottom-row { + background: -webkit-linear-gradient(top, #fff 0%,#e1e1e3 2%,#d1d1d4 50%,#bebec3 98%,#838387 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #fff 0%,#e1e1e3 2%,#d1d1d4 50%,#bebec3 98%,#838387 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #fff 0%,#e1e1e3 2%,#d1d1d4 50%,#bebec3 98%,#838387 100%); /* IE10+ */ + background: linear-gradient(top, #fff 0%,#e1e1e3 2%,#d1d1d4 50%,#bebec3 98%,#838387 100%); /* W3C */ +} + +.ctrl-pane .up-position .fn-key-top-row { + color:#333; + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#f7f7f7 2%,#dcdde3 96%,#999999 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ffffff 0%,#f7f7f7 2%,#dcdde3 96%,#999999 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#f7f7f7 2%,#dcdde3 96%,#999999 100%); /* IE10+ */ + background: linear-gradient(top, #ffffff 0%,#f7f7f7 2%,#dcdde3 96%,#999999 100%); /* W3C */ +} + +.ctrl-pane .up-position .fn-key-bottom-row { + color:#333; + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#f3f5fb 2%,#d2d2d8 98%,#999999 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ffffff 0%,#f3f5fb 2%,#d2d2d8 98%,#999999 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#f3f5fb 2%,#d2d2d8 98%,#999999 100%); /* IE10+ */ + background: linear-gradient(top, #ffffff 0%,#f3f5fb 2%,#d2d2d8 98%,#999999 100%); /* W3C */ +} + +.ctrl-pane .down-position .fn-key-top-row { + color:#333; + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#e1e1e3 4%,#d1d1d4 45%,#b7b8bd 98%,#838387 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ffffff 0%,#e1e1e3 4%,#d1d1d4 45%,#b7b8bd 98%,#838387 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#e1e1e3 4%,#d1d1d4 45%,#b7b8bd 98%,#838387 100%); /* IE10+ */ + background: linear-gradient(top, #ffffff 0%,#e1e1e3 4%,#d1d1d4 45%,#b7b8bd 98%,#838387 100%); /* W3C */ +} + +.ctrl-pane .down-position .fn-key-bottom-row { + color:#333; + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#d9dadd 4%,#c8c8cd 45%,#b0b0b7 98%,#838387 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, #ffffff 0%,#d9dadd 4%,#c8c8cd 45%,#b0b0b7 98%,#838387 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#d9dadd 4%,#c8c8cd 45%,#b0b0b7 98%,#838387 100%); /* IE10+ */ + background: linear-gradient(top, #ffffff 0%,#d9dadd 4%,#c8c8cd 45%,#b0b0b7 98%,#838387 100%); /* W3C */ +} + +.ctrl-pane .fn-key-top-row { + margin: 12px 6px 6px 6px; +} + +.ctrl-pane .border-key-top-left .fn-key-top-row { + margin: 12px 6px 6px 12px; +} + +.ctrl-pane .border-key-top-right .fn-key-top-row { + margin: 12px 12px 6px 6px; +} + +.ctrl-pane .fn-key-bottom-row { + margin: 5px 6px 12px 6px; +} + +.ctrl-pane .border-key-bottom-left .fn-key-bottom-row { + margin: 5px 6px 12px 12px; +} + +.ctrl-pane .border-key-bottom-right .fn-key-bottom-row { + margin: 5px 12px 12px 6px; +} + +.ctrl-pane .ctrl-key-top-row:active, .ctrl-pane .fn-key-top-row:active, +.ctrl-pane .ctrl-key-bottom-row:active, .ctrl-pane .fn-key-bottom-row:active { + background: #bbbbbb; + background: -webkit-linear-gradient(bottom, #888888 25%, #CCCCCC 68%); + background: -ms-linear-gradient(bottom, #888888 25%, #CCCCCC 68%); + background: -o-linear-gradient(bottom, #888888 25%, #CCCCCC 68%); + background: linear-gradient(bottom, #888888 25%, #CCCCCC 68%); +} + +.ctrl-pane .ctrl-key-top-row div, .ctrl-pane .ctrl-key-bottom-row div, +.ctrl-pane .fn-key-top-row div, .ctrl-pane .fn-key-bottom-row div { + width: 100%; + text-align: center; + padding-top: 17px; + overflow-x: hidden; +} + +/* Highlight selected modifier key */ +.ctrl-pane .ab-modifier-key-down { + color: #4D8DFF; +} + +.ctrl-pane .baseKey img { /* use .touch-sprite for image */ + background-repeat: no-repeat; + width: 57px; + height: 57px; + border: 0; + -moz-border-radius: 6px; -webkit-border-radius: 6px; -khtml-border-radius: 6px; border-radius: 6px; +} + +.ctrl-pane .baseKey .right-arrow { + background-position: -242px -182px; +} + +.ctrl-pane .baseKey .left-arrow { + background-position: -126px -182px; +} + +.ctrl-pane .baseKey .up-arrow { + background-position: -299px -182px; +} + +.ctrl-pane .baseKey .down-arrow { + background-position: -183px -182px; +} + +.ctrl-pane .baseKey .more-keys { + background-position: -10px -182px; +} + +/* Ctrl - pane flip transition. */ +.ctrl-pane.flip-container { + perspective: 1000; + -webkit-perspective: 1000; + -moz-perspective: 1000; + -ms-perspective: 1000; +} + + /* flip the ctrl-pane when this class toggles. */ +.flip-container.perform-flip .flipper { + transform: rotateY(180deg); + -webkit-transform: rotateY(180deg); + -moz-transform: rotateY(180deg); + -ms-transform: rotateY(180deg); +} + +/* flip speed goes here */ +.flip-container .flipper { + transition: 0.6s; + transform-style: preserve-3d; + -webkit-transition: 0.6s; + -webkit-transform-style: preserve-3d; + -moz-transition: 0.6s; + -moz-transform-style: preserve-3d; + -ms-transition: 0.6s; + -ms-transform-style: preserve-3d; + position: relative; +} + +/* hide back of pane during swap */ +.flip-container .front, .flip-container .back { + backface-visibility: hidden; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + position: absolute; + top: 0; + left: 0; +} + +/* front pane, placed above back */ +.flip-container .front { + z-index: 200; +} + +/* back, initially hidden pane */ +.flip-container .back { + transform: rotateY(180deg); + -webkit-transform: rotateY(180deg); + -moz-transform: rotateY(180deg); + -ms-transform: rotateY(180deg); +} diff --git a/src/sunstone/public/app/utils/webmks/img/touch_sprite.png b/src/sunstone/public/app/utils/webmks/img/touch_sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..9209d836cd3b19ba74c69ff287734043c79be2b1 GIT binary patch literal 24870 zcmbTdbyQqU^Da7AfDqh*ySu{#cPF^JySpYp(4Zl>dvFNu?(Xgog1f`ryzlq@&RKVz zb?#bs{$bCa?&|95uIlRNDZ)O>OCY|-eGdYG5TztVl|UdUVh{*|9_}6R<`cs_82E$Z zBBtS@Y;We`Zs=qR5;CzjG9{L>H8eL>GBq^ubR0D01$tRns%W@q$jO3@?QIzi-`X&G z*g62cK_FfM4+leIYf~3uBU5urJ3i9W=5|tIOA|g)bq+aZIR_C_3rk5aCsSoFc@<+X zYhxZ0QUQKqUJo!Jz}D2okl4f4#?Be+!AJU!Trlwb_L_;5_@5>&)_kP@Dy1R!nOMZ$ z$&{Fbk(t4mnUjT>lbw-;otcN7hn|>~nT45&g_Vh!i-Cn1%)td_W+DF1hZGpi$;1q- zBr5)&v4C%Uq!unN4qzrGcXxM2cQ!_QCvzqi9v&VhW>zLvRtBI2gR`fdi=hXDoio{g zC5W0j8#`G#xLDfT5x+?^G_rSf;Ufh!{dWqs4svq;BiPRQKZXKK#^hn>z{JAH%w%i( zHm`qLJG&^E{x3EDkFA|mJRMA#luVuNU7d`9^)Ms*Z)d=E|M!938UosY6`U-AMKQDy zwKsOPHMMh*66GTWeql7RGyzP+&CJ5W#m>yd%FM~l!otJC%p=YvA|@on!@?@U!Tw(v z|EInz9Ad&^tm4d^Y@9+YEMlxeY~o^K!lELqob0ST971gW?JH&H>|$tVZ2I4EErD_W z?JFk!f9(qvaWXY@v3F9jx3~H44)|XFAPsBPawK?HIBqJG^zbKuTZ1PQryG z2ZJB9R-0Ut;YePeF2}DUBO^7C2|`|G_zSWA798&?KO)!8Hb6sw{!xfnaD`k@twPWC zmwE+Zz0bpyxRXmk2VS3bS!v? z07y|SfL!r0ami82<24W#xf~7lx6R@OkJ1#~M3NST)$%MDZn@5utx?7&R7|o^KHa4O zdUv*FM{k^41@zAx&+NXcj0qI$wR)v$nttNoa7BFf52(zMh$a-d_G%R~!K!oI7Ow(n zqGDsuhlB-A7b>_b%LD~|`-Z0Wv(9$8DIc=g{ZtQqnKGt7mQ2E=*LtoL2kEDeUN&c# z77u29th_B`Z6o)}n>8ImKvLn+(d)d{bM)oOlS{SM@rexDec&{O!nrD=-tcH?7&wGn z0lebltecxGp}?&SufH^QtEu*FjrSwTY`;QdzJ7(QCv2@69?NlTN)#>Qeo(VU>dMO_@%Y@GRUS+iGO0We z`@BBit_XQ-g;A|+K`0t{PsJD1RLLJZ9Dr2~2+7W0FZV{b{UoCBEm6mH3F*tGtBm`P z0C^G(*52Fw(c_C%#uDUFEf-nvSb#woa#CRPR7=!C5Z=H4;ML0i8LmXH73{g6?mps} zr(Y)`EUb~A#&+QKki${QTMSZcDb>0RkW3{HOC=1OFD78r-H+OKy*bjnIIdrRk7=n? zC{M7`D<2mZht?ToX=Y}omCR~NS!X>j?|9mi!RM`)eXo#r-(PvG2=NsP`E5mzW+_RJ z)>tNr+W;KBful~+j3wn8Zr8LC-39sVS(6dr^ zSQWFZPfSg%DCOz^)&DSNYoUWtIk1)fJbR(UeohIj7y=y+Q$Jg)X zJeSX1dcHux3TtN4>m0tReC7tBl(3{|<#>HKPc@RlWp6jRLd^u6(K`dNwzj4nL4z%x zmrh;4Czv@!!a!VH{9@hzbu>~=FG-pqcF9!$lh}!_+3LH`?%YuAy9f8Aqfyl@+spWY z#+T~qYP~`MB#E@#+g57p4Jcm$H{vlbM|tPk)Vap?n0e0bbQaMMYZ(43qHi@paT@oBj1yiMgfA|?yZ?3#qK??I>b5#T0wTrPKM)~9k-V{Ood_x zcNUWY6a|%crgD`X-=OE>?hJPJ_lLvX0Y^gZ8SBZsYDyB~;qo}!P_iE;=u$u-kWDf% zFob{?>FE zN}E>dCt{d_wcCjuS|RS%)WrNNYZ#Iz*IbrUc?3+YS5wH@+1b(Bs95zDclem)uCqZz z0%V^gw6s#XpECU(4wUpI-WK??WOtt+>AJEv`bkS4`cPtVkLN4iE13>#1gJ@DzYr5hZqZaf@MrLZU7 zNlQ0s;U`F1}Y|9dRTDrcrT z+We7eG%PH&ztW}LZDqU!ELJnrnwYOZqyisvT)HR|n@3TV1!W$tHs9vO#Kgeo7(XmO zTpwZ=lhmzJJpG=tL3&dK6br$Gp;nle$E#6mH7hR6om!C%92&Nqb}Iu`xDwxq(@aqQ+}_=U7y6>Sf{irEh^iX`C&2&#ruU0CanonVsWXa|4cBpe%LQqO&TD4A(x2Ht@mwR%IrB1s;Z*dnm zs+)o&zV2q5;pp0;?Vh+ms?2CUF=Y^mG|9ss?b_ShA!&z>GktmmH%4IKa zz23&hMPJcrpi$?3x<+u)G{;Brw7}DQ_~y0~1t85yz;8d&p`$uw#EhkXN`$M&O58o~ zC-SchgHt{KswAAe;+dy z3KRMP7_S2sMp9T_LYnV=-u@u_epGs00LseqAg)JeUDbz2DgWf+5vA zDH!ON6;Yawc=(5waI8LHR|+O{%QSz>nEClWO{*w1>Jg_YlWFsUERFcjTp1pZ?*luP z=uVIQLS?q+A}R?9N!nSFdPTIC8)9%94z6+J&(v?u%27F#vbT|&{xgVHZ zEG&v{ZGby%i-y*34HgJmeb9It0JH(8ir2-~*%1U)i#28FQhcXD{hbNX*iu7_qZjs! zaOXV?)_8KmKTSKlCo~UjtT=My?~!Y#P;DkyFn|=6?DifJ_}K#;B4dTy*Hf>)?ro8P z&zam;-bTlC`T3xi-}{N~n=b#p-dOhd{Z9fjFN97Hywd8)m8Exy+r?$2l#ie&Jv zq<${mjme{$#o%li$NN9hA$|bWdBy#=gX)TU2 z2}7H~^{EMlaxFA!XL?;Y_lr#$-!F&l@Ziq3jG0kDe*@x87{nIF_xki9FeTET8Rqb7 zc%GA!z{+EjZ(-2XO#JVAx4QGlY=#?ZRQvlXNiEKyR~1b?S}(ic2dt!g;I*)V-&gYhu&@f2JIcx~1dcO#e@}|> zs2$c9N)h=qqAxI~(R+R&(SVw`Nz^Q87qY?_QH3A$ysUln#yfLG62=lUAf3^>eJHCv zS)2^+ubwb#s6sXe=#Wzk04q(9{_+$|A!i?WA9GdGP^jj6ar2njtI;A@j5#GBYw=N- zY{1wzBz|r@?&FO=Bhgq{p(jVa=gU>X4YC*GJc(}O`$i4!u=zoFeQ(y`A0l)SrLrQp z5-Hshim^YsgNSr*??pEE&gKO6&o{*m$Lir-t@B@x^r;4$5;7fz2{L6VRsT}N&}&7} z&vctiKR3pv-7z23Ab$Clb_(V!nUy%OE#>j?lXDX^IZewN=m=`7_!hSq@3`@{z8%?1 z%q{5sEv$P-r?9NHW#-pndy50;s%DqmbPxIu-rF-@MxxhzO(U7`UFsA(#nTgi-c7VYk|a5N5kh5)GAqt@gt&a zO9qy&;s+!-4UN?P5pbPR#Uy%1Fc?lPL3!FNUL7g+%*XmYujmx^xz(6dry+!;QAy}l zt?l*L&B7sc+wbql`ONItS%0JWo}tJk_nQVqbb<>{kfYlCH=>VAw_M@P?WSnAn7=1f zb|weLT11NO{!}l7O9aBlVF=&!s}$Fa8r%e-pgn(9(un`zSfK4sq|o{_y{F6mM?GiL zkk9!(4E_tR-N!IZ4-@zn7akJrM=%P64}+W}hF*lZZ~VrZ&<93arseE(QoDnv znB4XCE3JYzWekho|`))jyj}bl$N*UQejU>emKKrI2=ze6M73d>qnWJt&uJ&yPPvHuQaf ziF}!-Q^;j6c06c3t+WNF1pHHAp9Es-_Zhk(w<0IRc$tN_~YYkJ`SDK|vLqfI@uoYouoM$H&cZZd@aETG?=3 zBFbAL^YqlM#En%lo@&<59haN6a$ml2M6Iy6++Gt!#+njwo!t^F>q4OuYvRWIbRyf@8Ozc{)sO{IvRn1n)6&lz z&y*(@2;yu`k|By;c#tshazk{{lX@N9gmh2i=a0KiITsY1X+M3gqB<^!y!>=i)KV=g z7uk{emR~wRrnfpiF_8Y%N{aQhB-6~=y${urvEGJuW) z<8z5oJV3qC{6l%(rDRClULtN8R|2)>h^DrJ5lLV)i`iRO8Fa9D(dpPSt;zA_G&p)gv3LS_N~A1vJLT>~w|lL>1-Q|A`>iPb~{ zhr7nZ&(MMj>5&sXh~LN*kVh3L)@gI6g3F3;qTpL24^|nOs@G9*fO(t0$&-Di9G>g# z*1>Qo<44V0y=(BRC)bJ!NqG_aCsbGd*X=|+E8t-3mESCnGE>z$C%J}`lxQ<@)v}wR zHJ*$-$rEE#?_6(L`I{Uk%n=Qmh<%ag9SK?E0|pF4lb%ZkX|b zlCrwyL@P)_G=ZX~?nNw8ajq4g{-xBhoBIpfkN2^(*J!1C`nX8ExCIffQf+XPTFP1a zTEY3V%Zay5lag3id!|gy6UALf<|n8e51$g$?y4G1@za%C2;b&u`#vV`qRe{^#a$LV zD7Z?P-qYZ!#o@u9&ygrrm@a+%J40rv&|ai*yj=+^UQ@}XQ-e1#T0DbDQAYq~+Amijz5BWtC@Fo-A7 zU{<=Gz8s`IFJ!f+)@+)X+)L{+d!hSQnAVfu@KR)Pt~WsuOP4hbv{=NfZ#E>tAm&(h z^KaMM_cL{pa|;SK@rxD?V@5?t$U=G^h9 zPKl3S>jsbIxpPKdx0j=i_Vvoy5xa6z#O||M)N%Ag>OS~Ikf1MB2P@)drsj3^sOwl( zL^x%u#3(sp6Ed;>*hjfBg4KS6m@TPy3}dJQsGITZqeSC%J6(jn&IR3fkQ_xCmLl5{ zGjhZS^lh*(p@pfCm}vdatTv(H>@!Pm;dG-GGVeLwH^=Edyn&eBrM@Dry3j3uSEYfA zvd|78jtZ9`;yLcCj?(=RQ{G5fgk>R~OXMKEdRar6bU@Va9M6-rcE$5*z1PD;PtRmktxZl5*4^^ylRFzXvV@-rPt9$&+S4))jwq4pn3Hzg-Ai9M z`XZ&FUaC)xdW8n}zRX@_RcQZss2vhj%b&g1`fGNn+i8-**>~M%z+MJ&{u>BQ&V#bP zK~Z;|#LRdsw?`!bN_q|MN8h9NQRJOuNh(L>l8(q!SW(BK&m`8rbouX1g)Brr^n{!m z+&D>!NqT&kXQz!I`nqWL1gGZ_+JeKm%@%8ff)E{d{`_4>kxe*zJldmLuJcfxo;k>Y zpo&80stESYYJ!x%yabP8$yEZqEKoBq16KTBpH(Bp$*Rn3(laymF=wVij|(idYT5nP{}l`! zDj_K?DGA5^@k38al`DNzX8Lx?Ok8ooWv4G)|LL;o%FsUzmxu?3hi~84YR{+*N3OR5 z0BTx&H?9pqgothP$dg9lb@0;HDpJ8SjZsw%=+SB0EJ8v6%&hne!OKP zQAxEpLikjcmRJHXI^*!jG&V$wZH$`L(C+Ni8~|6N$lean3&m<`BjY=_mA9DQ0-Tc; z_lv_G=#zV}{2hUv%mEc}C^v#~0GiE)!{^10eFlKLv8Ka6gOymif&>Mue2WOM^9>0j zHj#PH1Y>fCI3v34jUlS8ir5S4zG?BI69m3PByIJ+-BTM$VhMb@+m0@+=;UGGqXsZJ zX?%EA{V&JBMeQ@Bf1`Oof#GRO?#vc@84<2A8DY)!Hn-!YD)UUW%uN%3TGP?zm*%fcK_OX!B1GAEzqSX_*bCj^JkF=SMMr+v ze!iD#AD5R$&I)jSPTPIoO@!E)qkGAsdAoWYudd^I4VSqcHbB;Ey+H_t7Qa-Ah1a|e z890@&uoY5}>81hRBpK9{pAdg|C|BX*`xsDvF+_fMUoHa%!kVpSX>ao5F3nty z7AEtLj~A)}FH-=rG!FeEtLHUbWndlDt#@~X1BxPY zC*y3s`3WOkpY+W&*R>-WLwXdn?8@zcP(sSl;RXsaD+ju!5+3#`<+ah`WhG*+yb1E&HR+# znXu*c8?Zg?dzWz{Qt3fNA_zM3g={GkZ1uWsk|&a!UKE)dwgJ*mHvl z+IaNX6%A4lc)kh(fYVC1taCl3JT~8lt4WyVCMD8phq< z5c2@`A`c)2JW4?Bda2qz2AK=|7U$}-QgS+CK{da44@R#B&b;J~xZzNYl^2 z_FS3RV9@&AkqYB+&8ARhsH{s+P9%p35db=;`~{GE98q#gJ3(h3IUF_wt@VSF0t_}Q z==IyuzPGU`m!lY(5{t2oTiLm(sfSSYy$t38%LaDOoA&Z4Q@>b{9mQtUiAne=Ctq}} z*b#7wfO3Ql>X?T1a9sRWGs&z$q5SPxlwtDQU1dP8q2oO}(xsWHf$8Md;C1a-=S!V` zhjRi+=gC^DOxxWS!lETWk?UVv&+F%+gU|k&XUG?Rk{`{>%HP&R0y(_1zX%|Y&AAsy z8qO60m_+K-Y@I%Yr$TH!kL)rwJb->>zBK!-TWvC^_pscjr=#`_U@4==2M0Y~Nc%n^vEQM(`_M*iJdDnlb5@tUZ20fqs(;28D%c z1Ri*YnXEBU=%0J6RqfcqD_y1RE(pv7rE zFMgz8i1_gqqRlfrzoqf}F4-h9>6?8e&!{(nLup?T$ZtPOVMkk^eV&HC!z~%{6{2fo zq!1^)sVKKQ*Ed z|IN8l|1@&@pJCD=3`cOlh={#^+y}}i)^hJXwSDvr@6I+~E`mQ#F8*nIzR`w5`ObF<9N^vH zXf|Z=-_zL9gD&cY)2(~oA9tf3#cdTbXQoL!WOY{8fH2j#4uq`^bjT;|fFCzsM2OPh z-}48d`&3mULF6!=1%N((2nxB$@C1(FgBH+zSMUxIaJF85ZEq`?XcqJBOCld^?hkLiNX`WFe&?&mLQrSZ9*8~VK7(Eb~6oWe^Jzcs9NUD;$- zv4hJ$%J+}JOqM6Vs9Xdv-+a~vI3%0X%)-RPiy-?*xHI+-E>F zXY|}U`}GWOHA~c5bE}*E$uB_V++2JPpj%sl&BAJ!hkD~FxY_5vdR=cH1lcoPTC81P zel#QqB)d}UZN7~|eZ|U!4eODSAMA8pT-d3&aXD=Up25n42Br;;+kLoAMUBN%`N-Ei z&U-}ib?}-Wmq)D%aU)%JI4XIiEV852L-^Uuksa-~dk` zFtu#dV!F2K*;`{?e#MV}s=zVKr_{Q=@_jn*PpW_t3|KHk!$dqk5<5AXm!uR03g*n6 zTWjvCSU(G)EA)Oi#Hc8a`g7t}^!RWS;I2O}OOF4^Et1XpYbPcI8U}{wQk|^~kkwPt zF`y#=sY7KmL*uRiAvMW2&CxU z47#fU8Iq~At`;j(Rd`ZYRr_3ya@oh{jQvSDK!${Xe9A|=0k&f_KEF?riJ95Y2d~(^ z68(1md!QI?piH|SzW_*WYrBuRomZ=e`m#krxPiOUD6o(f$(Q6F!YUp160k}S$@>Q6 zLVMQ+-4{qdBAJ;Mcz!^MbQQQ+a?;T>`yQ>bC7QEClpioPC0 zKmZ!>hAc!3igvd7K1y0y{Zc+i`#%3mm9E;a^*Or3(a|vvxYQxlZ%Y%QQ84&WS4gH9KL!8SwF&n0zi&GUx4DD)kTE4>jreOCIo!h4; zAI`{AD~2>3_h{M8!)2&7s?y|nk*GTd@k*@-^;#>{G4zYub^m4ATcG-5a7o-Uh;3QD zZX77GI$yr50DNTzV_n+e>W`v?BBO<4`$||dAHtalkXgGH4d_vR`SL~Y)-^RDEa4bP z^ZN=VKrNyHm7BjSbeqM2JD8;1dRtiv$gtAy4DO(t(Tp@+a zGlcJpKs3@$Nd}~cATWn>YLO76U0hA?!+8|7!7MlH&8}cAzI95X^$cytYndN&?FOFO z_nN^i0I;y~$Neax{Cl>Tj2uuW*kBGiL?)#qCl4a0r2JLqFZ^P&+|e!pdoep`%3{d~ z#H$QHIG$}?4JlimTF05ChK9k+BDrkN7_I6NcHl_d$R~mWO0W9EP$CVh8M_bzC;`YZ4EQ!KCnZ%Zh~2*&=JrjC2v#iqnAb;hraw2rX71r z8kVN2{7j&~VLc%+dte!J=8yQCs7u;hPd%a<`3YK*D)s|tSel85rUB@4w zHF{ftYnTpEEKrv#c4?-EMTzoJ_J|suj*gCv?o-cO0i=E}9TjOF<}(Bh4b8q}m4q>R zEs4@3F>vq5MELNbbe}qk3_`SibnnqXzPSskbu!`;IT&Tw75};;78g-)#W}EJ*LdiRd@z#Ny z|09qR3(%s5+!j^d^Jf^FPUPI79LsPh?I=p$3T<{iobi_KUP7$|PGNe_U4_ei{yS<4 z092rs1Y&!}G=yh{q(YOtNN%V4Q*`~=WGd*yxBsjFz^-?YK9=SdV&2W2W1xEgAqt%S zr?v$YU_LRJE~iyEEq=KK0rgG?5dooQX`ckBb#w*7?ySQb)Oz>6%X?+gTg#3Yq|^8U za`*<)UnZgDcWbQvSH@d8$9ruZoqtM4f!aEpOzW?2?DHME#aEb?%?GFs97u=%)@A=s z6*n9T;zVZ3;J533n*Vf!6qRafYWR=LELQ$`_~&3$`&B=;o}P=jIp62Oo=-CT$*K^A z0DT@%5g`Ak1Fu{Fl-9Y=OZ+`W0C#%`Ok@sI%Wl+cnWDz8r%&1BOOxRPVP?L^^1zo&OFAI7X{!BMf z{|i*367|l2c~hDc z{lagG+(m*63y;5=J{DR1Z{50I}TG;S)uKeEllTRC%TicMe6O-uXu^~$?B&KxpR}aDw0*vr_ zM@RllaqE6d!h3RF5n_XdYUre*-Uc7_003?db_WX`q;%d1PfQEfbmg7wb31K$AxL(U z9fba2IqA-T5aH+8TU;}A)Wp?msN{{)%%HcgL$toHWUX?^D^lh?gS^TcfXdl_3oE z`wC>M8HAF!wbkn(njgOp{%}1`wPV~I^QY>v#drs%~6u&^= z&?|!yZDdg!pXqt0 z0g$oZ^n}EQN*EX+%aE;f>p|XPj;i?hfgB!qvQ5+8GJm zhQY{R-^W9;7WRS5{g}cx+fu(Yg|5`1lZ8NT-2NE6ERkjg@*%4D8?<&E`%q!Snk$tgCF7T!F^23nw$#8 zq{sK-v1;3|>y!A-V%ZH{S!5AJ@9S~fyT9nz`9f5c3c|JTF9+QpaU=p1xS9{^=+kRs zyFZn+`UsT*dArGt2ZpymxF5vlaIRN-FCT{>6M4<}FVGk(e7S6Y>)kB$v;kPq9w{?b z8wF*Bf{Ys676XmtE!<@^(BW?0!<5O1ON9p_>Ob6rVA(V09|MPbzmK^2Rj{=yEJDIE zQN0;=PWWC-f8xF3WDPf?*eG6j8z&Z+n}3V@-K1kJPG%UcRMVFJx}ELssPON2#fkJ? zY9pD_FRk8*Cd!IGZON|^x$10059zY-%fQ!+B>XOoT>UPxrF!GBcLt*-E0#AN1!BkQ z8PWJw!5FpRW4C-T^V>nRjxpGd?(Z-rZB!BT2VUIA2YrnAK!$;aYYX zR$&X!?Mie7l>h@F$Ox4L3l3>JqWo4^6S7|#Ooa87t6YzKo#C}X)I)wwxB4NzIOrOG z5G}<3=blmnrB6_Z)Yymt>SAh~oDV}lx8yN?rTXOR?CCe#R)J>Yq$BqvKcd3Mfe!+KKC}&s~4oa5}FJuPciC&QBb--4y|6&PQxi5ysb;wOw4=~yc58)fX-;hbE_pGl3 ze~>mw?5y&!;iHAKk9iNF;_~e@10pbON&k*WPR!)rHH4<n*WRJn zgUBmZqeo^~iCDu!AQT@tbgY(AJI;lYsHHC{=FX*QTfPcA`h=|gbj{@C@e8E}i2IzL zN-U5QW6J@wfer2HxcJMj(Zp^hD0+FY#AVkM3(I6p=WNILd#NufD?(^(v-}7my|O1a zJRQ0T&rm|t$Kdk;&)BY)^|M}l&KZ4{MG$MmwKn`awl)V|MP@|ZXlS0Ln<+FJW7-5aVm zl+L>nf98!Nfuv(>Ph`uFX5;fEILpovfT-nCRw+C0NG4YyTl}77} z%Xv1l7hmT^jv!E9n3P{hl-it*?mlr%XJCHc`NTQWUG1MLH=z6LMrJ6ZkbgafLFrT?=rcj6U4^*g9 zC{SBIqxHEtQLD&fmksJ0ctkMMyM99RoWxA<5RAz$;3H@MfdP*klW?m*BRwu8uEI>g zWY@ZDS<>o$W+4a^Qf!-DhnpDhJ&C~R4O!3kIf@>EMN!FPA;qC`z$MNDQ`8aQG>>2CDa$M}$C7t(XY)Yw1aj@8g1Nl&Hh-E8S-GJMdR6O3UMBdh+V zK{TwCpHYaWq7HPp8T1Xlf7{9M#*1sPV~QIKhUszGr@g<8Cfm7sAsWm^oFF=RM~IU3 zZfj3j-cvZwG0cBlAwJN1$~v3W9vL(A4aLRT`sxk){uQscUF=Z)N-9+Auf>hCw}y*w z{{aLDQdCYay`@OyVA@{qMZ36q=f(Trv|}LYU9Vh)3q=bF#X|`6Hx!Y4tvs7%tvsn_ zb7Dc>fDH&1?xaR-h956o)^q~e=jv$#oX9D}89j$(l)z~deaF$y>*Dx@`o$eNMEm=? ziGPNthAiJYkIKiKB|Qp~R^6gHn9$*_+y(TUTjTNmU-6480*ffbdWfwd`nf6Dg;0*2 zt;ljYw^^|ooa&rEt6yPBddGhV#}`0{E@ki^5aiMA-pFqGfX=iblyDaUPv^?4`xAzk zp69N&CpmCA3@{hb;_$S>@6uccUTU%_BsyeinhYhj$S0ioH9NfH0B+$}~~+ zcrCLs22vd+h?Dash}w?)r+B;c+fZn|I0eA(#zW>L+2W#;U<2E_bIL*^a&A+5UvqAA z2VLf~rdta{c}8*#&IxT909e-hAuj`|(>Tu7>G%$A*O!q5EdvDz@gu8t7``Ni!}CfN zJ#-1L?Zt`P!J9gWoIxS0FC-07ykvqwBp$vCP)1I~D5ah>J8)P~vHK8{GG<`d4yMsX!|%Ukl3jJ!Mcge?PlEGCN_rW&j@}ui+q91rHnR#YjCs; zHh@oroyCNIE&7whDQ!!|+vJlfeBf5o%#v zepOETN3Pd70K@D4vP%~j-3BgZ%1)j7)mn}ea~Uc>KCc|NO z4Sl}RHfbvD`{k4L+>}bo3|KhgkB~vV3hKY`yVyn~Th^!lGAgWRK7gX_h(MW`#9U(p znb`PPixl*vO^u(w!de-)LK;-gclv0Mj?- zcw79mtDeX1eFy*}!2>i{AH9nhayccx-5N91=1c4GZz)#(nCsQLzIuMLNRl5trt{SS zO+SA!l-A(^rfIZ&RB9>8T*miHo*k8AXa9g{* z!#0nL@9)E*55IOhS%_IapdE~S6)C@)EWVk7Y!g#6dlyEFZj0JiPQbB$?7-=7ZK}fR zU+XxZs2Pcrhwn+5UfV_xSlm!#h&CH=zxx3_wdFI0KF!Qkz+FZm@|qtAB8Rr(N)F7k zz5Lv`d&mi2&xL9bEN(k+nE5K$_VL+A=b;R*#KW=b=Mu?H`Bsg!;IW~V0?Vdioe}2L zVQW4)do}~tNYQNa*!?Ti7{Tx}d*im0{-^V~-rzCPkv}<-)FevuQ;Rn-q1#|Ifnc8+ z-da5^M!#&*xi*c)m@(}MnwE7!!{vtrlg`K7!6uPnEKGMpBca-$keYjB$)?N?L~MaB zUaXo4PqSu^WMYH~68>Y#*AH`3e+1V&1T@~Gl;|N*vd+O1A}QWU2=_bZ!-TGF<^HG+ z8NTK99olJsG2D%c7=*6>a7F?lY}sOU^BRo&Xj0Q11{&tFk`OOlQg9pb40*cfu6Jbj z04M^BscXxrr-a+k;x4`wk?|AReV6;4m8#8B`kAQ5E_klkDUMv)GRc^25=U~sQcvZx zb970b^Fw}lkF>`}_Yy#PO@_@)o0mmR_d%d)bikc%&sjK6@p3MF@04-Ij`S;l&Y}}P zeKO)(pKK`$L*58kP1nGekoa*LR6ZTVwLG1{e+BVI?bH;Q)|-!Fs%o>vARI!{s*w>; zGEtT3CyS3A>q#&^ztA=M-7qoc4%MELIU;jX%`RP&7KG1^V(Rd)rO*FeN=y^@?Tx5g zT6i5_c2y*&r1!$nPmTqjDS%P__lEXpkP9ble+52De6@-L9Lt_gJaF|Cp`k#h+CgD zw|W`=pJu*19Lg^KTOmuzFj>Qlv1aU9vVOVNBV`K_ zS+ZsudxUASZ|@m-e(!T#?{&S`_5SyszwVj)+~+>)_j~U1{d_(p@0lQN48DVcQGUG7 zuf%sIHBa!w(OyI%QI4XG5fSXm~S~TCt z?3;)>b6m&mix$rVZ?8)kY4fWWb&X6n$&y}@(a6Gj`uEBTHMca?F%UX@Iu)x0n1`9% z-C94iuY8O)dPOt;)H0LGDErE$d7?_IT6Nd{FMZFqA+lv2P(Q0row**rJGuD6?Jjje|o?n@bU7#)h(5-2nD5J!B;KMV5e>79GggcEu!vrKV_$&az+*q{0hT=Unp&q1)Oi3_i6SWP^NRlF{^O?jt!1 zZ&|oI7flbnkurMf#YUn}S915Zw%5yZ?YC_5JJ&9iypxWjQKb<0b!v8OrR`A9(oKm6 zf%dyPTvi{J=a#$k%s2${OEPccS$@y=<$Y~OUj=|q;9}fhla-aI-wm2qpxCs9`wS?m zunt*zG+lEumyP~4JLv(_@Wuc7mh|eT1&F6)B_|<&IcC+7h#75?pZXn}s>gpp5?f*V z&=robDZOlDk^jAJY~-Vk`+>X;$H$!~;47!#%)dEFL?L&E7QI&(U z<(WMRRi)q{J1TknU))a^g67z+)a?0;xsZu~ibES>C zD?y+H0;d*rRMLGlWUxBQ5;)oX%ZWP9B$W_jaEo?dFmF#fuwp5UspJ-Xx);Vc81Vi> z@w8WK^LC0%kgI{x>iEzQ?b@X-SA_%oE$ORCbODpUi>SXhKiZ%z*zIXF+cRJJriSE` z=0i3!Lm1fMl%a8P51F=l%ft#^)%MpVvwRiey(lQQWa$QjaP|P-TbYpho`#2y!ShD_ zv)X_hQTDA$6eYx314vQP(^3|`ptB=*xs?vy9q(hYEsD`3*Fh1J(QQdoi$r~Gw??z4KZkU z5yo4yw*DoJG~Wx$+GaviYNCX!T)4He`{cx`u9LK`W zRt^@J=|DwLEihGzzUa&s>*AyU3w6QP8PFilS=2i66|@B?3m>|D_gwfnqZNe?zo{)P zGIv405O%*5rQTkw<(*$Uez0%NF55L3AI}2aYJM6(|E}EA?IG=|Y>^ngk@?_H&W7!p zLMg4FflPavIwX7n%S+$lR!q(Cf`eYG@&2XYT*POF&<(%YOszI=c9zj4h9BLBkB!uy zG55Zk)t;Uk_2i4IUe(b-Nnw322x`ntChuSTAQio+kgkkKuewA}#XDvWt=*BAsNy4}2} zFCA+MH^$~!PoFO27`$DHbkyG8TEx6N1GHo|NPOt&svx>NJ20Mc~qp#_e-yIWB>8m@7BmiNv2tr zRdo{$>X%;BbZZ(r!U~I`SqvH_i-n%0#nW#yU7Ij{-*d*xvjq1l9UHD-m_C}WsFIpq ztLp4c5x)J|U?cLDqHzzC$OOvmXqU%G*x*O>RjSSK$U*eJmoCJp7`cR-iiP>T zCLu`!Ae;)RIsB57PyPoBW_o9{z}baFScHNCJBSwkvg$>5n73vax-`u$?~uY6;Vsn^ z#y`FEN7FfL>=}jckc6<+*HNV)<*QdwJ2J_RPYlx)x%Vdt=EskuRo$rZiXzZ*Mg%_ zk|~iB-5~mq>wlw@U`d|v2b4li{vr9lXjuIxdiwwJ{J(-(!2F#&2EaOh)BpMY{}Idr z`cifovFvjCdEN|a${q{91mt|K&=Vg652ew=0QjM8(TXiLd>&)Ha2`QMyaRzNA#q%h z_bktyAr&ZNeUc$(j^>`WBi;hV`C_*zDJh3(@Y5F&=nSo6=@+p5Bq?Qtspg20sWnSm zg2>NFK|lLIcsRB=zU89>PZw)G`>dADY-c@nK*1c|zR$*aj2&l9-xARi9j|ePl~}xM zIGpWt8x5-j|NW7Q2R41V8Z1Cx$A4+JtgI~1m=1cFp(RuTV6(K&BNeUA4d+-T-a3df zQ!4@lmZ#(LKVHkcheHkxRrK2?>gwuqK!W2zm0d4_u($S+?<}LB`kO+I*MkE|xUj>R ze1>~pU!j5rg!AOO^H+zR%o)!ot_s623p=7SUKbqXg2DA2UG zNapu3PFQ~xxf(MVia-UGkwx7%e9PF4okro7Kg?=+Etc>B!vtMD^nS+OrgC1(U~ z03hUPYisM~*82~>JS&iJnUD|YFjR~=lUSxmH7U&{D?9pUrLren3;O-ty}~bODk$5% zsG~QEsOZr7Gh}2mPQzvQrvZS_hp;@ZY-MHDoTC=E`{!#@Y<`E$&+AWG(tIX^wm51t zA=d)G5&GIP7FzC>Io<~fI}O|lEeJHgx`HbC){@|P{I^yQ_5k1Kyk@A#2ow%vax#b- zK72g)m+cKjf{jF+ZFz78YNu7m2q}W+&Yv%l0KnW8z+VvO5&f3YHV+V9ijp4lT~dIU zLhzz<$3(`bn)}-y0D+r#?Hbo-CT3gPI4wS^$$I@%QGLql<*@r_$(RnNaqZf*wF``2 zmM5BVeG+>Glq0cx2;#uxoz4wD*d+&~Cm)PN*C>-N7AMdOAlB!JYE=ci`hbjNZBZ|x z6?*h0`Hpke>({Tpjo6xiIQYD^@6=<8KSVs^Pf)3&dzT0vSgVN?{jM#bxK(Xba>r|61jps{0?9gWHsgL1UU`Nc z6T?lfZz#Zt)TS2nV?*vTQJ>Ent`CwoCf^%aX;Puz6^Rc3Jbx$QvK zQ7^s$c424#>Gdry$zs(kAd+m--sWTD8h^0LySR1!b^h5N;GD&qX$XMY!iem#%8`uNTBP>z7aiX*ShAx`m8gMU>UMrY1&)&pg~;2l>VHYoQ2fX z)XJt`!y+Lm6km~zce&Pxjs*g*M%q7Wc@>)(vs|cGWLSQd0X_@JPeIQQ_sTqjevM)y z00qK1i$Y)?YS=0-E}jVG1gPi+VP)37AhvqcQLwY|xrU8Flg=PBF!?$oDvVG2H&>dW`F8tQh z%!mRl5eekc*O$rNIRvQX*zk-xZfTcfmG)nNMb?v>JOF_)adIs-q`Z)@r+&ZG0V#|vhRZ6pt4O#{kyCZ6QQFY7fpU>TN=`RQzPbxns$2D_tjKbt? zKsibwB$hYPK%dBo&=Lu~4tjl|@^nio9ho}lFsiF@h583jD?n<(qyO~i__=hhcQ#xjI)@*^Cf;gDR8-rud{fQAktB8*t z`{KVBpwcJl|CbGf(z(!C)xhZ|Os7wilIAR0UBMOsRjUUk(b6{U@#?$HxVhi>m^_W> zyTq{rEm?z)kt&m`@a*^x427vRrW2mHe$B0her z^IDEubeAiSpGqCO6HpFd>p3~u*_m_w&-?qzn1Cg8l6C_2KrIz%p!1Tb*a*@T7nuy5 zK~GV@)+$~PPIkxSJ@C9)dh#pNLzhp9y|r$OH3Pc@cKwgR2f|2$l9#+Xa=<`tYbFbj z-!W0YlprM|Q@adg&6o#)MHB`kqKxqV;}IqaahZ;xm}SGBtF5iA8Bqk2uoH&~SYIfbAc+973SK-hEA2+(eh-fpX3 zXi@X`-|YYh?H+^>=-9;ezj_8~3~(#XUV!br0pPXCMuxVwZwde%+e&U`m1@!7LKszd@OdVQ?M<&_0kA#wt6;gK(D z>T;H!LZksA+fFAvEzLg|Fj&0%floRv;kDDtOicWil|di3!P(ai!Gw1{VDC=)IZyy?YVvS*rydq@Oly6!XF@^*}X86qOR4d z#+23UXKXxL03_#V6ns|MQd7KiU}9Ei?0;riBj5onYPYIg+2fOw+nY_b2=1^IIePq+ zO8G{+7o&NeX0ikDVy1#O<$%6uw_c#D{bg}+ora^sJyT;TzV;o$LT#0#!@ygq;Qj5^ zE0TY!s1#yabURC#-=w{xL#7;18l77Nf(PDR)kD+hXlcoP9gIMu^^)E^efo5+ZvuFr zmMZ&x!9Ji|m>=fy<9%b^Ia=D%@VkHK8wpu^F%Tu?dthr@lIuxNo7yP?+XLG}|Ao1^ zARThe%l4yy7s!3*afLhRP5u7v%&Y(SczbUy=)IO`F8KT1@o6jmD$QDNj@pOd`ZfT# zUILkxH|C1&=Et5-%~R%$w$=5B`bNx zH&8u0I*G=UJnzqWDsPeen{S`NSLwJE5)x<9d> z(Pl>eaLj6qyET)xU_FFLKqsbiXCX=K_nRUU{IP3B%p8pVw|^;DI+Z!mwN0F-p*yia zs^pm4Sv3z{G8dQ>j#gmSZ-3`Kci*ql38NB`BmQ^9NhJ7{S{MRy&dm%C6&U?m#;lh? zzeLBCK?PlE=R%J6M!*B^omMgJl~(VPKT^#|b6e)(YC6<=_gYXSB_Hb)*_C#Zjl@nb zg!#rtE6z{6d&v0xpN>PAJp}>reNX$d9ltI8sCJA;^s`jZm`^-*%|>G(Zf0bJ-K{I!`1 z37ou23Ku=XN(58I!uYR`G`;|T^5jY1`9&PB;SS;y0)y6$94|Kd@KZ+yfri2)gte@B zV4SFHA+yja8O@d6Vj8>vZzDp0Y~zk&}}rKPS&Hro`TMxIch+dqbSP z(L@4UfryqxEg9?TdpkQhjzvb%C>nrP|H^G&b~CVHp{Gl{t|`?l9-#Dm`-=ApGpN+3 zhY5T8L?IUmq!P1mRD4DD9Dj9eRD8D{dLRiC*B=<+ku{P$5`c@@wwy?V^65-{C7$aM zhqg*s$rQqQhaOMYT6$K_M+|G?tz%A_!k4~~yDq+U8my$b8&>;7Wxt zkZTyq&guQ#sY)i@S5`aU3s`DWn4o|L5E#fxJU#dXBga4y+%K6BbO=0McPTAz zEBo}*-1pZ5O4QM_kj^`$$HR6S%+(M@Y6uI0TZLP>=|*SPzO3WvTqSPh76NLR&7Fz3 z7dk$T*p4J|gDZ#nm2*m7dr782rp{S@xlmR_{y)W>1;wbW(9y}mt_89IRh#Y-;Z0wq z|EWABBmx0emu12_L{JH#)BbdN=s-986I@<@c{~4X*LQH zV2fA4KKS1q6n8SCwo#kQ&xr$g-!K%_>l;#&T;}o#Njx?=13E_(4lW9*MM;>ri~~)o SNVLFD5{(-=DkaL6q5lg$`Kx{a literal 0 HcmV?d00001 diff --git a/src/sunstone/public/app/utils/webmks/img/touch_sprite_feedback.png b/src/sunstone/public/app/utils/webmks/img/touch_sprite_feedback.png new file mode 100644 index 0000000000000000000000000000000000000000..fbdb0a3fc5f5efb5e1ce44a97e4d66fc11b209b2 GIT binary patch literal 17962 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 XjF1U;qs4)naTz>a{an^LB{Ts5i&0?d.shift():new Image},f=function(a){delete a[0],a[0]=null,a=null},g=function(a){a.onload=a.onerror=null;var e=[71,73,70,56,57,97,1,0,1,0,0,255,0,44,0,0,0,0,1,0,1,0,0,2,0,59];e.push32($.now()),a.src="data:image/gif;base64,"+c.encodeFromArray(e),d.length<=b?d.push(a):f([a])};this.getImage=function(){return e()},this.releaseImage=function(a){if(!a)return;g(a)}}function e(){this._mediaSource=null,this._sourceBuffer=null,this._tempQueue=[],this._mediaPlayer=null,this._isError=!1,this._isErrorDoneCalled=!1,this._sendRequest=0,this._doneRequest=0,this._decodeDoneCb=null,this._decodeErrorCb=null,e.instanceNumber++,this._name="MP4Decoder"+e.instanceNumber}function f(d){function g(a){WMKS.LOGGER.trace("uint8utf8: replacing functions"),a._originalFunctions=a._originalFunctions||{};for(var b in f)f.hasOwnProperty(b)&&(a._originalFunctions[b]||(a._originalFunctions[b]=a[b]),a[b]=f[b])}function h(a){WMKS.LOGGER.trace("restoreFunctions");if(!a._originalFunctions)return;for(var b in a._originalFunctions)a._originalFunctions.hasOwnProperty(b)&&(a[b]=a._originalFunctions[b])}"use strict",WMKS.LOGGER.debug("adding uint8utf8 support");var e=d;e.hasOwnProperty("_legacyReceiveQueue")||(e._legacyReceiveQueue="",e._legacyReceiveQueueIndex=""),e.useLegacy=!1;var f={};f._receiveQueueBytesUnread=function(){return this._legacyReceiveQueue.length-this._legacyReceiveQueueIndex},f._receiveQueueConsumeBytes=function(a){this._legacyReceiveQueueIndex+=a},f._receiveQueueReset=function(){this._legacyReceiveQueue="",this._legacyReceiveQueueIndex=0},f._readString=function(a){var b=this._legacyReceiveQueue.slice(this._legacyReceiveQueueIndex,this._legacyReceiveQueueIndex+a);return this._legacyReceiveQueueIndex+=a,b},f._readStringUTF8=function(a){var b,c,d,e,f=[],g=this._legacyReceiveQueueIndex;while(ge._legacyReceiveQueue.length)return e.fail("overflow receiveQueue");e._legacyReceiveQueueIndex===e._legacyReceiveQueue.length&&(e._legacyReceiveQueue="",e._legacyReceiveQueueIndex=0);if(typeof b.data!="string"){var c=new Uint8Array(b.data);e._legacyReceiveQueue=e._legacyReceiveQueue.concat(a(c))}else e._legacyReceiveQueue=e._legacyReceiveQueue.concat(b.data);e._processMessages()},e.protocolList.indexOf("uint8utf8")===-1&&e.protocolList.push("uint8utf8"),f._receiveQueueReset.call(e)}var c={decodeToArray:function(a,c){return b(window.atob(a),c)},decodeToString:function(a){return window.atob(a)},encodeFromArray:function(b){return window.btoa(a(b))},encodeFromString:function(a){return window.btoa(a)}};WMKS={},WMKS.LOGGER=new function(){"use strict",this.LEVEL={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4};var a=this.LEVEL.INFO,b=[" [Trace] "," [Debug] "," [Info ] "," [Warn ] "," [Error] "];this.trace=function(a){this.log(a,this.LEVEL.TRACE)},this.debug=function(a){this.log(a,this.LEVEL.DEBUG)},this.info=function(a){this.log(a,this.LEVEL.INFO)},this.warn=function(a){this.log(a,this.LEVEL.WARN)},this.error=function(a){this.log(a,this.LEVEL.ERROR)},this.log=typeof console=="undefined"||typeof console.log=="undefined"?$.noop:function(c,d){d=d===undefined?this.LEVEL.INFO:d,d>=a&&c&&console.log((WMKS.BROWSER.isIE()?(new Date).toUTCString():(new Date).toISOString())+b[d]+c)},this.setLogLevel=function(c){typeof c=="number"&&c>=0&&c-1?c:d;var e=function(b,c){var d=a.match(b);return d&&d.length>c&&d[c]||""};this.version={full:""},this.isSafari()?this.version.full=e(/Version[ \/]([0-9\.]+)/i,1):this.isChrome()?this.version.full=e(/Chrome\/([0-9\.]+)/i,1):this.isFirefox()?this.version.full=e(/(?:Firefox|Iceweasel)[ \/]([0-9\.]+)/i,1):this.isOpera()?this.version.full=e(/Version[ \/]([0-9\.]+)/i,1)||e(/(?:opera|opr)[\s\/]([0-9\.]+)/i,1):this.isIE()&&(this.version.full=e(/(?:\b(MS)?IE\s+|\bTrident\/7\.0;.*\s+rv:|\bEdge\/)([0-9\.]+)/i,2));var f=this.version.full.split(".");this.version.major=parseInt(f.length>0?f[0]:0,10),this.version.minor=parseInt(f.length>1?f[1]:0,10),this.version.float=parseFloat(this.version.full),this.isCanvasSupported=function(){try{var a=document.createElement("canvas"),b=!!a.getContext;return a=null,b}catch(c){return!1}}},WMKS.CONST={CLICK:{left:1,middle:2,right:4},FORCE_RAW_KEY_CODE:{8:!0,9:!0,13:!0}},WMKS.UTIL={createCanvas:function(a){var b={};return a&&(b.position="absolute"),$("").css(b)},createVideo:function(a){var b={};return a&&(b.position="absolute"),$("