web-console 0.4.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of web-console might be problematic. Click here for more details.

Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/README.markdown +33 -21
  3. data/app/assets/javascripts/web_console/console_sessions.js +12 -17
  4. data/app/controllers/web_console/console_sessions_controller.rb +1 -1
  5. data/app/models/web_console/console_session.rb +22 -6
  6. data/lib/assets/stylesheets/web_console.css +255 -0
  7. data/lib/web_console/colors.rb +3 -2
  8. data/lib/web_console/colors/monokai.rb +24 -0
  9. data/lib/web_console/engine.rb +0 -1
  10. data/lib/web_console/slave.rb +11 -2
  11. data/lib/web_console/version.rb +1 -1
  12. data/test/controllers/web_console/console_sessions_controller_test.rb +20 -0
  13. data/test/dummy/config/application.rb +2 -0
  14. data/test/dummy/db/test.sqlite3 +0 -0
  15. data/test/dummy/log/development.log +65978 -12068
  16. data/test/dummy/log/test.log +14235 -0
  17. data/test/dummy/tmp/cache/assets/development/sprockets/0280bb38c5058cc31c4fcd8c392a5ec4 +0 -0
  18. data/test/dummy/tmp/cache/assets/development/sprockets/{6ad7acc9a22fe2a67ec24a1fc866c20e → 26a3e1c38a6e60bc45d967d210a21fa6} +0 -0
  19. data/test/dummy/tmp/cache/assets/development/sprockets/{c649837df826fc310cb80f1adafd6b8d → 2a48be7daff14cf56911b263cbe017c7} +0 -0
  20. data/test/dummy/tmp/cache/assets/development/sprockets/{496864a905d53afd8e176f29500f96a8 → 305b55f5220092e63fde09b502d4bbaf} +0 -0
  21. data/test/dummy/tmp/cache/assets/development/sprockets/{17c571144b4e44da39bddb2d2c412414 → 4787d1478456f16e87b4b67453741c19} +0 -0
  22. data/test/dummy/tmp/cache/assets/development/sprockets/{8aa4c7aabff23c8089d41e9e54193483 → 508ab3c25833ea537a5e3fc90df33595} +0 -0
  23. data/test/dummy/tmp/cache/assets/development/sprockets/{e6d6b8bde546349764be7b44ffcf5807 → 55538a15d325a77cefc001df3fbeb5ab} +0 -0
  24. data/test/dummy/tmp/cache/assets/development/sprockets/{5ac98782fe3dfd0a766f75ce1801f0a0 → 5adcb7569cdd03204d650e285f19351f} +0 -0
  25. data/test/dummy/tmp/cache/assets/development/sprockets/{44117154e909436e7eeaf10cdb18d2b4 → 8524ba6a67aa1b4780df9d219ade9577} +0 -0
  26. data/test/dummy/tmp/cache/assets/development/sprockets/{d982412def520c434e2240eae6d29cf2 → ad8eea7f774b674c29708ca90952764f} +0 -0
  27. data/test/dummy/tmp/cache/assets/development/sprockets/{680381170dc160e358fc28076ea6886c → b0c3672502453a0959bb662e74f70adf} +0 -0
  28. data/test/dummy/tmp/cache/assets/development/sprockets/{7a50a9e605754e99783de95715b976b0 → b90d44fbc7256fb3b64328fd182391e9} +0 -0
  29. data/test/dummy/tmp/cache/assets/development/sprockets/{eb25265794d2f7afd1684779d84efdac → bbafe93cdad62ca10f0397f0cb7f75d5} +0 -0
  30. data/test/dummy/tmp/cache/assets/development/sprockets/ca9069924054cf28d5d39195f1ac0447 +0 -0
  31. data/test/dummy/tmp/cache/assets/development/sprockets/{2b96b037f3dfeccfe27113eb95b06ea1 → cdd2c435bd92a68003449e1caabff6e2} +0 -0
  32. data/test/dummy/tmp/cache/assets/development/sprockets/e1d89809967e81220dca66770c50aa67 +0 -0
  33. data/test/dummy/tmp/cache/assets/development/sprockets/{55b7b76605fdffe31d737d4ac1f1ef7b → e3d5cafc071e8f9a8efc88fddf721947} +0 -0
  34. data/test/dummy/tmp/cache/assets/development/sprockets/{36341e42f23669574fa1027d0958ff3e → eae513a04f7e3700df598fae5b457003} +0 -0
  35. data/test/dummy/tmp/cache/assets/development/sprockets/f48ecedb2c5b2b5e48e71338d5933e8d +0 -0
  36. data/test/dummy/tmp/cache/assets/development/sprockets/{d1f6e06bc2f112c4ec3a4c3f68351878 → f4a21ed9cebe2c83a9d988504dc6720b} +0 -0
  37. data/test/dummy/tmp/cache/assets/development/sprockets/{cb0065359d3b5b296f71d673f4b276e9 → f4d45273ff5b44879dab0a16805f4309} +0 -0
  38. data/test/dummy/tmp/cache/assets/test/sprockets/0280bb38c5058cc31c4fcd8c392a5ec4 +0 -0
  39. data/test/dummy/tmp/cache/assets/test/sprockets/26a3e1c38a6e60bc45d967d210a21fa6 +0 -0
  40. data/test/dummy/tmp/cache/assets/test/sprockets/2a48be7daff14cf56911b263cbe017c7 +0 -0
  41. data/test/dummy/tmp/cache/assets/test/sprockets/305b55f5220092e63fde09b502d4bbaf +0 -0
  42. data/test/dummy/tmp/cache/assets/test/sprockets/508ab3c25833ea537a5e3fc90df33595 +0 -0
  43. data/test/dummy/tmp/cache/assets/test/sprockets/55538a15d325a77cefc001df3fbeb5ab +0 -0
  44. data/test/dummy/tmp/cache/assets/test/sprockets/5adcb7569cdd03204d650e285f19351f +0 -0
  45. data/test/dummy/tmp/cache/assets/test/sprockets/b0c3672502453a0959bb662e74f70adf +0 -0
  46. data/test/dummy/tmp/cache/assets/test/sprockets/b90d44fbc7256fb3b64328fd182391e9 +0 -0
  47. data/test/dummy/tmp/cache/assets/test/sprockets/bbafe93cdad62ca10f0397f0cb7f75d5 +0 -0
  48. data/test/dummy/tmp/cache/assets/test/sprockets/ca9069924054cf28d5d39195f1ac0447 +0 -0
  49. data/test/dummy/tmp/cache/assets/test/sprockets/e1d89809967e81220dca66770c50aa67 +0 -0
  50. data/test/dummy/tmp/cache/assets/test/sprockets/e3d5cafc071e8f9a8efc88fddf721947 +0 -0
  51. data/test/dummy/tmp/cache/assets/test/sprockets/f48ecedb2c5b2b5e48e71338d5933e8d +0 -0
  52. data/test/dummy/tmp/cache/assets/test/sprockets/f4a21ed9cebe2c83a9d988504dc6720b +0 -0
  53. data/test/dummy/tmp/cache/assets/test/sprockets/f4d45273ff5b44879dab0a16805f4309 +0 -0
  54. data/test/models/console_session_test.rb +12 -6
  55. data/test/test_helper.rb +3 -0
  56. data/test/web_console/engine_test.rb +136 -0
  57. data/test/web_console/slave_test.rb +57 -39
  58. metadata +157 -119
  59. data/test/dummy/tmp/cache/assets/development/sprockets/6e4d5b32cc444226f6597198994ccd5e +0 -0
  60. data/test/dummy/tmp/cache/assets/development/sprockets/b2401118729720034b6f3eda0b4c5025 +0 -0
  61. data/test/dummy/tmp/cache/assets/development/sprockets/d6b85d8b0b5c569388b89e56e9f6fed7 +0 -0
  62. data/test/dummy/tmp/cache/assets/development/sprockets/df048a8b0897b9c04acdf59c8f95b18f +0 -0
  63. data/test/web_console_test.rb +0 -134
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c7f3c6a649d0f958a0abfe85f46b31adfdb05ada
4
- data.tar.gz: 404c1f5f66dfe6e0de17cb7eb4f6cd73e2626a2e
3
+ metadata.gz: 8e96992b0e00e980e4c524e69f28ae6090df9306
4
+ data.tar.gz: 71fd3a7be8390397ff9fb9fff77edf733d5e02d3
5
5
  SHA512:
