web-console 0.4.0 → 1.0.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.
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
+