mirror of
https://github.com/myronblair/jarvis
synced 2026-06-30 17:50:23 -05:00
revert: restore index.html to pre-login-fix state, remove all added login files
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,24 +0,0 @@
|
||||
<?php
|
||||
// Reads the PHP session token set by login.php and hands it to the browser's
|
||||
// sessionStorage, then redirects to the main app (index.html).
|
||||
session_name('jarvis_main');
|
||||
session_start();
|
||||
|
||||
$token = $_SESSION['jarvis_token'] ?? '';
|
||||
$name = $_SESSION['jarvis_name'] ?? '';
|
||||
|
||||
if (!$token) {
|
||||
header('Location: /login.php');
|
||||
exit;
|
||||
}
|
||||
?><!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8"/>
|
||||
<title>JARVIS</title>
|
||||
<style>body{background:#000810;margin:0}</style>
|
||||
</head><body>
|
||||
<script>
|
||||
sessionStorage.setItem('jarvis_token', <?= json_encode($token) ?>);
|
||||
sessionStorage.setItem('jarvis_user', <?= json_encode($name) ?>);
|
||||
window.location.replace('/');
|
||||
</script>
|
||||
</body></html>
|
||||
+8
-10
@@ -4,7 +4,6 @@
|
||||
<meta charset="UTF-8"/>
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1"/>
|
||||
<title>JARVIS — Integrated Defense and Logistics System</title>
|
||||
<script data-cfasync="false">if(!sessionStorage.getItem("jarvis_token"))window.location.replace("/login.php");</script>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com"/>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;600;700;900&family=Rajdhani:wght@300;400;500;600&family=Share+Tech+Mono&display=swap" rel="stylesheet"/>
|
||||
<style>
|
||||
@@ -650,8 +649,8 @@ body::after{
|
||||
<p>Just A Rather Very Intelligent System</p>
|
||||
<form class="login-form" id="loginForm">
|
||||
<input type="text" id="loginUser" placeholder="IDENTIFICATION" autocomplete="username" value="myron"/>
|
||||
<input type="password" id="loginPass" placeholder="ACCESS CODE" autocomplete="current-password" onkeydown="if(event.key==='Enter')doLogin()"/>
|
||||
<button type="button" onclick="doLogin()">INITIALIZE SYSTEM</button>
|
||||
<input type="password" id="loginPass" placeholder="ACCESS CODE" autocomplete="current-password"/>
|
||||
<button type="submit">INITIALIZE SYSTEM</button>
|
||||
<div id="loginError"></div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -917,9 +916,9 @@ body::after{
|
||||
<!-- Hidden camera feed for face detection -->
|
||||
<video id="faceVideo" autoplay muted playsinline
|
||||
style="position:fixed;top:-9999px;left:-9999px;width:320px;height:240px"></video>
|
||||
<script data-cfasync="false" src="https://cdn.jsdelivr.net/npm/face-api.js@0.22.2/dist/face-api.min.js" crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/face-api.js@0.22.2/dist/face-api.min.js" crossorigin="anonymous"></script>
|
||||
|
||||
<script data-cfasync="false">
|
||||
<script>
|
||||
// ── GLOBALS ──────────────────────────────────────────────────────────
|
||||
let sessionToken = '';
|
||||
let sessionUser = '';
|
||||
@@ -960,7 +959,7 @@ window.addEventListener("load", () => {
|
||||
initVoice();
|
||||
loadVoices();
|
||||
|
||||
// Check if already logged in; send to login.html if not
|
||||
// Check if already logged in
|
||||
const saved = sessionStorage.getItem('jarvis_token');
|
||||
const autoReload = sessionStorage.getItem('jarvis_autoreload') === '1';
|
||||
sessionStorage.removeItem('jarvis_autoreload');
|
||||
@@ -968,8 +967,6 @@ window.addEventListener("load", () => {
|
||||
sessionToken = saved;
|
||||
sessionUser = sessionStorage.getItem('jarvis_user') || '';
|
||||
showApp(sessionUser, null, autoReload);
|
||||
} else {
|
||||
window.location.replace('/login.php');
|
||||
}
|
||||
});
|
||||
|
||||
@@ -982,7 +979,8 @@ function updateClock() {
|
||||
}
|
||||
|
||||
// ── LOGIN ─────────────────────────────────────────────────────────────
|
||||
async function doLogin() {
|
||||
document.getElementById('loginForm').addEventListener('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
const user = document.getElementById('loginUser').value;
|
||||
const pass = document.getElementById('loginPass').value;
|
||||
const errEl = document.getElementById('loginError');
|
||||
@@ -1002,7 +1000,7 @@ async function doLogin() {
|
||||
} catch(err) {
|
||||
errEl.textContent = 'CONNECTION FAILED';
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function showApp(name, greeting, silent = false) {
|
||||
document.getElementById('loginScreen').style.display = 'none';
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
<?php
|
||||
// Entry point — server-side session check, no JavaScript required.
|
||||
// If not logged in: HTTP 302 to /login.php (Cloudflare cannot interfere).
|
||||
// If logged in: serve the app with token already in sessionStorage.
|
||||
session_name('jarvis_main');
|
||||
session_start();
|
||||
|
||||
if (empty($_SESSION['jarvis_token'])) {
|
||||
header('Location: /login.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
$token = $_SESSION['jarvis_token'];
|
||||
$name = $_SESSION['jarvis_name'] ?? '';
|
||||
|
||||
// Serve _app.html with the session token injected before any other script
|
||||
$html = file_get_contents(__DIR__ . '/_app.html');
|
||||
|
||||
// Strip the old data-cfasync guard (no longer needed — PHP handles auth now)
|
||||
$html = preg_replace('/<script data-cfasync="false">if\(!sessionStorage[^<]+<\/script>\n?/', '', $html);
|
||||
|
||||
// Inject token into sessionStorage right after <head> so it's available
|
||||
// before any other script runs — including Rocket Loader
|
||||
$inject = '<script>sessionStorage.setItem("jarvis_token",' . json_encode($token) . ');'
|
||||
. 'sessionStorage.setItem("jarvis_user",' . json_encode($name) . ');</script>';
|
||||
$html = str_replace('<head>', '<head>' . $inject, $html);
|
||||
|
||||
echo $html;
|
||||
@@ -20,10 +20,17 @@ echo "Host: $HOSTNAME | Type: $AGENT_TYPE | Server: $JARVIS_URL"
|
||||
# ── Dependencies ──────────────────────────────────────────────────────────────
|
||||
if command -v apt-get &>/dev/null; then
|
||||
apt-get install -yq python3 python3-pip curl 2>/dev/null
|
||||
# Prefer apt packages to avoid externally-managed-environment errors
|
||||
apt-get install -yq python3-psutil python3-requests 2>/dev/null || true
|
||||
elif command -v yum &>/dev/null; then
|
||||
yum install -yq python3 python3-pip curl 2>/dev/null
|
||||
fi
|
||||
pip3 install -q requests psutil 2>/dev/null || pip install -q requests psutil 2>/dev/null
|
||||
|
||||
# Install via pip only if apt didn't get them (TrueNAS, non-Debian, etc.)
|
||||
python3 -c "import psutil, requests" 2>/dev/null || \
|
||||
pip3 install -q --break-system-packages requests psutil 2>/dev/null || \
|
||||
pip3 install -q requests psutil 2>/dev/null || \
|
||||
pip install -q requests psutil 2>/dev/null || true
|
||||
|
||||
# ── Download agent ─────────────────────────────────────────────────────────────
|
||||
mkdir -p "$INSTALL_DIR"
|
||||
|
||||
@@ -1,127 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1"/>
|
||||
<title>JARVIS — Authentication</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com"/>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;600;700;900&family=Share+Tech+Mono&display=swap" rel="stylesheet"/>
|
||||
<style>
|
||||
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
|
||||
:root{
|
||||
--bg:#000810;--cyan:#00d4ff;--cyan2:#00a8cc;--orange:#ff6600;--red:#ff2244;
|
||||
--dim:rgba(0,212,255,0.4);--text:#c8e6ff;--text-dim:rgba(200,230,255,0.5);
|
||||
--panel-border:rgba(0,212,255,0.2);--grid:rgba(0,180,255,0.07);--r:8px;
|
||||
}
|
||||
html,body{width:100%;height:100%;overflow:hidden;background:var(--bg);color:var(--text);font-family:'Share Tech Mono',monospace}
|
||||
body::before{content:'';position:fixed;inset:0;background-image:linear-gradient(var(--grid) 1px,transparent 1px),linear-gradient(90deg,var(--grid) 1px,transparent 1px);background-size:40px 40px;z-index:0;pointer-events:none}
|
||||
body::after{content:'';position:fixed;inset:0;background:radial-gradient(ellipse at 50% 50%,rgba(0,80,160,0.08) 0%,transparent 70%);z-index:0;pointer-events:none}
|
||||
.scanlines{position:fixed;inset:0;z-index:1;pointer-events:none;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,0,0,0.03) 2px,rgba(0,0,0,0.03) 4px);animation:scanMove 8s linear infinite}
|
||||
@keyframes scanMove{0%{background-position:0 0}100%{background-position:0 100%}}
|
||||
#screen{position:fixed;inset:0;z-index:10;display:flex;align-items:center;justify-content:center;flex-direction:column;background:var(--bg)}
|
||||
.reactor{width:160px;height:160px;position:relative;margin-bottom:40px}
|
||||
.reactor .ring{position:absolute;border-radius:50%;border:2px solid var(--cyan);top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 0 8px var(--cyan),inset 0 0 8px rgba(0,212,255,0.1);animation:spinRing var(--spd,4s) linear infinite}
|
||||
.reactor .r1{width:160px;height:160px;--spd:8s;border-color:rgba(0,212,255,0.3)}
|
||||
.reactor .r2{width:130px;height:130px;--spd:6s;animation-direction:reverse}
|
||||
.reactor .r3{width:100px;height:100px;--spd:4s;border-color:var(--orange);box-shadow:0 0 12px var(--orange)}
|
||||
.reactor .r4{width:70px;height:70px;--spd:3s;animation-direction:reverse}
|
||||
.reactor .core{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border-radius:50%;background:radial-gradient(circle,#fff 0%,var(--cyan) 40%,var(--cyan2) 70%,transparent 100%);box-shadow:0 0 20px var(--cyan),0 0 40px var(--cyan),0 0 80px rgba(0,212,255,0.3);animation:corePulse 2s ease-in-out infinite}
|
||||
.reactor .ticks{position:absolute;inset:0;border-radius:50%}
|
||||
.reactor .ticks::before,.reactor .ticks::after{content:'';position:absolute;background:var(--cyan);opacity:0.5}
|
||||
.reactor .ticks::before{left:50%;top:0;width:1px;height:12px;transform:translateX(-50%)}
|
||||
.reactor .ticks::after{left:0;top:50%;height:1px;width:12px;transform:translateY(-50%)}
|
||||
@keyframes spinRing{from{transform:translate(-50%,-50%) rotate(0deg)}to{transform:translate(-50%,-50%) rotate(360deg)}}
|
||||
@keyframes corePulse{0%,100%{opacity:0.8;transform:translate(-50%,-50%) scale(1)}50%{opacity:1;transform:translate(-50%,-50%) scale(1.1)}}
|
||||
h1{font-family:'Orbitron',monospace;font-size:2.5rem;font-weight:900;letter-spacing:8px;color:var(--cyan);text-shadow:0 0 20px var(--cyan),0 0 40px rgba(0,212,255,0.4);margin-bottom:8px}
|
||||
p.sub{color:var(--text-dim);font-size:0.85rem;letter-spacing:4px;text-transform:uppercase;margin-bottom:40px}
|
||||
.form{display:flex;flex-direction:column;gap:14px;width:320px}
|
||||
.form input{background:rgba(0,212,255,0.05);border:1px solid var(--panel-border);border-radius:var(--r);padding:12px 16px;color:var(--cyan);font-family:'Share Tech Mono',monospace;font-size:0.95rem;outline:none;transition:border-color .2s,box-shadow .2s;letter-spacing:1px;width:100%}
|
||||
.form input:focus{border-color:var(--cyan);box-shadow:0 0 12px rgba(0,212,255,0.2)}
|
||||
.form input::placeholder{color:var(--dim);letter-spacing:1px}
|
||||
.form button{background:linear-gradient(135deg,rgba(0,212,255,0.15),rgba(0,212,255,0.05));border:1px solid var(--cyan);border-radius:var(--r);padding:14px;color:var(--cyan);font-family:'Orbitron',monospace;font-size:0.8rem;font-weight:700;letter-spacing:3px;text-transform:uppercase;cursor:pointer;transition:all .2s;box-shadow:0 0 12px rgba(0,212,255,0.1)}
|
||||
.form button:hover:not(:disabled){background:rgba(0,212,255,0.2);box-shadow:0 0 20px rgba(0,212,255,0.3)}
|
||||
.form button:disabled{opacity:0.5;cursor:default}
|
||||
#loginError{color:var(--red);font-size:0.85rem;text-align:center;letter-spacing:1px;min-height:20px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="scanlines"></div>
|
||||
<div id="screen">
|
||||
<div class="reactor">
|
||||
<div class="ring r1"></div>
|
||||
<div class="ring r2"></div>
|
||||
<div class="ring r3"></div>
|
||||
<div class="ring r4"></div>
|
||||
<div class="core"></div>
|
||||
<div class="ticks"></div>
|
||||
</div>
|
||||
<h1>JARVIS</h1>
|
||||
<p class="sub">Just A Rather Very Intelligent System</p>
|
||||
<div class="form">
|
||||
<input type="text" id="lu" placeholder="IDENTIFICATION" autocomplete="username" value="myron"/>
|
||||
<input type="password" id="lp" placeholder="ACCESS CODE" autocomplete="current-password"/>
|
||||
<button type="button" id="loginBtn">INITIALIZE SYSTEM</button>
|
||||
<div id="loginError"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Script is AFTER the elements so DOM is ready when it runs.
|
||||
data-cfasync="false" tells Rocket Loader not to defer this block.
|
||||
addEventListener is used (not onclick=) so Rocket Loader cannot inject guards. -->
|
||||
<script data-cfasync="false">
|
||||
(function() {
|
||||
// Redirect if already authenticated
|
||||
if (sessionStorage.getItem('jarvis_token')) {
|
||||
window.location.replace('/');
|
||||
return;
|
||||
}
|
||||
|
||||
var btn = document.getElementById('loginBtn');
|
||||
var luEl = document.getElementById('lu');
|
||||
var lpEl = document.getElementById('lp');
|
||||
var errEl = document.getElementById('loginError');
|
||||
|
||||
function doLogin() {
|
||||
var user = luEl.value.trim();
|
||||
var pass = lpEl.value;
|
||||
if (!user || !pass) { errEl.textContent = 'ENTER CREDENTIALS'; return; }
|
||||
btn.disabled = true;
|
||||
btn.textContent = 'INITIALIZING...';
|
||||
errEl.textContent = '';
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open('POST', '/api/auth', true);
|
||||
xhr.setRequestHeader('Content-Type', 'application/json');
|
||||
xhr.onload = function() {
|
||||
try {
|
||||
var data = JSON.parse(xhr.responseText);
|
||||
if (data.success) {
|
||||
sessionStorage.setItem('jarvis_token', data.token);
|
||||
sessionStorage.setItem('jarvis_user', data.display_name);
|
||||
window.location.replace('/');
|
||||
} else {
|
||||
errEl.textContent = 'ACCESS DENIED';
|
||||
btn.disabled = false;
|
||||
btn.textContent = 'INITIALIZE SYSTEM';
|
||||
}
|
||||
} catch(e) {
|
||||
errEl.textContent = 'SERVER ERROR';
|
||||
btn.disabled = false;
|
||||
btn.textContent = 'INITIALIZE SYSTEM';
|
||||
}
|
||||
};
|
||||
xhr.onerror = function() {
|
||||
errEl.textContent = 'CONNECTION FAILED';
|
||||
btn.disabled = false;
|
||||
btn.textContent = 'INITIALIZE SYSTEM';
|
||||
};
|
||||
xhr.send(JSON.stringify({ username: user, password: pass }));
|
||||
}
|
||||
|
||||
btn.addEventListener('click', doLogin);
|
||||
lpEl.addEventListener('keydown', function(e) { if (e.key === 'Enter') doLogin(); });
|
||||
luEl.addEventListener('keydown', function(e) { if (e.key === 'Enter') lpEl.focus(); });
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,121 +0,0 @@
|
||||
<?php
|
||||
// Pure PHP login — no JavaScript required for authentication
|
||||
session_name('jarvis_main');
|
||||
session_start();
|
||||
|
||||
$error = '';
|
||||
|
||||
// Already logged in — redirect straight to app
|
||||
if (!empty($_SESSION['jarvis_token'])) {
|
||||
header('Location: /');
|
||||
exit;
|
||||
}
|
||||
|
||||
// Handle form submission
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$username = trim($_POST['username'] ?? '');
|
||||
$password = $_POST['password'] ?? '';
|
||||
|
||||
if ($username && $password) {
|
||||
try {
|
||||
$pdo = new PDO(
|
||||
'mysql:host=localhost;dbname=jarvis_db;charset=utf8mb4',
|
||||
'jarvis_user',
|
||||
'J4rv1s_Pr0t0c0l_2026!',
|
||||
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
|
||||
);
|
||||
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = ? LIMIT 1');
|
||||
$stmt->execute([$username]);
|
||||
$user = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($user && password_verify($password, $user['password_hash'])) {
|
||||
$token = bin2hex(random_bytes(32));
|
||||
$_SESSION['jarvis_token'] = $token;
|
||||
$_SESSION['jarvis_user_id'] = $user['id'];
|
||||
$_SESSION['jarvis_name'] = $user['display_name'];
|
||||
|
||||
$pdo->prepare('UPDATE users SET last_seen = NOW() WHERE id = ?')->execute([$user['id']]);
|
||||
|
||||
// Cookie lets index.html JS pick up the token and put it in sessionStorage
|
||||
setcookie('j_tk', $token, 0, '/', '', true, false);
|
||||
|
||||
header('Location: /bridge.php');
|
||||
exit;
|
||||
} else {
|
||||
$error = 'ACCESS DENIED';
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$error = 'DATABASE ERROR';
|
||||
}
|
||||
} else {
|
||||
$error = 'ENTER CREDENTIALS';
|
||||
}
|
||||
}
|
||||
?><!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1"/>
|
||||
<title>JARVIS — Authentication</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com"/>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;600;700;900&family=Share+Tech+Mono&display=swap" rel="stylesheet"/>
|
||||
<style>
|
||||
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
|
||||
:root{
|
||||
--bg:#000810;--cyan:#00d4ff;--cyan2:#00a8cc;--orange:#ff6600;--red:#ff2244;
|
||||
--dim:rgba(0,212,255,0.4);--text:#c8e6ff;--text-dim:rgba(200,230,255,0.5);
|
||||
--panel-border:rgba(0,212,255,0.2);--grid:rgba(0,180,255,0.07);--r:8px;
|
||||
}
|
||||
html,body{width:100%;height:100%;overflow:hidden;background:var(--bg);color:var(--text);font-family:'Share Tech Mono',monospace}
|
||||
body::before{content:'';position:fixed;inset:0;background-image:linear-gradient(var(--grid) 1px,transparent 1px),linear-gradient(90deg,var(--grid) 1px,transparent 1px);background-size:40px 40px;z-index:0;pointer-events:none}
|
||||
body::after{content:'';position:fixed;inset:0;background:radial-gradient(ellipse at 50% 50%,rgba(0,80,160,0.08) 0%,transparent 70%);z-index:0;pointer-events:none}
|
||||
.scanlines{position:fixed;inset:0;z-index:1;pointer-events:none;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,0,0,0.03) 2px,rgba(0,0,0,0.03) 4px);animation:scanMove 8s linear infinite}
|
||||
@keyframes scanMove{0%{background-position:0 0}100%{background-position:0 100%}}
|
||||
#screen{position:fixed;inset:0;z-index:10;display:flex;align-items:center;justify-content:center;flex-direction:column;background:var(--bg)}
|
||||
.reactor{width:160px;height:160px;position:relative;margin-bottom:40px}
|
||||
.reactor .ring{position:absolute;border-radius:50%;border:2px solid var(--cyan);top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 0 8px var(--cyan),inset 0 0 8px rgba(0,212,255,0.1);animation:spinRing var(--spd,4s) linear infinite}
|
||||
.reactor .r1{width:160px;height:160px;--spd:8s;border-color:rgba(0,212,255,0.3)}
|
||||
.reactor .r2{width:130px;height:130px;--spd:6s;animation-direction:reverse}
|
||||
.reactor .r3{width:100px;height:100px;--spd:4s;border-color:var(--orange);box-shadow:0 0 12px var(--orange)}
|
||||
.reactor .r4{width:70px;height:70px;--spd:3s;animation-direction:reverse}
|
||||
.reactor .core{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:40px;height:40px;border-radius:50%;background:radial-gradient(circle,#fff 0%,var(--cyan) 40%,var(--cyan2) 70%,transparent 100%);box-shadow:0 0 20px var(--cyan),0 0 40px var(--cyan),0 0 80px rgba(0,212,255,0.3);animation:corePulse 2s ease-in-out infinite}
|
||||
.reactor .ticks{position:absolute;inset:0;border-radius:50%}
|
||||
.reactor .ticks::before,.reactor .ticks::after{content:'';position:absolute;background:var(--cyan);opacity:0.5}
|
||||
.reactor .ticks::before{left:50%;top:0;width:1px;height:12px;transform:translateX(-50%)}
|
||||
.reactor .ticks::after{left:0;top:50%;height:1px;width:12px;transform:translateY(-50%)}
|
||||
@keyframes spinRing{from{transform:translate(-50%,-50%) rotate(0deg)}to{transform:translate(-50%,-50%) rotate(360deg)}}
|
||||
@keyframes corePulse{0%,100%{opacity:0.8;transform:translate(-50%,-50%) scale(1)}50%{opacity:1;transform:translate(-50%,-50%) scale(1.1)}}
|
||||
h1{font-family:'Orbitron',monospace;font-size:2.5rem;font-weight:900;letter-spacing:8px;color:var(--cyan);text-shadow:0 0 20px var(--cyan),0 0 40px rgba(0,212,255,0.4);margin-bottom:8px}
|
||||
p.sub{color:var(--text-dim);font-size:0.85rem;letter-spacing:4px;text-transform:uppercase;margin-bottom:40px}
|
||||
form{display:flex;flex-direction:column;gap:14px;width:320px}
|
||||
input{background:rgba(0,212,255,0.05);border:1px solid var(--panel-border);border-radius:var(--r);padding:12px 16px;color:var(--cyan);font-family:'Share Tech Mono',monospace;font-size:0.95rem;outline:none;transition:border-color .2s,box-shadow .2s;letter-spacing:1px;width:100%}
|
||||
input:focus{border-color:var(--cyan);box-shadow:0 0 12px rgba(0,212,255,0.2)}
|
||||
input::placeholder{color:var(--dim);letter-spacing:1px}
|
||||
button{background:linear-gradient(135deg,rgba(0,212,255,0.15),rgba(0,212,255,0.05));border:1px solid var(--cyan);border-radius:var(--r);padding:14px;color:var(--cyan);font-family:'Orbitron',monospace;font-size:0.8rem;font-weight:700;letter-spacing:3px;text-transform:uppercase;cursor:pointer;transition:all .2s;box-shadow:0 0 12px rgba(0,212,255,0.1)}
|
||||
button:hover{background:rgba(0,212,255,0.2);box-shadow:0 0 20px rgba(0,212,255,0.3)}
|
||||
.err{color:var(--red);font-size:0.85rem;text-align:center;letter-spacing:1px;min-height:20px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="scanlines"></div>
|
||||
<div id="screen">
|
||||
<div class="reactor">
|
||||
<div class="ring r1"></div><div class="ring r2"></div>
|
||||
<div class="ring r3"></div><div class="ring r4"></div>
|
||||
<div class="core"></div><div class="ticks"></div>
|
||||
</div>
|
||||
<h1>JARVIS</h1>
|
||||
<p class="sub">Just A Rather Very Intelligent System</p>
|
||||
<form method="POST" action="/login.php">
|
||||
<input type="text" name="username" placeholder="IDENTIFICATION" autocomplete="username" value="myron"/>
|
||||
<input type="password" name="password" placeholder="ACCESS CODE" autocomplete="current-password"/>
|
||||
<button type="submit">INITIALIZE SYSTEM</button>
|
||||
<?php if ($error): ?>
|
||||
<div class="err"><?= htmlspecialchars($error) ?></div>
|
||||
<?php else: ?>
|
||||
<div class="err"></div>
|
||||
<?php endif; ?>
|
||||
</form>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user