]> git.proxmox.com Git - mirror_novnc.git/blame - app/styles/base.css
Group WebSocket settings together
[mirror_novnc.git] / app / styles / base.css
CommitLineData
d58f8b51
JM
1/*
2 * noVNC base CSS
3 * Copyright (C) 2012 Joel Martin
682fd02b 4 * Copyright (C) 2016 Samuel Mannehed for Cendio AB
6cba147d 5 * Copyright (C) 2016 Pierre Ossman for Cendio AB
1d728ace 6 * noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
d58f8b51
JM
7 * This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
8 */
9
c327865b 10body {
01a9eee9
JM
11 margin:0;
12 padding:0;
13 font-family: Helvetica;
14 /*Background image with light grey curve.*/
15 background-color:#494949;
16 background-repeat:no-repeat;
17 background-position:right bottom;
18 height:100%;
b1358a1f 19 touch-action: none;
c327865b
CG
20}
21
22html {
01a9eee9 23 height:100%;
c327865b
CG
24}
25
65e3d7d6
PO
26.noVNC_only_touch.noVNC_hidden {
27 display: none;
28}
29
8d710e8b
PO
30/* ----------------------------------------
31 * Spinner
32 * ----------------------------------------
33 */
34
35.noVNC_spinner {
36 position: relative;
37}
38.noVNC_spinner, .noVNC_spinner::before, .noVNC_spinner::after {
39 width: 10px;
40 height: 10px;
41 border-radius: 50%;
42 animation: noVNC_spinner 1.0s ease-in-out alternate infinite;
43}
44.noVNC_spinner::before {
45 content: "";
46 position: absolute;
47 left: -20px;
48 animation-delay: -0.2s;
49}
50.noVNC_spinner::after {
51 content: "";
52 position: absolute;
53 left: 20px;
54 animation-delay: 0.2s;
55}
56@keyframes noVNC_spinner {
57 0% { box-shadow: 0 10px 0 white; }
58 100% { box-shadow: 0 30px 0 white; }
59}
60
79fd3b1f
PO
61/* ----------------------------------------
62 * Input Elements
63 * ----------------------------------------
64 */
65
66input[type=input], input[type=password], input:not([type]), textarea {
67 /* Disable default rendering */
68 -webkit-appearance: none;
69 -moz-appearance: none;
70 background: none;
71
72 margin: 2px;
73 padding: 2px;
74 border: 1px solid rgb(192, 192, 192);
75 border-radius: 5px;
76 color: black;
77 background: linear-gradient(to top, rgb(255, 255, 255) 80%, rgb(240, 240, 240));
78}
79
80input[type=button], select {
81 /* Disable default rendering */
82 -webkit-appearance: none;
83 -moz-appearance: none;
84 background: none;
85
86 margin: 2px;
87 padding: 2px;
88 border: 1px solid rgb(192, 192, 192);
89 border-bottom-width: 2px;
90 border-radius: 5px;
91 color: black;
92 background: linear-gradient(to top, rgb(255, 255, 255), rgb(240, 240, 240));
93
94 /* This avoids it jumping around when :active */
95 vertical-align: middle;
96}
97
98input[type=button] {
99 padding-left: 20px;
100 padding-right: 20px;
101}
102
103option {
104 color: black;
105 background: white;
106}
107
108input[type=input]:focus, input[type=password]:focus,
109input:not([type]):focus, input[type=button]:focus,
110textarea:focus, select:focus {
111 box-shadow: 0px 0px 3px rgba(74, 144, 217, 0.5);
112 border-color: rgb(74, 144, 217);
113 outline: none;
114}
115
116input[type=button]::-moz-focus-inner {
117 border: none;
118}
119
120input[type=input]:disabled, input[type=password]:disabled,
121input:not([type]):disabled, input[type=button]:disabled,
122textarea:disabled, select:disabled {
123 color: rgb(128, 128, 128);
124 background: rgb(240, 240, 240);
125}
126
127input[type=button]:active, select:active {
128 border-bottom-width: 1px;
129 margin-top: 3px;
130}
131
1a15cb5b
PO
132:root:not(.noVNC_touch) input[type=button]:hover:not(:disabled), :root:not(.noVNC_touch) select:hover:not(:disabled) {
133 background: linear-gradient(to top, rgb(255, 255, 255), rgb(250, 250, 250));
134}
135
8a7ec6ea
SM
136/* ----------------------------------------
137 * WebKit centering hacks
138 * ----------------------------------------
139 */
140
141.noVNC_center {
142 /*
143 * This is a workaround because webkit misrenders transforms and
144 * uses non-integer coordinates, resulting in blurry content.
145 * Ideally we'd use "top: 50%; transform: translateY(-50%);" on
146 * the objects instead.
147 */
148 display: flex;
149 align-items: center;
150 justify-content: center;
151 position: fixed;
152 top: 0;
153 left: 0;
154 width: 100%;
155 height: 100%;
156 pointer-events: none;
157}
158.noVNC_center > * {
159 pointer-events: auto;
160}
fb7c3b3b
PO
161.noVNC_vcenter {
162 display: flex;
163 flex-direction: column;
164 justify-content: center;
165 position: fixed;
166 top: 0;
167 left: 0;
168 height: 100%;
169 pointer-events: none;
170}
171.noVNC_vcenter > * {
172 pointer-events: auto;
173}
8a7ec6ea 174
d24de750
SM
175/* ----------------------------------------
176 * Fallback error
177 * ----------------------------------------
178 */
179
180#noVNC_fallback_error {
181 position: fixed;
182 z-index: 3;
183 left: 50%;
184 transform: translate(-50%, -50px);
185 transition: 0.5s ease-in-out;
186
187 visibility: hidden;
188 opacity: 0;
189
190 top: 60px;
191 padding: 15px;
192 width: auto;
193
194 text-align: center;
195 font-weight: bold;
196 word-wrap: break-word;
197 color: #fff;
198
199 border-radius: 10px;
200 box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
201 background: rgba(200,55,55,0.8);
202}
203#noVNC_fallback_error.noVNC_open {
204 transform: translate(-50%, 0);
205 visibility: visible;
206 opacity: 1;
207}
d8ff7c9e 208
d24de750
SM
209#noVNC_fallback_errormsg {
210 font-weight: normal;
211}
212
d8ff7c9e
SM
213#noVNC_fallback_error .noVNC_location {
214 font-style: italic;
215 font-size: 0.8em;
216 color: rgba(255, 255, 255, 0.8);
217}
218
219#noVNC_fallback_error .noVNC_stack {
220 padding: 10px;
221 margin: 10px;
222 font-size: 0.8em;
223 text-align: left;
224 white-space: pre;
225 border: 1px solid rgba(0, 0, 0, 0.5);
226 background: rgba(0, 0, 0, 0.2);
227}
228
2869308c 229/* ----------------------------------------
230 * Control Bar
231 * ----------------------------------------
232 */
233
fb7c3b3b
PO
234#noVNC_control_bar_anchor {
235 /* The anchor is needed to get z-stacking to work */
2869308c 236 position: fixed;
fb7c3b3b 237 z-index: 2;
ca5c74ad 238
728b5d9e
PO
239 transition: 0.5s ease-in-out;
240
fb7c3b3b
PO
241 /* Edge misrenders animations wihthout this */
242 transform: translateX(0);
243}
728b5d9e
PO
244:root.noVNC_connected #noVNC_control_bar_anchor.noVNC_idle {
245 opacity: 0.8;
246}
8ee432f1
PO
247#noVNC_control_bar_anchor.noVNC_right {
248 left: auto;
249 right: 0;
250}
fb7c3b3b
PO
251
252#noVNC_control_bar {
253 position: relative;
8ee432f1 254 left: -100%;
38323d4d
PO
255
256 transition: 0.5s ease-in-out;
fb7c3b3b
PO
257
258 background-color: rgb(110, 132, 163);
259 border-radius: 0 10px 10px 0;
260
fb7c3b3b 261}
38323d4d
PO
262#noVNC_control_bar.noVNC_open {
263 box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
8ee432f1
PO
264 left: 0;
265}
266#noVNC_control_bar::before {
267 /* This extra element is to get a proper shadow */
268 content: "";
269 position: absolute;
270 z-index: -1;
271 height: 100%;
272 width: 30px;
38323d4d 273 left: -30px;
8ee432f1
PO
274 transition: box-shadow 0.5s ease-in-out;
275}
276#noVNC_control_bar.noVNC_open::before {
277 box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
278}
279.noVNC_right #noVNC_control_bar {
280 left: 100%;
281 border-radius: 10px 0 0 10px;
282}
283.noVNC_right #noVNC_control_bar.noVNC_open {
284 left: 0;
285}
286.noVNC_right #noVNC_control_bar::before {
287 visibility: hidden;
38323d4d
PO
288}
289
290#noVNC_control_bar_handle {
291 position: absolute;
8ee432f1 292 left: -15px;
04b399e2
SM
293 top: 0;
294 transform: translateY(35px);
8ee432f1 295 width: calc(100% + 30px);
38323d4d
PO
296 height: 50px;
297 z-index: -2;
298 cursor: pointer;
8ee432f1 299 border-radius: 5px;
38323d4d
PO
300 background-color: rgb(83, 99, 122);
301 background-image: url("../images/handle_bg.svg");
302 background-repeat: no-repeat;
303 background-position: right;
304 box-shadow: 3px 3px 0px rgba(0, 0, 0, 0.5);
305}
306#noVNC_control_bar_handle:after {
307 content: "";
8ee432f1 308 transition: transform 0.5s ease-in-out;
38323d4d
PO
309 background: url("../images/handle.svg");
310 position: absolute;
311 top: 22px; /* (50px-6px)/2 */
312 right: 5px;
313 width: 5px;
314 height: 6px;
315}
316#noVNC_control_bar.noVNC_open #noVNC_control_bar_handle:after {
317 transform: translateX(1px) rotate(180deg);
318}
319:root:not(.noVNC_connected) #noVNC_control_bar_handle {
320 display: none;
321}
8ee432f1
PO
322.noVNC_right #noVNC_control_bar_handle {
323 background-position: left;
324}
325.noVNC_right #noVNC_control_bar_handle:after {
326 left: 5px;
327 right: 0;
328 transform: translateX(1px) rotate(180deg);
329}
330.noVNC_right #noVNC_control_bar.noVNC_open #noVNC_control_bar_handle:after {
331 transform: none;
332}
65e3d7d6
PO
333#noVNC_control_bar_handle div {
334 position: absolute;
335 right: -35px;
336 top: 0;
337 width: 50px;
338 height: 50px;
339}
340:root:not(.noVNC_touch) #noVNC_control_bar_handle div {
341 display: none;
342}
8ee432f1
PO
343.noVNC_right #noVNC_control_bar_handle div {
344 left: -35px;
345 right: auto;
346}
fb7c3b3b
PO
347
348#noVNC_control_bar .noVNC_scroll {
349 max-height: 100vh; /* Chrome is buggy with 100% */
350 overflow-x: hidden;
351 overflow-y: auto;
352 padding: 0 10px 0 5px;
c327865b 353}
8ee432f1
PO
354.noVNC_right #noVNC_control_bar .noVNC_scroll {
355 padding: 0 5px 0 10px;
356}
c327865b 357
2869308c 358/* General button style */
a49d9298 359.noVNC_button {
fb7c3b3b 360 display: block;
2869308c 361 padding: 4px 4px;
fb7c3b3b 362 margin: 10px 0;
2869308c 363 vertical-align: middle;
fb7c3b3b 364 border:1px solid rgba(255, 255, 255, 0.2);
2869308c 365 -webkit-border-radius: 6px;
366 -moz-border-radius: 6px;
367 border-radius: 6px;
01a9eee9 368}
d9e86214 369.noVNC_button.noVNC_selected {
fb7c3b3b
PO
370 border-color: rgba(0, 0, 0, 0.8);
371 background: rgba(0, 0, 0, 0.5);
c327865b 372}
a49d9298 373.noVNC_button:disabled {
2869308c 374 opacity: 0.4;
c327865b 375}
f7c725ce
PO
376.noVNC_button:focus {
377 outline: none;
378}
379.noVNC_button:active {
380 padding-top: 5px;
381 padding-bottom: 3px;
382}
1a15cb5b
PO
383:root:not(.noVNC_touch) .noVNC_button.noVNC_selected:hover {
384 border-color: rgba(0, 0, 0, 0.4);
385 background: rgba(0, 0, 0, 0.2);
386}
387:root:not(.noVNC_touch) .noVNC_button:hover {
388 background: rgba(255, 255, 255, 0.2);
389}
a49d9298 390.noVNC_button.noVNC_hidden {
e40978c7
PO
391 display: none;
392}
2869308c 393
394/* Panels */
286947cb 395.noVNC_panel {
fb7c3b3b 396 transform: translateX(25px);
24d8b311
PO
397
398 transition: 0.5s ease-in-out;
399
fb7c3b3b
PO
400 max-height: 100vh; /* Chrome is buggy with 100% */
401 overflow-x: hidden;
402 overflow-y: auto;
403
24d8b311
PO
404 visibility: hidden;
405 opacity: 0;
406
2869308c 407 padding: 15px;
24d8b311
PO
408
409 background: #fff;
2869308c 410 -webkit-border-radius: 10px;
411 -moz-border-radius: 10px;
412 border-radius: 10px;
413 color: #000;
414 border: 2px solid #E0E0E0;
24d8b311 415 box-shadow: 6px 6px 0px rgba(0, 0, 0, 0.5);
c327865b 416}
e40978c7 417.noVNC_panel.noVNC_open {
24d8b311
PO
418 visibility: visible;
419 opacity: 1;
fb7c3b3b 420 transform: translateX(75px);
a5df24b4 421}
8ee432f1
PO
422.noVNC_right .noVNC_vcenter {
423 left: auto;
424 right: 0;
425}
426.noVNC_right .noVNC_panel {
427 transform: translateX(-25px);
428}
429.noVNC_right .noVNC_panel.noVNC_open {
430 transform: translateX(-75px);
431}
2869308c 432
1fe9faee
PO
433.noVNC_panel hr {
434 border: none;
435 border-top: 1px solid rgb(192, 192, 192);
436}
437
438.noVNC_panel label {
439 display: block;
440}
441
5454c345
PO
442.noVNC_panel .noVNC_heading {
443 background-color: rgb(110, 132, 163);
444 border-radius: 5px;
445 padding: 5px;
446 /* Compensate for padding in image */
447 padding-right: 8px;
448 color: white;
449 font-size: 20px;
450 margin-bottom: 10px;
451 white-space: nowrap;
452}
453.noVNC_panel .noVNC_heading img {
454 vertical-align: bottom;
455}
456
79fd3b1f
PO
457.noVNC_submit {
458 float: right;
459}
460
575f6983
PO
461/* Expanders */
462.noVNC_expander {
463 cursor: pointer;
464}
465.noVNC_expander::before {
466 content: url("../images/expander.svg");
467 display: inline-block;
468 margin-right: 5px;
469 transition: 0.2s ease-in-out;
470}
471.noVNC_expander.noVNC_open::before {
472 transform: rotateZ(90deg);
473}
474.noVNC_expander ~ * {
475 margin: 5px;
476 margin-left: 10px;
477 padding: 5px;
478 background: rgba(0, 0, 0, 0.05);
479 border-radius: 5px;
480}
481.noVNC_expander:not(.noVNC_open) ~ * {
482 display: none;
483}
484
485/* Control bar content */
486
6244e383
PO
487:root:not(.noVNC_connected) #noVNC_view_drag_button {
488 display: none;
489}
490
2869308c 491/* noVNC Touch Device only buttons */
6244e383
PO
492:root:not(.noVNC_connected) #noVNC_mobile_buttons {
493 display: none;
494}
495:root:not(.noVNC_touch) #noVNC_mobile_buttons {
a6357e82 496 display: none;
497}
2869308c 498
499#noVNC_keyboardinput {
500 width: 1px;
501 height: 1px;
502 background-color: #fff;
503 color: #fff;
504 border: 0;
505 position: relative;
506 left: -40px;
507 z-index: -1;
508 ime-mode: disabled;
fb35d50f 509}
2869308c 510
fb7c3b3b 511/* Extra manual keys */
6244e383 512:root:not(.noVNC_connected) #noVNC_extra_keys {
608e0f52
JM
513 display: none;
514}
515
fb7c3b3b
PO
516#noVNC_modifiers {
517 background-color: rgb(92, 92, 92);
518 border: none;
519 padding: 0 10px;
520}
521
2869308c 522/* XVP Shutdown/Reboot */
6244e383
PO
523:root:not(.noVNC_connected) #noVNC_xvp_button {
524 display: none;
525}
2869308c 526#noVNC_xvp {
2869308c 527}
528#noVNC_xvp_buttons {
529 display: none;
f4bce783
JM
530}
531
1fe9faee
PO
532#noVNC_xvp input[type=button] {
533 width: 100%;
534}
535
2869308c 536/* Clipboard */
6244e383
PO
537:root:not(.noVNC_connected) #noVNC_clipboard_button {
538 display: none;
539}
2869308c 540#noVNC_clipboard {
fb7c3b3b
PO
541 /* Full screen, minus padding and left and right margins */
542 max-width: calc(100vw - 2*15px - 75px - 25px);
2869308c 543}
544#noVNC_clipboard_text {
545 width: 500px;
fb7c3b3b 546 max-width: 100%;
2869308c 547}
f4bce783 548
2869308c 549/* Settings */
550#noVNC_settings {
2869308c 551}
eeb395dc 552#noVNC_settings ul {
2869308c 553 list-style: none;
1fe9faee 554 margin: 0px;
2869308c 555 padding: 0px;
556}
575f6983
PO
557#noVNC_setting_port {
558 width: 80px;
559}
2869308c 560#noVNC_setting_path {
561 width: 100px;
562}
f4bce783 563
2869308c 564/* Connection Controls */
6244e383
PO
565:root.noVNC_connected #noVNC_connect_controls_button {
566 display: none;
567}
568:root:not(.noVNC_connected) #noVNC_disconnect_button {
569 display: none;
2869308c 570}
a49d9298 571#noVNC_connect_controls ul {
2869308c 572 list-style: none;
573 margin: 0px;
574 padding: 0px;
575}
c327865b 576
ca5c74ad 577/* ----------------------------------------
578 * Status Dialog
579 * ----------------------------------------
580 */
581
582#noVNC_status {
2869308c 583 position: fixed;
ca5c74ad 584 top: 0;
585 left: 0;
586 width: 100%;
587 z-index: 3;
24d8b311
PO
588 transform: translateY(-100%);
589
590 transition: 0.5s ease-in-out;
591
592 visibility: hidden;
593 opacity: 0;
2869308c 594
ca5c74ad 595 padding: 5px;
2869308c 596
24d8b311 597 display: flex;
ca5c74ad 598 flex-direction: row;
599 justify-content: center;
600 align-content: center;
601
602 line-height: 25px;
2869308c 603 word-wrap: break-word;
604 color: #fff;
2869308c 605
ca5c74ad 606 border-bottom: 1px solid rgba(0, 0, 0, 0.9);
c327865b 607}
ca5c74ad 608#noVNC_status.noVNC_open {
24d8b311
PO
609 transform: translateY(0);
610 visibility: visible;
611 opacity: 1;
ca5c74ad 612}
613
614#noVNC_status::before {
615 content: "";
616 display: inline-block;
617 width: 25px;
618 height: 25px;
619 margin-right: 5px;
620}
621
622#noVNC_status.noVNC_status_normal {
623 background: rgba(128,128,128,0.9);
624}
625#noVNC_status.noVNC_status_normal::before {
626 content: url("../images/info.svg") " ";
627}
628#noVNC_status.noVNC_status_error {
629 background: rgba(200,55,55,0.9);
630}
631#noVNC_status.noVNC_status_error::before {
632 content: url("../images/error.svg") " ";
633}
634#noVNC_status.noVNC_status_warn {
635 background: rgba(180,180,30,0.9);
636}
637#noVNC_status.noVNC_status_warn::before {
638 content: url("../images/warning.svg") " ";
e40978c7 639}
c327865b 640
8a7ec6ea
SM
641/* ----------------------------------------
642 * Password Dialog
643 * ----------------------------------------
644 */
645
646#noVNC_password_dlg {
647 transform: translateY(-50px);
648}
649#noVNC_password_dlg.noVNC_open {
650 transform: translateY(0);
651}
652#noVNC_password_dlg ul {
653 list-style: none;
654 margin: 0px;
655 padding: 0px;
656}
8a7ec6ea 657
2869308c 658/* ----------------------------------------
659 * Main Area
660 * ----------------------------------------
661 */
662
8d710e8b
PO
663/* Transition screen */
664#noVNC_transition {
665 display: none;
666
667 position: fixed;
668 top: 0;
669 left: 0;
670 bottom: 0;
671 right: 0;
672
673 color: white;
674 background: rgba(0, 0, 0, 0.5);
675 z-index: 1000;
676
677 /*display: flex;*/
678 align-items: center;
679 justify-content: center;
680 flex-direction: column;
681}
682:root.noVNC_connecting #noVNC_transition,
683:root.noVNC_disconnecting #noVNC_transition {
684 display: flex;
685}
686#noVNC_transition_text {
687 font-size: 1.5em;
688}
689
690/* Main container */
2869308c 691#noVNC_container {
692 display: table;
693 width: 100%;
694 height: 100%;
695 background-color: #313131;
696 border-bottom-right-radius: 800px 600px;
697 /*border-top-left-radius: 800px 600px;*/
698}
8f2ca5fe
PO
699:root.noVNC_connected #noVNC_container {
700 background-color: rgb(40, 40, 40);
701 border-radius: 0;
702}
2869308c 703
704/* HTML5 Canvas */
705#noVNC_screen {
2869308c 706 position: absolute;
707 margin: 0px;
708 padding: 0px;
709 bottom: 0px;
fb7c3b3b 710 top: 0px;
2869308c 711 left: 0px;
712 right: 0px;
713 width: auto;
714 height: auto;
715}
6244e383 716:root:not(.noVNC_connected) #noVNC_screen {
e40978c7
PO
717 display: none;
718}
2869308c 719
720/* Do not set width/height for VNC_canvas or incorrect
721 * scaling will occur. Canvas size depends on remote VNC
722 * settings and noVNC settings. */
723#noVNC_canvas {
724 position: absolute;
47fbdced 725 top: 0;
2869308c 726 left: 0;
727 right: 0;
47fbdced
PO
728 bottom: 0;
729 margin: auto;
c327865b
CG
730}
731
b70ce077 732/*Default noVNC logo.*/
479bfa99
JM
733/* From: http://fonts.googleapis.com/css?family=Orbitron:700 */
734@font-face {
735 font-family: 'Orbitron';
736 font-style: normal;
737 font-weight: 700;
738 src: local('?'), url('Orbitron700.woff') format('woff'),
739 url('Orbitron700.ttf') format('truetype');
740}
741
4d3aa0ef 742.noVNC_logo {
01a9eee9
JM
743 color:yellow;
744 text-align:left;
479bfa99 745 font-family: 'Orbitron', 'OrbitronTTF', sans-serif;
4d3aa0ef 746 font-size: 13px;
01a9eee9 747 line-height:90%;
4d3aa0ef
PO
748 text-shadow: 1px 1px 0 #000;
749}
750.noVNC_logo span{
751 color:green;
752}
753
754#noVNC_logo {
755 margin-top: 60px;
756 margin-left: 60px;
757 font-size: 180px;
01a9eee9 758 text-shadow:
c327865b
CG
759 5px 5px 0 #000,
760 -1px -1px 0 #000,
761 1px -1px 0 #000,
762 -1px 1px 0 #000,
763 1px 1px 0 #000;
764}
6244e383 765:root.noVNC_connected #noVNC_logo {
e40978c7
PO
766 display: none;
767}
a5df24b4 768
63bf2ba5
PO
769#noVNC_bell {
770 display: none;
771}
772
a5df24b4
JM
773/* ----------------------------------------
774 * Media sizing
775 * ----------------------------------------
776 */
777
35b29c98 778@media screen and (max-width: 640px){
9d04096e 779 #noVNC_logo {
780 font-size: 150px;
781 }
a5df24b4
JM
782}
783
784@media screen and (min-width: 321px) and (max-width: 480px) {
a5df24b4
JM
785 #noVNC_logo {
786 font-size: 110px;
787 }
788}
789
790@media screen and (max-width: 320px) {
a5df24b4
JM
791 #noVNC_logo {
792 font-size: 90px;
793 }
794}