smodusermc commited on
Commit
eb5a39b
·
verified ·
1 Parent(s): cfd4888

Update static/style.css

Browse files
Files changed (1) hide show
  1. static/style.css +1049 -101
static/style.css CHANGED
@@ -1,103 +1,1051 @@
1
- /* ====== CSS Custom Properties (themes) ====== */
 
 
 
 
2
  :root {
3
- --bg-primary: #fff;
4
- --bg-secondary: #f0f0f0;
5
- --text-primary: #000;
6
- --text-secondary: #666;
7
- --bubble-self: #25D366;
8
- --bubble-other: #E5E5EA;
9
- --bubble-text-self: #000;
10
- --bubble-text-other: #000;
11
- --header-bg: #128C7E;
12
- --header-text: #fff;
13
- --input-bg: #fff;
14
- --input-border: #ccc;
15
- --shadow: 0 2px 4px rgba(0,0,0,0.1);
16
- }
17
-
18
- .theme-dark {
19
- --bg-primary: #121212;
20
- --bg-secondary: #1e1e1e;
21
- --text-primary: #fff;
22
- --text-secondary: #aaa;
23
- --bubble-self: #056162;
24
- --bubble-other: #262D31;
25
- --bubble-text-self: #fff;
26
- --bubble-text-other: #fff;
27
- --header-bg: #1e1e1e;
28
- --input-bg: #2a2f32;
29
- --input-border: #333;
30
- }
31
-
32
- .theme-custom {
33
- /* values set via JavaScript */
34
- }
35
-
36
- * { margin:0; padding:0; box-sizing:border-box; }
37
- body { font-family: system-ui, -apple-system, sans-serif; background: var(--bg-primary); color: var(--text-primary); height:100vh; overflow:hidden; }
38
-
39
- /* ====== Layout ====== */
40
- #app { height:100%; }
41
- .screen { display:flex; flex-direction:column; height:100%; }
42
- .hidden { display:none!important; }
43
-
44
- /* ====== Auth ====== */
45
- .auth-container { max-width:400px; margin:auto; padding:2rem; text-align:center; }
46
- .auth-container h1 { margin-bottom:2rem; color:var(--header-bg); }
47
- .auth-tabs { display:flex; margin-bottom:1rem; border-bottom:2px solid var(--input-border); }
48
- .tab { flex:1; padding:0.75rem; background:none; border:none; color:var(--text-secondary); font-weight:500; cursor:pointer; }
49
- .tab.active { color:var(--header-bg); border-bottom:3px solid var(--header-bg); }
50
- #auth-form input { width:100%; margin:0.5rem 0; padding:0.75rem; border:1px solid var(--input-border); border-radius:8px; background:var(--input-bg); color:var(--text-primary); }
51
- #auth-form button { width:100%; padding:0.75rem; background:var(--header-bg); color:var(--header-text); border:none; border-radius:8px; font-size:1rem; margin-top:1rem; cursor:pointer; }
52
- .error-msg { color:red; margin-top:1rem; }
53
-
54
- /* ====== Chat header ====== */
55
- .chat-header { display:flex; align-items:center; justify-content:space-between; padding:0.75rem 1rem; background:var(--header-bg); color:var(--header-text); min-height:60px; }
56
- .icon-btn { background:none; border:none; color:inherit; font-size:1.5rem; cursor:pointer; padding:0.25rem; }
57
-
58
- /* ====== Typing ====== */
59
- #typing-indicator { height:24px; font-size:0.85rem; padding:0 1rem; color:var(--text-secondary); background:var(--bg-secondary); display:flex; align-items:center; }
60
-
61
- /* ====== Messages ====== */
62
- #messages-container { flex:1; overflow-y:auto; padding:1rem; background:var(--bg-primary); }
63
- #messages-list { display:flex; flex-direction:column; gap:0.25rem; }
64
- .message-bubble { max-width:80%; margin-bottom:0.25rem; }
65
- .message-self { align-self:flex-end; background:var(--bubble-self); color:var(--bubble-text-self); border-radius:18px 18px 0 18px; padding:0.6rem 1rem; }
66
- .message-other { align-self:flex-start; background:var(--bubble-other); color:var(--bubble-text-other); border-radius:18px 18px 18px 0; padding:0.6rem 1rem; }
67
- .message-info { display:flex; justify-content:space-between; font-size:0.7rem; opacity:0.8; margin-bottom:0.1rem; }
68
- .message-actions { display:flex; gap:0.25rem; margin-top:0.25rem; font-size:0.8rem; }
69
- .reply-indicator { font-size:0.8rem; padding:0.2rem 0.5rem; background:rgba(0,0,0,0.1); border-radius:8px; margin-bottom:0.25rem; }
70
- .edited-label { font-style:italic; opacity:0.7; font-size:0.75rem; }
71
- .deleted-bubble { opacity:0.6; font-style:italic; }
72
- .attachment img, .attachment video { max-width:100%; max-height:300px; border-radius:8px; margin-top:0.5rem; }
73
- .attachment audio { width:100%; margin-top:0.5rem; }
74
- .attachment .file-preview { display:flex; align-items:center; gap:0.5rem; background:rgba(0,0,0,0.05); padding:0.5rem; border-radius:8px; cursor:pointer; }
75
- /* Read receipts (ticks) */
76
- .read-status { display:inline-block; margin-left:0.2rem; font-size:0.7rem; }
77
- .read-status.double-check { color:var(--header-bg); }
78
- .read-status.single-check { color:var(--text-secondary); }
79
-
80
- /* ====== Reply preview ====== */
81
- #reply-preview { background:var(--bg-secondary); padding:0.5rem 1rem; display:flex; align-items:center; justify-content:space-between; }
82
-
83
- /* ====== Compose ====== */
84
- .compose-area { display:flex; align-items:center; padding:0.5rem; background:var(--input-bg); border-top:1px solid var(--input-border); }
85
- .compose-area textarea { flex:1; resize:none; border:1px solid var(--input-border); border-radius:20px; padding:0.6rem 1rem; background:var(--bg-primary); color:var(--text-primary); outline:none; font-family:inherit; }
86
- #send-btn { background:var(--header-bg); color:white; border:none; border-radius:50%; width:40px; height:40px; font-size:1.2rem; margin-left:0.5rem; cursor:pointer; }
87
- #upload-progress { padding:0.5rem; background:var(--bg-secondary); display:flex; align-items:center; gap:0.5rem; }
88
-
89
- /* ====== Settings modal ====== */
90
- .modal { position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.5); display:flex; justify-content:center; align-items:center; z-index:1000; }
91
- .modal-content { background:var(--bg-primary); padding:2rem; border-radius:12px; width:90%; max-width:400px; }
92
- .setting-group { margin-bottom:1rem; }
93
- .setting-group label { display:block; margin-bottom:0.25rem; font-weight:500; }
94
- .setting-group input[type="text"], .setting-group select { width:100%; padding:0.5rem; border:1px solid var(--input-border); border-radius:6px; background:var(--input-bg); color:var(--text-primary); }
95
- .avatar-preview { width:60px; height:60px; border-radius:50%; object-fit:cover; display:block; margin-top:0.5rem; }
96
- .modal-actions { display:flex; justify-content:flex-end; gap:0.5rem; margin-top:1rem; }
97
- .modal-actions button { padding:0.5rem 1rem; border:none; border-radius:6px; background:var(--header-bg); color:white; cursor:pointer; }
98
- #load-more { text-align:center; margin:1rem; }
99
-
100
- @media (min-width:768px) {
101
- .message-bubble { max-width:60%; }
102
- .compose-area { padding:0.75rem 1rem; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  }
 
1
+ /* =============================================
2
+ InfinityChat - Professional Design System
3
+ ============================================= */
4
+
5
+ /* CSS Variables - Theme System */
6
  :root {
7
+ /* Base Colors */
8
+ --color-primary: #2563EB;
9
+ --color-primary-dark: #1D4ED8;
10
+ --color-primary-light: #DBEAFE;
11
+
12
+ --color-bg: #FFFFFF;
13
+ --color-bg-secondary: #F9FAFB;
14
+ --color-bg-tertiary: #F3F4F6;
15
+
16
+ --color-text: #111827;
17
+ --color-text-secondary: #6B7280;
18
+ --color-text-tertiary: #9CA3AF;
19
+
20
+ --color-border: #E5E7EB;
21
+ --color-border-light: #F3F4F6;
22
+
23
+ /* Bubble Colors */
24
+ --bubble-self: var(--color-primary);
25
+ --bubble-self-text: #FFFFFF;
26
+ --bubble-other: var(--color-bg-tertiary);
27
+ --bubble-other-text: var(--color-text);
28
+
29
+ /* Header */
30
+ --header-bg: var(--color-bg);
31
+ --header-border: var(--color-border);
32
+
33
+ /* Input */
34
+ --input-bg: var(--color-bg-tertiary);
35
+ --input-border: var(--color-border);
36
+ --input-focus: var(--color-primary);
37
+
38
+ /* Shadows */
39
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
40
+ --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07);
41
+ --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
42
+
43
+ /* Typography */
44
+ --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
45
+ --font-mono: 'SF Mono', 'Fira Code', monospace;
46
+
47
+ /* Spacing */
48
+ --space-xs: 0.25rem;
49
+ --space-sm: 0.5rem;
50
+ --space-md: 1rem;
51
+ --space-lg: 1.5rem;
52
+ --space-xl: 2rem;
53
+
54
+ /* Border Radius */
55
+ --radius-sm: 6px;
56
+ --radius-md: 8px;
57
+ --radius-lg: 12px;
58
+ --radius-xl: 16px;
59
+ --radius-full: 9999px;
60
+
61
+ /* Transitions */
62
+ --transition-fast: 150ms ease;
63
+ --transition-normal: 250ms ease;
64
+ }
65
+
66
+ /* Dark Theme */
67
+ [data-theme="dark"] {
68
+ --color-primary: #60A5FA;
69
+ --color-primary-dark: #3B82F6;
70
+ --color-primary-light: #1E3A5F;
71
+
72
+ --color-bg: #111827;
73
+ --color-bg-secondary: #1F2937;
74
+ --color-bg-tertiary: #374151;
75
+
76
+ --color-text: #F9FAFB;
77
+ --color-text-secondary: #9CA3AF;
78
+ --color-text-tertiary: #6B7280;
79
+
80
+ --color-border: #374151;
81
+ --color-border-light: #1F2937;
82
+
83
+ --bubble-self: var(--color-primary);
84
+ --bubble-self-text: #111827;
85
+ --bubble-other: var(--color-bg-tertiary);
86
+ --bubble-other-text: var(--color-text);
87
+
88
+ --header-bg: var(--color-bg-secondary);
89
+ --header-border: var(--color-border);
90
+
91
+ --input-bg: var(--color-bg-tertiary);
92
+ --input-border: var(--color-border);
93
+
94
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
95
+ --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.4);
96
+ }
97
+
98
+ /* Custom Theme */
99
+ [data-theme="custom"] {
100
+ /* Values set by JavaScript */
101
+ }
102
+
103
+ /* =============================================
104
+ Reset & Base Styles
105
+ ============================================= */
106
+ *, *::before, *::after {
107
+ margin: 0;
108
+ padding: 0;
109
+ box-sizing: border-box;
110
+ }
111
+
112
+ html {
113
+ font-size: 16px;
114
+ -webkit-text-size-adjust: 100%;
115
+ }
116
+
117
+ body {
118
+ font-family: var(--font-sans);
119
+ background: var(--color-bg);
120
+ color: var(--color-text);
121
+ height: 100vh;
122
+ width: 100vw;
123
+ overflow: hidden;
124
+ line-height: 1.5;
125
+ -webkit-font-smoothing: antialiased;
126
+ }
127
+
128
+ /* =============================================
129
+ Buttons
130
+ ============================================= */
131
+ .btn {
132
+ display: inline-flex;
133
+ align-items: center;
134
+ justify-content: center;
135
+ padding: 0.625rem 1.25rem;
136
+ font-size: 0.875rem;
137
+ font-weight: 500;
138
+ border: none;
139
+ border-radius: var(--radius-md);
140
+ cursor: pointer;
141
+ transition: all var(--transition-fast);
142
+ text-decoration: none;
143
+ gap: var(--space-sm);
144
+ }
145
+
146
+ .btn:disabled {
147
+ opacity: 0.5;
148
+ cursor: not-allowed;
149
+ }
150
+
151
+ .btn-primary {
152
+ background: var(--color-primary);
153
+ color: white;
154
+ box-shadow: var(--shadow-sm);
155
+ }
156
+
157
+ .btn-primary:hover:not(:disabled) {
158
+ background: var(--color-primary-dark);
159
+ box-shadow: var(--shadow-md);
160
+ transform: translateY(-1px);
161
+ }
162
+
163
+ .btn-secondary {
164
+ background: var(--color-bg-secondary);
165
+ color: var(--color-text);
166
+ border: 1px solid var(--color-border);
167
+ }
168
+
169
+ .btn-secondary:hover:not(:disabled) {
170
+ background: var(--color-bg-tertiary);
171
+ }
172
+
173
+ /* =============================================
174
+ Forms & Inputs
175
+ ============================================= */
176
+ .input-group {
177
+ display: flex;
178
+ flex-direction: column;
179
+ gap: var(--space-xs);
180
+ margin-bottom: var(--space-md);
181
+ }
182
+
183
+ .input-group label {
184
+ font-size: 0.875rem;
185
+ font-weight: 500;
186
+ color: var(--color-text);
187
+ }
188
+
189
+ .input {
190
+ width: 100%;
191
+ padding: 0.75rem 1rem;
192
+ font-size: 0.9375rem;
193
+ font-family: inherit;
194
+ color: var(--color-text);
195
+ background: var(--input-bg);
196
+ border: 1px solid var(--input-border);
197
+ border-radius: var(--radius-md);
198
+ outline: none;
199
+ transition: all var(--transition-fast);
200
+ }
201
+
202
+ .input:focus {
203
+ border-color: var(--input-focus);
204
+ box-shadow: 0 0 0 3px var(--color-primary-light);
205
+ }
206
+
207
+ .input::placeholder {
208
+ color: var(--color-text-tertiary);
209
+ }
210
+
211
+ select.input {
212
+ appearance: none;
213
+ background-image: url("data:image/svg+xml,%3Csvg width='10' height='6' viewBox='0 0 10 6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1L5 5L9 1' stroke='%236B7280' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
214
+ background-repeat: no-repeat;
215
+ background-position: right 1rem center;
216
+ padding-right: 2.5rem;
217
+ cursor: pointer;
218
+ }
219
+
220
+ /* =============================================
221
+ Auth Screen
222
+ ============================================= */
223
+ #auth-screen {
224
+ display: flex;
225
+ align-items: center;
226
+ justify-content: center;
227
+ min-height: 100vh;
228
+ background: linear-gradient(135deg, var(--color-bg-secondary) 0%, var(--color-bg) 100%);
229
+ padding: var(--space-xl);
230
+ }
231
+
232
+ .auth-container {
233
+ width: 100%;
234
+ max-width: 420px;
235
+ background: var(--color-bg);
236
+ border-radius: var(--radius-xl);
237
+ box-shadow: var(--shadow-lg);
238
+ padding: var(--space-xl);
239
+ position: relative;
240
+ z-index: 1;
241
+ }
242
+
243
+ .auth-logo {
244
+ text-align: center;
245
+ margin-bottom: var(--space-xl);
246
+ }
247
+
248
+ .auth-logo svg {
249
+ color: var(--color-primary);
250
+ margin-bottom: var(--space-sm);
251
+ }
252
+
253
+ .auth-logo h1 {
254
+ font-size: 1.75rem;
255
+ font-weight: 700;
256
+ color: var(--color-text);
257
+ margin-bottom: var(--space-xs);
258
+ }
259
+
260
+ .auth-subtitle {
261
+ font-size: 0.875rem;
262
+ color: var(--color-text-secondary);
263
+ }
264
+
265
+ .auth-tabs {
266
+ display: flex;
267
+ gap: var(--space-xs);
268
+ margin-bottom: var(--space-xl);
269
+ background: var(--color-bg-tertiary);
270
+ padding: var(--space-xs);
271
+ border-radius: var(--radius-md);
272
+ }
273
+
274
+ .auth-tab {
275
+ flex: 1;
276
+ padding: var(--space-sm) var(--space-md);
277
+ font-size: 0.875rem;
278
+ font-weight: 500;
279
+ color: var(--color-text-secondary);
280
+ background: transparent;
281
+ border: none;
282
+ border-radius: var(--radius-sm);
283
+ cursor: pointer;
284
+ transition: all var(--transition-fast);
285
+ }
286
+
287
+ .auth-tab.active {
288
+ background: var(--color-bg);
289
+ color: var(--color-text);
290
+ box-shadow: var(--shadow-sm);
291
+ }
292
+
293
+ .auth-form {
294
+ display: none;
295
+ }
296
+
297
+ .auth-form.active {
298
+ display: block;
299
+ }
300
+
301
+ .auth-form .btn {
302
+ width: 100%;
303
+ margin-top: var(--space-md);
304
+ }
305
+
306
+ .error-message {
307
+ margin-top: var(--space-md);
308
+ padding: var(--space-sm) var(--space-md);
309
+ background: #FEF2F2;
310
+ color: #DC2626;
311
+ border: 1px solid #FCA5A5;
312
+ border-radius: var(--radius-md);
313
+ font-size: 0.875rem;
314
+ display: none;
315
+ }
316
+
317
+ .error-message:not(:empty) {
318
+ display: block;
319
+ }
320
+
321
+ /* =============================================
322
+ Chat Screen
323
+ ============================================= */
324
+ #chat-screen {
325
+ display: none;
326
+ height: 100vh;
327
+ flex-direction: column;
328
+ }
329
+
330
+ #chat-screen.active {
331
+ display: flex;
332
+ }
333
+
334
+ /* Header */
335
+ .chat-header {
336
+ display: flex;
337
+ align-items: center;
338
+ justify-content: space-between;
339
+ padding: var(--space-md) var(--space-lg);
340
+ background: var(--header-bg);
341
+ border-bottom: 1px solid var(--header-border);
342
+ min-height: 64px;
343
+ flex-shrink: 0;
344
+ }
345
+
346
+ .header-center {
347
+ text-align: center;
348
+ }
349
+
350
+ .chat-title {
351
+ font-size: 1.0625rem;
352
+ font-weight: 600;
353
+ line-height: 1.3;
354
+ }
355
+
356
+ .online-count {
357
+ font-size: 0.75rem;
358
+ color: var(--color-text-secondary);
359
+ }
360
+
361
+ .icon-btn {
362
+ display: inline-flex;
363
+ align-items: center;
364
+ justify-content: center;
365
+ width: 40px;
366
+ height: 40px;
367
+ background: transparent;
368
+ border: none;
369
+ border-radius: var(--radius-md);
370
+ color: var(--color-text-secondary);
371
+ cursor: pointer;
372
+ transition: all var(--transition-fast);
373
+ }
374
+
375
+ .icon-btn:hover {
376
+ background: var(--color-bg-tertiary);
377
+ color: var(--color-text);
378
+ }
379
+
380
+ /* Typing Indicator */
381
+ .typing-indicator {
382
+ height: 28px;
383
+ display: flex;
384
+ align-items: center;
385
+ padding: 0 var(--space-lg);
386
+ font-size: 0.8125rem;
387
+ color: var(--color-text-secondary);
388
+ background: var(--color-bg);
389
+ border-bottom: 1px solid var(--color-border-light);
390
+ flex-shrink: 0;
391
+ }
392
+
393
+ /* Messages Container */
394
+ .messages-container {
395
+ flex: 1;
396
+ overflow-y: auto;
397
+ padding: var(--space-md);
398
+ background: var(--color-bg);
399
+ display: flex;
400
+ flex-direction: column;
401
+ }
402
+
403
+ .messages-list {
404
+ display: flex;
405
+ flex-direction: column;
406
+ gap: var(--space-xs);
407
+ padding-bottom: var(--space-md);
408
+ }
409
+
410
+ .load-more {
411
+ text-align: center;
412
+ padding: var(--space-md);
413
+ }
414
+
415
+ .load-more .btn {
416
+ font-size: 0.8125rem;
417
+ padding: var(--space-sm) var(--space-md);
418
+ }
419
+
420
+ /* Message Bubbles */
421
+ .message-bubble {
422
+ max-width: 75%;
423
+ margin-bottom: var(--space-xs);
424
+ animation: messageSlideIn 0.3s ease;
425
+ }
426
+
427
+ @keyframes messageSlideIn {
428
+ from {
429
+ opacity: 0;
430
+ transform: translateY(8px);
431
+ }
432
+ to {
433
+ opacity: 1;
434
+ transform: translateY(0);
435
+ }
436
+ }
437
+
438
+ .message-self {
439
+ align-self: flex-end;
440
+ }
441
+
442
+ .message-other {
443
+ align-self: flex-start;
444
+ }
445
+
446
+ .message-content {
447
+ position: relative;
448
+ padding: 0.625rem 1rem;
449
+ border-radius: var(--radius-lg);
450
+ word-wrap: break-word;
451
+ white-space: pre-wrap;
452
+ }
453
+
454
+ .message-self .message-content {
455
+ background: var(--bubble-self);
456
+ color: var(--bubble-self-text);
457
+ border-bottom-right-radius: var(--radius-sm);
458
+ }
459
+
460
+ .message-other .message-content {
461
+ background: var(--bubble-other);
462
+ color: var(--bubble-other-text);
463
+ border-bottom-left-radius: var(--radius-sm);
464
+ }
465
+
466
+ .message-info {
467
+ display: flex;
468
+ align-items: center;
469
+ gap: var(--space-sm);
470
+ margin-bottom: var(--space-xs);
471
+ font-size: 0.75rem;
472
+ }
473
+
474
+ .message-self .message-info {
475
+ justify-content: flex-end;
476
+ }
477
+
478
+ .sender-name {
479
+ font-weight: 600;
480
+ color: var(--color-primary);
481
+ }
482
+
483
+ .message-other .sender-name {
484
+ color: var(--color-text);
485
+ }
486
+
487
+ .timestamp {
488
+ color: var(--color-text-tertiary);
489
+ font-size: 0.6875rem;
490
+ }
491
+
492
+ .message-text {
493
+ font-size: 0.9375rem;
494
+ line-height: 1.5;
495
+ }
496
+
497
+ .message-status {
498
+ display: inline-flex;
499
+ align-items: center;
500
+ margin-left: var(--space-xs);
501
+ font-size: 0.75rem;
502
+ color: var(--color-text-tertiary);
503
+ }
504
+
505
+ .message-status.read {
506
+ color: var(--color-primary);
507
+ }
508
+
509
+ .message-actions {
510
+ display: flex;
511
+ gap: var(--space-xs);
512
+ margin-top: var(--space-xs);
513
+ opacity: 0;
514
+ transition: opacity var(--transition-fast);
515
+ }
516
+
517
+ .message-bubble:hover .message-actions {
518
+ opacity: 1;
519
+ }
520
+
521
+ .message-actions button {
522
+ display: inline-flex;
523
+ align-items: center;
524
+ justify-content: center;
525
+ width: 28px;
526
+ height: 28px;
527
+ background: var(--color-bg-secondary);
528
+ border: 1px solid var(--color-border);
529
+ border-radius: var(--radius-sm);
530
+ color: var(--color-text-secondary);
531
+ cursor: pointer;
532
+ font-size: 0.75rem;
533
+ transition: all var(--transition-fast);
534
+ }
535
+
536
+ .message-actions button:hover {
537
+ background: var(--color-bg-tertiary);
538
+ color: var(--color-text);
539
+ }
540
+
541
+ /* Reply Indicator */
542
+ .reply-indicator {
543
+ display: flex;
544
+ align-items: center;
545
+ gap: var(--space-sm);
546
+ padding: var(--space-xs) var(--space-sm);
547
+ margin-bottom: var(--space-xs);
548
+ font-size: 0.8125rem;
549
+ color: var(--color-text-secondary);
550
+ background: var(--color-bg-tertiary);
551
+ border-radius: var(--radius-sm);
552
+ border-left: 3px solid var(--color-primary);
553
+ }
554
+
555
+ .reply-arrow {
556
+ font-size: 0.75rem;
557
+ line-height: 1;
558
+ }
559
+
560
+ /* Attachments */
561
+ .attachment {
562
+ margin-top: var(--space-sm);
563
+ }
564
+
565
+ .attachment img {
566
+ max-width: 100%;
567
+ max-height: 300px;
568
+ border-radius: var(--radius-md);
569
+ cursor: pointer;
570
+ transition: transform var(--transition-fast);
571
+ }
572
+
573
+ .attachment img:hover {
574
+ transform: scale(1.02);
575
+ }
576
+
577
+ .attachment video {
578
+ max-width: 100%;
579
+ max-height: 300px;
580
+ border-radius: var(--radius-md);
581
+ }
582
+
583
+ .attachment audio {
584
+ width: 100%;
585
+ margin-top: var(--space-xs);
586
+ }
587
+
588
+ .attachment .file-preview {
589
+ display: flex;
590
+ align-items: center;
591
+ gap: var(--space-sm);
592
+ padding: var(--space-sm) var(--space-md);
593
+ background: var(--color-bg-secondary);
594
+ border: 1px solid var(--color-border);
595
+ border-radius: var(--radius-md);
596
+ cursor: pointer;
597
+ transition: all var(--transition-fast);
598
+ }
599
+
600
+ .attachment .file-preview:hover {
601
+ background: var(--color-bg-tertiary);
602
+ border-color: var(--color-primary);
603
+ }
604
+
605
+ .file-icon {
606
+ font-size: 1.25rem;
607
+ line-height: 1;
608
+ }
609
+
610
+ .file-name {
611
+ font-size: 0.875rem;
612
+ color: var(--color-primary);
613
+ text-decoration: underline;
614
+ }
615
+
616
+ .edited-label {
617
+ font-size: 0.75rem;
618
+ font-style: italic;
619
+ opacity: 0.7;
620
+ margin-left: var(--space-xs);
621
+ }
622
+
623
+ .deleted-message {
624
+ font-style: italic;
625
+ color: var(--color-text-tertiary);
626
+ padding: 0.5rem 1rem;
627
+ }
628
+
629
+ /* =============================================
630
+ Reply Preview
631
+ ============================================= */
632
+ .reply-preview {
633
+ display: flex;
634
+ align-items: center;
635
+ justify-content: space-between;
636
+ padding: var(--space-sm) var(--space-lg);
637
+ background: var(--color-bg-secondary);
638
+ border-top: 1px solid var(--color-border);
639
+ flex-shrink: 0;
640
+ }
641
+
642
+ .reply-content {
643
+ display: flex;
644
+ flex-direction: column;
645
+ gap: var(--space-xs);
646
+ flex: 1;
647
+ min-width: 0;
648
+ }
649
+
650
+ .reply-label {
651
+ font-size: 0.75rem;
652
+ font-weight: 600;
653
+ color: var(--color-primary);
654
+ }
655
+
656
+ .reply-text {
657
+ font-size: 0.8125rem;
658
+ color: var(--color-text-secondary);
659
+ overflow: hidden;
660
+ text-overflow: ellipsis;
661
+ white-space: nowrap;
662
+ }
663
+
664
+ .cancel-reply {
665
+ display: inline-flex;
666
+ align-items: center;
667
+ justify-content: center;
668
+ width: 32px;
669
+ height: 32px;
670
+ background: transparent;
671
+ border: none;
672
+ border-radius: var(--radius-sm);
673
+ color: var(--color-text-secondary);
674
+ cursor: pointer;
675
+ flex-shrink: 0;
676
+ transition: all var(--transition-fast);
677
+ }
678
+
679
+ .cancel-reply:hover {
680
+ background: var(--color-bg-tertiary);
681
+ color: var(--color-text);
682
+ }
683
+
684
+ /* =============================================
685
+ Compose Area
686
+ ============================================= */
687
+ .compose-container {
688
+ flex-shrink: 0;
689
+ border-top: 1px solid var(--color-border);
690
+ background: var(--color-bg);
691
+ }
692
+
693
+ .compose-form {
694
+ display: flex;
695
+ align-items: flex-end;
696
+ gap: var(--space-sm);
697
+ padding: var(--space-sm) var(--space-md);
698
+ }
699
+
700
+ .attach-btn {
701
+ display: inline-flex;
702
+ align-items: center;
703
+ justify-content: center;
704
+ width: 40px;
705
+ height: 40px;
706
+ background: transparent;
707
+ border: none;
708
+ border-radius: var(--radius-full);
709
+ color: var(--color-text-secondary);
710
+ cursor: pointer;
711
+ flex-shrink: 0;
712
+ transition: all var(--transition-fast);
713
+ }
714
+
715
+ .attach-btn:hover {
716
+ background: var(--color-bg-tertiary);
717
+ color: var(--color-text);
718
+ }
719
+
720
+ .message-input {
721
+ flex: 1;
722
+ resize: none;
723
+ padding: 0.625rem 1rem;
724
+ font-size: 0.9375rem;
725
+ font-family: inherit;
726
+ color: var(--color-text);
727
+ background: var(--input-bg);
728
+ border: 1px solid var(--input-border);
729
+ border-radius: var(--radius-xl);
730
+ outline: none;
731
+ min-height: 40px;
732
+ max-height: 120px;
733
+ transition: all var(--transition-fast);
734
+ line-height: 1.5;
735
+ }
736
+
737
+ .message-input:focus {
738
+ border-color: var(--input-focus);
739
+ box-shadow: 0 0 0 3px var(--color-primary-light);
740
+ }
741
+
742
+ .message-input::placeholder {
743
+ color: var(--color-text-tertiary);
744
+ }
745
+
746
+ .send-btn {
747
+ display: inline-flex;
748
+ align-items: center;
749
+ justify-content: center;
750
+ width: 40px;
751
+ height: 40px;
752
+ background: var(--color-primary);
753
+ border: none;
754
+ border-radius: var(--radius-full);
755
+ color: white;
756
+ cursor: pointer;
757
+ flex-shrink: 0;
758
+ transition: all var(--transition-fast);
759
+ box-shadow: var(--shadow-sm);
760
+ }
761
+
762
+ .send-btn:hover:not(:disabled) {
763
+ background: var(--color-primary-dark);
764
+ box-shadow: var(--shadow-md);
765
+ transform: scale(1.05);
766
+ }
767
+
768
+ .send-btn:disabled {
769
+ opacity: 0.5;
770
+ cursor: not-allowed;
771
+ }
772
+
773
+ /* Upload Progress */
774
+ .upload-progress {
775
+ display: flex;
776
+ align-items: center;
777
+ gap: var(--space-sm);
778
+ padding: var(--space-sm) var(--space-md);
779
+ background: var(--color-bg-secondary);
780
+ }
781
+
782
+ .upload-progress.hidden {
783
+ display: none;
784
+ }
785
+
786
+ .progress-bar {
787
+ flex: 1;
788
+ height: 4px;
789
+ background: var(--color-bg-tertiary);
790
+ border-radius: var(--radius-full);
791
+ overflow: hidden;
792
+ }
793
+
794
+ .progress-fill {
795
+ height: 100%;
796
+ background: var(--color-primary);
797
+ border-radius: var(--radius-full);
798
+ transition: width var(--transition-normal);
799
+ }
800
+
801
+ .upload-filename {
802
+ font-size: 0.8125rem;
803
+ color: var(--color-text-secondary);
804
+ white-space: nowrap;
805
+ overflow: hidden;
806
+ text-overflow: ellipsis;
807
+ }
808
+
809
+ /* =============================================
810
+ Modal
811
+ ============================================= */
812
+ .modal {
813
+ position: fixed;
814
+ top: 0;
815
+ left: 0;
816
+ width: 100%;
817
+ height: 100%;
818
+ display: flex;
819
+ align-items: center;
820
+ justify-content: center;
821
+ z-index: 1000;
822
+ padding: var(--space-md);
823
+ }
824
+
825
+ .modal.hidden {
826
+ display: none;
827
+ }
828
+
829
+ .modal-overlay {
830
+ position: absolute;
831
+ top: 0;
832
+ left: 0;
833
+ width: 100%;
834
+ height: 100%;
835
+ background: rgba(0, 0, 0, 0.5);
836
+ backdrop-filter: blur(4px);
837
+ }
838
+
839
+ .modal-content {
840
+ position: relative;
841
+ width: 100%;
842
+ max-width: 480px;
843
+ max-height: 85vh;
844
+ background: var(--color-bg);
845
+ border-radius: var(--radius-xl);
846
+ box-shadow: var(--shadow-lg);
847
+ overflow: hidden;
848
+ animation: modalSlideIn 0.2s ease;
849
+ }
850
+
851
+ @keyframes modalSlideIn {
852
+ from {
853
+ opacity: 0;
854
+ transform: scale(0.95) translateY(10px);
855
+ }
856
+ to {
857
+ opacity: 1;
858
+ transform: scale(1) translateY(0);
859
+ }
860
+ }
861
+
862
+ .modal-header {
863
+ display: flex;
864
+ align-items: center;
865
+ justify-content: space-between;
866
+ padding: var(--space-lg);
867
+ border-bottom: 1px solid var(--color-border);
868
+ }
869
+
870
+ .modal-header h2 {
871
+ font-size: 1.25rem;
872
+ font-weight: 600;
873
+ }
874
+
875
+ .modal-body {
876
+ padding: var(--space-lg);
877
+ overflow-y: auto;
878
+ max-height: calc(85vh - 140px);
879
+ }
880
+
881
+ .modal-footer {
882
+ display: flex;
883
+ justify-content: flex-end;
884
+ padding: var(--space-md) var(--space-lg);
885
+ border-top: 1px solid var(--color-border);
886
+ background: var(--color-bg-secondary);
887
+ }
888
+
889
+ .setting-section {
890
+ margin-bottom: var(--space-xl);
891
+ }
892
+
893
+ .setting-section:last-child {
894
+ margin-bottom: 0;
895
+ }
896
+
897
+ .setting-section h3 {
898
+ font-size: 0.875rem;
899
+ font-weight: 600;
900
+ color: var(--color-text-secondary);
901
+ text-transform: uppercase;
902
+ letter-spacing: 0.05em;
903
+ margin-bottom: var(--space-md);
904
+ padding-bottom: var(--space-sm);
905
+ border-bottom: 1px solid var(--color-border-light);
906
+ }
907
+
908
+ .setting-item {
909
+ margin-bottom: var(--space-md);
910
+ }
911
+
912
+ .setting-item label {
913
+ display: block;
914
+ font-size: 0.875rem;
915
+ font-weight: 500;
916
+ margin-bottom: var(--space-xs);
917
+ color: var(--color-text);
918
+ }
919
+
920
+ .color-input-wrapper {
921
+ display: flex;
922
+ align-items: center;
923
+ gap: var(--space-sm);
924
+ }
925
+
926
+ .color-input-wrapper input[type="color"] {
927
+ width: 40px;
928
+ height: 40px;
929
+ padding: 2px;
930
+ border: 1px solid var(--color-border);
931
+ border-radius: var(--radius-md);
932
+ cursor: pointer;
933
+ background: none;
934
+ }
935
+
936
+ .color-input-wrapper input[type="color"]::-webkit-color-swatch-wrapper {
937
+ padding: 0;
938
+ }
939
+
940
+ .color-input-wrapper input[type="color"]::-webkit-color-swatch {
941
+ border: none;
942
+ border-radius: var(--radius-sm);
943
+ }
944
+
945
+ .avatar-upload {
946
+ display: flex;
947
+ align-items: center;
948
+ gap: var(--space-md);
949
+ }
950
+
951
+ .avatar-preview {
952
+ width: 64px;
953
+ height: 64px;
954
+ border-radius: var(--radius-full);
955
+ object-fit: cover;
956
+ border: 2px solid var(--color-border);
957
+ }
958
+
959
+ .avatar-preview:not([style*="display: block"]) {
960
+ display: none;
961
+ }
962
+
963
+ .custom-theme {
964
+ padding: var(--space-md);
965
+ background: var(--color-bg-secondary);
966
+ border-radius: var(--radius-md);
967
+ margin-top: var(--space-sm);
968
+ }
969
+
970
+ /* =============================================
971
+ Utility Classes
972
+ ============================================= */
973
+ .hidden {
974
+ display: none !important;
975
+ }
976
+
977
+ .screen {
978
+ display: none;
979
+ height: 100vh;
980
+ }
981
+
982
+ .screen.active {
983
+ display: flex;
984
+ }
985
+
986
+ /* =============================================
987
+ Scrollbar Styles
988
+ ============================================= */
989
+ .messages-container::-webkit-scrollbar {
990
+ width: 6px;
991
+ }
992
+
993
+ .messages-container::-webkit-scrollbar-track {
994
+ background: transparent;
995
+ }
996
+
997
+ .messages-container::-webkit-scrollbar-thumb {
998
+ background: var(--color-border);
999
+ border-radius: var(--radius-full);
1000
+ }
1001
+
1002
+ .messages-container::-webkit-scrollbar-thumb:hover {
1003
+ background: var(--color-text-tertiary);
1004
+ }
1005
+
1006
+ /* =============================================
1007
+ Responsive Design
1008
+ ============================================= */
1009
+ @media (max-width: 640px) {
1010
+ .auth-container {
1011
+ padding: var(--space-lg);
1012
+ border-radius: var(--radius-lg);
1013
+ }
1014
+
1015
+ .chat-header {
1016
+ padding: var(--space-sm) var(--space-md);
1017
+ }
1018
+
1019
+ .message-bubble {
1020
+ max-width: 85%;
1021
+ }
1022
+
1023
+ .modal {
1024
+ padding: 0;
1025
+ }
1026
+
1027
+ .modal-content {
1028
+ max-height: 100vh;
1029
+ border-radius: 0;
1030
+ }
1031
+
1032
+ .modal-body {
1033
+ max-height: calc(100vh - 140px);
1034
+ }
1035
+ }
1036
+
1037
+ @media (min-width: 768px) {
1038
+ .message-bubble {
1039
+ max-width: 65%;
1040
+ }
1041
+
1042
+ .compose-form {
1043
+ padding: var(--space-sm) var(--space-lg);
1044
+ }
1045
+ }
1046
+
1047
+ @media (min-width: 1024px) {
1048
+ .message-bubble {
1049
+ max-width: 55%;
1050
+ }
1051
  }