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);
}
* {