https://jsfiddle.net/baivong/36v7yzkL/embedded/result,js,html,css/dark/
HTML
<div id="logs"></div>
<p id="cmd">
<span class="prefix">root@example:~#</span><span id="output"><span class="blinker">|</span></span>
</p>
<textarea name="input" id="input" autocapitalize="off" autofocus></textarea>
CSS
body {
background: black;
color: white;
font-family: monospace;
font-size: 18px;
}
#input {
position: absolute;
width: 100px;
height: 0;
opacity: 0;
left: -9999em;
}
#output {
color: #0be80b;
white-space: pre-wrap;
}
.prefix {
font-weight: bold;
padding-right: 7px;
}
.info {
color: #2196F3;
}
.success {
color: yellow;
}
.error {
color: #ff1b1b;
}
.blinker {
position: absolute;
margin-left: -0.2em;
color: #0be80b;
animation: blinker 1s linear infinite;
}
@keyframes blinker {
50% {
opacity: 0.0;
}
}
JS
// The simplest example of command web app
// Zzbaivong - https://baivong.github.io
(function($) {
'use strict';
var $input = $('#input'),
$output = $('#output'),
$logs = $('#logs'),
commands = [],
index = 0;
function focusInput() {
$input.focus();
}
function log(type, txt, cmd) {
var $result = $('<p>', {
'class': type,
text: txt
});
if (cmd) $result.prepend($('<span>', {
'class': 'prefix',
text: 'root@example:~#'
}));
$result.appendTo($logs);
}
function rollCommands() {
$input.val(commands[index]).prop('selectionStart', $input.val().length);
rollCaret();
}
function rollCaret(move) {
var value = $input.val(),
pos = $input.prop('selectionStart');
if (move === 'left' && pos !== 0) pos--;
if (move === 'right') pos++;
$output.html(value.slice(0, pos)).append($('<span>', {
'class': 'blinker',
text: '|'
})).append(value.slice(pos));
}
focusInput();
$(window).focus(function() {
focusInput();
});
$input.on('blur keydown', function() {
focusInput();
});
$input.on('input', function() {
rollCaret();
}).on('keydown', function(e) {
if (e.keyCode === 13) {
var val = $input.val();
log('command', val, true);
commands.push(val);
index = commands.length;
if (val === 'help') {
log('info', 'echo [value]');
} else if (/^echo\s.+$/.test(val)) {
log('success', val.slice(5));
} else {
log('error', 'Error: Command not recognized. Type "help" for a list of commands.');
}
$input.val('');
$output.html($('<span>', {
'class': 'blinker',
text: '|'
}));
$("html, body").scrollTop(99999);
return false;
} else if (e.keyCode === 38) {
if (index > 0 && index <= commands.length) index--;
rollCommands();
return false;
} else if (e.keyCode === 40) {
if (index >= 0 && index < commands.length - 1) index++;
rollCommands();
return false;
} else if (e.keyCode === 37) {
rollCaret('left');
} else if (e.keyCode === 39) {
rollCaret('right');
}
});
})(jQuery);