@cmusei/console-forge 0.0.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,6 +12,7 @@ export declare class ConsoleToolbarComponent {
12
12
  canvasRecordingStarted: import("@angular/core").OutputEmitterRef<void>;
13
13
  canvasRecordingFinished: import("@angular/core").OutputEmitterRef<Blob>;
14
14
  ctrlAltDelSent: import("@angular/core").OutputEmitterRef<void>;
15
+ keyboardInputSent: import("@angular/core").OutputEmitterRef<string>;
15
16
  networkConnectionRequested: import("@angular/core").OutputEmitterRef<string>;
16
17
  networkDisconnectRequested: import("@angular/core").OutputEmitterRef<void>;
17
18
  powerRequestSent: import("@angular/core").OutputEmitterRef<ConsolePowerRequest>;
@@ -29,6 +30,7 @@ export declare class ConsoleToolbarComponent {
29
30
  constructor();
30
31
  protected handleCopyScreenshot(): Promise<void>;
31
32
  protected handleFullscreen(): Promise<void>;
33
+ protected handleKeyboardInputSend(text: string): Promise<void>;
32
34
  protected handleNetworkConnectionRequest(networkName: string): void;
33
35
  protected handleRecordScreenStart(): void;
34
36
  protected handleRecordScreenStop(): Promise<Blob>;
@@ -36,5 +38,5 @@ export declare class ConsoleToolbarComponent {
36
38
  private handleSendPowerRequest;
37
39
  protected handleSendTextToClipboard(text: string): Promise<void>;
38
40
  static ɵfac: i0.ɵɵFactoryDeclaration<ConsoleToolbarComponent, never>;
39
- static ɵcmp: i0.ɵɵComponentDeclaration<ConsoleToolbarComponent, "cf-console-toolbar", never, { "consoleClient": { "alias": "consoleClient"; "required": true; "isSignal": true; }; "consoleNetworkConfig": { "alias": "consoleNetworkConfig"; "required": false; "isSignal": true; }; "customToolbarComponent": { "alias": "customToolbarComponent"; "required": false; "isSignal": true; }; }, { "canvasRecordingStarted": "canvasRecordingStarted"; "canvasRecordingFinished": "canvasRecordingFinished"; "ctrlAltDelSent": "ctrlAltDelSent"; "networkConnectionRequested": "networkConnectionRequested"; "networkDisconnectRequested": "networkDisconnectRequested"; "powerRequestSent": "powerRequestSent"; "screenshotCopied": "screenshotCopied"; "toggleFullscreen": "toggleFullscreen"; }, never, never, true, never>;
41
+ static ɵcmp: i0.ɵɵComponentDeclaration<ConsoleToolbarComponent, "cf-console-toolbar", never, { "consoleClient": { "alias": "consoleClient"; "required": true; "isSignal": true; }; "consoleNetworkConfig": { "alias": "consoleNetworkConfig"; "required": false; "isSignal": true; }; "customToolbarComponent": { "alias": "customToolbarComponent"; "required": false; "isSignal": true; }; }, { "canvasRecordingStarted": "canvasRecordingStarted"; "canvasRecordingFinished": "canvasRecordingFinished"; "ctrlAltDelSent": "ctrlAltDelSent"; "keyboardInputSent": "keyboardInputSent"; "networkConnectionRequested": "networkConnectionRequested"; "networkDisconnectRequested": "networkDisconnectRequested"; "powerRequestSent": "powerRequestSent"; "screenshotCopied": "screenshotCopied"; "toggleFullscreen": "toggleFullscreen"; }, never, never, true, never>;
40
42
  }
@@ -8,23 +8,27 @@ import * as i0 from "@angular/core";
8
8
  export declare class ConsoleToolbarDefaultComponent implements ConsoleToolbarComponentBase {
9
9
  consoleContext: import("@angular/core").InputSignal<ConsoleToolbarContext>;
10
10
  protected isClipboardDialogOpen: boolean;
11
+ protected isKeyboardDialogOpen: boolean;
11
12
  protected isNetworkDialogOpen: boolean;
12
13
  protected isPowerDialogOpen: boolean;
13
14
  protected isSettingsDialogOpen: boolean;
15
+ protected keyboardInputText: import("@angular/core").ModelSignal<string>;
14
16
  protected readonly cfConfig: ConsoleForgeConfig;
17
+ private readonly clipboardService;
15
18
  protected readonly clipboardTextInput: import("@angular/core").Signal<ElementRef<any> | undefined>;
16
- protected readonly userSettings: import("@angular/core").Signal<import("../../models/console-user-settings").ConsoleUserSettings>;
17
19
  protected handleChangeToolbarPosition(position: ConsoleToolbarPosition): void;
18
20
  protected handleClipboardDialogOpenClose(isOpen: boolean): void;
19
21
  protected handleClipboardCopyLastText(text: string): void;
20
22
  protected handleNetworkChangeRequested(networkName?: string): void;
21
23
  protected handleNetworkDialogOpenClose(isOpen: boolean): void;
22
24
  protected handleRecordToggle(): void;
23
- protected handleSendClipboardText(event: Event, text: string): void;
25
+ protected handleSendClipboardText(event: Event, text: string): Promise<void>;
26
+ protected handlSendKeyboardCtrlAltDel(): Promise<void>;
27
+ protected handleSendKeyboardInput(event: Event, text: string): Promise<void>;
24
28
  protected handleSendPowerRequest(request: ConsolePowerRequest): Promise<void>;
25
29
  protected handleSettingsDialogOpenClose(isOpen: boolean): void;
26
30
  protected handleSettingsAllowLocalClipboardWrite(allow: boolean): void;
27
31
  protected handleSettingsPreserveAspectRatioChange(preserveAspectRatioOnScale: boolean): void;
28
32
  static ɵfac: i0.ɵɵFactoryDeclaration<ConsoleToolbarDefaultComponent, never>;
29
- static ɵcmp: i0.ɵɵComponentDeclaration<ConsoleToolbarDefaultComponent, "cf-console-toolbar-default", never, { "consoleContext": { "alias": "consoleContext"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
33
+ static ɵcmp: i0.ɵɵComponentDeclaration<ConsoleToolbarDefaultComponent, "cf-console-toolbar-default", never, { "consoleContext": { "alias": "consoleContext"; "required": true; "isSignal": true; }; "keyboardInputText": { "alias": "keyboardInputText"; "required": false; "isSignal": true; }; }, { "keyboardInputText": "keyboardInputTextChange"; }, never, never, true, never>;
30
34
  }
@@ -1,4 +1,30 @@
1
1
  export interface ConsoleSupportedFeatures {
2
+ /**
3
+ * This is basically a stupid kludge that is only here because VMWare's client has a very weird implementation of "copy".
4
+ *
5
+ * The VMWare "WMKS" client only emits clipboard events after the remote console's clipboard receives new data (i.e. you copy some content on the remote desktop)
6
+ * AND after the console canvas loses focus. That is, no matter how much copying you do, the client doesn't know about until the canvas housing the console
7
+ * is blurred.
8
+ *
9
+ * The downstream effect of this that, unlike with other protocols, we can't gracefully emit events when copies happen or automatically copy to your local
10
+ * clipboard in a reasonable way, because we can't know when the remote copy happened and if you really want it copied to your local CB or not. So when this
11
+ * flag is set to false (VMWare is the only service which does this), we show a panel in the default toolbar that you can manually copy content from and
12
+ * automatically receives the last "copy" event from the console.
13
+ *
14
+ * Yuck.
15
+ */
16
+ clipboardAutomaticLocalCopy: boolean;
17
+ /**
18
+ * Indicates whether the remote console protocol allows us to write content directly to the clipboard of the remote machine.
19
+ */
20
+ clipboardRemoteWrite: boolean;
21
+ /**
22
+ * Indicates whether there remote console offers an on-screen keyboard. (Hint: probably not. As far as we know, VMWare's WMKS is the only one that will do this.)
23
+ */
2
24
  onScreenKeyboard: boolean;
25
+ /**
26
+ * Indicates whether the remote console protocol allows us to issue power requests (like restart, reboot, and hard reboot). This is typically a configuration detail
27
+ * of the machine, so we usually have to rely on the protocol-specific service to tell us whether the feature is enabled (see our VNC client, wrapping noVnc, for an example)
28
+ */
3
29
  powerManagement: boolean;
4
30
  }
@@ -5,13 +5,17 @@ import { ConsoleSupportedFeatures } from "./console-supported-features";
5
5
  import { ConsoleComponentNetworkConfig } from "./console-component-network-config";
6
6
  import { UserSettingsService } from "../services/user-settings.service";
7
7
  export interface ConsoleToolbarContext {
8
+ clipboard: {
9
+ consoleClipboardText: Signal<string>;
10
+ sendTextToConsoleClipboard(text: string): Promise<void>;
11
+ };
8
12
  console: {
9
13
  copyScreenshot(): Promise<void>;
10
14
  recordScreenStart(): void;
11
15
  recordScreenStop(): Promise<Blob>;
12
16
  sendCtrlAltDel(): Promise<void>;
17
+ sendKeyboardInput(text: string): Promise<void>;
13
18
  sendPowerRequest(request: ConsolePowerRequest): Promise<void>;
14
- sendTextToClipboard(text: string): Promise<void>;
15
19
  supportedFeatures: Signal<ConsoleSupportedFeatures>;
16
20
  toggleFullscreen(): Promise<void>;
17
21
  };
@@ -3,12 +3,6 @@
3
3
  *
4
4
  * @param clipboardItem - The ClipboardItem to extract text from.
5
5
  * @returns A promise that resolves to the extracted text, or null if no text is present.
6
- *
7
- * @example
8
- * const text = await getTextFromClipboardItem(item);
9
- * if (text) {
10
- * console.log("Clipboard text:", text);
11
- * }
12
6
  */
13
7
  export declare function getTextFromClipboardItem(clipboardItem?: ClipboardItem): Promise<string | null>;
14
8
  export declare function getClipboardItemFromText(text: string): ClipboardItem;
@@ -8,10 +8,10 @@ export interface ConsoleClientService {
8
8
  readonly consoleClipboardUpdated: Signal<string>;
9
9
  readonly supportedFeatures: Signal<ConsoleSupportedFeatures>;
10
10
  connect(url: string, options: ConsoleConnectionOptions): Promise<ConsoleSupportedFeatures>;
11
- copyVmClipboard(): Promise<void>;
12
11
  disconnect(): Promise<void>;
13
12
  sendClipboardText(text: string): Promise<void>;
14
13
  sendCtrlAltDelete(): Promise<void>;
14
+ sendKeyboardInput(text: string): Promise<void>;
15
15
  sendPowerRequest(request: ConsolePowerRequest): Promise<void>;
16
16
  setPreserveAspectRatioOnScale(preserve: boolean): Promise<void>;
17
17
  setIsViewOnly(isViewOnly: boolean): Promise<void>;
@@ -9,6 +9,7 @@ export declare class VmWareConsoleClientService implements ConsoleClientService
9
9
  private readonly clipboardService;
10
10
  private readonly logger;
11
11
  private readonly document;
12
+ private readonly userSettings;
12
13
  private readonly window;
13
14
  private wmksClient?;
14
15
  private readonly _connectionStatus;
@@ -21,9 +22,9 @@ export declare class VmWareConsoleClientService implements ConsoleClientService
21
22
  private readonly _needsCanvasSizeUpdateSub;
22
23
  connect(url: string, options: ConsoleConnectionOptions): Promise<ConsoleSupportedFeatures>;
23
24
  disconnect(): Promise<void>;
24
- copyVmClipboard(): Promise<void>;
25
25
  sendClipboardText(text: string): Promise<void>;
26
26
  sendCtrlAltDelete(): Promise<void>;
27
+ sendKeyboardInput(text: string): Promise<void>;
27
28
  sendPowerRequest(request: ConsolePowerRequest): Promise<void>;
28
29
  setIsViewOnly(isViewOnly: boolean): Promise<void>;
29
30
  setPreserveAspectRatioOnScale(scaleToContainerSize: boolean): Promise<void>;
@@ -19,9 +19,9 @@ export declare class VncConsoleClientService implements ConsoleClientService {
19
19
  connect(url: string, options: ConsoleConnectionOptions): Promise<ConsoleSupportedFeatures>;
20
20
  disconnect(): Promise<void>;
21
21
  dispose(): Promise<void>;
22
- copyVmClipboard(): Promise<void>;
23
22
  sendClipboardText(text: string): Promise<void>;
24
23
  sendCtrlAltDelete(): Promise<void>;
24
+ sendKeyboardInput(text: string): Promise<void>;
25
25
  sendPowerRequest(request: ConsolePowerRequest): Promise<void>;
26
26
  setIsViewOnly(isViewOnly: boolean): Promise<void>;
27
27
  setPreserveAspectRatioOnScale(preserve: boolean): Promise<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cmusei/console-forge",
3
- "version": "0.0.1",
3
+ "version": "0.10.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/cmu-sei/console-forge.git"
@@ -1,318 +0,0 @@
1
- /******************************************************************************
2
- * Copyright 2013 VMware, Inc. All rights reserved.
3
- *****************************************************************************/
4
-
5
- /*
6
- * extended-keypad.css
7
- *
8
- * Defines style for the virtual keys on the control pane.
9
- */
10
-
11
- .ctrl-pane-wrapper {
12
- width: 290px !important; /* Needed as the default is a bit larger than this */
13
- border: 1px solid #333 !important;
14
- -moz-border-radius: 6px; -webkit-border-radius: 6px; -khtml-border-radius: 6px; border-radius: 6px;
15
- background: rgb(170,171,182); /* Old browsers */
16
- background: -webkit-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* Chrome10+,Safari5.1+ */
17
- background: -o-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* Opera 11.10+ */
18
- background: -ms-linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* IE10+ */
19
- background: linear-gradient(top, rgba(170,171,182,.93) 0%,rgba(123,123,133,.93) 100%); /* W3C */
20
- }
21
-
22
- .fnKey-pane-wrapper {
23
- width: 427px;
24
- border: 1px solid #333;
25
- -moz-border-radius: 6px; -webkit-border-radius: 6px; -khtml-border-radius: 6px; border-radius: 6px;
26
- background: #c1c4d1; /* Old browsers */
27
- background: -webkit-linear-gradient(top, #c1c4d1 0%,#b0b1bd 100%); /* Chrome10+,Safari5.1+ */
28
- background: -o-linear-gradient(top, #c1c4d1 0%,#b0b1bd 100%); /* Opera 11.10+ */
29
- background: -ms-linear-gradient(top, #c1c4d1 0%,#b0b1bd 100%); /* IE10+ */
30
- background: linear-gradient(top, #c1c4d1 0%, #b0b1bd 100%); /* W3C */
31
- position: absolute;
32
- padding: 0;
33
- -moz-box-shadow: 0px 5px 7px rgba(0,0,0,.5);
34
- -webkit-box-shadow: 0px 5px 7px rgba(0,0,0,.5);
35
- box-shadow: 0px 5px 7px rgba(0,0,0,.5);
36
- }
37
-
38
- .fnKey-pane-wrapper-down {
39
- width: 427px;
40
- border: 1px solid #333;
41
- -moz-border-radius: 6px; -webkit-border-radius: 6px; -khtml-border-radius: 6px; border-radius: 6px;
42
- background: #6e6e77; /* Old browsers */
43
- background: -webkit-linear-gradient(top, #6e6e77 0%,#656565 100%); /* Chrome10+,Safari5.1+ */
44
- background: -o-linear-gradient(top, #6e6e77 0%,#656565 100%); /* Opera 11.10+ */
45
- background: -ms-linear-gradient(top, #6e6e77 0%,#656565 100%); /* IE10+ */
46
- background: linear-gradient(top, #6e6e77 0%, #656565 100%); /* W3C */
47
- position: absolute;
48
- padding: 0;
49
- -moz-box-shadow: 0px 5px 7px rgba(0,0,0,.5);
50
- -webkit-box-shadow: 0px 5px 7px rgba(0,0,0,.5);
51
- box-shadow: 0px 5px 7px rgba(0,0,0,.5);
52
- }
53
-
54
- /* Hide jquery ui title bar. */
55
- .ctrl-pane-wrapper .ui-dialog-titlebar {
56
- border-top: 1px solid #ccc;
57
- border-left: 1px solid #aaa;
58
- border-right: 1px solid #aaa;
59
- border-bottom: 0;
60
- padding: .6em .8em 0 .8em;
61
- background: none !important;
62
- -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; -khtml-border-top-left-radius: 5px; border-top-left-radius: 5px;
63
- -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; -khtml-border-top-right-radius: 5px; border-top-right-radius: 5px;
64
- }
65
-
66
- /* Replace jquery ui title bar close icon. */
67
- .ctrl-pane-wrapper .ui-dialog-titlebar-close {
68
- margin-top: -9px;
69
- border: 0 !important;
70
- background: none !important;
71
- }
72
-
73
- /* Background-image is defined along with touch-sprite in 1 place. */
74
- .ctrl-pane-wrapper .ui-dialog-titlebar-close .ui-icon {
75
- background-position: -9px -239px;
76
- background-repeat: no-repeat;
77
- }
78
-
79
- .ctrl-pane-wrapper .ui-dialog-titlebar-close .ui-icon:active {
80
- background-position-x: -24px;
81
- background-repeat: no-repeat;
82
- }
83
-
84
- /* The grabber icon indicating the dialog could be moved around */
85
- .ctrl-pane-wrapper .ui-dialog-titlebar .ui-dialog-title {
86
- background-position: -10px -255px;
87
- background-repeat: no-repeat;
88
- width: 40px;
89
- height: 14px;
90
- margin: 0 0 0 42%;
91
- }
92
-
93
- .ctrl-pane-wrapper .ui-dialog-titlebar .ui-dialog-title:active {
94
- background-position-x: -52px;
95
- }
96
-
97
- .ctrl-pane-wrapper .ui-dialog-content {
98
- background: none !important;
99
- padding: 0 0;
100
- border-style: solid;
101
- border-color: #aaaaaa;
102
- border-width: 0 1px 1px 1px;
103
- -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; -khtml-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px;
104
- -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; -khtml-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px;
105
- }
106
-
107
- .fnKey-inner-border-helper {
108
- position: relative;
109
- background: none !important;
110
- border-style: solid;
111
- border-color: #d5d5d5;
112
- border-width: 1px;
113
- -moz-border-radius: 5px; -webkit-border-radius: 5px; -khtml-border-radius: 5px; border-radius: 5px;
114
- pointer-events:none;
115
- }
116
-
117
- .ctrl-pane-wrapper .ctrl-pane {
118
- padding: 3px 0 3px 6px;
119
- height: 140px;
120
- width: 280px;
121
- }
122
-
123
- .ctrl-pane .baseKey {
124
- float: left;
125
- border: 0;
126
- padding: 0;
127
- width: 57px;
128
- height: 57px;
129
- margin: 6px;
130
- -moz-border-radius: 6px; -webkit-border-radius: 6px; -khtml-border-radius: 6px; border-radius: 6px;
131
- font-family: "HelveticaNeue", "Helvetica Neue", "HelveticaNeue", "Helvetica Neue", 'TeXGyreHeros', "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif;
132
- font-size: 18px;
133
- text-shadow: 0 1px 1px #eeeeee;
134
- -moz-box-shadow: 0px 1px 3px rgba(0, 0, 0, .7);
135
- -webkit-box-shadow: 0px 1px 3px rgba(0,0,0,.7);
136
- box-shadow: 0px 1px 3px rgba(0,0,0,.7);
137
- }
138
-
139
- .ctrl-pane .ctrl-key-top-row {
140
- background: -webkit-linear-gradient(top, #fff 0%,#f3f5fb 2%,#d2d2d8 98%,#999 100%); /* Chrome10+,Safari5.1+ */
141
- background: -o-linear-gradient(top, #fff 0%,#f3f5fb 2%,#d2d2d8 98%,#999 100%); /* Opera 11.10+ */
142
- background: -ms-linear-gradient(top, #fff 0%,#f3f5fb 2%,#d2d2d8 98%,#999 100%); /* IE10+ */
143
- background: linear-gradient(top, #fff 0%,#f3f5fb 2%,#d2d2d8 98%,#999 100%); /* W3C */
144
- }
145
-
146
- .ctrl-pane .ctrl-key-bottom-row {
147
- background: -webkit-linear-gradient(top, #fff 0%,#e1e1e3 2%,#d1d1d4 50%,#bebec3 98%,#838387 100%); /* Chrome10+,Safari5.1+ */
148
- background: -o-linear-gradient(top, #fff 0%,#e1e1e3 2%,#d1d1d4 50%,#bebec3 98%,#838387 100%); /* Opera 11.10+ */
149
- background: -ms-linear-gradient(top, #fff 0%,#e1e1e3 2%,#d1d1d4 50%,#bebec3 98%,#838387 100%); /* IE10+ */
150
- background: linear-gradient(top, #fff 0%,#e1e1e3 2%,#d1d1d4 50%,#bebec3 98%,#838387 100%); /* W3C */
151
- }
152
-
153
- .ctrl-pane .up-position .fn-key-top-row {
154
- color:#333;
155
- background: #ffffff; /* Old browsers */
156
- background: -webkit-linear-gradient(top, #ffffff 0%,#f7f7f7 2%,#dcdde3 96%,#999999 100%); /* Chrome10+,Safari5.1+ */
157
- background: -o-linear-gradient(top, #ffffff 0%,#f7f7f7 2%,#dcdde3 96%,#999999 100%); /* Opera 11.10+ */
158
- background: -ms-linear-gradient(top, #ffffff 0%,#f7f7f7 2%,#dcdde3 96%,#999999 100%); /* IE10+ */
159
- background: linear-gradient(top, #ffffff 0%,#f7f7f7 2%,#dcdde3 96%,#999999 100%); /* W3C */
160
- }
161
-
162
- .ctrl-pane .up-position .fn-key-bottom-row {
163
- color:#333;
164
- background: #ffffff; /* Old browsers */
165
- background: -webkit-linear-gradient(top, #ffffff 0%,#f3f5fb 2%,#d2d2d8 98%,#999999 100%); /* Chrome10+,Safari5.1+ */
166
- background: -o-linear-gradient(top, #ffffff 0%,#f3f5fb 2%,#d2d2d8 98%,#999999 100%); /* Opera 11.10+ */
167
- background: -ms-linear-gradient(top, #ffffff 0%,#f3f5fb 2%,#d2d2d8 98%,#999999 100%); /* IE10+ */
168
- background: linear-gradient(top, #ffffff 0%,#f3f5fb 2%,#d2d2d8 98%,#999999 100%); /* W3C */
169
- }
170
-
171
- .ctrl-pane .down-position .fn-key-top-row {
172
- color:#333;
173
- background: #ffffff; /* Old browsers */
174
- background: -webkit-linear-gradient(top, #ffffff 0%,#e1e1e3 4%,#d1d1d4 45%,#b7b8bd 98%,#838387 100%); /* Chrome10+,Safari5.1+ */
175
- background: -o-linear-gradient(top, #ffffff 0%,#e1e1e3 4%,#d1d1d4 45%,#b7b8bd 98%,#838387 100%); /* Opera 11.10+ */
176
- background: -ms-linear-gradient(top, #ffffff 0%,#e1e1e3 4%,#d1d1d4 45%,#b7b8bd 98%,#838387 100%); /* IE10+ */
177
- background: linear-gradient(top, #ffffff 0%,#e1e1e3 4%,#d1d1d4 45%,#b7b8bd 98%,#838387 100%); /* W3C */
178
- }
179
-
180
- .ctrl-pane .down-position .fn-key-bottom-row {
181
- color:#333;
182
- background: #ffffff; /* Old browsers */
183
- background: -webkit-linear-gradient(top, #ffffff 0%,#d9dadd 4%,#c8c8cd 45%,#b0b0b7 98%,#838387 100%); /* Chrome10+,Safari5.1+ */
184
- background: -o-linear-gradient(top, #ffffff 0%,#d9dadd 4%,#c8c8cd 45%,#b0b0b7 98%,#838387 100%); /* Opera 11.10+ */
185
- background: -ms-linear-gradient(top, #ffffff 0%,#d9dadd 4%,#c8c8cd 45%,#b0b0b7 98%,#838387 100%); /* IE10+ */
186
- background: linear-gradient(top, #ffffff 0%,#d9dadd 4%,#c8c8cd 45%,#b0b0b7 98%,#838387 100%); /* W3C */
187
- }
188
-
189
- .ctrl-pane .fn-key-top-row {
190
- margin: 12px 6px 6px 6px;
191
- }
192
-
193
- .ctrl-pane .border-key-top-left .fn-key-top-row {
194
- margin: 12px 6px 6px 12px;
195
- }
196
-
197
- .ctrl-pane .border-key-top-right .fn-key-top-row {
198
- margin: 12px 12px 6px 6px;
199
- }
200
-
201
- .ctrl-pane .fn-key-bottom-row {
202
- margin: 5px 6px 12px 6px;
203
- }
204
-
205
- .ctrl-pane .border-key-bottom-left .fn-key-bottom-row {
206
- margin: 5px 6px 12px 12px;
207
- }
208
-
209
- .ctrl-pane .border-key-bottom-right .fn-key-bottom-row {
210
- margin: 5px 12px 12px 6px;
211
- }
212
-
213
- .ctrl-pane .ctrl-key-top-row:active, .ctrl-pane .fn-key-top-row:active,
214
- .ctrl-pane .ctrl-key-bottom-row:active, .ctrl-pane .fn-key-bottom-row:active {
215
- background: #bbbbbb;
216
- background: -webkit-linear-gradient(bottom, #888888 25%, #CCCCCC 68%);
217
- background: -ms-linear-gradient(bottom, #888888 25%, #CCCCCC 68%);
218
- background: -o-linear-gradient(bottom, #888888 25%, #CCCCCC 68%);
219
- background: linear-gradient(bottom, #888888 25%, #CCCCCC 68%);
220
- }
221
-
222
- .ctrl-pane .ctrl-key-top-row div, .ctrl-pane .ctrl-key-bottom-row div,
223
- .ctrl-pane .fn-key-top-row div, .ctrl-pane .fn-key-bottom-row div {
224
- width: 100%;
225
- text-align: center;
226
- padding-top: 17px;
227
- overflow-x: hidden;
228
- }
229
-
230
- /* Highlight selected modifier key */
231
- .ctrl-pane .ab-modifier-key-down {
232
- color: #4D8DFF;
233
- }
234
-
235
- .ctrl-pane .baseKey img { /* use .touch-sprite for image */
236
- background-repeat: no-repeat;
237
- width: 57px;
238
- height: 57px;
239
- border: 0;
240
- -moz-border-radius: 6px; -webkit-border-radius: 6px; -khtml-border-radius: 6px; border-radius: 6px;
241
- }
242
-
243
- .ctrl-pane .baseKey .right-arrow {
244
- background-position: -242px -182px;
245
- }
246
-
247
- .ctrl-pane .baseKey .left-arrow {
248
- background-position: -126px -182px;
249
- }
250
-
251
- .ctrl-pane .baseKey .up-arrow {
252
- background-position: -299px -182px;
253
- }
254
-
255
- .ctrl-pane .baseKey .down-arrow {
256
- background-position: -183px -182px;
257
- }
258
-
259
- .ctrl-pane .baseKey .more-keys {
260
- background-position: -10px -182px;
261
- }
262
-
263
- /* Ctrl - pane flip transition. */
264
- .ctrl-pane.flip-container {
265
- perspective: 1000;
266
- -webkit-perspective: 1000;
267
- -moz-perspective: 1000;
268
- -ms-perspective: 1000;
269
- }
270
-
271
- /* flip the ctrl-pane when this class toggles. */
272
- .flip-container.perform-flip .flipper {
273
- transform: rotateY(180deg);
274
- -webkit-transform: rotateY(180deg);
275
- -moz-transform: rotateY(180deg);
276
- -ms-transform: rotateY(180deg);
277
- }
278
-
279
- /* flip speed goes here */
280
- .flip-container .flipper {
281
- transition: 0.6s;
282
- transform-style: preserve-3d;
283
- -webkit-transition: 0.6s;
284
- -webkit-transform-style: preserve-3d;
285
- -moz-transition: 0.6s;
286
- -moz-transform-style: preserve-3d;
287
- -ms-transition: 0.6s;
288
- -ms-transform-style: preserve-3d;
289
- position: relative;
290
- }
291
-
292
- /* hide back of pane during swap */
293
- .flip-container .front, .flip-container .back {
294
- backface-visibility: hidden;
295
- -webkit-backface-visibility: hidden;
296
- -moz-backface-visibility: hidden;
297
- -ms-backface-visibility: hidden;
298
- position: absolute;
299
- top: 0;
300
- left: 0;
301
- }
302
-
303
- /* front pane, placed above back */
304
- .flip-container .front {
305
- z-index: 200;
306
- }
307
-
308
- /* back, initially hidden pane */
309
- .flip-container .back {
310
- transform: rotateY(180deg);
311
- -webkit-transform: rotateY(180deg);
312
- -moz-transform: rotateY(180deg);
313
- -ms-transform: rotateY(180deg);
314
- }
315
-
316
- #fnMasterKey {
317
- letter-spacing: -1px
318
- }
@@ -1,180 +0,0 @@
1
- /******************************************************************************
2
- * Copyright 2013 VMware, Inc. All rights reserved.
3
- *****************************************************************************/
4
-
5
- /*
6
- * main-ui.css
7
- *
8
- * Defines style for the wmks ui widgets.
9
- *
10
- * Use CSS3 for touch devices as jquery effects break when browser handles
11
- * orientation changes, or page bouncing.
12
- *
13
- * TODO: Need to handle Retina mode for iPad.
14
- */
15
-
16
- /*
17
- * jQuery UI Dialog
18
- */
19
- .ui-dialog {
20
- padding: 0;
21
- box-shadow: 0px 5px 7px rgba(0,0,0,.5);
22
- }
23
-
24
- .ui-dialog .ui-dialog-titlebar {
25
- padding: .8em .8em;
26
- border-bottom-left-radius: 0;
27
- border-bottom-right-radius: 0;
28
- }
29
-
30
- .ui-dialog .ui-dialog-titlebar-close {
31
- right: .4em;
32
- margin-top: -11px;
33
- }
34
-
35
- .ui-widget-content {
36
- border: 0;
37
- background: #ffffff;
38
- color: #333333;
39
- }
40
-
41
- .ui-widget-header a {
42
- color: #333333;
43
- }
44
-
45
-
46
- /* Touch feedback indicator */
47
- .ui-touch-feedback-icon {
48
- /* HACK ALERT - can't easily manage this when distributing with a library */
49
- /* background-image: url('../img/touch_sprite_feedback.png'); */
50
- width: 300px;
51
- height: 120px;
52
- position: absolute;
53
- left: -9999px;
54
- top: -9999px;
55
- z-index: 2;
56
- }
57
-
58
- .feedback-container {
59
- z-index: 2;
60
- position: absolute;
61
- display: none;
62
- }
63
-
64
- .feedback-container.cursor-icon {
65
- /* HACK ALERT - can't easily manage this when distributing with a library */
66
- /* background: url('../img/touch_sprite_feedback.png') -260px -15px no-repeat; */
67
- width: 17px;
68
- height: 23px;
69
- }
70
-
71
- .feedback-container.tap-icon {
72
- /* HACK ALERT - can't easily manage this when distributing with a library */
73
- /* background: url('../img/touch_sprite_feedback.png') -300px -15px no-repeat; */
74
- width: 36px;
75
- height: 36px;
76
- }
77
-
78
- .feedback-container.drag-icon {
79
- /* HACK ALERT - can't easily manage this when distributing with a library */
80
- /* background: url('../img/touch_sprite_feedback.png') -10px -10px no-repeat; */
81
- width: 100px;
82
- height: 100px;
83
- }
84
-
85
- .feedback-container.pulse-icon {
86
- /* HACK ALERT - can't easily manage this when distributing with a library */
87
- /* background: url('../img/touch_sprite_feedback.png') -111px -10px no-repeat; */
88
- width: 100px;
89
- height: 100px;
90
- }
91
-
92
- .feedback-container.scroll-icon {
93
- /* HACK ALERT - can't easily manage this when distributing with a library */
94
- /* background: url('../img/touch_sprite_feedback.png') -212px -10px no-repeat; */
95
- width: 27px;
96
- height: 100px;
97
- }
98
-
99
- .trackPad-cursor {
100
- background: none !important;
101
- }
102
-
103
- .trackPad-cursor.cursorIcon{
104
- opacity: 0;
105
- }
106
-
107
- .cursor-icon-shadow {
108
- transform-origin: 0 0 ;
109
- -webkit-transform-origin: 0 0 ;
110
- -moz-transform-origin: 0 0 ;
111
- -ms-transform-origin: 0 0 ;
112
- }
113
-
114
- /* CSS3 feedback indicator animation. Keep it simple (uses lower cpu cycles)
115
- as there may be multiple animation requests made in quick successions. */
116
- .animate-feedback-indicator {
117
- display: block;
118
- opacity: 0;
119
- animation-name: showfadeout;
120
- animation-duration: 350ms;
121
- -webkit-animation-name: showfadeout;
122
- -webkit-animation-duration: 350ms;
123
- -moz-animation-name: showfadeout;
124
- -moz-animation-duration: 350ms;
125
- -ms-animation-name: showfadeout;
126
- -ms-animation-duration: 350ms;
127
- }
128
-
129
- @-webkit-keyframes showfadeout {
130
- 0% { opacity: 1; }
131
- 100% { opacity: 0; }
132
- }
133
-
134
- @-moz-keyframes showfadeout {
135
- 0% { opacity: 1; }
136
- 100% { opacity: 0; }
137
- }
138
-
139
- @-ms-keyframes showfadeout {
140
- 0% { opacity: 1; }
141
- 100% { opacity: 0; }
142
- }
143
-
144
- .animate-double-feedback-indicator {
145
- display: block;
146
- opacity: 0;
147
- animation-name: showdoublefadeout;
148
- animation-duration: 400ms;
149
- -webkit-animation-name: showdoublefadeout;
150
- -webkit-animation-duration: 400ms;
151
- -moz-animation-name: showdoublefadeout;
152
- -moz-animation-duration: 400ms;
153
- -ms-animation-name: showdoublefadeout;
154
- -ms-animation-duration: 400ms;
155
- }
156
-
157
- @-webkit-keyframes showdoublefadeout {
158
- 0% { opacity: 1; }
159
- 40% { opacity: 0; }
160
- 70% { opacity: 1; }
161
- 100% { opacity: 0; }
162
- }
163
-
164
- @-moz-keyframes showdoublefadeout {
165
- 0% { opacity: 1; }
166
- 40% { opacity: 0; }
167
- 70% { opacity: 1; }
168
- 100% { opacity: 0; }
169
- }
170
-
171
- @-ms-keyframes showdoublefadeout {
172
- 0% { opacity: 1; }
173
- 40% { opacity: 0; }
174
- 70% { opacity: 1; }
175
- 100% { opacity: 0; }
176
- }
177
-
178
- #relativepadLeft {
179
- height:200px; border:1px solid black;
180
- }