muxmind-ai 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/style.css ADDED
@@ -0,0 +1,948 @@
1
+ /* ==========================================================================
2
+ MuxMind AI — Cyberpunk Glassmorphism UI Framework (Dark + Light themes)
3
+ ========================================================================== */
4
+
5
+ :root {
6
+ --bg-void: #0a0b10;
7
+ --bg-panel: rgba(16, 19, 28, 0.72);
8
+ --bg-panel-solid: #12141e;
9
+ --bg-elevated: rgba(255,255,255,0.03);
10
+ --border-glass: rgba(0, 242, 254, 0.18);
11
+ --accent-cyan: #00f2fe;
12
+ --accent-cyan-dim: rgba(0, 242, 254, 0.35);
13
+ --accent-magenta: #ff2fd0;
14
+ --accent-green: #2ee6a6;
15
+ --accent-amber: #ffb020;
16
+ --accent-red: #ff4d6d;
17
+ --text-primary: #eaf6ff;
18
+ --text-secondary: #8fa3b8;
19
+ --text-muted: #566577;
20
+ --radius-lg: 18px;
21
+ --radius-md: 12px;
22
+ --radius-sm: 8px;
23
+ --shadow-glow: 0 0 24px rgba(0, 242, 254, 0.12);
24
+ --shadow-deep: 0 12px 40px rgba(0, 0, 0, 0.55);
25
+ --font-main: 'Segoe UI', 'Inter', system-ui, -apple-system, sans-serif;
26
+ --font-mono: 'Fira Code', 'Cascadia Code', Consolas, monospace;
27
+ }
28
+
29
+ [data-theme="light"] {
30
+ --bg-void: #f2f5fa;
31
+ --bg-panel: rgba(255, 255, 255, 0.78);
32
+ --bg-panel-solid: #ffffff;
33
+ --bg-elevated: rgba(10,20,40,0.03);
34
+ --border-glass: rgba(0, 130, 160, 0.18);
35
+ --accent-cyan: #0090a8;
36
+ --accent-cyan-dim: rgba(0, 144, 168, 0.30);
37
+ --accent-magenta: #c026a3;
38
+ --accent-green: #0e9e6f;
39
+ --accent-amber: #b5790a;
40
+ --accent-red: #d9294f;
41
+ --text-primary: #10151f;
42
+ --text-secondary: #4a5768;
43
+ --text-muted: #8291a2;
44
+ --shadow-glow: 0 0 24px rgba(0, 144, 168, 0.10);
45
+ --shadow-deep: 0 12px 32px rgba(20, 30, 50, 0.14);
46
+ }
47
+
48
+ * { box-sizing: border-box; margin: 0; padding: 0; }
49
+
50
+ html, body {
51
+ height: 100%;
52
+ background: var(--bg-void);
53
+ color: var(--text-primary);
54
+ font-family: var(--font-main);
55
+ overflow-y: auto;
56
+ overflow-x: hidden;
57
+ transition: background 0.25s ease, color 0.25s ease;
58
+ }
59
+
60
+ body {
61
+ background-image:
62
+ radial-gradient(circle at 15% 10%, rgba(0, 242, 254, 0.08), transparent 40%),
63
+ radial-gradient(circle at 85% 90%, rgba(255, 47, 208, 0.06), transparent 45%);
64
+ }
65
+
66
+ [data-theme="light"] body {
67
+ background-image:
68
+ radial-gradient(circle at 15% 10%, rgba(0, 144, 168, 0.06), transparent 40%),
69
+ radial-gradient(circle at 85% 90%, rgba(192, 38, 163, 0.04), transparent 45%);
70
+ }
71
+
72
+ ::-webkit-scrollbar { width: 8px; height: 8px; }
73
+ ::-webkit-scrollbar-track { background: transparent; }
74
+ ::-webkit-scrollbar-thumb { background: var(--accent-cyan-dim); border-radius: 8px; }
75
+ ::-webkit-scrollbar-thumb:hover { background: var(--accent-cyan); }
76
+
77
+ /* ---------------------------------------------------------------------- */
78
+ /* App Shell / Sidebar layout */
79
+ /* ---------------------------------------------------------------------- */
80
+
81
+ .app-shell {
82
+ display: flex;
83
+ height: 100vh;
84
+ width: 100vw;
85
+ }
86
+
87
+ .app-shell.hidden { display: none; }
88
+
89
+ .rail {
90
+ width: 68px;
91
+ background: var(--bg-panel);
92
+ backdrop-filter: blur(18px);
93
+ border-right: 1px solid var(--border-glass);
94
+ display: flex;
95
+ flex-direction: column;
96
+ align-items: center;
97
+ padding: 16px 0;
98
+ gap: 8px;
99
+ z-index: 60;
100
+ }
101
+
102
+ .rail-logo { margin-bottom: 14px; }
103
+
104
+ .rail-btn {
105
+ width: 44px; height: 44px;
106
+ display: flex; align-items: center; justify-content: center;
107
+ border-radius: var(--radius-md);
108
+ background: transparent;
109
+ border: 1px solid transparent;
110
+ color: var(--text-secondary);
111
+ cursor: pointer;
112
+ font-size: 1.2rem;
113
+ transition: all 0.18s ease;
114
+ }
115
+
116
+ .rail-btn:hover {
117
+ color: var(--accent-cyan);
118
+ background: rgba(0,242,254,0.08);
119
+ border-color: var(--accent-cyan-dim);
120
+ }
121
+
122
+ .rail-btn.active {
123
+ color: var(--accent-cyan);
124
+ background: rgba(0,242,254,0.12);
125
+ border-color: var(--accent-cyan);
126
+ box-shadow: var(--shadow-glow);
127
+ }
128
+
129
+ .rail-spacer { flex: 1; }
130
+
131
+ .page-container {
132
+ flex: 1;
133
+ display: flex;
134
+ flex-direction: column;
135
+ min-width: 0;
136
+ position: relative;
137
+ }
138
+
139
+ .page-view { display: none; flex: 1; flex-direction: column; min-height: 0; }
140
+ .page-view.active { display: flex; }
141
+
142
+ /* ---------------------------------------------------------------------- */
143
+ /* Top Navigation Bar */
144
+ /* ---------------------------------------------------------------------- */
145
+
146
+ .top-nav {
147
+ display: flex;
148
+ align-items: center;
149
+ justify-content: space-between;
150
+ gap: 12px;
151
+ padding: 12px 20px;
152
+ background: var(--bg-panel);
153
+ backdrop-filter: blur(18px) saturate(140%);
154
+ -webkit-backdrop-filter: blur(18px) saturate(140%);
155
+ border-bottom: 1px solid var(--border-glass);
156
+ box-shadow: var(--shadow-deep);
157
+ z-index: 50;
158
+ }
159
+
160
+ .brand { display: flex; align-items: center; gap: 10px; font-weight: 700; letter-spacing: 0.5px; font-size: 1.05rem; }
161
+
162
+ .nav-controls { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
163
+
164
+ .nav-btn, .icon-btn {
165
+ display: inline-flex; align-items: center; gap: 6px;
166
+ background: var(--bg-elevated);
167
+ border: 1px solid var(--border-glass);
168
+ color: var(--text-primary);
169
+ padding: 8px 14px;
170
+ border-radius: var(--radius-md);
171
+ font-size: 0.85rem;
172
+ cursor: pointer;
173
+ transition: all 0.18s ease;
174
+ }
175
+
176
+ .nav-btn:hover, .icon-btn:hover {
177
+ background: rgba(0, 242, 254, 0.08);
178
+ border-color: var(--accent-cyan);
179
+ box-shadow: var(--shadow-glow);
180
+ transform: translateY(-1px);
181
+ }
182
+
183
+ .nav-btn:active, .icon-btn:active { transform: translateY(0); }
184
+
185
+ select#model-selector-dropdown {
186
+ background: var(--bg-elevated);
187
+ border: 1px solid var(--border-glass);
188
+ color: var(--text-primary);
189
+ padding: 8px 12px;
190
+ border-radius: var(--radius-md);
191
+ font-size: 0.85rem;
192
+ cursor: pointer;
193
+ max-width: 220px;
194
+ }
195
+
196
+ #status-badge {
197
+ font-family: var(--font-mono);
198
+ font-size: 0.78rem;
199
+ color: var(--accent-green);
200
+ background: rgba(46, 230, 166, 0.08);
201
+ border: 1px solid rgba(46, 230, 166, 0.3);
202
+ padding: 6px 12px;
203
+ border-radius: var(--radius-sm);
204
+ white-space: nowrap;
205
+ }
206
+
207
+ #status-badge.streaming { color: var(--accent-cyan); border-color: var(--accent-cyan-dim); }
208
+ #status-badge.error { color: var(--accent-red); border-color: rgba(255, 77, 109, 0.4); }
209
+
210
+ /* ---------------------------------------------------------------------- */
211
+ /* Chat area */
212
+ /* ---------------------------------------------------------------------- */
213
+
214
+ .chat-area { flex: 1; display: flex; flex-direction: column; min-width: 0; min-height: 0; }
215
+
216
+ .chat-messages {
217
+ flex: 1;
218
+ overflow-y: auto;
219
+ padding: 24px 18%;
220
+ display: flex;
221
+ flex-direction: column;
222
+ gap: 18px;
223
+ position: relative;
224
+ }
225
+
226
+ @media (max-width: 1100px) { .chat-messages { padding: 20px 6%; } }
227
+ @media (max-width: 640px) { .chat-messages { padding: 16px 4%; } }
228
+
229
+ .msg { display: flex; flex-direction: column; max-width: 88%; animation: fade-in 0.25s ease; }
230
+
231
+ @keyframes fade-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } }
232
+
233
+ .msg.user { align-self: flex-end; align-items: flex-end; }
234
+ .msg.assistant { align-self: flex-start; align-items: flex-start; }
235
+
236
+ .msg-bubble {
237
+ padding: 14px 18px;
238
+ border-radius: var(--radius-lg);
239
+ line-height: 1.55;
240
+ font-size: 0.95rem;
241
+ white-space: pre-wrap;
242
+ word-break: break-word;
243
+ }
244
+
245
+ .msg.user .msg-bubble {
246
+ background: linear-gradient(135deg, rgba(0,242,254,0.16), rgba(255,47,208,0.10));
247
+ border: 1px solid var(--accent-cyan-dim);
248
+ }
249
+
250
+ .msg.assistant .msg-bubble {
251
+ background: var(--bg-panel);
252
+ backdrop-filter: blur(14px);
253
+ border: 1px solid var(--border-glass);
254
+ }
255
+
256
+ .msg-meta { font-size: 0.7rem; color: var(--text-muted); margin-top: 4px; font-family: var(--font-mono); }
257
+
258
+ .provider-tag {
259
+ display: inline-flex; align-items: center; gap: 4px;
260
+ padding: 2px 8px; border-radius: 20px;
261
+ background: rgba(0,242,254,0.08);
262
+ border: 1px solid var(--accent-cyan-dim);
263
+ color: var(--accent-cyan);
264
+ font-size: 0.68rem;
265
+ margin-right: 4px;
266
+ }
267
+
268
+ /* Jump-to-latest button (fixes "scroll up then forced back down") */
269
+ .jump-latest {
270
+ position: absolute;
271
+ bottom: 16px;
272
+ left: 50%;
273
+ transform: translateX(-50%) translateY(8px);
274
+ background: var(--bg-panel-solid);
275
+ border: 1px solid var(--accent-cyan-dim);
276
+ color: var(--accent-cyan);
277
+ padding: 8px 16px;
278
+ border-radius: 30px;
279
+ font-size: 0.78rem;
280
+ cursor: pointer;
281
+ box-shadow: var(--shadow-deep);
282
+ opacity: 0;
283
+ pointer-events: none;
284
+ transition: all 0.2s ease;
285
+ z-index: 10;
286
+ }
287
+
288
+ .jump-latest.visible { opacity: 1; pointer-events: auto; transform: translateX(-50%) translateY(0); }
289
+
290
+ /* ---------------------------------------------------------------------- */
291
+ /* Input Toolbar */
292
+ /* ---------------------------------------------------------------------- */
293
+
294
+ .input-toolbar { padding: 14px 18%; background: linear-gradient(to top, var(--bg-void) 60%, transparent); }
295
+
296
+ @media (max-width: 1100px) { .input-toolbar { padding: 12px 6%; } }
297
+ @media (max-width: 640px) { .input-toolbar { padding: 10px 4%; } }
298
+
299
+ .input-wrap {
300
+ display: flex;
301
+ align-items: flex-end;
302
+ gap: 10px;
303
+ background: var(--bg-panel);
304
+ backdrop-filter: blur(18px);
305
+ border: 1px solid var(--border-glass);
306
+ border-radius: var(--radius-lg);
307
+ padding: 10px 12px;
308
+ box-shadow: var(--shadow-deep);
309
+ transition: border-color 0.2s ease;
310
+ }
311
+
312
+ .input-wrap:focus-within { border-color: var(--accent-cyan); box-shadow: var(--shadow-glow); }
313
+
314
+ #user-prompt-input {
315
+ flex: 1; background: transparent; border: none; outline: none; resize: none;
316
+ color: var(--text-primary);
317
+ font-family: var(--font-main);
318
+ font-size: 0.95rem;
319
+ max-height: 200px; min-height: 24px; line-height: 1.5;
320
+ padding: 8px 4px;
321
+ }
322
+
323
+ #user-prompt-input::placeholder { color: var(--text-muted); }
324
+
325
+ .toolbar-icons { display: flex; gap: 6px; align-items: center; }
326
+
327
+ .toolbar-icons button {
328
+ background: transparent; border: 1px solid transparent;
329
+ color: var(--text-secondary);
330
+ width: 38px; height: 38px;
331
+ border-radius: var(--radius-sm);
332
+ cursor: pointer;
333
+ display: flex; align-items: center; justify-content: center;
334
+ font-size: 1.1rem;
335
+ transition: all 0.15s ease;
336
+ }
337
+
338
+ .toolbar-icons button:hover { color: var(--accent-cyan); background: rgba(0,242,254,0.08); border-color: var(--accent-cyan-dim); }
339
+
340
+ #btn-send { background: linear-gradient(135deg, var(--accent-cyan), #0090ff); color: #001018; font-weight: 700; }
341
+ #btn-send:hover { box-shadow: 0 0 18px rgba(0,242,254,0.5); }
342
+ #btn-send:disabled { opacity: 0.5; cursor: not-allowed; }
343
+
344
+ #btn-stop { color: var(--accent-red); display: none; }
345
+ #btn-stop.active { display: flex; }
346
+
347
+ #btn-mic[data-state="listening"] {
348
+ color: var(--accent-red);
349
+ border-color: var(--accent-red);
350
+ animation: mic-pulse 1.1s ease-in-out infinite;
351
+ }
352
+ @keyframes mic-pulse {
353
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(255, 59, 48, 0.35); }
354
+ 50% { box-shadow: 0 0 0 6px rgba(255, 59, 48, 0); }
355
+ }
356
+
357
+ .compression-row { display: flex; align-items: center; gap: 10px; margin-top: 8px; padding: 0 4px; font-size: 0.72rem; color: var(--text-secondary); }
358
+
359
+ #token-compression-slider { flex: 1; accent-color: var(--accent-cyan); cursor: pointer; }
360
+
361
+ #compression-value { font-family: var(--font-mono); color: var(--accent-cyan); min-width: 70px; text-align: right; }
362
+
363
+ .file-chip-row { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 6px; padding: 0 4px; }
364
+
365
+ .file-chip {
366
+ display: flex; align-items: center; gap: 6px;
367
+ background: rgba(0,242,254,0.06);
368
+ border: 1px solid var(--accent-cyan-dim);
369
+ padding: 4px 10px; border-radius: 20px; font-size: 0.72rem; color: var(--text-secondary);
370
+ }
371
+
372
+ .file-chip .remove { cursor: pointer; color: var(--accent-red); font-weight: 700; }
373
+
374
+ /* ---------------------------------------------------------------------- */
375
+ /* Side Vault Panel */
376
+ /* ---------------------------------------------------------------------- */
377
+
378
+ .vault-panel {
379
+ position: fixed; top: 0; right: 0;
380
+ width: 380px; max-width: 92vw; height: 100vh;
381
+ background: var(--bg-panel-solid);
382
+ border-left: 1px solid var(--border-glass);
383
+ box-shadow: -20px 0 50px rgba(0,0,0,0.35);
384
+ transform: translateX(100%);
385
+ transition: transform 0.28s cubic-bezier(0.16, 1, 0.3, 1);
386
+ z-index: 200;
387
+ display: flex; flex-direction: column;
388
+ }
389
+
390
+ .vault-panel.open { transform: translateX(0); }
391
+
392
+ .vault-header { display: flex; align-items: center; justify-content: space-between; padding: 18px 20px; border-bottom: 1px solid var(--border-glass); }
393
+ .vault-header h2 { font-size: 1.05rem; color: var(--accent-cyan); }
394
+
395
+ .vault-body { flex: 1; overflow-y: auto; padding: 18px 20px; display: flex; flex-direction: column; gap: 16px; }
396
+
397
+ .vault-form {
398
+ background: var(--bg-elevated);
399
+ border: 1px solid var(--border-glass);
400
+ border-radius: var(--radius-md);
401
+ padding: 14px;
402
+ display: flex; flex-direction: column; gap: 10px;
403
+ }
404
+
405
+ .vault-form label { font-size: 0.72rem; color: var(--text-secondary); }
406
+
407
+ .vault-form input, .vault-form select {
408
+ background: rgba(0,0,0,0.04);
409
+ border: 1px solid var(--border-glass);
410
+ color: var(--text-primary);
411
+ padding: 9px 10px;
412
+ border-radius: var(--radius-sm);
413
+ font-size: 0.85rem;
414
+ outline: none;
415
+ }
416
+
417
+ [data-theme="dark"] .vault-form input,
418
+ :root:not([data-theme="light"]) .vault-form input,
419
+ :root:not([data-theme="light"]) .vault-form select { background: rgba(0,0,0,0.3); }
420
+
421
+ .vault-form input:focus, .vault-form select:focus { border-color: var(--accent-cyan); }
422
+
423
+ .vault-form button {
424
+ background: linear-gradient(135deg, var(--accent-cyan), #0090ff);
425
+ color: #001018;
426
+ border: none;
427
+ padding: 10px;
428
+ border-radius: var(--radius-sm);
429
+ font-weight: 700;
430
+ cursor: pointer;
431
+ margin-top: 4px;
432
+ }
433
+
434
+ .vault-entry {
435
+ display: flex; align-items: center; justify-content: space-between;
436
+ background: var(--bg-elevated);
437
+ border: 1px solid var(--border-glass);
438
+ border-radius: var(--radius-md);
439
+ padding: 12px 14px;
440
+ }
441
+
442
+ .vault-entry-info { display: flex; flex-direction: column; gap: 3px; }
443
+ .vault-entry-name { font-size: 0.88rem; font-weight: 600; }
444
+ .vault-entry-key { font-family: var(--font-mono); font-size: 0.72rem; color: var(--text-muted); }
445
+
446
+ .vault-entry-status { font-size: 0.68rem; padding: 3px 8px; border-radius: 20px; }
447
+ .vault-entry-status.active { background: rgba(46,230,166,0.12); color: var(--accent-green); }
448
+ .vault-entry-status.dead { background: rgba(255,77,109,0.12); color: var(--accent-red); }
449
+ .vault-entry-status.checking { background: rgba(255,176,32,0.12); color: var(--accent-amber); }
450
+
451
+ .vault-entry-actions button { background: transparent; border: none; color: var(--text-muted); cursor: pointer; font-size: 0.9rem; padding: 4px 6px; }
452
+ .vault-entry-actions button:hover { color: var(--accent-red); }
453
+
454
+ .vault-note {
455
+ font-size: 0.7rem; color: var(--text-muted); line-height: 1.5;
456
+ padding: 10px 12px;
457
+ background: rgba(0,242,254,0.04);
458
+ border: 1px dashed var(--accent-cyan-dim);
459
+ border-radius: var(--radius-sm);
460
+ }
461
+
462
+ .vault-overlay {
463
+ position: fixed; inset: 0;
464
+ background: rgba(0,0,0,0.5);
465
+ backdrop-filter: blur(2px);
466
+ z-index: 190;
467
+ opacity: 0; pointer-events: none;
468
+ transition: opacity 0.25s ease;
469
+ }
470
+
471
+ .vault-overlay.open { opacity: 1; pointer-events: auto; }
472
+
473
+ /* ---------------------------------------------------------------------- */
474
+ /* Providers Page */
475
+ /* ---------------------------------------------------------------------- */
476
+
477
+ .page-scroll { flex: 1; overflow-y: auto; padding: 28px 8%; }
478
+ @media (max-width: 900px) { .page-scroll { padding: 22px 5%; } }
479
+
480
+ .page-header { margin-bottom: 22px; }
481
+ .page-header h1 { font-size: 1.4rem; margin-bottom: 6px; }
482
+ .page-header p { color: var(--text-secondary); font-size: 0.88rem; }
483
+
484
+ .provider-grid {
485
+ display: grid;
486
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
487
+ gap: 16px;
488
+ }
489
+
490
+ .provider-card {
491
+ background: var(--bg-panel);
492
+ backdrop-filter: blur(14px);
493
+ border: 1px solid var(--border-glass);
494
+ border-radius: var(--radius-lg);
495
+ padding: 18px;
496
+ display: flex; flex-direction: column; gap: 10px;
497
+ transition: transform 0.18s ease, box-shadow 0.18s ease;
498
+ }
499
+
500
+ .provider-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-glow); }
501
+
502
+ .provider-card-top { display: flex; align-items: center; gap: 10px; }
503
+
504
+ .provider-dot { width: 12px; height: 12px; border-radius: 50%; flex-shrink: 0; }
505
+
506
+ .provider-card h3 { font-size: 1rem; }
507
+
508
+ .provider-card .prefix { font-family: var(--font-mono); font-size: 0.72rem; color: var(--text-muted); }
509
+
510
+ .provider-card-links { display: flex; gap: 8px; margin-top: auto; }
511
+
512
+ .provider-card-links a {
513
+ flex: 1;
514
+ text-align: center;
515
+ padding: 8px 10px;
516
+ border-radius: var(--radius-sm);
517
+ border: 1px solid var(--border-glass);
518
+ color: var(--text-primary);
519
+ text-decoration: none;
520
+ font-size: 0.78rem;
521
+ transition: all 0.15s ease;
522
+ }
523
+
524
+ .provider-card-links a:hover { border-color: var(--accent-cyan); color: var(--accent-cyan); background: rgba(0,242,254,0.06); }
525
+
526
+ .provider-card-links a.primary {
527
+ background: linear-gradient(135deg, var(--accent-cyan), #0090ff);
528
+ color: #001018;
529
+ border: none;
530
+ font-weight: 700;
531
+ }
532
+
533
+ .live-models-strip { display: flex; flex-wrap: wrap; gap: 6px; }
534
+ .live-model-chip {
535
+ font-size: 0.68rem; font-family: var(--font-mono);
536
+ padding: 3px 8px; border-radius: 14px;
537
+ background: rgba(46,230,166,0.1);
538
+ color: var(--accent-green);
539
+ border: 1px solid rgba(46,230,166,0.25);
540
+ }
541
+ .live-model-chip.none { background: rgba(255,77,109,0.08); color: var(--accent-red); border-color: rgba(255,77,109,0.2); }
542
+
543
+ /* ---------------------------------------------------------------------- */
544
+ /* Settings Page */
545
+ /* ---------------------------------------------------------------------- */
546
+
547
+ .settings-section {
548
+ background: var(--bg-panel);
549
+ backdrop-filter: blur(14px);
550
+ border: 1px solid var(--border-glass);
551
+ border-radius: var(--radius-lg);
552
+ padding: 20px;
553
+ margin-bottom: 16px;
554
+ }
555
+
556
+ .settings-section h3 { font-size: 0.95rem; margin-bottom: 14px; color: var(--accent-cyan); }
557
+
558
+ .settings-row {
559
+ display: flex; align-items: center; justify-content: space-between;
560
+ padding: 12px 0;
561
+ border-bottom: 1px solid var(--border-glass);
562
+ }
563
+ .settings-row:last-child { border-bottom: none; }
564
+
565
+ .settings-row-label { display: flex; flex-direction: column; gap: 3px; }
566
+ .settings-row-label strong { font-size: 0.88rem; }
567
+ .settings-row-label span { font-size: 0.74rem; color: var(--text-muted); }
568
+
569
+ .theme-toggle {
570
+ display: flex;
571
+ background: var(--bg-elevated);
572
+ border: 1px solid var(--border-glass);
573
+ border-radius: 30px;
574
+ padding: 3px;
575
+ gap: 3px;
576
+ }
577
+
578
+ .theme-toggle button {
579
+ border: none; background: transparent; color: var(--text-secondary);
580
+ padding: 6px 14px; border-radius: 24px; cursor: pointer; font-size: 0.8rem;
581
+ transition: all 0.18s ease;
582
+ }
583
+
584
+ .theme-toggle button.active { background: var(--accent-cyan); color: #001018; font-weight: 700; }
585
+
586
+ .settings-input {
587
+ background: var(--bg-elevated);
588
+ border: 1px solid var(--border-glass);
589
+ color: var(--text-primary);
590
+ padding: 8px 12px;
591
+ border-radius: var(--radius-sm);
592
+ font-size: 0.85rem;
593
+ min-width: 220px;
594
+ }
595
+
596
+ .settings-btn {
597
+ background: var(--bg-elevated);
598
+ border: 1px solid var(--border-glass);
599
+ color: var(--text-primary);
600
+ padding: 8px 16px;
601
+ border-radius: var(--radius-sm);
602
+ cursor: pointer;
603
+ font-size: 0.82rem;
604
+ }
605
+
606
+ .settings-btn:hover { border-color: var(--accent-cyan); color: var(--accent-cyan); }
607
+ .settings-btn.danger:hover { border-color: var(--accent-red); color: var(--accent-red); }
608
+
609
+ /* ---------------------------------------------------------------------- */
610
+ /* Login Page */
611
+ /* ---------------------------------------------------------------------- */
612
+
613
+ .login-screen {
614
+ position: fixed; inset: 0;
615
+ display: flex; align-items: center; justify-content: center;
616
+ background: var(--bg-void);
617
+ background-image:
618
+ radial-gradient(circle at 20% 20%, rgba(0, 242, 254, 0.10), transparent 45%),
619
+ radial-gradient(circle at 80% 80%, rgba(255, 47, 208, 0.08), transparent 45%);
620
+ z-index: 500;
621
+ }
622
+
623
+ .login-card {
624
+ width: 380px; max-width: 90vw;
625
+ background: var(--bg-panel);
626
+ backdrop-filter: blur(20px);
627
+ border: 1px solid var(--border-glass);
628
+ border-radius: var(--radius-lg);
629
+ padding: 32px 28px;
630
+ box-shadow: var(--shadow-deep);
631
+ display: flex; flex-direction: column; align-items: center; gap: 16px;
632
+ text-align: center;
633
+ }
634
+
635
+ .login-card .logo-wrap { width: 64px; height: 64px; margin-bottom: 4px; }
636
+
637
+ .login-card h1 { font-size: 1.3rem; }
638
+ .login-card p { font-size: 0.82rem; color: var(--text-secondary); margin-bottom: 6px; }
639
+
640
+ .login-form { width: 100%; display: flex; flex-direction: column; gap: 12px; }
641
+
642
+ .login-form input {
643
+ width: 100%;
644
+ background: var(--bg-elevated);
645
+ border: 1px solid var(--border-glass);
646
+ color: var(--text-primary);
647
+ padding: 12px 14px;
648
+ border-radius: var(--radius-md);
649
+ font-size: 0.92rem;
650
+ outline: none;
651
+ text-align: center;
652
+ letter-spacing: 1px;
653
+ }
654
+
655
+ .login-form input:focus { border-color: var(--accent-cyan); box-shadow: var(--shadow-glow); }
656
+
657
+ .login-form button {
658
+ background: linear-gradient(135deg, var(--accent-cyan), #0090ff);
659
+ color: #001018;
660
+ border: none;
661
+ padding: 12px;
662
+ border-radius: var(--radius-md);
663
+ font-weight: 700;
664
+ cursor: pointer;
665
+ font-size: 0.92rem;
666
+ }
667
+
668
+ .login-error { color: var(--accent-red); font-size: 0.78rem; min-height: 16px; }
669
+
670
+ .login-hint {
671
+ font-size: 0.68rem; color: var(--text-muted);
672
+ background: rgba(0,242,254,0.04);
673
+ border: 1px dashed var(--accent-cyan-dim);
674
+ border-radius: var(--radius-sm);
675
+ padding: 8px 10px;
676
+ line-height: 1.5;
677
+ }
678
+
679
+ /* ---------------------------------------------------------------------- */
680
+ /* Network Map Page */
681
+ /* ---------------------------------------------------------------------- */
682
+
683
+ .map-page { flex: 1; display: flex; flex-direction: column; }
684
+
685
+ .map-canvas-wrap {
686
+ flex: 1;
687
+ position: relative;
688
+ display: flex; align-items: center; justify-content: center;
689
+ overflow: hidden;
690
+ }
691
+
692
+ .map-legend {
693
+ position: absolute; bottom: 20px; left: 20px;
694
+ background: var(--bg-panel);
695
+ backdrop-filter: blur(14px);
696
+ border: 1px solid var(--border-glass);
697
+ border-radius: var(--radius-md);
698
+ padding: 12px 16px;
699
+ font-size: 0.74rem;
700
+ color: var(--text-secondary);
701
+ display: flex; flex-direction: column; gap: 6px;
702
+ }
703
+
704
+ .map-legend-item { display: flex; align-items: center; gap: 8px; }
705
+ .map-legend-dot { width: 9px; height: 9px; border-radius: 50%; }
706
+
707
+ /* ---------------------------------------------------------------------- */
708
+ /* Empty state */
709
+ /* ---------------------------------------------------------------------- */
710
+
711
+ .empty-state {
712
+ flex: 1;
713
+ display: flex; flex-direction: column; align-items: center; justify-content: center;
714
+ gap: 12px;
715
+ color: var(--text-muted);
716
+ text-align: center;
717
+ padding: 20px;
718
+ }
719
+
720
+ .empty-state .glow-title {
721
+ font-size: 1.6rem; font-weight: 700;
722
+ background: linear-gradient(135deg, var(--accent-cyan), var(--accent-magenta));
723
+ -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent;
724
+ }
725
+
726
+ /* ---------------------------------------------------------------------- */
727
+ /* Loading dots */
728
+ /* ---------------------------------------------------------------------- */
729
+
730
+ .typing-dots { display: inline-flex; gap: 4px; padding: 6px 0; }
731
+ .typing-dots span { width: 6px; height: 6px; border-radius: 50%; background: var(--accent-cyan); animation: bounce-dot 1.2s infinite ease-in-out; }
732
+ .typing-dots span:nth-child(2) { animation-delay: 0.15s; }
733
+ .typing-dots span:nth-child(3) { animation-delay: 0.3s; }
734
+
735
+ @keyframes bounce-dot {
736
+ 0%, 80%, 100% { transform: translateY(0); opacity: 0.4; }
737
+ 40% { transform: translateY(-6px); opacity: 1; }
738
+ }
739
+
740
+ .svg-render-host { display: inline-block; isolation: isolate; }
741
+
742
+ .toast {
743
+ position: fixed; bottom: 20px; right: 20px;
744
+ background: var(--bg-panel-solid);
745
+ border: 1px solid var(--accent-cyan-dim);
746
+ color: var(--text-primary);
747
+ padding: 12px 18px;
748
+ border-radius: var(--radius-md);
749
+ font-size: 0.82rem;
750
+ box-shadow: var(--shadow-deep);
751
+ z-index: 999;
752
+ opacity: 0;
753
+ transform: translateY(10px);
754
+ transition: all 0.25s ease;
755
+ pointer-events: none;
756
+ }
757
+
758
+ .toast.visible { opacity: 1; transform: translateY(0); }
759
+ .toast.error { border-color: rgba(255,77,109,0.4); color: var(--accent-red); }
760
+ .toast.success { border-color: rgba(46,230,166,0.4); color: var(--accent-green); }
761
+
762
+ /* ==========================================================================
763
+ MuxMind AI — v2 additions: chat history sidebar, RTL/i18n, file viewer,
764
+ image generation, password change, empty-state network map
765
+ ========================================================================== */
766
+
767
+ /* ---- App shell now has a 3rd column: chat history rail ---- */
768
+ .app-shell { display: grid; grid-template-columns: 60px auto 1fr; height: 100%; }
769
+ .app-shell.history-collapsed { grid-template-columns: 60px 1fr; }
770
+
771
+ .history-rail {
772
+ width: 260px;
773
+ background: var(--bg-panel);
774
+ border-right: 1px solid var(--border-glass);
775
+ backdrop-filter: blur(16px);
776
+ display: flex; flex-direction: column;
777
+ overflow: hidden;
778
+ transition: width 0.2s ease;
779
+ }
780
+ .app-shell.history-collapsed .history-rail { width: 0; border: none; }
781
+
782
+ .history-header {
783
+ display: flex; align-items: center; justify-content: space-between;
784
+ padding: 14px 12px; gap: 8px; border-bottom: 1px solid var(--border-glass);
785
+ }
786
+ .history-header h3 { font-size: 0.85rem; color: var(--text-secondary); font-weight: 600; }
787
+ .btn-new-chat {
788
+ display: flex; align-items: center; gap: 6px;
789
+ background: linear-gradient(135deg, var(--accent-cyan), var(--accent-magenta));
790
+ color: #06121a; border: none; border-radius: var(--radius-sm);
791
+ padding: 8px 10px; font-size: 0.78rem; font-weight: 700; cursor: pointer;
792
+ width: 100%; justify-content: center;
793
+ }
794
+ .btn-new-chat:hover { filter: brightness(1.08); }
795
+
796
+ .history-search { padding: 8px 12px; }
797
+ .history-search input {
798
+ width: 100%; padding: 7px 10px; border-radius: var(--radius-sm);
799
+ border: 1px solid var(--border-glass); background: var(--bg-elevated);
800
+ color: var(--text-primary); font-size: 0.78rem;
801
+ }
802
+
803
+ .history-list { flex: 1; overflow-y: auto; padding: 6px 8px; }
804
+ .history-item {
805
+ display: flex; align-items: center; gap: 8px;
806
+ padding: 9px 10px; border-radius: var(--radius-sm);
807
+ cursor: pointer; margin-bottom: 3px; position: relative;
808
+ color: var(--text-secondary); font-size: 0.82rem;
809
+ }
810
+ .history-item:hover { background: var(--bg-elevated); color: var(--text-primary); }
811
+ .history-item.active { background: var(--accent-cyan-dim); color: var(--text-primary); }
812
+ .history-item-title {
813
+ flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
814
+ }
815
+ .history-item-actions { display: none; gap: 4px; }
816
+ .history-item:hover .history-item-actions { display: flex; }
817
+ .history-item-actions button {
818
+ background: none; border: none; color: var(--text-muted); cursor: pointer;
819
+ font-size: 0.78rem; padding: 2px 4px; border-radius: 4px;
820
+ }
821
+ .history-item-actions button:hover { color: var(--accent-red); background: rgba(255,77,109,0.1); }
822
+ .history-empty { padding: 20px 10px; text-align: center; color: var(--text-muted); font-size: 0.78rem; }
823
+
824
+ .btn-toggle-history {
825
+ background: none; border: none; color: var(--text-secondary); cursor: pointer;
826
+ font-size: 1rem; padding: 4px;
827
+ }
828
+
829
+ /* ---- File preview chips now clickable + attachments-in-message ---- */
830
+ .file-chip { cursor: pointer; }
831
+ .file-chip:hover { border-color: var(--accent-cyan-dim); }
832
+
833
+ .msg-attachments {
834
+ display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px;
835
+ }
836
+ .msg-attachment-chip {
837
+ display: flex; align-items: center; gap: 5px;
838
+ background: var(--bg-elevated); border: 1px solid var(--border-glass);
839
+ border-radius: var(--radius-sm); padding: 5px 9px; font-size: 0.74rem;
840
+ cursor: pointer; color: var(--text-secondary);
841
+ }
842
+ .msg-attachment-chip:hover { color: var(--text-primary); border-color: var(--accent-cyan-dim); }
843
+ .msg-attachment-chip img.thumb { width: 18px; height: 18px; object-fit: cover; border-radius: 3px; }
844
+
845
+ /* ---- File viewer modal ---- */
846
+ .modal-overlay {
847
+ position: fixed; inset: 0; background: rgba(0,0,0,0.55);
848
+ display: none; align-items: center; justify-content: center; z-index: 1000;
849
+ backdrop-filter: blur(3px);
850
+ }
851
+ .modal-overlay.open { display: flex; }
852
+ .file-viewer-modal {
853
+ width: min(760px, 92vw); max-height: 84vh; display: flex; flex-direction: column;
854
+ background: var(--bg-panel-solid); border: 1px solid var(--border-glass);
855
+ border-radius: var(--radius-lg); box-shadow: var(--shadow-deep); overflow: hidden;
856
+ }
857
+ .file-viewer-header {
858
+ display: flex; align-items: center; justify-content: space-between;
859
+ padding: 14px 18px; border-bottom: 1px solid var(--border-glass);
860
+ }
861
+ .file-viewer-header h3 { font-size: 0.92rem; }
862
+ .file-viewer-body { padding: 16px 18px; overflow: auto; flex: 1; }
863
+ .file-viewer-body pre {
864
+ white-space: pre-wrap; word-break: break-word; font-family: var(--font-mono);
865
+ font-size: 0.82rem; line-height: 1.5; color: var(--text-primary);
866
+ }
867
+ .file-viewer-body img { max-width: 100%; border-radius: var(--radius-sm); }
868
+ .file-viewer-body iframe { width: 100%; height: 65vh; border: none; border-radius: var(--radius-sm); }
869
+
870
+ /* ---- Image generation panel ---- */
871
+ .imagegen-panel { padding: 16px 18px; display: flex; flex-direction: column; gap: 12px; }
872
+ .imagegen-form { display: flex; gap: 8px; }
873
+ .imagegen-form textarea {
874
+ flex: 1; resize: none; min-height: 44px; max-height: 120px;
875
+ border-radius: var(--radius-sm); border: 1px solid var(--border-glass);
876
+ background: var(--bg-elevated); color: var(--text-primary); padding: 10px 12px;
877
+ font-family: var(--font-main); font-size: 0.85rem;
878
+ }
879
+ .imagegen-form select {
880
+ border-radius: var(--radius-sm); border: 1px solid var(--border-glass);
881
+ background: var(--bg-elevated); color: var(--text-primary); padding: 0 8px;
882
+ font-size: 0.8rem;
883
+ }
884
+ .imagegen-form button {
885
+ background: linear-gradient(135deg, var(--accent-cyan), var(--accent-magenta));
886
+ color: #06121a; border: none; border-radius: var(--radius-sm);
887
+ padding: 0 18px; font-weight: 700; cursor: pointer; font-size: 0.85rem;
888
+ }
889
+ .imagegen-form button:disabled { opacity: 0.5; cursor: not-allowed; }
890
+ .imagegen-results {
891
+ display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
892
+ gap: 12px;
893
+ }
894
+ .imagegen-result { border-radius: var(--radius-md); overflow: hidden; border: 1px solid var(--border-glass); position: relative; }
895
+ .imagegen-result img { width: 100%; display: block; }
896
+ .imagegen-result a.dl-btn {
897
+ position: absolute; bottom: 6px; right: 6px;
898
+ background: rgba(0,0,0,0.55); color: #fff; border-radius: 6px;
899
+ padding: 4px 8px; font-size: 0.7rem; text-decoration: none;
900
+ }
901
+ .imagegen-empty, .imagegen-loading { color: var(--text-muted); font-size: 0.82rem; padding: 20px; text-align: center; }
902
+
903
+ /* ---- Password change form ---- */
904
+ .password-form { display: flex; flex-direction: column; gap: 8px; max-width: 320px; margin-top: 8px; }
905
+ .password-form input {
906
+ padding: 9px 12px; border-radius: var(--radius-sm); border: 1px solid var(--border-glass);
907
+ background: var(--bg-elevated); color: var(--text-primary); font-size: 0.82rem;
908
+ }
909
+ .password-form button {
910
+ align-self: flex-start; background: var(--accent-cyan); color: #06121a; border: none;
911
+ border-radius: var(--radius-sm); padding: 8px 16px; font-weight: 700; cursor: pointer; font-size: 0.8rem;
912
+ }
913
+ .password-form .form-msg { font-size: 0.76rem; min-height: 16px; }
914
+ .password-form .form-msg.error { color: var(--accent-red); }
915
+ .password-form .form-msg.success { color: var(--accent-green); }
916
+
917
+ /* ---- Language selector ---- */
918
+ .lang-toggle { display: flex; gap: 4px; }
919
+ .lang-toggle button {
920
+ padding: 7px 12px; border-radius: var(--radius-sm); border: 1px solid var(--border-glass);
921
+ background: var(--bg-elevated); color: var(--text-secondary); cursor: pointer; font-size: 0.8rem;
922
+ }
923
+ .lang-toggle button.active { background: var(--accent-cyan-dim); color: var(--text-primary); border-color: var(--accent-cyan-dim); }
924
+
925
+ /* ---- RTL support ---- */
926
+ html[dir="rtl"] .app-shell { direction: rtl; }
927
+ html[dir="rtl"] .history-rail { border-right: none; border-left: 1px solid var(--border-glass); }
928
+ html[dir="rtl"] .msg.user { align-self: flex-end; }
929
+ html[dir="rtl"] .toolbar-icons, html[dir="rtl"] .nav-controls { direction: rtl; }
930
+ html[dir="rtl"] .toast { right: auto; left: 20px; }
931
+ html[dir="rtl"] body { font-family: 'Segoe UI', 'Tahoma', var(--font-main); }
932
+
933
+ /* ---- Network map empty state ---- */
934
+ .map-empty-state {
935
+ position: absolute; inset: 0; display: flex; flex-direction: column;
936
+ align-items: center; justify-content: center; gap: 10px; z-index: 3;
937
+ color: var(--text-muted); text-align: center; padding: 20px;
938
+ }
939
+ .map-empty-state .map-empty-icon { width: 56px; height: 56px; opacity: 0.5; }
940
+ .map-node-logo { width: 100%; height: 100%; }
941
+
942
+ /* ---- Rail logo: adaptive background chip so it reads on any theme ---- */
943
+ .rail-logo, .logo-wrap { border-radius: 50%; }
944
+ .logo-chip {
945
+ display: flex; align-items: center; justify-content: center;
946
+ background: var(--bg-elevated); border: 1px solid var(--border-glass);
947
+ border-radius: 50%; padding: 4px;
948
+ }