6
- metadata.gz: 54ed5afb88caca8157cc7e3984d1a9d4e2afa050b44e11acb5cb76dcd568717f0647dc3544928fb5035f54318789a7c7267851da42e3e4fd8173484700b0245a
7
- data.tar.gz: f9696ed9194c1c3132c1a93d879f89456297c8ec6c0afd6b15e387d1e8dc34da8d3625f2ed5927ae68b75e2182f4fe11f84738291fffdf011a0623c8e035b7a7
6
+ metadata.gz: 18f21edfbdfa5867d041b1424bde048670d1e375246d3b39ad2701552bf74056e17319d7ac4a24f98a7afe22b67ac1b25e439c8f9025322f431c6223edbea750
7
+ data.tar.gz: ebf49726b9fea1dd1db7cdc52792d9366243f708a3b32ba61c3c4d4371b0f19daab0b286ab43a29d7ca6c52ec23be3532d9d427ebb9b96a45f1db77f187675ac
@@ -1,11 +1,12 @@
1
1
  <p align=right>
2
2
  Documentation for:
3
- <a href=https://github.com/gsamokovarov/web-console/tree/v0.1.0>v0.1.0</a>
4
- <a href=https://github.com/gsamokovarov/web-console/tree/v0.2.0>v0.2.0</a>
5
- <a href=https://github.com/gsamokovarov/web-console/tree/v0.3.0>v0.3.0</a>
3
+ <a href=https://github.com/rails/web-console/tree/v0.1.0>v0.1.0</a>
4
+ <a href=https://github.com/rails/web-console/tree/v0.2.0>v0.2.0</a>
5
+ <a href=https://github.com/rails/web-console/tree/v0.3.0>v0.3.0</a>
6
+ <a href=https://github.com/rails/web-console/tree/v0.4.0>v0.4.0</a>
6
7
  </p>
