diff --git a/client/index.html b/client/index.html index 1fab440..5b1c6d3 100644 --- a/client/index.html +++ b/client/index.html @@ -7,7 +7,7 @@ Chat E2EE - Minimal & Secure - + diff --git a/client/src/components/CallOverlay/CallOverlay.css b/client/src/components/CallOverlay/CallOverlay.css index eb7837c..13eddb4 100644 --- a/client/src/components/CallOverlay/CallOverlay.css +++ b/client/src/components/CallOverlay/CallOverlay.css @@ -1,90 +1,92 @@ /** - * Call overlay styles + * Call overlay styles – terminal theme */ .blur-overlay { position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; + inset: 0; z-index: 200; display: flex; justify-content: center; align-items: center; - background: rgba(15, 23, 42, 0.8); + background: rgba(0, 0, 0, 0.88); padding: 1rem; padding-bottom: calc(1rem + env(safe-area-inset-bottom)); - animation: fadeIn 0.3s ease; + animation: fadeIn 0.25s ease; } @keyframes fadeIn { - from { - opacity: 0; - } - - to { - opacity: 1; - } + from { opacity: 0; } + to { opacity: 1; } } .call-info { text-align: center; + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; } +/* Terminal-style pulsing avatar */ .call-avatar { - width: 120px; - height: 120px; + width: 110px; + height: 110px; border-radius: 50%; - background: var(--glass); - margin: 0 auto 1.5rem; + background: rgba(0, 10, 0, 0.9); + margin-bottom: 1rem; border: 2px solid var(--primary); + box-shadow: var(--glow-md), inset var(--glow-sm); + position: relative; + overflow: hidden; } -.shimmer { - background: linear-gradient(90deg, var(--glass) 25%, rgba(99, 102, 241, 0.2) 50%, var(--glass) 75%); - background-size: 200% 100%; - animation: shimmer 1.5s infinite; +.call-avatar::after { + content: ''; + position: absolute; + inset: 0; + border-radius: 50%; + background: radial-gradient(circle at 40% 35%, var(--primary-dim), transparent 60%); } -@keyframes shimmer { - 0% { - background-position: 200% 0; - } +.shimmer { + animation: callPulse 1.8s ease-in-out infinite; +} - 100% { - background-position: -200% 0; - } +@keyframes callPulse { + 0%, 100% { box-shadow: var(--glow-md), inset var(--glow-sm); } + 50% { box-shadow: var(--glow-lg), inset var(--glow-md); } } .call-status { - font-size: 1.5rem; - margin-bottom: 0.5rem; - color: white; + font-size: 1.25rem; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + color: var(--primary); + text-shadow: var(--glow-md); } .call-duration { color: var(--text-muted); - margin-bottom: 2rem; - font-size: 1.1rem; + margin-bottom: 1.75rem; + font-size: 0.95rem; + letter-spacing: 0.12em; + font-variant-numeric: tabular-nums; } /* Mobile responsive */ @media (max-width: 480px) { - .blur-overlay { - padding: 1rem; - } - .call-avatar { - width: 100px; - height: 100px; + width: 90px; + height: 90px; } .call-status { - font-size: 1.25rem; + font-size: 1.05rem; } .call-duration { - margin-bottom: 1.5rem; + margin-bottom: 1.25rem; } -} \ No newline at end of file +} diff --git a/client/src/components/ChatContainer/ChatContainer.css b/client/src/components/ChatContainer/ChatContainer.css index 9feae0c..7029894 100644 --- a/client/src/components/ChatContainer/ChatContainer.css +++ b/client/src/components/ChatContainer/ChatContainer.css @@ -1,23 +1,23 @@ /** - * Chat container styles + * Chat container styles – terminal theme */ #chat-container { width: 100%; - max-width: 800px; + max-width: 820px; height: 100%; - max-height: 800px; + max-height: 820px; display: flex; flex-direction: column; - border-radius: 2rem; + border-radius: 0.25rem; overflow: hidden; - opacity: 1; - transition: all 0.3s ease; + border: 1px solid var(--glass-border); + box-shadow: var(--glow-sm), 0 0 60px rgba(0, 0, 0, 0.8); + background: rgba(0, 8, 0, 0.95); } #chat-container.hidden { display: none; - opacity: 0; } /* Mobile responsive */ @@ -26,5 +26,6 @@ max-width: 100%; max-height: 100%; border-radius: 0; + border: none; } -} \ No newline at end of file +} diff --git a/client/src/components/ChatContainer/ChatFooter.css b/client/src/components/ChatContainer/ChatFooter.css index a7c16b0..239c9f2 100644 --- a/client/src/components/ChatContainer/ChatFooter.css +++ b/client/src/components/ChatContainer/ChatFooter.css @@ -1,48 +1,65 @@ /** - * Chat footer styles + * Chat footer styles – terminal theme */ .chat-footer { - padding: 1.5rem; + padding: 0.875rem 1.25rem; + border-top: 1px solid var(--glass-border); + background: rgba(0, 10, 0, 0.98); + flex-shrink: 0; } .input-container { display: flex; - gap: 0.75rem; + gap: 0.625rem; align-items: center; } +/* Terminal prompt prefix */ +.input-container::before { + content: '>'; + color: var(--primary); + font-size: 1rem; + font-weight: 700; + flex-shrink: 0; + text-shadow: var(--glow-sm); + user-select: none; +} + .message-input { flex: 1; - padding: 0.75rem 1rem; - background: rgba(0, 0, 0, 0.2); - border: 1px solid var(--glass-border); - border-radius: 0.75rem; - color: white; + padding: 0.65rem 0.9rem; + background: rgba(0, 5, 0, 0.85); + border: 1px solid rgba(0, 255, 65, 0.2); + border-radius: 0.2rem; + color: var(--text); font-family: inherit; - font-size: 1rem; - transition: all 0.2s; + font-size: 0.9rem; + transition: border-color 0.15s ease, box-shadow 0.15s ease; + caret-color: var(--primary); + min-width: 0; +} + +.message-input::placeholder { + color: var(--text-muted); + opacity: 0.6; } .message-input:focus { outline: none; border-color: var(--primary); - background: rgba(0, 0, 0, 0.4); -} - -.message-input::placeholder { - color: var(--text-muted); + box-shadow: var(--glow-sm); } .message-input:disabled { - opacity: 0.6; + opacity: 0.4; cursor: not-allowed; } /* Mobile responsive */ @media (max-width: 480px) { .chat-footer { - padding: 0.75rem; + padding: 0.75rem 1rem; padding-bottom: calc(0.75rem + env(safe-area-inset-bottom)); } @@ -52,6 +69,6 @@ .message-input { font-size: 16px; - /* Prevents zoom on iOS */ + /* Prevents iOS zoom */ } -} \ No newline at end of file +} diff --git a/client/src/components/ChatContainer/ChatHeader.css b/client/src/components/ChatContainer/ChatHeader.css index 661c3d8..3af1fee 100644 --- a/client/src/components/ChatContainer/ChatHeader.css +++ b/client/src/components/ChatContainer/ChatHeader.css @@ -1,112 +1,135 @@ /** - * Chat header styles + * Chat header styles – terminal theme */ .chat-header { - padding: 1.5rem; + padding: 0.875rem 1.25rem; display: flex; justify-content: space-between; align-items: center; gap: 1rem; - flex-wrap: wrap; + border-bottom: 1px solid var(--glass-border); + background: rgba(0, 10, 0, 0.98); + flex-shrink: 0; +} + +/* Terminal title bar row */ +.chat-header::before { + display: none; /* used via pseudo on parent if needed */ } .header-info { flex: 1; + min-width: 0; } .title-row { display: flex; align-items: center; - gap: 0.75rem; - margin-bottom: 0.25rem; + gap: 0.625rem; + margin-bottom: 0.2rem; } +/* Blinking status dot */ .status-dot { - width: 8px; - height: 8px; + width: 7px; + height: 7px; border-radius: 50%; background: var(--text-muted); - transition: all 0.3s ease; + flex-shrink: 0; + transition: background 0.3s ease, box-shadow 0.3s ease; } .status-dot.connected { background: var(--success); - box-shadow: 0 0 8px var(--success); + box-shadow: var(--glow-md); + animation: pulse 2s ease-in-out infinite; +} + +@keyframes pulse { + 0%, 100% { box-shadow: var(--glow-md); } + 50% { box-shadow: var(--glow-sm); } } .channel-title { - font-size: 1.25rem; - font-weight: 600; + font-size: 0.95rem; + font-weight: 700; + color: var(--primary); + letter-spacing: 0.06em; + text-transform: uppercase; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .badge { - font-size: 0.7rem; - background: rgba(16, 185, 129, 0.2); - color: var(--success); - padding: 2px 8px; - border-radius: 1rem; - font-weight: 600; + font-size: 0.6rem; + background: rgba(0, 255, 65, 0.1); + color: var(--primary); + padding: 1px 7px; + border-radius: 0.1rem; + font-weight: 700; + letter-spacing: 0.1em; + border: 1px solid rgba(0, 255, 65, 0.3); + text-shadow: var(--glow-sm); } .hash-badge-container { display: flex; align-items: center; - gap: 0.5rem; - background: rgba(255, 255, 255, 0.05); - padding: 0.25rem 0.5rem; - border-radius: 0.5rem; - margin-top: 0.5rem; + gap: 0.4rem; + background: rgba(0, 255, 65, 0.03); + padding: 0.2rem 0.5rem; + border-radius: 0.15rem; + margin-top: 0.3rem; width: fit-content; - border: 1px solid var(--glass-border); + border: 1px solid rgba(0, 255, 65, 0.12); position: relative; } .hash-text { - font-family: monospace; - font-size: 0.75rem; + font-family: inherit; + font-size: 0.7rem; color: var(--text-muted); word-break: break-all; + letter-spacing: 0.03em; } .copy-feedback-small { position: absolute; - top: -20px; + top: -18px; right: 0; - font-size: 0.75rem; + font-size: 0.65rem; color: var(--success); white-space: nowrap; + letter-spacing: 0.04em; } .participant-info { - font-size: 0.8rem; + font-size: 0.7rem; color: var(--text-muted); - margin-top: 0.25rem; + margin-top: 0.2rem; + letter-spacing: 0.03em; } .header-actions { display: flex; - gap: 0.5rem; + gap: 0.25rem; + flex-shrink: 0; } /* Mobile responsive */ @media (max-width: 480px) { .chat-header { - padding: 0.875rem 1rem; - padding-top: calc(0.875rem + env(safe-area-inset-top)); - flex-direction: column; - align-items: flex-start; + padding: 0.75rem 1rem; + padding-top: calc(0.75rem + env(safe-area-inset-top)); } .channel-title { - font-size: 1.05rem; + font-size: 0.875rem; } .hash-badge-container { display: none; } - - .header-actions { - align-self: flex-end; - } -} \ No newline at end of file +} diff --git a/client/src/components/ChatContainer/MessageBubble.css b/client/src/components/ChatContainer/MessageBubble.css index 4e7f773..f64d0e9 100644 --- a/client/src/components/ChatContainer/MessageBubble.css +++ b/client/src/components/ChatContainer/MessageBubble.css @@ -1,23 +1,22 @@ /** - * Message bubble styles + * Message bubble styles – terminal theme */ .message { - max-width: 70%; - padding: 0.75rem 1rem; - border-radius: 1.25rem; - font-size: 0.95rem; - line-height: 1.4; + max-width: 72%; + padding: 0.6rem 0.9rem; + border-radius: 0.2rem; + font-size: 0.875rem; + line-height: 1.5; position: relative; - animation: slideUp 0.3s ease-out; + animation: msgIn 0.2s ease-out; } -@keyframes slideUp { +@keyframes msgIn { from { opacity: 0; - transform: translateY(10px); + transform: translateY(6px); } - to { opacity: 1; transform: translateY(0); @@ -26,37 +25,58 @@ .message.sent { align-self: flex-end; - background: var(--primary); - border-bottom-right-radius: 0.25rem; - color: white; - margin-left: auto; + background: rgba(0, 50, 10, 0.8); + border: 1px solid rgba(0, 255, 65, 0.35); + border-bottom-right-radius: 0; + color: var(--text); + box-shadow: var(--glow-sm); } .message.received { align-self: flex-start; - background: var(--glass); - border: 1px solid var(--glass-border); - border-bottom-left-radius: 0.25rem; + background: rgba(0, 8, 0, 0.9); + border: 1px solid rgba(0, 255, 65, 0.15); + border-bottom-left-radius: 0; +} + +/* Small left marker on received messages */ +.message.received::before { + content: ''; + position: absolute; + left: -4px; + top: 50%; + transform: translateY(-50%); + width: 2px; + height: 60%; + background: rgba(0, 255, 65, 0.3); + border-radius: 1px; } .message-text { word-wrap: break-word; overflow-wrap: break-word; + color: var(--text); +} + +.message.sent .message-text { + color: #c8ffcc; } .message-meta { - font-size: 0.7rem; - color: rgba(255, 255, 255, 0.5); - margin-top: 0.25rem; + font-size: 0.63rem; + color: var(--text-muted); + margin-top: 0.3rem; display: flex; justify-content: space-between; - gap: 0.5rem; + gap: 0.75rem; + letter-spacing: 0.03em; + opacity: 0.7; } /* Mobile responsive */ @media (max-width: 480px) { .message { - max-width: 85%; - font-size: 0.9rem; + max-width: 86%; + font-size: 0.85rem; } -} \ No newline at end of file +} diff --git a/client/src/components/ChatContainer/MessagesArea.css b/client/src/components/ChatContainer/MessagesArea.css index a2d0877..7885feb 100644 --- a/client/src/components/ChatContainer/MessagesArea.css +++ b/client/src/components/ChatContainer/MessagesArea.css @@ -1,51 +1,61 @@ /** - * Messages area styles + * Messages area styles – terminal theme */ .messages-area { flex: 1; overflow-y: auto; - padding: 1.5rem; + padding: 1.25rem; display: flex; flex-direction: column; - gap: 1rem; + gap: 0.75rem; scroll-behavior: smooth; + background: rgba(0, 5, 0, 0.6); } .empty-state { display: flex; + flex-direction: column; align-items: center; justify-content: center; height: 100%; + gap: 0.5rem; color: var(--text-muted); } .empty-state p { + font-size: 0.8rem; + letter-spacing: 0.06em; text-align: center; } -/* Scrollbar styling */ +.empty-state p::before { + content: '$ '; + opacity: 0.5; +} + +/* Scrollbar */ .messages-area::-webkit-scrollbar { - width: 8px; + width: 5px; } .messages-area::-webkit-scrollbar-track { - background: rgba(255, 255, 255, 0.05); + background: rgba(0, 255, 65, 0.02); } .messages-area::-webkit-scrollbar-thumb { - background: rgba(99, 102, 241, 0.4); - border-radius: 4px; + background: rgba(0, 255, 65, 0.2); + border-radius: 3px; } .messages-area::-webkit-scrollbar-thumb:hover { - background: rgba(99, 102, 241, 0.6); + background: rgba(0, 255, 65, 0.4); } /* Mobile responsive */ @media (max-width: 480px) { .messages-area { padding: 0.875rem 0.75rem; - gap: 0.75rem; + gap: 0.625rem; } -} \ No newline at end of file +} diff --git a/client/src/components/SetupOverlay/CreateHashView.css b/client/src/components/SetupOverlay/CreateHashView.css index 81c6ea7..57cd336 100644 --- a/client/src/components/SetupOverlay/CreateHashView.css +++ b/client/src/components/SetupOverlay/CreateHashView.css @@ -1,23 +1,28 @@ /** - * Create hash view styles + * Create hash view styles – terminal theme */ .create-hash-view { display: flex; flex-direction: column; - gap: 1.5rem; + gap: 1.25rem; } .copy-feedback { - font-size: 0.85rem; + font-size: 0.75rem; color: var(--success); - margin-top: 0.5rem; + margin-top: 0.35rem; display: block; + letter-spacing: 0.06em; +} + +.copy-feedback::before { + content: '✓ '; } .button-group { display: grid; grid-template-columns: 1fr 1fr; - gap: 1rem; - margin-top: 1rem; -} \ No newline at end of file + gap: 0.875rem; + margin-top: 0.5rem; +} diff --git a/client/src/components/SetupOverlay/InitialActions.css b/client/src/components/SetupOverlay/InitialActions.css index 51c03ca..5e2b181 100644 --- a/client/src/components/SetupOverlay/InitialActions.css +++ b/client/src/components/SetupOverlay/InitialActions.css @@ -5,5 +5,5 @@ .initial-actions { display: flex; flex-direction: column; - gap: 1rem; -} \ No newline at end of file + gap: 0.875rem; +} diff --git a/client/src/components/SetupOverlay/JoinHashView.css b/client/src/components/SetupOverlay/JoinHashView.css index a460154..33b5c3d 100644 --- a/client/src/components/SetupOverlay/JoinHashView.css +++ b/client/src/components/SetupOverlay/JoinHashView.css @@ -1,15 +1,15 @@ /** - * Join hash view styles + * Join hash view styles – terminal theme */ .join-hash-view { display: flex; flex-direction: column; - gap: 1.5rem; + gap: 1.25rem; } .button-group { display: grid; grid-template-columns: 1fr 1fr; - gap: 1rem; -} \ No newline at end of file + gap: 0.875rem; +} diff --git a/client/src/components/SetupOverlay/SetupOverlay.css b/client/src/components/SetupOverlay/SetupOverlay.css index 5743be4..3e7b7c9 100644 --- a/client/src/components/SetupOverlay/SetupOverlay.css +++ b/client/src/components/SetupOverlay/SetupOverlay.css @@ -1,19 +1,16 @@ /** - * SetupOverlay styles + * SetupOverlay styles – terminal theme */ .overlay { position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; + inset: 0; z-index: 100; display: flex; justify-content: center; align-items: center; padding: 20px; - opacity: 1; + background: rgba(0, 0, 0, 0.6); transition: opacity 0.3s ease; } @@ -24,38 +21,62 @@ .overlay-content { width: 100%; - max-width: 400px; + max-width: 420px; padding: 2.5rem; - border-radius: 2rem; + border-radius: 0.25rem; text-align: center; } +/* Terminal "window chrome" top bar */ +.overlay-content::before { + content: '■ ■ ■ SECURE_TERMINAL v2'; + display: block; + font-size: 0.65rem; + letter-spacing: 0.12em; + color: var(--text-muted); + background: rgba(0, 255, 65, 0.05); + border-bottom: 1px solid var(--glass-border); + margin: -2.5rem -2.5rem 2rem -2.5rem; + padding: 0.5rem 1rem; + text-align: left; +} + .overlay-content h1 { - font-size: 2rem; - margin-bottom: 0.5rem; - font-weight: 600; + font-size: 1.6rem; + margin-bottom: 0.4rem; + font-weight: 700; + color: var(--primary); + letter-spacing: 0.05em; + text-shadow: var(--glow-md); } .overlay-content p { color: var(--text-muted); margin-bottom: 2rem; - font-size: 0.9rem; + font-size: 0.78rem; + letter-spacing: 0.04em; } .setup-status { margin-top: 1.5rem; - padding: 0.75rem 1rem; - background: rgba(99, 102, 241, 0.1); - border: 1px solid var(--primary); - border-radius: 0.5rem; + padding: 0.65rem 1rem; + background: rgba(0, 255, 65, 0.05); + border: 1px solid rgba(0, 255, 65, 0.3); + border-radius: 0.2rem; color: var(--primary); - font-size: 0.9rem; - text-align: center; + font-size: 0.8rem; + text-align: left; + font-family: inherit; +} + +.setup-status::before { + content: '$ '; + opacity: 0.5; } .setup-status.error { - background: rgba(239, 68, 68, 0.1); - border-color: var(--danger); + background: rgba(255, 34, 68, 0.06); + border-color: rgba(255, 34, 68, 0.4); color: var(--danger); } @@ -64,20 +85,25 @@ .overlay { align-items: flex-end; padding: 0; + background: rgba(0, 0, 0, 0.7); } .overlay-content { max-width: 100%; - border-radius: 1.75rem 1.75rem 0 0; - padding: 1.75rem 1.25rem; - padding-bottom: calc(1.75rem + env(safe-area-inset-bottom)); + border-radius: 0.5rem 0.5rem 0 0; + padding: 2rem 1.25rem; + padding-bottom: calc(2rem + env(safe-area-inset-bottom)); + } + + .overlay-content::before { + margin: -2rem -1.25rem 1.5rem -1.25rem; } .overlay-content h1 { - font-size: 1.5rem; + font-size: 1.25rem; } .overlay-content p { - font-size: 0.85rem; + font-size: 0.75rem; } -} \ No newline at end of file +} diff --git a/client/src/components/SetupOverlay/SetupOverlay.tsx b/client/src/components/SetupOverlay/SetupOverlay.tsx index 1114185..cff469f 100644 --- a/client/src/components/SetupOverlay/SetupOverlay.tsx +++ b/client/src/components/SetupOverlay/SetupOverlay.tsx @@ -99,8 +99,8 @@ export const SetupOverlay: React.FC = ({ onSetupComplete, isH return (
-

Secure Messenger

-

Simple. End-to-End Encrypted. Private.

+

CHAT_E2EE

+

// end-to-end encrypted · zero knowledge · ephemeral

{view === 'initial' && ( '; + opacity: 0.6; +} + .input-field { width: 100%; - padding: 0.75rem 1rem; - background: rgba(0, 0, 0, 0.2); - border: 1px solid var(--glass-border); - border-radius: 0.75rem; - color: white; + padding: 0.7rem 1rem; + background: rgba(0, 5, 0, 0.85); + border: 1px solid rgba(0, 255, 65, 0.2); + border-radius: 0.2rem; + color: var(--text); font-family: inherit; - font-size: 1rem; - transition: all 0.2s; + font-size: 0.9rem; + transition: border-color 0.15s ease, box-shadow 0.15s ease; + caret-color: var(--primary); +} + +.input-field::placeholder { + color: var(--text-muted); + opacity: 0.7; } .input-field:focus { outline: none; border-color: var(--primary); - background: rgba(0, 0, 0, 0.4); + box-shadow: var(--glow-sm); + background: rgba(0, 8, 0, 0.95); } .input-field:read-only { - cursor: not-allowed; - opacity: 0.8; + cursor: default; + color: var(--text-muted); + border-color: rgba(0, 255, 65, 0.1); } /* Copy input container */ @@ -49,4 +62,4 @@ .copy-input .input-field { flex: 1; -} \ No newline at end of file +} diff --git a/client/src/styles/global.css b/client/src/styles/global.css index 5787ed4..ae97e9d 100644 --- a/client/src/styles/global.css +++ b/client/src/styles/global.css @@ -1,21 +1,34 @@ /** - * Global CSS variables + * Global CSS variables – hacker / terminal dark theme */ :root { - --primary: #6366f1; - --primary-hover: #4f46e5; - --bg: #0f172a; - --card-bg: rgba(30, 41, 59, 0.7); - --text: #f8fafc; - --text-muted: #94a3b8; - --danger: #ef4444; - --success: #10b981; - --glass: rgba(255, 255, 255, 0.05); - --glass-border: rgba(255, 255, 255, 0.1); + /* Palette */ + --primary: #00ff41; + --primary-hover: #33ff6a; + --primary-dim: rgba(0, 255, 65, 0.12); + --bg: #080808; + --surface: #0d0d0d; + --surface-alt: #111111; + --text: #d4ffd4; + --text-bright: #00ff41; + --text-muted: #4d8c5e; + --danger: #ff2244; + --danger-hover: #cc1133; + --success: #00ff41; + --accent: #00ccff; + --glass: rgba(0, 255, 65, 0.03); + --glass-border: rgba(0, 255, 65, 0.18); + + /* Glows */ + --glow-sm: 0 0 6px rgba(0, 255, 65, 0.25); + --glow-md: 0 0 14px rgba(0, 255, 65, 0.35); + --glow-lg: 0 0 28px rgba(0, 255, 65, 0.4); } -* { +*, +*::before, +*::after { box-sizing: border-box; margin: 0; padding: 0; @@ -28,15 +41,34 @@ body { } body { - font-family: 'Outfit', sans-serif; + font-family: 'JetBrains Mono', 'Fira Code', 'Courier New', monospace; background-color: var(--bg); color: var(--text); height: 100vh; height: 100dvh; overflow: hidden; - background-image: radial-gradient(at 0% 0%, hsla(253, 16%, 7%, 1) 0, transparent 50%), - radial-gradient(at 50% 0%, hsla(225, 39%, 30%, 1) 0, transparent 50%), - radial-gradient(at 100% 0%, hsla(339, 49%, 30%, 1) 0, transparent 50%); + + /* Subtle terminal grid */ + background-image: + linear-gradient(rgba(0, 255, 65, 0.025) 1px, transparent 1px), + linear-gradient(90deg, rgba(0, 255, 65, 0.025) 1px, transparent 1px); + background-size: 40px 40px; +} + +/* CRT scanline overlay */ +body::after { + content: ''; + position: fixed; + inset: 0; + background: repeating-linear-gradient( + 0deg, + transparent, + transparent 3px, + rgba(0, 0, 0, 0.06) 3px, + rgba(0, 0, 0, 0.06) 4px + ); + pointer-events: none; + z-index: 9999; } #root, @@ -48,39 +80,37 @@ body { padding: 20px; } +/* Terminal surface (replaces glassmorphism) */ .glass { - background: var(--glass); - backdrop-filter: blur(12px); - -webkit-backdrop-filter: blur(12px); + background: rgba(0, 10, 0, 0.92); border: 1px solid var(--glass-border); - box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37); + box-shadow: var(--glow-sm), inset 0 0 40px rgba(0, 0, 0, 0.5); } .hidden { display: none !important; } -/* Scrollbar styling */ +/* Scrollbar */ ::-webkit-scrollbar { - width: 8px; + width: 6px; } ::-webkit-scrollbar-track { - background: rgba(255, 255, 255, 0.05); + background: rgba(0, 255, 65, 0.03); } ::-webkit-scrollbar-thumb { - background: rgba(99, 102, 241, 0.4); - border-radius: 4px; + background: rgba(0, 255, 65, 0.25); + border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { - background: rgba(99, 102, 241, 0.6); + background: rgba(0, 255, 65, 0.45); } -/* Mobile responsive */ +/* Mobile */ @media (max-width: 480px) { - #root, #app { padding: 0; @@ -91,4 +121,4 @@ body { height: 100vh; height: 100dvh; } -} \ No newline at end of file +} diff --git a/client/style.css b/client/style.css index bdfe749..b6a2b54 100644 --- a/client/style.css +++ b/client/style.css @@ -1,14 +1,14 @@ :root { - --primary: #6366f1; - --primary-hover: #4f46e5; - --bg: #0f172a; - --card-bg: rgba(30, 41, 59, 0.7); - --text: #f8fafc; - --text-muted: #94a3b8; - --danger: #ef4444; - --success: #10b981; - --glass: rgba(255, 255, 255, 0.05); - --glass-border: rgba(255, 255, 255, 0.1); + --primary: #00ff41; + --primary-hover: #33ff6a; + --bg: #080808; + --card-bg: rgba(0, 10, 0, 0.92); + --text: #d4ffd4; + --text-muted: #4d8c5e; + --danger: #ff2244; + --success: #00ff41; + --glass: rgba(0, 255, 65, 0.03); + --glass-border: rgba(0, 255, 65, 0.18); } * {