7
8
 
8
- Web Console [![Version](https://badge.fury.io/rb/web-console.png)](http://badge.fury.io/rb/web-console) [![Travis](https://travis-ci.org/gsamokovarov/web-console.png)](https://travis-ci.org/gsamokovarov/web-console)
9
+ Web Console [![Version](https://badge.fury.io/rb/web-console.png)](http://badge.fury.io/rb/web-console) [![Travis](https://travis-ci.org/rails/web-console.png)](https://travis-ci.org/rails/web-console)
9
10
  ===========
10
11
 
11
12
  There is no doubt that `rails console` is one of the most useful commands,
@@ -18,6 +19,8 @@ This is where _Web Console_ comes to the rescue. It gives you the same
18
19
  let's you evaluate Ruby code, there are a lot of those. Its a [VT100]
19
20
  compatible terminal, running `rails console`.
20
21
 
22
+ ![demo](http://f.cl.ly/items/1C1x1e0F1u3h3a260V3A/web-console-demo.png)
23
+
21
24
  You can see _Web Console_ in action at this [video].
22
25
 
23
26
  Requirements
@@ -41,7 +44,7 @@ To install it in your current application, add the following to your `Gemfile`.
41
44
 
42
45
  ```ruby
43
46
  group :development do
44
- gem 'web-console', '~> 0.3.0'
47
+ gem 'web-console', '~> 1.0.0
45
48
  end
46
49
  ```
47
50
 
@@ -133,6 +136,8 @@ run [`login`][login] instead to let users sign into the host system.
133
136
 
134
137
  ```ruby
135
138
  class Application < Rails::Application
139
+ # You have to run /bin/login as root. That should worry you and you may work
140
+ # around it by running ssh connecting to the same machine.
136
141
  config.web_console.command = 'sudo /bin/login'
137
142
  end
138
143
  ```
@@ -140,7 +145,8 @@ end
140
145
  _Poor man's solution to SSH._ ![boom](http://f.cl.ly/items/3n2h0p1w0B261u2d201b/boom.png)
141
146
 
142
147
  **If you ever decide to use _Web Console_ that way, use SSL to encrypt the
143
- traffic, otherwise all the input can be easily sniffed!**
148
+ traffic, otherwise all the input (including the negotiated username and
149
+ password) can be easily sniffed!**
144
150
 
145
151
  ### config.web_console.term
146
152
 
@@ -172,7 +178,7 @@ class Application < Rails::Application
172
178
  config.allow_concurrency = true
173
179
 
174
180
  # For long-polling, 45 seconds timeout for the development server seems
175
- reasonable.
181
+ # reasonable.
176
182
  config.web_console.timeout = 45.seconds
177
183
  end
178
184
  ```
@@ -192,10 +198,11 @@ The default color theme is a white-on-black theme called `light`. For
192
198
  different appearance you may want to experiment with the other included color
193
199
  themes.
194
200
 
195
- - `xterm` _the standard xterm theme_
196
- - `tango` _theme based on the tango colors_
201
+ - `monokai` _the default Sublime Text colors_
197
202
  - `solarized_dark` _light version of the common solarized colors_
198
203
  - `solarized_light` _dark version of the common solarized colors_
204
+ - `tango` _theme based on the tango colors_
205
+ - `xterm` _the standard xterm theme_
199
206
 
200
207
  If you would like to use a custom theme, you may do so with the following
201
208
  syntax.
@@ -243,6 +250,20 @@ end
243
250
  You may also change the font, which is following the CSS font property syntax.
244
251
  By default it is `large DejaVu Sans Mono, Liberation Mono, monospace`.
245
252
 
253
+ Try
254
+ ---
255
+
256
+ If you just want to try the web-console, without having to go through the
257
+ trouble of installing it, we provide a [Docker] container that does that for
258
+ you.
259
+
260
+ To try it, install [Docker] first and then paste the following snippet in your
261
+ shell.
262
+
263
+ ```bash
264
+ sudo docker build -t rails/web-console github.com/!#:4 && !#:0-1 run -i -t !#:4
265
+ ```
266
+
246
267
  FAQ
247
268
  ---
248
269
 
@@ -254,19 +275,10 @@ While spawning processes is relatively cheap on _MRI_, this is not the case in
254
275
  _JRuby_. Spawning another process is slow. Spawning another **JRuby** process
255
276
  is even slower. Read more about the problem at the _JRuby_ [wiki].
256
277
 
257
- Test Drive
258
- ----------
278
+ ### Changing the colors is broken.
259
279
 
260
- If you just want to try the web-console, without having to go through the
261
- trouble of installing it, we provide a [Docker] container that does that for
262
- you.
263
-
264
- To try it, install [Docker] first and then paste the following snippet in your
265
- shell.
266
-
267
- ```bash
268
- sudo docker build -t gsamokovarov/web-console github.com/!#:4 && !#:0-1 run -i -t !#:4
269
- ```
280
+ Some of the style sheets may be cached. Run `rake tmp:cache:clear` to clear it
281
+ up.
270
282
 
271
283
  [Docker]: http://www.docker.io/
272
284
  [Puma]: http://puma.io/
@@ -5,16 +5,7 @@ var AJAXTransport = (function(WebConsole) {
5
5
  var inherits = WebConsole.inherits;
6
6
  var EventEmitter = WebConsole.EventEmitter;
7
7
 
8
- // Use an IE friendly implementation of XMLHttpRequest.
9
- XHR = (function() {
10
- try {
11
- return XMLHttpRequest;
12
- } catch (e) {
13
- return function() {
14
- return new ActiveXObject('Microsoft.XMLHTTP');
15
- };
16
- }
17
- }).call(this);
8
+ var FORM_MIME_TYPE = 'application/x-www-form-urlencoded; charset=utf-8';
18
9
 
19
10
  var AJAXTransport = function(options) {
20
11
  EventEmitter.call(this);
@@ -28,6 +19,13 @@ var AJAXTransport = (function(WebConsole) {
28
19
 
29
20
  this.pendingInput = '';
30
21
 
22
+ this.initializeEventHandlers();
23
+ };
24
+
25
+ inherits(AJAXTransport, EventEmitter);
26
+
27
+ // Initializes the default event handlers.
28
+ AJAXTransport.prototype.initializeEventHandlers = function() {
31
29
  this.on('input', this.sendInput);
32
30
  this.on('configuration', this.sendConfiguration);
33
31
  this.once('initialization', function(cols, rows) {
@@ -36,13 +34,11 @@ var AJAXTransport = (function(WebConsole) {
36
34
  });
37
35
  };
38
36
 
39
- inherits(AJAXTransport, EventEmitter);
40
-
41
37
  // Shorthand for creating XHR requests.
42
38
  AJAXTransport.prototype.createRequest = function(method, url, options) {
43
39
  options || (options = {});
44
40
 
45
- var request = new XHR();
41
+ var request = new XMLHttpRequest;
46
42
  request.open(method, url);
47
43
 
48
44
  if (typeof options.form === 'object') {
@@ -53,8 +49,7 @@ var AJAXTransport = (function(WebConsole) {
53
49
  content.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
54
50
  }
55
51
 
56
- var formMimeType = 'application/x-www-form-urlencoded; charset=utf-8';
57
- request.setRequestHeader('Content-Type', formMimeType);
52
+ request.setRequestHeader('Content-Type', FORM_MIME_TYPE);
58
53
  request.data = content.join('&');
59
54
  }
60
55
 
@@ -66,7 +61,7 @@ var AJAXTransport = (function(WebConsole) {
66
61
 
67
62
  var self = this;
68
63
  request.onreadystatechange = function() {
69
- if (request.readyState === 4) {
64
+ if (request.readyState === XMLHttpRequest.DONE) {
70
65
  if (request.status === 200) {
71
66
  self.emit('pendingOutput', request.responseText);
72
67
  self.pollForPendingOutput();
@@ -103,7 +98,7 @@ var AJAXTransport = (function(WebConsole) {
103
98
 
104
99
  var self = this;
105
100
  request.onreadystatechange = function() {
106
- if (request.readyState === 4) {
101
+ if (request.readyState === XMLHttpRequest.DONE) {
107
102
  self.sendingInput = false;
108
103
  if (self.pendingInput) self.sendInput();
109
104
  }
@@ -2,7 +2,7 @@ require_dependency 'web_console/application_controller'
2
2
 
3
3
  module WebConsole
4
4
  class ConsoleSessionsController < ApplicationController
5
- rescue_from ConsoleSession::NotFound do |exception|
5
+ rescue_from ConsoleSession::Unavailable do |exception|
6
6
  render json: exception, status: :gone
7
7
  end
8
8
 
@@ -18,8 +18,8 @@ module WebConsole
18
18
  end
19
19
 
20
20
  # Raised when trying to find a session that is no longer in the in-memory
21
- # session storage.
22
- NotFound = Class.new(Error)
21
+ # session storage or when the slave process exited.
22
+ Unavailable = Class.new(Error)
23
23
 
24
24
  # Raised when an operation transition to an invalid state.
25
25
  Invalid = Class.new(Error)
@@ -29,7 +29,7 @@ module WebConsole
29
29
  #
30
30
  # Raises WebConsole::ConsoleSession::Expired if there is no such session.
31
31
  def find(pid)
32
- INMEMORY_STORAGE[pid.to_i] or raise NotFound, 'Session unavailable'
32
+ INMEMORY_STORAGE[pid.to_i] or raise Unavailable, 'Session unavailable'
33
33
  end
34
34
 
35
35
  # Creates an already persisted consolse session.
@@ -63,14 +63,30 @@ module WebConsole
63
63
 
64
64
  private
65
65
 
66
+ def delegate_and_call_slave_method(name, *args, &block)
67
+ # Cache the delegated method, so we don't have to hit #method_missing
68
+ # on every call.
69
+ define_singleton_method(name) do |*inner_args, &inner_block|
70
+ begin
71
+ @slave.public_send(name, *inner_args, &inner_block)
72
+ rescue ArgumentError => exc
73
+ raise Invalid, exc
74
+ rescue Slave::Closed => exc
75
+ raise Unavailable, exc
76
+ end
77
+ end
78
+
79
+ # Now call the method, since that's our most common use case. Delegate
80
+ # the method and than call it.
81
+ public_send(name, *args, &block)
82
+ end
83
+
66
84
  def method_missing(name, *args, &block)
67
85
  if @slave.respond_to?(name)
68
- @slave.public_send(name, *args, &block)
86
+ delegate_and_call_slave_method(name, *args, &block)
69
87
  else
70
88
  super
71
89
  end
72
- rescue ArgumentError => exc
73
- raise Invalid, exc
74
90
  end
75
91
 
76
92
  def respond_to_missing?(name, include_all = false)
@@ -0,0 +1,255 @@
1
+ #vt100 a { text-decoration: none; }
2
+ #vt100 a:hover { cursor: pointer; }
3
+
4
+ #vt100 #cursize {
5
+ background: #EEEEEE;
6
+ border: 1px solid black;
7
+ font-family: sans-serif;
8
+ font-size: large;
9
+ font-weight: bold;
10
+ padding: 1ex;
11
+ position: absolute;
12
+ z-index: 2;
13
+ }
14
+
15
+ #vt100 pre { margin: 0; }
16
+ }
17
+
18
+ #vt100 pre pre {
19
+ overflow: hidden;
20
+ }
21
+
22
+ #vt100 #scrollable {
23
+ overflow-x: hidden;
24
+ overflow-y: scroll;
25
+ position: relative;
26
+ padding: 1px;
27
+ }
28
+
29
+ #vt100 #console, #vt100 #alt_console, #vt100 #cursor, #vt100 #lineheight, #vt100 .hidden pre {
30
+ font-family: "DejaVu Sans Mono", "Everson Mono", FreeMono, "Andale Mono", monospace;
31
+ }
32
+
33
+ #vt100 #lineheight {
34
+ position: absolute;
35
+ visibility: hidden;
36
+ }
37
+
38
+ #vt100 #cursor {
39
+ position: absolute;
40
+ left: 0px;
41
+ top: 0px;
42
+ overflow: hidden;
43
+ z-index: 1;
44
+ }
45
+
46
+ #vt100 #cursor.bright {
47
+ background-color: black;
48
+ color: white;
49
+ }
50
+
51
+ #vt100 #cursor.dim {
52
+ visibility: hidden;
53
+ }
54
+
55
+ #vt100 #cursor.inactive {
56
+ border: 1px solid;
57
+ margin: -1px;
58
+ }
59
+
60
+ #vt100 #padding {
61
+ visibility: hidden;
62
+ width: 1px;
63
+ height: 0px;
64
+ overflow: hidden;
65
+ }
66
+
67
+ #vt100 .hidden {
68
+ position: absolute;
69
+ top: -10000px;
70
+ left: -10000px;
71
+ width: 0px;
72
+ height: 0px;
73
+ }
74
+
75
+ #vt100 #menu {
76
+ overflow: visible;
77
+ position: absolute;
78
+ z-index: 3;
79
+ }
80
+
81
+ #vt100 #menu .popup {
82
+ background-color: #EEEEEE;
83
+ border: 1px solid black;
84
+ font-family: sans-serif;
85
+ position: absolute;
86
+ }
87
+
88
+ #vt100 #menu .popup ul {
89
+ list-style-type: none;
90
+ padding: 0px;
91
+ margin: 0px;
92
+ min-width: 10em;
93
+ }
94
+
95
+ #vt100 #menu .popup li {
96
+ padding: 3px 0.5ex 3px 0.5ex;
97
+ }
98
+
99
+ #vt100 #menu .popup li.hover {
100
+ background-color: #444444;
101
+ color: white;
102
+ }
103
+
104
+ #vt100 #menu .popup li.disabled {
105
+ color: #AAAAAA;
106
+ }
107
+
108
+ #vt100 #menu .popup hr {
109
+ margin: 0.5ex 0px 0.5ex 0px;
110
+ }
111
+
112
+ #vt100 #menu img {
113
+ margin-right: 0.5ex;
114
+ width: 1ex;
115
+ height: 1ex;
116
+ }
117
+
118
+ #vt100 #scrollable.inverted { color: #ffffff;
119
+ background-color: #000000; }
120
+
121
+ #vt100 #kbd_button {
122
+ float: left;
123
+ position: fixed;
124
+ z-index: 0;
125
+ visibility: hidden;
126
+ }
127
+
128
+ #vt100 #keyboard {
129
+ z-index: 3;
130
+ position: absolute;
131
+ }
132
+
133
+ #vt100 #keyboard .box {
134
+ font-family: sans-serif;
135
+ background-color: #cccccc;
136
+ padding: .8em;
137
+ float: left;
138
+ position: absolute;
139
+ border-radius: 10px;
140
+ -moz-border-radius: 10px;
141
+ box-shadow: 4px 4px 6px #222222;
142
+ -webkit-box-shadow: 4px 4px 6px #222222;
143
+ /* Don't set the -moz-box-shadow. It doesn't properly scale when CSS
144
+ * transforms are in effect. Once Firefox supports box-shadow, it should
145
+ * automatically do the right thing. Until then, leave shadows disabled
146
+ * for Firefox.
147
+ */
148
+ opacity: 0.85;
149
+ -moz-opacity: 0.85;
150
+ filter: alpha(opacity=85);
151
+ }
152
+
153
+ #vt100 #keyboard .box * {
154
+ vertical-align: top;
155
+ display: inline-block;
156
+ }
157
+
158
+ #vt100 #keyboard b, #vt100 #keyboard i, #vt100 #keyboard s, #vt100 #keyboard u {
159
+ font-style: normal;
160
+ font-weight: bold;
161
+ border-radius: 5px;
162
+ -moz-border-radius: 5px;
163
+ background-color: #555555;
164
+ color: #eeeeee;
165
+ box-shadow: 2px 2px 3px #222222;
166
+ -webkit-box-shadow: 2px 2px 3px #222222;
167
+ padding: 4px;
168
+ margin: 2px;
169
+ height: 2ex;
170
+ display: inline-block;
171
+ text-align: center;
172
+ text-decoration: none;
173
+ }
174
+
175
+ #vt100 #keyboard b, #vt100 #keyboard s {
176
+ width: 2ex;
177
+ }
178
+
179
+ #vt100 #keyboard u, #vt100 #keyboard s {
180
+ visibility: hidden;
181
+ }
182
+
183
+ #vt100 #keyboard .shifted {
184
+ display: none;
185
+ }
186
+
187
+ #vt100 #keyboard .selected {
188
+ color: #888888;
189
+ background-color: #eeeeee;
190
+ box-shadow: 0px 0px 3px #222222;
191
+ -webkit-box-shadow: 0px 0px 3px #222222;
192
+ position: relative;
193
+ top: 1px;
194
+ left: 1px;
195
+ }
196
+
197
+ [if DEFINES_COLORS]
198
+ /* IE cannot properly handle "inherit" properties. So, the monochrome.css/
199
+ * color.css style sheets cannot work, if we define colors in styles.css.
200
+ */
201
+ [else DEFINES_COLORS]
202
+ #vt100 .ansi0 { }
203
+ #vt100 .ansi1 { color: #cd0000; }
204
+ #vt100 .ansi2 { color: #00cd00; }
205
+ #vt100 .ansi3 { color: #cdcd00; }
206
+ #vt100 .ansi4 { color: #0000ee; }
207
+ #vt100 .ansi5 { color: #cd00cd; }
208
+ #vt100 .ansi6 { color: #00cdcd; }
209
+ #vt100 .ansi7 { color: #e5e5e5; }
210
+ #vt100 .ansi8 { color: #7f7f7f; }
211
+ #vt100 .ansi9 { color: #ff0000; }
212
+ #vt100 .ansi10 { color: #00ff00; }
213
+ #vt100 .ansi11 { color: #e8e800; }
214
+ #vt100 .ansi12 { color: #5c5cff; }
215
+ #vt100 .ansi13 { color: #ff00ff; }
216
+ #vt100 .ansi14 { color: #00ffff; }
217
+ #vt100 .ansi15 { color: #ffffff; }
218
+
219
+ #vt100 .bgAnsi0 { background-color: #000000; }
220
+ #vt100 .bgAnsi1 { background-color: #cd0000; }
221
+ #vt100 .bgAnsi2 { background-color: #00cd00; }
222
+ #vt100 .bgAnsi3 { background-color: #cdcd00; }
223
+ #vt100 .bgAnsi4 { background-color: #0000ee; }
224
+ #vt100 .bgAnsi5 { background-color: #cd00cd; }
225
+ #vt100 .bgAnsi6 { background-color: #00cdcd; }
226
+ #vt100 .bgAnsi7 { background-color: #e5e5e5; }
227
+ #vt100 .bgAnsi8 { background-color: #7f7f7f; }
228
+ #vt100 .bgAnsi9 { background-color: #ff0000; }
229
+ #vt100 .bgAnsi10 { background-color: #00ff00; }
230
+ #vt100 .bgAnsi11 { background-color: #e8e800; }
231
+ #vt100 .bgAnsi12 { background-color: #5c5cff; }
232
+ #vt100 .bgAnsi13 { background-color: #ff00ff; }
233
+ #vt100 .bgAnsi14 { background-color: #00ffff; }
234
+ #vt100 .bgAnsi15 { }
235
+ [endif DEFINES_COLORS]
236
+
237
+ @media print {
238
+ #vt100 .scrollback {
239
+ display: none;
240
+ }
241
+
242
+ #vt100 #reconnect, #vt100 #cursor, #vt100 #menu, #vt100 #kbd_button, #vt100 #keyboard {
243
+ visibility: hidden;
244
+ }
245
+
246
+ #vt100 #scrollable {
247
+ overflow: hidden;
248
+ }
249
+
250
+ #vt100 #console, #vt100 #alt_console {
251
+ overflow: hidden;
252
+ width: 1000000ex;
253
+ }
254
+ }
255
+