crewlyze 3.1.0

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.
Files changed (48) hide show
  1. package/.dockerignore +12 -0
  2. package/.gitattributes +2 -0
  3. package/CHANGELOG.md +86 -0
  4. package/Dockerfile +21 -0
  5. package/LICENSE +21 -0
  6. package/README.md +139 -0
  7. package/USAGE.md +106 -0
  8. package/agents/__init__.py +0 -0
  9. package/agents/cleaner.py +38 -0
  10. package/agents/insights.py +44 -0
  11. package/agents/relation.py +36 -0
  12. package/agents/visualizer.py +41 -0
  13. package/assets/badge_crewai.svg +4 -0
  14. package/assets/badge_matplotlib.svg +4 -0
  15. package/assets/badge_ollama.svg +4 -0
  16. package/assets/badge_pandas.svg +4 -0
  17. package/assets/badge_seaborn.svg +4 -0
  18. package/assets/branding_image.png +0 -0
  19. package/assets/complete_workflow.svg +216 -0
  20. package/assets/favicon.png +0 -0
  21. package/assets/logo.png +0 -0
  22. package/assets/stars.svg +12 -0
  23. package/bin/crewlyze.js +79 -0
  24. package/config/README.md +129 -0
  25. package/config/__init__.py +1 -0
  26. package/config/context.py +16 -0
  27. package/config/llm_config.py +300 -0
  28. package/config/metrics_tracker.py +70 -0
  29. package/crew.py +870 -0
  30. package/crewlyze-3.1.0.tgz +0 -0
  31. package/fix_syntax.py +54 -0
  32. package/main.py +1279 -0
  33. package/package.json +22 -0
  34. package/pyproject.toml +32 -0
  35. package/requirements.txt +33 -0
  36. package/tools/__init__.py +0 -0
  37. package/tools/dataset_tools.py +803 -0
  38. package/ui/__init__.py +3 -0
  39. package/ui/copilot.py +200 -0
  40. package/ui/export.py +800 -0
  41. package/update_appjs.py +54 -0
  42. package/update_llm.py +21 -0
  43. package/update_main.py +20 -0
  44. package/web/app.js +3142 -0
  45. package/web/index.html +1105 -0
  46. package/web/style.css +2561 -0
  47. package/workflows/__init__.py +0 -0
  48. package/workflows/pipeline.py +254 -0
package/web/style.css ADDED
@@ -0,0 +1,2561 @@
1
+ /* ══════════════════════════════════════════════════════
2
+ Crewlyze — Premium Dark Web UI
3
+ Design: Obsidian + Electric Violet + Cyan Accents
4
+ ══════════════════════════════════════════════════════ */
5
+
6
+ /* ── Reset & Tokens ─────────────────────────────────── */
7
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
8
+
9
+ :root {
10
+ /* Palette */
11
+ --bg-base: #09090b;
12
+ --bg-surface: #111113;
13
+ --bg-elevated: #18181b;
14
+ --bg-card: #1c1c1f;
15
+ --bg-hover: #27272a;
16
+
17
+ --border: rgba(255,255,255,0.07);
18
+ --border-mid: rgba(255,255,255,0.12);
19
+
20
+ --violet: #ff252a;
21
+ --violet-light: #ff6b6e;
22
+ --violet-glow: rgba(255,37,42,0.25);
23
+ --cyan: #22d3ee;
24
+ --cyan-glow: rgba(34,211,238,0.18);
25
+ --rose: #f43f5e;
26
+ --emerald: #10b981;
27
+ --amber: #f59e0b;
28
+
29
+ --text-primary: #f4f4f5;
30
+ --text-secondary: #a1a1aa;
31
+ --text-muted: #52525b;
32
+
33
+ /* Sidebar */
34
+ --sidebar-w: 280px;
35
+
36
+ /* Type */
37
+ --font-body: 'Inter', system-ui, sans-serif;
38
+ --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
39
+
40
+ /* Radius */
41
+ --r-sm: 6px;
42
+ --r-md: 10px;
43
+ --r-lg: 16px;
44
+ --r-xl: 24px;
45
+
46
+ /* Shadow */
47
+ --shadow-sm: 0 1px 3px rgba(0,0,0,0.5);
48
+ --shadow-md: 0 4px 24px rgba(0,0,0,0.5);
49
+ --shadow-lg: 0 8px 48px rgba(0,0,0,0.7);
50
+ --shadow-violet: 0 0 24px var(--violet-glow);
51
+ }
52
+
53
+ html, body {
54
+ height: 100%;
55
+ font-family: var(--font-body);
56
+ background: var(--bg-base);
57
+ color: var(--text-primary);
58
+ overflow: hidden;
59
+ }
60
+
61
+ /* ── Layout shell ───────────────────────────────────── */
62
+ .sidebar {
63
+ position: fixed;
64
+ left: 0; top: 0; bottom: 0;
65
+ width: var(--sidebar-w);
66
+ background: var(--bg-surface);
67
+ border-right: 1px solid var(--border);
68
+ display: flex;
69
+ flex-direction: column;
70
+ z-index: 100;
71
+ transition: width 0.3s cubic-bezier(0.4,0,0.2,1), transform 0.3s;
72
+ overflow: hidden;
73
+ }
74
+ .sidebar.collapsed { width: 56px; }
75
+ .sidebar.collapsed .sidebar-section,
76
+ .sidebar.collapsed .sidebar-footer { opacity: 0; pointer-events: none; }
77
+ .sidebar.collapsed .logo-text { display: none; }
78
+
79
+ .main-area {
80
+ margin-left: var(--sidebar-w);
81
+ height: 100vh;
82
+ display: flex;
83
+ flex-direction: column;
84
+ overflow: hidden;
85
+ transition: margin-left 0.3s;
86
+ }
87
+ .sidebar.collapsed ~ .main-area { margin-left: 56px; }
88
+
89
+ /* ── Sidebar Header ─────────────────────────────────── */
90
+ .sidebar-header {
91
+ display: flex;
92
+ align-items: center;
93
+ justify-content: space-between;
94
+ padding: 18px 16px;
95
+ border-bottom: 1px solid var(--border);
96
+ min-height: 60px;
97
+ }
98
+ .logo {
99
+ display: flex;
100
+ align-items: center;
101
+ gap: 10px;
102
+ }
103
+ .logo-icon {
104
+ font-size: 22px;
105
+ color: var(--violet-light);
106
+ filter: drop-shadow(0 0 8px var(--violet-glow));
107
+ }
108
+ .logo-text { font-size: 1.25rem; font-weight: 700; letter-spacing: -0.3px; white-space: nowrap; background: linear-gradient(90deg, #ffffff 0%, var(--violet-light) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; }
109
+ .logo-accent { }
110
+ .sidebar-toggle {
111
+ background: none;
112
+ border: 1px solid var(--border-mid);
113
+ color: var(--text-secondary);
114
+ width: 32px; height: 32px;
115
+ border-radius: var(--r-md);
116
+ cursor: pointer;
117
+ font-size: 18px;
118
+ transition: all 0.2s;
119
+ display: flex; align-items: center; justify-content: center;
120
+ }
121
+ .sidebar-toggle:hover { background: var(--bg-hover); color: var(--text-primary); }
122
+
123
+ /* ── Sidebar Sections ───────────────────────────────── */
124
+ .sidebar-section {
125
+ padding: 14px 14px 8px;
126
+ border-bottom: 1px solid var(--border);
127
+ display: flex;
128
+ flex-direction: column;
129
+ gap: 8px;
130
+ }
131
+ .sidebar-section-header {
132
+ display: flex;
133
+ align-items: center;
134
+ justify-content: space-between;
135
+ font-size: 0.65rem;
136
+ font-weight: 600;
137
+ letter-spacing: 0.1em;
138
+ color: var(--text-muted);
139
+ padding: 0 2px;
140
+ margin-bottom: 4px;
141
+ }
142
+
143
+ /* Projects list */
144
+ .projects-list { display: flex; flex-direction: column; gap: 4px; max-height: 200px; overflow-y: auto; }
145
+ .projects-empty { font-size: 0.78rem; color: var(--text-muted); text-align: center; padding: 12px 0; line-height: 1.6; }
146
+ .project-item {
147
+ display: flex;
148
+ align-items: center;
149
+ gap: 8px;
150
+ padding: 8px 10px;
151
+ border-radius: var(--r-sm);
152
+ cursor: pointer;
153
+ transition: background 0.15s;
154
+ border: 1px solid transparent;
155
+ }
156
+ .project-item:hover { background: var(--bg-hover); }
157
+ .project-item.active { background: var(--violet-glow); border-color: rgba(255, 37, 42,0.3); }
158
+ .project-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--text-muted); flex-shrink: 0; }
159
+ .project-dot.completed { background: var(--emerald); }
160
+ .project-dot.running { background: var(--amber); animation: pulse 1.4s infinite; }
161
+ .project-dot.failed { background: var(--rose); }
162
+ .project-name { font-size: 0.82rem; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
163
+ .project-del { background: none; border: none; color: var(--text-muted); cursor: pointer; font-size: 12px; opacity: 0; transition: opacity 0.15s; }
164
+ .project-item:hover .project-del { opacity: 1; }
165
+ .project-del:hover { color: var(--rose); }
166
+
167
+ /* Form fields */
168
+ .field-label { font-size: 0.75rem; color: var(--text-secondary); font-weight: 500; }
169
+ .field-select, .field-input {
170
+ width: 100%;
171
+ background: var(--bg-elevated);
172
+ border: 1px solid var(--border-mid);
173
+ color: var(--text-primary);
174
+ border-radius: var(--r-sm);
175
+ padding: 7px 10px;
176
+ font-family: var(--font-body);
177
+ font-size: 0.82rem;
178
+ outline: none;
179
+ transition: border-color 0.2s;
180
+ }
181
+ .field-select:focus, .field-input:focus { border-color: var(--violet-light); }
182
+ .field-select option { background: var(--bg-elevated); }
183
+ .field-range {
184
+ width: 100%;
185
+ accent-color: var(--violet-light);
186
+ cursor: pointer;
187
+ }
188
+ .key-input-wrap { display: flex; gap: 6px; align-items: center; }
189
+ .key-input-wrap .field-input { flex: 1; }
190
+ .btn-eye { background: none; border: 1px solid var(--border-mid); color: var(--text-secondary); border-radius: var(--r-sm); padding: 6px 8px; cursor: pointer; font-size: 14px; }
191
+ .btn-eye:hover { background: var(--bg-hover); }
192
+
193
+ .connection-status { font-size: 0.75rem; min-height: 18px; }
194
+ .connection-status.ok { color: var(--emerald); }
195
+ .connection-status.error { color: var(--rose); }
196
+ .connection-status.loading { color: var(--amber); }
197
+
198
+ .sidebar-footer {
199
+ margin-top: auto;
200
+ padding: 12px 16px;
201
+ font-size: 0.7rem;
202
+ color: var(--text-muted);
203
+ border-top: 1px solid var(--border);
204
+ }
205
+
206
+ /* ── Topbar ─────────────────────────────────────────── */
207
+ .topbar {
208
+ display: flex;
209
+ align-items: center;
210
+ justify-content: space-between;
211
+ padding: 0 24px;
212
+ height: 56px;
213
+ border-bottom: 1px solid var(--border);
214
+ background: rgba(9,9,11,0.8);
215
+ backdrop-filter: blur(12px);
216
+ flex-shrink: 0;
217
+ }
218
+ .topbar-left { display: flex; align-items: center; gap: 14px; }
219
+ .breadcrumb { display: flex; gap: 6px; align-items: center; font-size: 0.85rem; }
220
+ .breadcrumb-item { color: var(--text-muted); }
221
+ .breadcrumb-item.active { color: var(--text-primary); font-weight: 500; }
222
+ .breadcrumb-sep { color: var(--text-muted); }
223
+
224
+ .status-pill {
225
+ font-size: 0.72rem;
226
+ font-weight: 600;
227
+ padding: 4px 12px;
228
+ border-radius: 99px;
229
+ letter-spacing: 0.05em;
230
+ }
231
+ .status-pill.idle { background: rgba(82,82,91,0.2); color: var(--text-muted); }
232
+ .status-pill.running { background: rgba(245,158,11,0.15); color: var(--amber); animation: pulse 1.8s infinite; }
233
+ .status-pill.complete { background: rgba(16,185,129,0.15); color: var(--emerald); }
234
+ .status-pill.error { background: rgba(244,63,94,0.15); color: var(--rose); }
235
+
236
+ /* ── Screens ─────────────────────────────────────────── */
237
+ .screen { display: none; flex: 1; min-height: 0; overflow-y: auto; padding: 32px 28px 28px; }
238
+ .screen.active { display: flex; flex-direction: column; gap: 28px; }
239
+
240
+ /* ── Landing ─────────────────────────────────────────── */
241
+ .landing-hero {
242
+ position: relative;
243
+ text-align: center;
244
+ display: flex;
245
+ flex-direction: column;
246
+ align-items: center;
247
+ gap: 20px;
248
+ padding: 60px 24px 44px;
249
+ background: radial-gradient(circle at top, rgba(255, 37, 42, 0.12) 0%, transparent 65%),
250
+ rgba(18, 18, 22, 0.45);
251
+ border: 1px solid rgba(255, 255, 255, 0.05);
252
+ box-shadow: 0 20px 50px rgba(0, 0, 0, 0.35), inset 0 1px 0 rgba(255, 255, 255, 0.03);
253
+ backdrop-filter: blur(20px);
254
+ -webkit-backdrop-filter: blur(20px);
255
+ border-radius: var(--r-xl);
256
+ margin-bottom: 8px;
257
+ overflow: hidden;
258
+ flex-shrink: 0;
259
+ }
260
+ .landing-hero::before {
261
+ content: "";
262
+ position: absolute;
263
+ top: -10%; left: 50%;
264
+ transform: translateX(-50%);
265
+ width: 800px;
266
+ height: 450px;
267
+ background: radial-gradient(circle, rgba(255, 37, 42, 0.22) 0%, rgba(34, 211, 238, 0.08) 45%, rgba(9, 9, 11, 0) 75%);
268
+ filter: blur(80px);
269
+ z-index: -1;
270
+ pointer-events: none;
271
+ }
272
+ .landing-hero::after {
273
+ content: "";
274
+ position: absolute;
275
+ inset: 0;
276
+ background-image: linear-gradient(rgba(255, 255, 255, 0.015) 1px, transparent 1px),
277
+ linear-gradient(90deg, rgba(255, 255, 255, 0.015) 1px, transparent 1px);
278
+ background-size: 28px 28px;
279
+ background-position: center;
280
+ mask-image: radial-gradient(circle, black 30%, transparent 75%);
281
+ -webkit-mask-image: radial-gradient(circle, black 30%, transparent 75%);
282
+ z-index: -1;
283
+ pointer-events: none;
284
+ }
285
+ .hero-badge {
286
+ font-size: 0.72rem;
287
+ font-weight: 600;
288
+ letter-spacing: 0.08em;
289
+ padding: 6px 16px;
290
+ border-radius: 99px;
291
+ border: 1px solid rgba(255, 37, 42, 0.35);
292
+ color: var(--text-primary);
293
+ background: linear-gradient(90deg, rgba(255, 37, 42, 0.12) 0%, rgba(34, 211, 238, 0.08) 100%);
294
+ box-shadow: 0 4px 12px rgba(255, 37, 42, 0.06);
295
+ display: inline-flex;
296
+ align-items: center;
297
+ gap: 6px;
298
+ text-transform: uppercase;
299
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
300
+ cursor: default;
301
+ }
302
+ .hero-badge:hover {
303
+ border-color: rgba(34, 211, 238, 0.5);
304
+ box-shadow: 0 4px 20px rgba(34, 211, 238, 0.15);
305
+ transform: translateY(-1px);
306
+ }
307
+ .hero-title {
308
+ font-size: clamp(2.4rem, 5.5vw, 3.6rem);
309
+ font-weight: 800;
310
+ line-height: 1.12;
311
+ letter-spacing: -1.5px;
312
+ color: #ffffff;
313
+ text-shadow: 0 0 40px rgba(255, 37, 42, 0.1);
314
+ margin-top: 4px;
315
+ }
316
+ @keyframes gradientShift {
317
+ 0% { background-position: 0% 50%; }
318
+ 50% { background-position: 100% 50%; }
319
+ 100% { background-position: 0% 50%; }
320
+ }
321
+ .gradient-text {
322
+ background: linear-gradient(135deg, #ffffff 0%, var(--violet-light) 50%, #ffffff 100%);
323
+ background-size: 300% auto;
324
+ -webkit-background-clip: text;
325
+ -webkit-text-fill-color: transparent;
326
+ background-clip: text;
327
+ animation: gradientShift 6s ease infinite;
328
+ }
329
+ .hero-subtitle {
330
+ font-size: 1.08rem;
331
+ color: #94a3b8;
332
+ max-width: 580px;
333
+ line-height: 1.7;
334
+ margin-bottom: 16px;
335
+ }
336
+
337
+ /* Upload zone */
338
+ .upload-zone {
339
+ width: 100%;
340
+ max-width: 520px;
341
+ border: 2px dashed rgba(255, 37, 42,0.35);
342
+ border-radius: var(--r-xl);
343
+ padding: 40px 30px;
344
+ text-align: center;
345
+ cursor: pointer;
346
+ transition: all 0.25s;
347
+ background: rgba(255, 37, 42,0.04);
348
+ position: relative;
349
+ }
350
+ .upload-zone:hover, .upload-zone.drag-over {
351
+ border-color: var(--violet-light);
352
+ background: rgba(255, 37, 42,0.1);
353
+ box-shadow: var(--shadow-violet);
354
+ }
355
+ .upload-icon { font-size: 2.5rem; margin-bottom: 10px; }
356
+ .upload-title { font-size: 1.05rem; font-weight: 600; margin-bottom: 6px; }
357
+ .upload-hint { font-size: 0.85rem; color: var(--text-secondary); }
358
+ .upload-link { color: var(--violet-light); cursor: pointer; text-decoration: underline; }
359
+ .upload-meta { margin-top: 14px; font-size: 0.82rem; color: var(--emerald); }
360
+ .upload-actions { display: flex; flex-direction: column; align-items: center; gap: 10px; }
361
+
362
+ .feature-grid {
363
+ display: grid;
364
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
365
+ gap: 20px;
366
+ margin-top: 30px;
367
+ }
368
+ .feature-card {
369
+ background: var(--bg-card);
370
+ border: 1px solid var(--border);
371
+ border-radius: var(--r-lg);
372
+ padding: 24px 22px;
373
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
374
+ display: flex;
375
+ flex-direction: column;
376
+ gap: 12px;
377
+ }
378
+ .feature-card:hover {
379
+ border-color: var(--border-mid);
380
+ background: var(--bg-elevated);
381
+ transform: translateY(-4px);
382
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.3);
383
+ }
384
+ .feature-header-row {
385
+ display: flex;
386
+ justify-content: space-between;
387
+ align-items: center;
388
+ margin-bottom: 4px;
389
+ }
390
+ .feature-step-num {
391
+ font-size: 0.72rem;
392
+ font-weight: 700;
393
+ text-transform: uppercase;
394
+ letter-spacing: 0.1em;
395
+ color: var(--text-secondary);
396
+ }
397
+ .feature-step-badge {
398
+ font-size: 0.65rem;
399
+ font-weight: 700;
400
+ padding: 2px 8px;
401
+ border-radius: 4px;
402
+ letter-spacing: 0.05em;
403
+ }
404
+ .feature-step-badge.clean { background: rgba(16, 185, 129, 0.12); color: var(--emerald); }
405
+ .feature-step-badge.relations { background: rgba(34, 211, 238, 0.12); color: var(--cyan); }
406
+ .feature-step-badge.insights { background: rgba(245, 158, 11, 0.12); color: var(--amber); }
407
+ .feature-step-badge.visualize { background: rgba(167, 139, 250, 0.12); color: var(--violet-light); }
408
+ .feature-step-badge.output { background: rgba(244, 63, 94, 0.12); color: var(--rose); }
409
+
410
+ .feature-title {
411
+ font-size: 1.05rem;
412
+ font-weight: 600;
413
+ color: var(--text-primary);
414
+ }
415
+ .feature-desc {
416
+ font-size: 0.8rem;
417
+ color: var(--text-secondary);
418
+ line-height: 1.5;
419
+ }
420
+ .feature-bullet-list {
421
+ list-style: none;
422
+ padding: 0;
423
+ margin: 4px 0 0 0;
424
+ display: flex;
425
+ flex-direction: column;
426
+ gap: 8px;
427
+ border-top: 1px solid rgba(255,255,255,0.03);
428
+ padding-top: 12px;
429
+ }
430
+ .feature-bullet-list li {
431
+ font-size: 0.78rem;
432
+ color: var(--text-secondary);
433
+ position: relative;
434
+ padding-left: 14px;
435
+ line-height: 1.45;
436
+ }
437
+ .feature-bullet-list li::before {
438
+ content: "•";
439
+ position: absolute;
440
+ left: 0;
441
+ color: var(--violet-light);
442
+ font-weight: bold;
443
+ }
444
+ .feature-bullet-list li strong {
445
+ color: var(--text-primary);
446
+ font-weight: 600;
447
+ }
448
+
449
+ /* ── Modal ───────────────────────────────────────────── */
450
+ .modal-overlay {
451
+ position: fixed; inset: 0;
452
+ background: rgba(0,0,0,0.75);
453
+ backdrop-filter: blur(6px);
454
+ z-index: 200;
455
+ display: flex;
456
+ align-items: center;
457
+ justify-content: center;
458
+ padding: 20px;
459
+ }
460
+ .modal-overlay.hidden { display: none; }
461
+ .modal-box {
462
+ background: var(--bg-elevated);
463
+ border: 1px solid var(--border-mid);
464
+ border-radius: var(--r-xl);
465
+ width: 100%;
466
+ max-width: 680px;
467
+ box-shadow: var(--shadow-lg);
468
+ display: flex;
469
+ flex-direction: column;
470
+ max-height: 90vh;
471
+ overflow: hidden;
472
+ }
473
+ .modal-header {
474
+ display: flex; align-items: center; justify-content: space-between;
475
+ padding: 20px 24px;
476
+ border-bottom: 1px solid var(--border);
477
+ }
478
+ .modal-header h2 { font-size: 1.05rem; font-weight: 700; }
479
+ .modal-body { padding: 20px 24px; overflow-y: auto; display: flex; flex-direction: column; gap: 18px; }
480
+ .modal-hint { font-size: 0.82rem; color: var(--text-secondary); }
481
+ .modal-footer {
482
+ display: flex; justify-content: flex-end; gap: 10px;
483
+ padding: 16px 24px;
484
+ border-top: 1px solid var(--border);
485
+ }
486
+
487
+ /* Task cards */
488
+ .task-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
489
+ .task-card {
490
+ display: flex;
491
+ align-items: center;
492
+ gap: 12px;
493
+ background: var(--bg-card);
494
+ border: 1px solid var(--border-mid);
495
+ border-radius: var(--r-md);
496
+ padding: 14px;
497
+ cursor: pointer;
498
+ transition: all 0.2s;
499
+ position: relative;
500
+ }
501
+ .task-card input[type=checkbox] { display: none; }
502
+ .task-card:hover { border-color: var(--violet-light); background: var(--bg-hover); }
503
+ .task-card.checked { border-color: var(--violet-light); background: rgba(255, 37, 42,0.1); }
504
+ .task-card.disabled { opacity: 0.4; pointer-events: none; }
505
+ .task-card-icon { font-size: 1.5rem; flex-shrink: 0; }
506
+ .task-card-body { flex: 1; }
507
+ .task-card-title { font-size: 0.88rem; font-weight: 600; }
508
+ .task-card-desc { font-size: 0.73rem; color: var(--text-secondary); margin-top: 2px; line-height: 1.4; }
509
+ .task-card-desc em { color: var(--amber); font-style: normal; }
510
+ .task-card-check {
511
+ width: 22px; height: 22px;
512
+ border-radius: 50%;
513
+ border: 1.5px solid var(--border-mid);
514
+ display: flex; align-items: center; justify-content: center;
515
+ font-size: 12px;
516
+ color: transparent;
517
+ background: transparent;
518
+ transition: all 0.2s;
519
+ flex-shrink: 0;
520
+ }
521
+ .task-card.checked .task-card-check {
522
+ background: var(--violet-light);
523
+ border-color: var(--violet-light);
524
+ color: white;
525
+ }
526
+
527
+ /* Depth selector */
528
+ .depth-selector { display: flex; flex-direction: column; gap: 8px; }
529
+ .depth-label { font-size: 0.78rem; color: var(--text-secondary); font-weight: 500; }
530
+ .depth-options { display: flex; gap: 10px; }
531
+ .depth-option {
532
+ flex: 1;
533
+ display: flex;
534
+ flex-direction: column;
535
+ align-items: center;
536
+ gap: 4px;
537
+ padding: 14px;
538
+ border-radius: var(--r-md);
539
+ border: 1px solid var(--border-mid);
540
+ cursor: pointer;
541
+ transition: all 0.2s;
542
+ text-align: center;
543
+ }
544
+ .depth-option input { display: none; }
545
+ .depth-option:hover { border-color: var(--violet-light); background: var(--bg-hover); }
546
+ .depth-option.active { border-color: var(--violet-light); background: rgba(255, 37, 42,0.1); }
547
+ .depth-icon { font-size: 1.4rem; }
548
+ .depth-name { font-size: 0.85rem; font-weight: 600; }
549
+ .depth-desc { font-size: 0.72rem; color: var(--text-secondary); }
550
+
551
+ .field-group { display: flex; flex-direction: column; gap: 6px; }
552
+
553
+ /* ── Running Screen ──────────────────────────────────── */
554
+ .running-header {
555
+ display: flex;
556
+ align-items: center;
557
+ gap: 20px;
558
+ background: var(--bg-card);
559
+ border: 1px solid var(--border);
560
+ border-radius: var(--r-lg);
561
+ padding: 24px;
562
+ }
563
+ .running-spinner {
564
+ width: 44px; height: 44px;
565
+ border: 3px solid var(--border-mid);
566
+ border-top-color: var(--violet-light);
567
+ border-radius: 50%;
568
+ animation: spin 0.9s linear infinite;
569
+ flex-shrink: 0;
570
+ }
571
+ .running-header h2 { font-size: 1.05rem; font-weight: 700; }
572
+ .running-sub { font-size: 0.82rem; color: var(--text-secondary); margin-top: 4px; }
573
+
574
+ .stages-track {
575
+ display: flex;
576
+ align-items: center;
577
+ gap: 0;
578
+ background: transparent;
579
+ backdrop-filter: none;
580
+ -webkit-backdrop-filter: none;
581
+ border: none;
582
+ border-radius: 0;
583
+ padding: 24px 0 32px 0; /* Increase bottom padding to accommodate labels */
584
+ overflow: visible; /* Allow labels to be shown fully without vertical clipping */
585
+ box-shadow: none;
586
+ }
587
+ .stage-item {
588
+ display: flex;
589
+ flex-direction: column;
590
+ align-items: center;
591
+ gap: 12px;
592
+ flex: 1;
593
+ position: relative;
594
+ min-width: 90px;
595
+ }
596
+ .stage-item:not(:last-child)::after {
597
+ content: '';
598
+ position: absolute;
599
+ top: 11px;
600
+ left: calc(50% + 18px);
601
+ right: calc(-50% + 18px);
602
+ height: 3px;
603
+ background: rgba(255, 255, 255, 0.05);
604
+ z-index: 0;
605
+ border-radius: 99px;
606
+ transition: all 0.4s ease;
607
+ }
608
+ .stage-item.done:not(:last-child)::after {
609
+ background: var(--emerald);
610
+ box-shadow: 0 0 10px rgba(16, 185, 129, 0.5);
611
+ }
612
+ .stage-item.active:not(:last-child)::after {
613
+ background: linear-gradient(90deg, var(--violet-light) 0%, rgba(255, 255, 255, 0.05) 100%);
614
+ }
615
+ .stage-dot {
616
+ width: 24px;
617
+ height: 24px;
618
+ border-radius: 50%;
619
+ background: var(--bg-surface);
620
+ border: 2.5px solid var(--border-mid);
621
+ z-index: 1;
622
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
623
+ box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.2);
624
+ }
625
+ .stage-item.done .stage-dot {
626
+ background: var(--emerald);
627
+ border-color: var(--emerald);
628
+ box-shadow: 0 0 14px rgba(16, 185, 129, 0.5);
629
+ transform: scale(1.0);
630
+ }
631
+ .stage-item.active .stage-dot {
632
+ background: var(--violet-light);
633
+ border-color: var(--violet-light);
634
+ transform: scale(1.15); /* Scale active dot to stand out */
635
+ box-shadow: 0 0 18px rgba(167, 139, 250, 0.6);
636
+ animation: stageDotActivePulse 1.4s infinite alternate;
637
+ }
638
+ .stage-label {
639
+ font-size: 0.8rem;
640
+ color: var(--text-muted);
641
+ font-weight: 600;
642
+ letter-spacing: 0.02em;
643
+ transition: all 0.3s;
644
+ white-space: nowrap;
645
+ }
646
+ .stage-item.done .stage-label {
647
+ color: var(--emerald);
648
+ font-weight: 700;
649
+ text-shadow: 0 0 8px rgba(16, 185, 129, 0.3);
650
+ }
651
+ .stage-item.active .stage-label {
652
+ color: var(--violet-light);
653
+ font-weight: 700;
654
+ text-shadow: 0 0 10px rgba(167, 139, 250, 0.4);
655
+ }
656
+
657
+ @keyframes stageDotActivePulse {
658
+ 0% {
659
+ box-shadow: 0 0 0 0px rgba(167, 139, 250, 0.6), 0 0 12px rgba(167, 139, 250, 0.4);
660
+ }
661
+ 100% {
662
+ box-shadow: 0 0 0 8px rgba(167, 139, 250, 0.0), 0 0 20px rgba(167, 139, 250, 0.8);
663
+ }
664
+ }
665
+ /* ── Stage POV Panel ────────────────────────────────── */
666
+ .stage-pov-panel {
667
+ background: rgba(22, 22, 25, 0.45);
668
+ border: 1px solid rgba(255, 255, 255, 0.05);
669
+ border-radius: var(--r-lg);
670
+ padding: 24px;
671
+ margin: 16px 0;
672
+ display: flex;
673
+ flex-direction: column;
674
+ gap: 18px;
675
+ backdrop-filter: blur(12px);
676
+ -webkit-backdrop-filter: blur(12px);
677
+ transition: all 0.3s ease;
678
+ min-height: 250px;
679
+ }
680
+
681
+ .pov-initial-state {
682
+ display: flex;
683
+ flex-direction: column;
684
+ align-items: center;
685
+ justify-content: center;
686
+ height: 180px;
687
+ color: var(--text-muted);
688
+ gap: 12px;
689
+ }
690
+
691
+ .pov-pulse-ring {
692
+ width: 28px;
693
+ height: 28px;
694
+ border-radius: 50%;
695
+ border: 2px solid var(--violet-light);
696
+ border-top-color: transparent;
697
+ animation: spin 1s linear infinite;
698
+ }
699
+
700
+ .pov-header {
701
+ display: flex;
702
+ flex-direction: column;
703
+ gap: 6px;
704
+ }
705
+ .pov-title {
706
+ font-size: 1.1rem;
707
+ font-weight: 700;
708
+ color: #ffffff;
709
+ display: flex;
710
+ align-items: center;
711
+ gap: 8px;
712
+ }
713
+ .pov-desc {
714
+ font-size: 0.82rem;
715
+ color: var(--text-secondary);
716
+ line-height: 1.45;
717
+ }
718
+
719
+ .pov-content {
720
+ display: flex;
721
+ align-items: center;
722
+ justify-content: center;
723
+ height: 180px;
724
+ border-radius: var(--r-md);
725
+ background: rgba(13, 13, 15, 0.5);
726
+ border: 1px solid rgba(255, 255, 255, 0.03);
727
+ overflow: hidden;
728
+ position: relative;
729
+ }
730
+
731
+ /* Cleaning Simulator */
732
+ .pov-scanner-wrap {
733
+ max-width: 600px;
734
+ width: 100%;
735
+ margin: 0 auto;
736
+ height: 100%;
737
+ display: flex;
738
+ flex-direction: column;
739
+ padding: 18px 24px;
740
+ gap: 10px;
741
+ font-family: var(--font-mono);
742
+ font-size: 0.78rem;
743
+ color: #10b981;
744
+ position: relative;
745
+ }
746
+ .pov-scanner-line {
747
+ position: absolute;
748
+ left: 0; right: 0;
749
+ height: 2px;
750
+ background: linear-gradient(to right, transparent, #10b981, transparent);
751
+ box-shadow: 0 0 8px #10b981;
752
+ animation: scanline 2.5s ease-in-out infinite;
753
+ z-index: 5;
754
+ }
755
+ .pov-scanner-row {
756
+ display: flex;
757
+ justify-content: space-between;
758
+ opacity: 0.85;
759
+ }
760
+ .pov-scanner-row.active {
761
+ color: #ffffff;
762
+ text-shadow: 0 0 4px #10b981;
763
+ }
764
+
765
+ /* Correlation Chord Simulator */
766
+ .pov-chords-svg {
767
+ width: 240px;
768
+ height: 150px;
769
+ overflow: visible;
770
+ }
771
+ .pov-chords-rotate {
772
+ transform-origin: 80px 50px;
773
+ animation: rotateChords 25s linear infinite;
774
+ }
775
+ .pov-node {
776
+ fill: rgba(15, 15, 18, 0.9);
777
+ stroke: var(--violet-light);
778
+ stroke-width: 1.5px;
779
+ transition: all 0.3s;
780
+ animation: nodePulse 2.4s ease-in-out infinite alternate;
781
+ }
782
+ .pov-node:nth-child(even) {
783
+ animation-delay: 1.2s;
784
+ }
785
+ .pov-node:hover {
786
+ stroke: var(--cyan);
787
+ fill: var(--cyan);
788
+ }
789
+ .pov-chord-line {
790
+ stroke: var(--violet-light);
791
+ stroke-width: 1px;
792
+ opacity: 0.15;
793
+ stroke-dasharray: 4, 4;
794
+ animation: dash 15s linear infinite;
795
+ }
796
+ .pov-chord-line.active {
797
+ stroke: var(--cyan);
798
+ stroke-width: 1.5px;
799
+ opacity: 0.7;
800
+ stroke-dasharray: none;
801
+ animation: pulseGlow 1.5s infinite;
802
+ }
803
+
804
+ /* Insights Pulse */
805
+ .pov-insight-bulb {
806
+ display: flex;
807
+ align-items: center;
808
+ justify-content: center;
809
+ gap: 32px;
810
+ max-width: 520px;
811
+ margin: 0 auto;
812
+ width: 100%;
813
+ height: 100%;
814
+ }
815
+ .pov-bulb-icon {
816
+ width: 64px;
817
+ height: 64px;
818
+ color: #f59e0b;
819
+ filter: drop-shadow(0 0 12px rgba(245,158,11,0.5));
820
+ animation: bounceSlow 2s ease-in-out infinite;
821
+ }
822
+ .pov-insight-bullets {
823
+ display: flex;
824
+ flex-direction: column;
825
+ gap: 10px;
826
+ color: var(--text-primary);
827
+ font-size: 0.85rem;
828
+ font-weight: 500;
829
+ }
830
+ .pov-bullet-text {
831
+ opacity: 0;
832
+ transform: translateX(-5px);
833
+ animation: slideInText 4s forwards infinite;
834
+ }
835
+ .pov-bullet-text:nth-child(1) { animation-delay: 0.2s; }
836
+ .pov-bullet-text:nth-child(2) { animation-delay: 1.2s; }
837
+ .pov-bullet-text:nth-child(3) { animation-delay: 2.2s; }
838
+
839
+ /* Visual compiler coordinates */
840
+ .pov-compiler-svg {
841
+ width: 250px;
842
+ height: 150px;
843
+ overflow: visible;
844
+ }
845
+ .pov-axis {
846
+ stroke: rgba(255, 255, 255, 0.15);
847
+ stroke-width: 1.5px;
848
+ }
849
+ .pov-compiler-path {
850
+ fill: none;
851
+ stroke: var(--cyan);
852
+ stroke-width: 2px;
853
+ stroke-dasharray: 200;
854
+ stroke-dashoffset: 200;
855
+ animation: drawPath 3.5s ease-in-out forwards infinite;
856
+ }
857
+ .pov-dot {
858
+ fill: #ec4899;
859
+ opacity: 0;
860
+ animation: showDot 3.5s ease-in-out infinite;
861
+ }
862
+
863
+ /* Plotly Skeleton Dashboard */
864
+ .pov-plotly-grid {
865
+ display: grid;
866
+ grid-template-columns: repeat(3, 1fr);
867
+ gap: 12px;
868
+ width: 100%;
869
+ padding: 14px;
870
+ }
871
+ .pov-skeleton-card {
872
+ background: rgba(255, 255, 255, 0.02);
873
+ border: 1px solid rgba(255, 255, 255, 0.04);
874
+ border-radius: 8px;
875
+ height: 140px;
876
+ padding: 14px;
877
+ display: flex;
878
+ flex-direction: column;
879
+ justify-content: space-between;
880
+ position: relative;
881
+ overflow: hidden;
882
+ }
883
+ .pov-skeleton-card::after {
884
+ content: '';
885
+ position: absolute;
886
+ top: 0; left: -150%;
887
+ width: 100%; height: 100%;
888
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.05), transparent);
889
+ animation: shimmer 1.5s infinite;
890
+ }
891
+ .pov-skeleton-header {
892
+ height: 8px;
893
+ background: rgba(255,255,255,0.06);
894
+ border-radius: 4px;
895
+ width: 60%;
896
+ }
897
+ .pov-skeleton-body {
898
+ height: 80px;
899
+ border-radius: 4px;
900
+ border: 1.5px dashed rgba(255, 255, 255, 0.06);
901
+ display: flex;
902
+ align-items: flex-end;
903
+ justify-content: space-around;
904
+ padding: 6px;
905
+ }
906
+ .pov-skeleton-bar {
907
+ width: 6px;
908
+ border-radius: 2px;
909
+ background: var(--violet-light);
910
+ opacity: 0.4;
911
+ height: 40%;
912
+ animation: skeletonBarGrow 1.8s ease-in-out infinite alternate;
913
+ }
914
+ .pov-skeleton-bar:nth-child(2) { height: 70%; animation-delay: 0.3s; background: var(--cyan); }
915
+ .pov-skeleton-bar:nth-child(3) { height: 50%; animation-delay: 0.6s; background: #ec4899; }
916
+
917
+ /* Keyframes */
918
+ @keyframes scanline {
919
+ 0% { top: 0%; }
920
+ 50% { top: 100%; }
921
+ 100% { top: 0%; }
922
+ }
923
+ @keyframes dash {
924
+ to { stroke-dashoffset: -1000; }
925
+ }
926
+ @keyframes pulseGlow {
927
+ 0%, 100% { filter: drop-shadow(0 0 1px var(--cyan)); opacity: 0.6; }
928
+ 50% { filter: drop-shadow(0 0 6px var(--cyan)); opacity: 0.9; }
929
+ }
930
+ @keyframes bounceSlow {
931
+ 0%, 100% { transform: translateY(0); }
932
+ 50% { transform: translateY(-4px); }
933
+ }
934
+ @keyframes slideInText {
935
+ 0% { opacity: 0; transform: translateX(-6px); }
936
+ 10%, 40% { opacity: 1; transform: translateX(0); }
937
+ 50%, 100% { opacity: 0; transform: translateX(6px); }
938
+ }
939
+ @keyframes drawPath {
940
+ 0% { stroke-dashoffset: 200; }
941
+ 45%, 100% { stroke-dashoffset: 0; }
942
+ }
943
+ @keyframes showDot {
944
+ 0%, 30% { opacity: 0; transform: scale(0.3); }
945
+ 45%, 85% { opacity: 1; transform: scale(1); }
946
+ 95%, 100% { opacity: 0; }
947
+ }
948
+ @keyframes shimmer {
949
+ to { left: 150%; }
950
+ }
951
+ @keyframes skeletonBarGrow {
952
+ 0% { height: 20%; }
953
+ 100% { height: 85%; }
954
+ }
955
+ @keyframes stageDotActivePulse {
956
+ 0% { transform: scale(0.95); box-shadow: 0 0 6px var(--violet-light); }
957
+ 100% { transform: scale(1.15); box-shadow: 0 0 16px var(--violet-light), 0 0 4px var(--violet-light); }
958
+ }
959
+ @keyframes rotateChords {
960
+ from { transform: rotate(0deg); }
961
+ to { transform: rotate(360deg); }
962
+ }
963
+ @keyframes nodePulse {
964
+ 0% { r: 3.5px; fill: rgba(255, 37, 42, 0.5); filter: drop-shadow(0 0 1px var(--violet-light)); }
965
+ 100% { r: 5.5px; fill: var(--cyan); filter: drop-shadow(0 0 5px var(--cyan)); }
966
+ }
967
+
968
+ .log-panel {
969
+ background: var(--bg-surface);
970
+ border: 1px solid var(--border);
971
+ border-radius: var(--r-lg);
972
+ flex: 1;
973
+ display: flex;
974
+ flex-direction: column;
975
+ min-height: 220px;
976
+ max-height: 400px;
977
+ }
978
+ .log-header {
979
+ display: flex; align-items: center; justify-content: space-between;
980
+ padding: 10px 16px;
981
+ border-bottom: 1px solid var(--border);
982
+ font-size: 0.78rem;
983
+ color: var(--text-secondary);
984
+ }
985
+ .log-output {
986
+ flex: 1;
987
+ overflow-y: auto;
988
+ padding: 12px 16px;
989
+ font-family: var(--font-mono);
990
+ font-size: 0.75rem;
991
+ line-height: 1.7;
992
+ color: var(--text-secondary);
993
+ white-space: pre-wrap;
994
+ word-break: break-all;
995
+ }
996
+ .log-output .log-line { padding: 1px 0; }
997
+ .log-output .log-line.thought { color: #c084fc; }
998
+ .log-output .log-line.action { color: var(--cyan); }
999
+ .log-output .log-line.response { color: var(--emerald); }
1000
+ .log-output .log-line.error { color: var(--rose); }
1001
+ .log-output .log-line.warning { color: var(--amber); }
1002
+ .log-output .log-line.done { color: var(--emerald); font-weight: 600; }
1003
+
1004
+ /* ── Stats Row ───────────────────────────────────────── */
1005
+ .stats-row {
1006
+ display: grid;
1007
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
1008
+ gap: 14px;
1009
+ flex-shrink: 0;
1010
+ }
1011
+ .stat-card {
1012
+ background: var(--bg-card);
1013
+ border: 1px solid var(--border);
1014
+ border-radius: var(--r-lg);
1015
+ padding: 18px 20px;
1016
+ position: relative;
1017
+ overflow: hidden;
1018
+ transition: border-color 0.2s;
1019
+ }
1020
+ .stat-card:hover { border-color: var(--border-mid); }
1021
+ .stat-card::before {
1022
+ content: '';
1023
+ position: absolute;
1024
+ top: 0; left: 0; right: 0;
1025
+ height: 2px;
1026
+ background: linear-gradient(90deg, var(--violet-light), var(--cyan));
1027
+ }
1028
+ .stat-val { font-size: 1.9rem; font-weight: 800; line-height: 1; letter-spacing: -1px; }
1029
+ .stat-lbl { font-size: 0.72rem; color: var(--text-muted); margin-top: 6px; font-weight: 500; letter-spacing: 0.04em; }
1030
+
1031
+ /* ── Tabs ─────────────────────────────────────────────── */
1032
+ .tabs-bar {
1033
+ display: flex;
1034
+ gap: 2px;
1035
+ background: var(--bg-surface);
1036
+ border: 1px solid var(--border);
1037
+ border-radius: var(--r-md);
1038
+ padding: 4px;
1039
+ flex-shrink: 0;
1040
+ overflow-x: auto;
1041
+ }
1042
+ .tab-btn {
1043
+ flex-shrink: 0;
1044
+ background: none;
1045
+ border: none;
1046
+ color: var(--text-secondary);
1047
+ padding: 7px 16px;
1048
+ border-radius: 7px;
1049
+ cursor: pointer;
1050
+ font-size: 0.82rem;
1051
+ font-weight: 500;
1052
+ font-family: var(--font-body);
1053
+ transition: all 0.2s;
1054
+ white-space: nowrap;
1055
+ position: relative;
1056
+ }
1057
+ .tab-btn:hover { background: var(--bg-hover); color: var(--text-primary); }
1058
+ .tab-btn.active {
1059
+ background: var(--bg-elevated);
1060
+ color: var(--text-primary);
1061
+ box-shadow: var(--shadow-sm);
1062
+ }
1063
+ .tab-btn.active::after {
1064
+ content: '';
1065
+ position: absolute;
1066
+ bottom: 0; left: 20%; right: 20%;
1067
+ height: 2px;
1068
+ background: linear-gradient(90deg, var(--violet-light), var(--cyan));
1069
+ border-radius: 2px;
1070
+ box-shadow: 0 0 8px var(--violet-glow);
1071
+ }
1072
+
1073
+ .tab-panels { flex: 1; overflow: hidden; display: flex; flex-direction: column; }
1074
+ .tab-panel { display: none; flex: 1; overflow-y: auto; padding: 20px 0; flex-direction: column; gap: 16px; }
1075
+ .tab-panel.active { display: flex; }
1076
+
1077
+ .panel-title { font-size: 1rem; font-weight: 700; }
1078
+ .panel-toolbar { display: flex; align-items: center; justify-content: space-between; }
1079
+
1080
+ /* ── Data Table ─────────────────────────────────────── */
1081
+ .table-wrap { overflow: auto; border-radius: var(--r-md); border: 1px solid var(--border); background: var(--bg-card); }
1082
+ .data-table { width: 100%; border-collapse: collapse; font-size: 0.78rem; }
1083
+ .data-table th {
1084
+ background: var(--bg-elevated);
1085
+ padding: 9px 12px;
1086
+ text-align: left;
1087
+ font-weight: 600;
1088
+ color: var(--text-secondary);
1089
+ font-size: 0.72rem;
1090
+ letter-spacing: 0.04em;
1091
+ white-space: nowrap;
1092
+ border-bottom: 1px solid var(--border);
1093
+ position: sticky; top: 0; z-index: 10;
1094
+ }
1095
+ .data-table td {
1096
+ padding: 7px 12px;
1097
+ border-bottom: 1px solid var(--border);
1098
+ color: var(--text-primary);
1099
+ max-width: 220px;
1100
+ overflow: hidden;
1101
+ text-overflow: ellipsis;
1102
+ white-space: nowrap;
1103
+ }
1104
+ .data-table tr:hover td { background: var(--bg-hover); }
1105
+ .data-table-container { max-height: 500px; overflow: auto; }
1106
+
1107
+ /* Minimized preview */
1108
+ .preview-minimized {
1109
+ background: var(--bg-card);
1110
+ border: 1px solid var(--border);
1111
+ border-radius: var(--r-md);
1112
+ padding: 16px 20px;
1113
+ color: var(--text-secondary);
1114
+ font-size: 0.85rem;
1115
+ }
1116
+
1117
+ /* ── Cleaning list ───────────────────────────────────── */
1118
+ .cleaning-list { display: flex; flex-direction: column; gap: 10px; }
1119
+ .cleaning-item {
1120
+ display: flex;
1121
+ gap: 12px;
1122
+ align-items: flex-start;
1123
+ background: var(--bg-card);
1124
+ border: 1px solid var(--border);
1125
+ border-radius: var(--r-md);
1126
+ padding: 14px 16px;
1127
+ border-left: 3px solid var(--emerald);
1128
+ }
1129
+ .cleaning-check { font-size: 1rem; flex-shrink: 0; margin-top: 1px; }
1130
+ .cleaning-text { font-size: 0.84rem; color: var(--text-primary); line-height: 1.5; }
1131
+
1132
+ /* ── Relations grid ──────────────────────────────────── */
1133
+ .relations-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 12px; }
1134
+ .relation-card {
1135
+ background: var(--bg-card);
1136
+ border: 1px solid var(--border);
1137
+ border-radius: var(--r-md);
1138
+ padding: 14px 16px;
1139
+ border-left: 3px solid var(--cyan);
1140
+ display: flex;
1141
+ flex-direction: column;
1142
+ gap: 6px;
1143
+ }
1144
+ .relation-cols { display: flex; align-items: center; gap: 8px; font-size: 0.82rem; font-weight: 600; }
1145
+ .relation-col { background: rgba(34,211,238,0.1); color: var(--cyan); padding: 2px 8px; border-radius: 4px; }
1146
+ .relation-arrow { color: var(--text-muted); }
1147
+ .relation-type { font-size: 0.72rem; color: var(--text-muted); background: var(--bg-elevated); padding: 2px 8px; border-radius: 4px; display: inline-block; }
1148
+
1149
+ /* ── Insights ────────────────────────────────────────── */
1150
+ .insights-list { display: flex; flex-direction: column; gap: 16px; }
1151
+ .insight-card {
1152
+ background: rgba(22, 22, 25, 0.4);
1153
+ border: 1px solid var(--border-mid);
1154
+ border-radius: var(--r-lg);
1155
+ padding: 22px 24px;
1156
+ position: relative;
1157
+ display: flex;
1158
+ gap: 16px;
1159
+ align-items: flex-start;
1160
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
1161
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
1162
+ backdrop-filter: blur(8px);
1163
+ -webkit-backdrop-filter: blur(8px);
1164
+ }
1165
+ .insight-card:hover {
1166
+ transform: translateY(-2px);
1167
+ border-color: rgba(167, 139, 250, 0.3);
1168
+ background: rgba(28, 28, 33, 0.65);
1169
+ box-shadow: 0 12px 30px rgba(0, 0, 0, 0.3), 0 0 15px rgba(167, 139, 250, 0.08);
1170
+ }
1171
+ .insight-num-pill {
1172
+ width: 28px;
1173
+ height: 28px;
1174
+ background: var(--violet-glow);
1175
+ color: var(--violet-light);
1176
+ border: 1px solid rgba(167, 139, 250, 0.3);
1177
+ border-radius: 50%;
1178
+ display: flex;
1179
+ align-items: center;
1180
+ justify-content: center;
1181
+ font-family: var(--font-mono);
1182
+ font-size: 0.85rem;
1183
+ font-weight: 700;
1184
+ flex-shrink: 0;
1185
+ box-shadow: 0 0 10px rgba(255, 37, 42, 0.2);
1186
+ }
1187
+ .insight-body {
1188
+ flex: 1;
1189
+ display: flex;
1190
+ flex-direction: column;
1191
+ gap: 14px;
1192
+ }
1193
+ .insight-section { display: flex; flex-direction: column; gap: 6px; }
1194
+ .insight-section-label {
1195
+ font-size: 0.72rem;
1196
+ font-weight: 750;
1197
+ letter-spacing: 0.06em;
1198
+ text-transform: uppercase;
1199
+ display: inline-flex;
1200
+ align-items: center;
1201
+ gap: 4px;
1202
+ }
1203
+ .insight-section-label.obs { color: var(--cyan); }
1204
+ .insight-section-label.impl { color: var(--amber); }
1205
+ .insight-section-label.strat { color: var(--violet-light); }
1206
+ .insight-section-text { font-size: 0.88rem; color: var(--text-primary); line-height: 1.6; }
1207
+ .insight-bullet { font-size: 0.86rem; color: var(--text-secondary); line-height: 1.5; margin-left: 12px; }
1208
+
1209
+ /* Icon SVG vertical alignment */
1210
+ .icon-svg {
1211
+ display: inline-block;
1212
+ vertical-align: middle;
1213
+ flex-shrink: 0;
1214
+ }
1215
+
1216
+ /* ── Charts ─────────────────────────────────────────── */
1217
+ .charts-grid { display: flex; flex-direction: column; gap: 20px; }
1218
+ .chart-card {
1219
+ background: var(--bg-card);
1220
+ border: 1px solid var(--border);
1221
+ border-radius: var(--r-lg);
1222
+ overflow: hidden;
1223
+ }
1224
+ .chart-card-header {
1225
+ padding: 12px 18px;
1226
+ border-bottom: 1px solid var(--border);
1227
+ display: flex;
1228
+ align-items: center;
1229
+ justify-content: space-between;
1230
+ }
1231
+ .chart-card-title { font-size: 0.88rem; font-weight: 600; }
1232
+ .chart-card-type { font-size: 0.7rem; color: var(--text-muted); background: var(--bg-elevated); padding: 2px 8px; border-radius: 4px; }
1233
+ .chart-card-body { padding: 4px; }
1234
+ .chart-card-error { padding: 20px; color: var(--rose); font-size: 0.82rem; }
1235
+
1236
+ .png-charts-wrap { display: flex; flex-direction: column; gap: 12px; }
1237
+ .png-grid { display: flex; flex-direction: column; gap: 20px; }
1238
+ .png-chart-card {
1239
+ background: var(--bg-card);
1240
+ border: 1px solid var(--border);
1241
+ border-radius: var(--r-lg);
1242
+ overflow: hidden;
1243
+ }
1244
+ .png-chart-card img { width: 100%; display: block; }
1245
+ .png-chart-label { padding: 8px 14px; font-size: 0.75rem; color: var(--text-muted); }
1246
+
1247
+ .viz-code-details {
1248
+ background: var(--bg-card);
1249
+ border: 1px solid var(--border);
1250
+ border-radius: var(--r-md);
1251
+ }
1252
+ .viz-code-details summary {
1253
+ padding: 12px 16px;
1254
+ cursor: pointer;
1255
+ font-size: 0.85rem;
1256
+ font-weight: 500;
1257
+ color: var(--text-secondary);
1258
+ list-style: none;
1259
+ user-select: none;
1260
+ }
1261
+ .viz-code-details summary:hover { color: var(--text-primary); }
1262
+ .viz-code-details[open] summary { border-bottom: 1px solid var(--border); color: var(--text-primary); }
1263
+ .code-block {
1264
+ padding: 16px;
1265
+ font-family: var(--font-mono);
1266
+ font-size: 0.74rem;
1267
+ line-height: 1.65;
1268
+ color: var(--cyan);
1269
+ white-space: pre-wrap;
1270
+ word-break: break-all;
1271
+ overflow-x: auto;
1272
+ max-height: 400px;
1273
+ }
1274
+
1275
+ /* ── Chat ────────────────────────────────────────────── */
1276
+ .chat-layout { display: flex; flex-direction: column; flex: 1; gap: 16px; }
1277
+ .chat-main { display: flex; flex-direction: column; flex: 1; gap: 12px; }
1278
+ .chat-header { display: flex; align-items: center; justify-content: space-between; }
1279
+
1280
+ .chat-messages {
1281
+ flex: 1;
1282
+ overflow-y: auto;
1283
+ display: flex;
1284
+ flex-direction: column;
1285
+ gap: 14px;
1286
+ padding: 4px 0;
1287
+ min-height: 280px;
1288
+ max-height: 440px;
1289
+ }
1290
+ .chat-msg { display: flex; gap: 10px; }
1291
+ .chat-msg.user { flex-direction: row-reverse; }
1292
+
1293
+ .chat-avatar {
1294
+ width: 32px; height: 32px;
1295
+ border-radius: 50%;
1296
+ display: flex; align-items: center; justify-content: center;
1297
+ font-size: 14px;
1298
+ flex-shrink: 0;
1299
+ }
1300
+ .chat-msg.user .chat-avatar { background: var(--violet-glow); color: var(--violet-light); }
1301
+ .chat-msg.assistant .chat-avatar { background: rgba(34,211,238,0.15); color: var(--cyan); }
1302
+
1303
+ .chat-bubble {
1304
+ max-width: 75%;
1305
+ background: var(--bg-card);
1306
+ border: 1px solid var(--border);
1307
+ border-radius: var(--r-md);
1308
+ padding: 10px 14px;
1309
+ font-size: 0.84rem;
1310
+ line-height: 1.6;
1311
+ }
1312
+ .chat-msg.user .chat-bubble {
1313
+ background: rgba(255, 37, 42,0.15);
1314
+ border-color: rgba(255, 37, 42,0.25);
1315
+ border-radius: var(--r-md) 4px var(--r-md) var(--r-md);
1316
+ }
1317
+ .chat-msg.assistant .chat-bubble {
1318
+ border-radius: 4px var(--r-md) var(--r-md) var(--r-md);
1319
+ }
1320
+ .chat-bubble pre {
1321
+ background: var(--bg-surface);
1322
+ border-radius: var(--r-sm);
1323
+ padding: 10px;
1324
+ font-family: var(--font-mono);
1325
+ font-size: 0.73rem;
1326
+ overflow-x: auto;
1327
+ margin: 8px 0;
1328
+ color: var(--cyan);
1329
+ }
1330
+ .chat-bubble img { max-width: 100%; border-radius: var(--r-md); margin-top: 8px; }
1331
+
1332
+ .chat-input-area { display: flex; flex-direction: column; gap: 8px; position: relative; }
1333
+ .col-picker-dropdown {
1334
+ position: absolute;
1335
+ bottom: 100%;
1336
+ left: 0;
1337
+ right: 72px;
1338
+ background: var(--bg-elevated);
1339
+ border: 1px solid var(--border-mid);
1340
+ border-radius: var(--r-md);
1341
+ max-height: 220px;
1342
+ overflow-y: auto;
1343
+ z-index: 50;
1344
+ box-shadow: var(--shadow-md);
1345
+ }
1346
+ .col-picker-dropdown.hidden { display: none; }
1347
+ .col-picker-item {
1348
+ padding: 8px 14px;
1349
+ font-size: 0.82rem;
1350
+ cursor: pointer;
1351
+ display: flex;
1352
+ align-items: center;
1353
+ gap: 8px;
1354
+ transition: background 0.15s;
1355
+ }
1356
+ .col-picker-item:hover { background: var(--bg-hover); }
1357
+ .col-picker-item-type { font-size: 0.68rem; color: var(--text-muted); background: var(--bg-surface); padding: 1px 6px; border-radius: 3px; }
1358
+ .col-picker-header { padding: 6px 14px; font-size: 0.65rem; letter-spacing: 0.08em; color: var(--text-muted); border-bottom: 1px solid var(--border); }
1359
+
1360
+ .chat-input-row { display: flex; gap: 8px; align-items: flex-end; }
1361
+ .chat-textarea {
1362
+ flex: 1;
1363
+ background: var(--bg-card);
1364
+ border: 1px solid var(--border-mid);
1365
+ border-radius: var(--r-md);
1366
+ color: var(--text-primary);
1367
+ font-family: var(--font-body);
1368
+ font-size: 0.85rem;
1369
+ padding: 10px 14px;
1370
+ resize: none;
1371
+ outline: none;
1372
+ transition: border-color 0.2s;
1373
+ line-height: 1.5;
1374
+ }
1375
+ .chat-textarea:focus { border-color: var(--violet-light); }
1376
+ .btn-send {
1377
+ padding: 10px 16px;
1378
+ align-self: flex-end;
1379
+ border-radius: var(--r-md);
1380
+ height: fit-content;
1381
+ }
1382
+
1383
+ .chat-hints { display: flex; flex-wrap: wrap; gap: 6px; }
1384
+ .chat-hint-chip {
1385
+ font-size: 0.72rem;
1386
+ background: var(--bg-elevated);
1387
+ border: 1px solid var(--border);
1388
+ border-radius: 99px;
1389
+ padding: 4px 10px;
1390
+ cursor: pointer;
1391
+ color: var(--text-secondary);
1392
+ transition: all 0.15s;
1393
+ white-space: nowrap;
1394
+ }
1395
+ .chat-hint-chip:hover { background: var(--bg-hover); color: var(--text-primary); border-color: var(--border-mid); }
1396
+
1397
+ .export-bar {
1398
+ display: none !important;
1399
+ }
1400
+
1401
+ /* ── Buttons ─────────────────────────────────────────── */
1402
+ .btn-primary {
1403
+ background: var(--violet);
1404
+ color: white;
1405
+ border: none;
1406
+ border-radius: var(--r-md);
1407
+ padding: 9px 20px;
1408
+ font-size: 0.85rem;
1409
+ font-weight: 600;
1410
+ font-family: var(--font-body);
1411
+ cursor: pointer;
1412
+ transition: all 0.2s;
1413
+ display: inline-flex;
1414
+ align-items: center;
1415
+ gap: 6px;
1416
+ }
1417
+ .btn-primary:hover { background: #6d28d9; box-shadow: var(--shadow-violet); transform: translateY(-1px); }
1418
+ .btn-primary:active { transform: translateY(0); }
1419
+ .btn-primary.btn-lg { padding: 13px 30px; font-size: 0.95rem; border-radius: var(--r-lg); }
1420
+ .btn-primary.btn-sm { padding: 6px 14px; font-size: 0.78rem; }
1421
+
1422
+ .btn-secondary {
1423
+ background: var(--bg-elevated);
1424
+ color: var(--text-primary);
1425
+ border: 1px solid var(--border-mid);
1426
+ border-radius: var(--r-md);
1427
+ padding: 9px 18px;
1428
+ font-size: 0.85rem;
1429
+ font-weight: 500;
1430
+ font-family: var(--font-body);
1431
+ cursor: pointer;
1432
+ transition: all 0.2s;
1433
+ }
1434
+ .btn-secondary:hover { background: var(--bg-hover); border-color: var(--border-mid); }
1435
+ .btn-secondary.btn-sm { padding: 6px 12px; font-size: 0.78rem; }
1436
+
1437
+ .btn-ghost {
1438
+ background: none;
1439
+ color: var(--text-secondary);
1440
+ border: none;
1441
+ border-radius: var(--r-md);
1442
+ padding: 9px 16px;
1443
+ font-size: 0.85rem;
1444
+ font-family: var(--font-body);
1445
+ cursor: pointer;
1446
+ transition: all 0.2s;
1447
+ }
1448
+ .btn-ghost:hover { color: var(--text-primary); background: var(--bg-hover); }
1449
+
1450
+ .btn-icon {
1451
+ background: none;
1452
+ border: none;
1453
+ color: var(--text-secondary);
1454
+ cursor: pointer;
1455
+ width: 28px; height: 28px;
1456
+ border-radius: var(--r-sm);
1457
+ display: flex; align-items: center; justify-content: center;
1458
+ font-size: 14px;
1459
+ transition: all 0.15s;
1460
+ }
1461
+ .btn-icon:hover { background: var(--bg-hover); color: var(--text-primary); }
1462
+ .btn-icon-lg { font-size: 18px; width: 34px; height: 34px; background: none; border: none; color: var(--text-secondary); cursor: pointer; border-radius: var(--r-sm); display: none; }
1463
+
1464
+ .btn-xs {
1465
+ background: var(--bg-elevated);
1466
+ border: 1px solid var(--border);
1467
+ color: var(--text-muted);
1468
+ border-radius: 4px;
1469
+ padding: 2px 8px;
1470
+ font-size: 0.7rem;
1471
+ cursor: pointer;
1472
+ font-family: var(--font-body);
1473
+ transition: all 0.15s;
1474
+ }
1475
+ .btn-xs:hover { border-color: var(--border-mid); color: var(--text-secondary); }
1476
+
1477
+ /* ── Sub titles ──────────────────────────────────────── */
1478
+ .sub-title { font-size: 0.88rem; font-weight: 600; color: var(--text-secondary); }
1479
+
1480
+ /* ── Toast ───────────────────────────────────────────── */
1481
+ .toast-container {
1482
+ position: fixed;
1483
+ bottom: 24px;
1484
+ right: 24px;
1485
+ z-index: 999;
1486
+ display: flex;
1487
+ flex-direction: column-reverse;
1488
+ gap: 8px;
1489
+ }
1490
+ .toast {
1491
+ background: var(--bg-elevated);
1492
+ border: 1px solid var(--border-mid);
1493
+ border-radius: var(--r-md);
1494
+ padding: 12px 18px;
1495
+ font-size: 0.82rem;
1496
+ box-shadow: var(--shadow-md);
1497
+ animation: slideUp 0.3s ease;
1498
+ max-width: 360px;
1499
+ }
1500
+ .toast.success { border-left: 3px solid var(--emerald); }
1501
+ .toast.error { border-left: 3px solid var(--rose); }
1502
+ .toast.info { border-left: 3px solid var(--violet-light); }
1503
+ .toast.warning { border-left: 3px solid var(--amber); }
1504
+
1505
+ /* ── Utilities ───────────────────────────────────────── */
1506
+ .hidden { display: none !important; }
1507
+ .mt-8 { margin-top: 8px; }
1508
+
1509
+ /* ── Animations ─────────────────────────────────────── */
1510
+ @keyframes spin { to { transform: rotate(360deg); } }
1511
+ @keyframes pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.45; } }
1512
+ @keyframes slideUp {
1513
+ from { transform: translateY(14px); opacity: 0; }
1514
+ to { transform: translateY(0); opacity: 1; }
1515
+ }
1516
+
1517
+ /* ── Scrollbars ─────────────────────────────────────── */
1518
+ ::-webkit-scrollbar { width: 6px; height: 6px; }
1519
+ ::-webkit-scrollbar-track { background: transparent; }
1520
+ ::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.12); border-radius: 99px; }
1521
+ ::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,0.22); }
1522
+
1523
+ /* ── Responsive ─────────────────────────────────────── */
1524
+ @media (max-width: 900px) {
1525
+ .sidebar { transform: translateX(-100%); }
1526
+ .sidebar.mobile-open { transform: translateX(0); }
1527
+ .main-area { margin-left: 0 !important; }
1528
+ .btn-icon-lg { display: flex; }
1529
+ .task-grid { grid-template-columns: 1fr; }
1530
+ }
1531
+
1532
+ /* ── Dashboard Projects Grid ─────────────────────────── */
1533
+ .dashboard-projects-section {
1534
+ margin-top: 32px;
1535
+ background: rgba(18, 18, 22, 0.25);
1536
+ border: 1px solid rgba(255, 255, 255, 0.03);
1537
+ border-radius: var(--r-xl);
1538
+ padding: 32px;
1539
+ box-shadow: 0 15px 45px rgba(0, 0, 0, 0.2);
1540
+ backdrop-filter: blur(8px);
1541
+ -webkit-backdrop-filter: blur(8px);
1542
+ }
1543
+ .section-title-row {
1544
+ display: flex;
1545
+ align-items: baseline;
1546
+ gap: 8px;
1547
+ margin-bottom: 20px;
1548
+ }
1549
+ .section-title {
1550
+ font-size: 1.25rem;
1551
+ font-weight: 700;
1552
+ color: var(--text-primary);
1553
+ letter-spacing: -0.01em;
1554
+ }
1555
+ .projects-count {
1556
+ font-size: 0.85rem;
1557
+ color: var(--text-muted);
1558
+ font-family: var(--font-mono);
1559
+ }
1560
+ .projects-grid {
1561
+ display: grid;
1562
+ grid-template-columns: repeat(auto-fill, minmax(290px, 1fr));
1563
+ gap: 20px;
1564
+ }
1565
+ .dashboard-project-card {
1566
+ background: rgba(22, 22, 25, 0.45);
1567
+ border: 1px solid rgba(255, 255, 255, 0.05);
1568
+ border-radius: var(--r-lg);
1569
+ padding: 16px;
1570
+ display: flex;
1571
+ flex-direction: column;
1572
+ align-items: stretch;
1573
+ cursor: pointer;
1574
+ position: relative;
1575
+ transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
1576
+ min-height: 250px;
1577
+ backdrop-filter: blur(12px);
1578
+ -webkit-backdrop-filter: blur(12px);
1579
+ overflow: hidden;
1580
+ }
1581
+ .dashboard-project-card:hover {
1582
+ transform: translateY(-5px);
1583
+ border-color: rgba(139, 92, 246, 0.4);
1584
+ background: rgba(28, 28, 33, 0.6);
1585
+ box-shadow: 0 16px 36px rgba(0, 0, 0, 0.5), 0 0 25px rgba(255, 37, 42, 0.12);
1586
+ }
1587
+ .dashboard-project-card.active {
1588
+ border-color: var(--cyan);
1589
+ background: rgba(28, 28, 33, 0.8);
1590
+ box-shadow: 0 0 30px rgba(34, 211, 238, 0.15), 0 0 1px rgba(34, 211, 238, 0.5);
1591
+ }
1592
+
1593
+ .db-project-card-header {
1594
+ display: flex;
1595
+ justify-content: space-between;
1596
+ align-items: center;
1597
+ width: 100%;
1598
+ margin-bottom: 4px;
1599
+ }
1600
+ .db-project-date {
1601
+ font-size: 0.72rem;
1602
+ font-weight: 600;
1603
+ color: var(--text-muted);
1604
+ letter-spacing: 0.5px;
1605
+ }
1606
+ .db-project-status-badge {
1607
+ font-size: 0.68rem;
1608
+ font-weight: 700;
1609
+ letter-spacing: 0.05em;
1610
+ padding: 4px 12px;
1611
+ border-radius: 6px;
1612
+ text-transform: uppercase;
1613
+ transition: opacity 0.25s ease, transform 0.25s ease;
1614
+ }
1615
+ .dashboard-project-card:hover .db-project-status-badge {
1616
+ opacity: 0;
1617
+ transform: translateY(-2px);
1618
+ pointer-events: none;
1619
+ }
1620
+ .db-project-status-badge.completed {
1621
+ background: rgba(16, 185, 129, 0.12);
1622
+ color: #10b981;
1623
+ border: 1px solid rgba(16, 185, 129, 0.25);
1624
+ }
1625
+ .db-project-status-badge.running {
1626
+ background: rgba(245, 158, 11, 0.12);
1627
+ color: #f59e0b;
1628
+ border: 1px solid rgba(245, 158, 11, 0.25);
1629
+ animation: pulse 1.6s infinite;
1630
+ }
1631
+ .db-project-status-badge.failed {
1632
+ background: rgba(244, 63, 94, 0.12);
1633
+ color: #f43f5e;
1634
+ border: 1px solid rgba(244, 63, 94, 0.25);
1635
+ }
1636
+ .db-project-status-badge.idle {
1637
+ background: rgba(161, 161, 170, 0.12);
1638
+ color: #a1a1aa;
1639
+ border: 1px solid rgba(161, 161, 170, 0.2);
1640
+ }
1641
+
1642
+ /* Project Thumbnail Preview Styling */
1643
+ .db-project-preview-wrap {
1644
+ position: relative;
1645
+ width: 100%;
1646
+ height: 125px;
1647
+ border-radius: var(--r-md);
1648
+ overflow: hidden;
1649
+ margin: 10px 0;
1650
+ border: 1px solid rgba(255, 255, 255, 0.06);
1651
+ background: #0d0d0f;
1652
+ }
1653
+ .db-project-preview-img {
1654
+ width: 100%;
1655
+ height: 100%;
1656
+ object-fit: cover;
1657
+ transition: transform 0.6s cubic-bezier(0.16, 1, 0.3, 1);
1658
+ filter: brightness(0.8) contrast(1.05);
1659
+ }
1660
+ .dashboard-project-card:hover .db-project-preview-img {
1661
+ transform: scale(1.06);
1662
+ filter: brightness(0.9) contrast(1.1);
1663
+ }
1664
+ .db-project-preview-overlay {
1665
+ position: absolute;
1666
+ inset: 0;
1667
+ background: linear-gradient(180deg, rgba(13, 13, 15, 0.1) 0%, rgba(13, 13, 15, 0.5) 100%);
1668
+ display: flex;
1669
+ align-items: center;
1670
+ justify-content: center;
1671
+ transition: background 0.3s ease;
1672
+ }
1673
+ .dashboard-project-card:hover .db-project-preview-overlay {
1674
+ background: linear-gradient(180deg, rgba(13, 13, 15, 0) 0%, rgba(13, 13, 15, 0.65) 100%);
1675
+ }
1676
+
1677
+ .db-project-folder-icon {
1678
+ display: flex;
1679
+ justify-content: center;
1680
+ align-items: center;
1681
+ width: 44px;
1682
+ height: 44px;
1683
+ border-radius: 50%;
1684
+ background: rgba(15, 15, 18, 0.7);
1685
+ backdrop-filter: blur(6px);
1686
+ -webkit-backdrop-filter: blur(6px);
1687
+ border: 1px solid rgba(255, 255, 255, 0.08);
1688
+ transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
1689
+ }
1690
+ .folder-svg {
1691
+ width: 20px;
1692
+ height: 20px;
1693
+ transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
1694
+ }
1695
+ .db-project-folder-icon.completed {
1696
+ color: #10b981;
1697
+ box-shadow: 0 4px 15px rgba(16, 185, 129, 0.2);
1698
+ border-color: rgba(16, 185, 129, 0.3);
1699
+ }
1700
+ .db-project-folder-icon.running {
1701
+ color: #f59e0b;
1702
+ box-shadow: 0 4px 15px rgba(245, 158, 11, 0.25);
1703
+ border-color: rgba(245, 158, 11, 0.3);
1704
+ animation: pulse-border 1.6s infinite;
1705
+ }
1706
+ .db-project-folder-icon.failed {
1707
+ color: #f43f5e;
1708
+ box-shadow: 0 4px 15px rgba(244, 63, 94, 0.2);
1709
+ border-color: rgba(244, 63, 94, 0.3);
1710
+ }
1711
+ .db-project-folder-icon.idle {
1712
+ color: var(--violet-light);
1713
+ box-shadow: 0 4px 15px rgba(255, 37, 42, 0.2);
1714
+ border-color: rgba(255, 37, 42, 0.3);
1715
+ }
1716
+ .dashboard-project-card:hover .db-project-folder-icon {
1717
+ transform: scale(1.1);
1718
+ background: rgba(15, 15, 18, 0.9);
1719
+ border-color: currentColor;
1720
+ }
1721
+ .dashboard-project-card:hover .folder-svg {
1722
+ transform: scale(1.05);
1723
+ }
1724
+
1725
+ .db-project-card-title {
1726
+ font-size: 1.05rem;
1727
+ font-weight: 600;
1728
+ color: #ffffff;
1729
+ text-align: left;
1730
+ letter-spacing: 0.2px;
1731
+ margin: 6px 0 10px 0;
1732
+ white-space: nowrap;
1733
+ overflow: hidden;
1734
+ text-overflow: ellipsis;
1735
+ max-width: 100%;
1736
+ transition: color 0.3s ease;
1737
+ }
1738
+ .dashboard-project-card:hover .db-project-card-title {
1739
+ color: var(--cyan);
1740
+ }
1741
+
1742
+ .db-project-card-footer {
1743
+ display: flex;
1744
+ justify-content: space-between;
1745
+ align-items: center;
1746
+ font-size: 0.68rem;
1747
+ font-weight: 600;
1748
+ color: var(--text-muted);
1749
+ text-transform: uppercase;
1750
+ letter-spacing: 0.5px;
1751
+ margin-top: auto;
1752
+ border-top: 1px solid rgba(255, 255, 255, 0.04);
1753
+ padding-top: 10px;
1754
+ }
1755
+ .db-project-filename {
1756
+ max-width: 140px;
1757
+ overflow: hidden;
1758
+ text-overflow: ellipsis;
1759
+ white-space: nowrap;
1760
+ color: var(--text-secondary);
1761
+ }
1762
+
1763
+ .db-project-btn-del {
1764
+ position: absolute;
1765
+ top: 14px;
1766
+ right: 16px;
1767
+ width: 24px;
1768
+ height: 24px;
1769
+ border-radius: 6px;
1770
+ background: rgba(0, 0, 0, 0.4);
1771
+ border: 1px solid rgba(255, 255, 255, 0.06);
1772
+ color: var(--text-muted);
1773
+ display: flex;
1774
+ align-items: center;
1775
+ justify-content: center;
1776
+ cursor: pointer;
1777
+ font-size: 0.7rem;
1778
+ opacity: 0;
1779
+ transform: translateY(2px);
1780
+ transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);
1781
+ padding: 0;
1782
+ line-height: 1;
1783
+ }
1784
+ .dashboard-project-card:hover .db-project-btn-del {
1785
+ opacity: 1;
1786
+ transform: translateY(0);
1787
+ }
1788
+ .db-project-btn-del:hover {
1789
+ color: #ff3366;
1790
+ background: rgba(255, 51, 102, 0.15);
1791
+ border-color: rgba(255, 51, 102, 0.3);
1792
+ transform: scale(1.05);
1793
+ }
1794
+
1795
+ .projects-empty-card {
1796
+ grid-column: 1 / -1;
1797
+ background: var(--bg-surface);
1798
+ border: 1px dashed var(--border);
1799
+ border-radius: var(--r-lg);
1800
+ padding: 48px;
1801
+ text-align: center;
1802
+ display: flex;
1803
+ flex-direction: column;
1804
+ align-items: center;
1805
+ justify-content: center;
1806
+ gap: 12px;
1807
+ min-height: 200px;
1808
+ }
1809
+ .empty-card-icon {
1810
+ font-size: 2.2rem;
1811
+ }
1812
+ .empty-card-title {
1813
+ font-size: 1.05rem;
1814
+ font-weight: 600;
1815
+ color: var(--text-primary);
1816
+ }
1817
+ .empty-card-desc {
1818
+ font-size: 0.82rem;
1819
+ color: var(--text-secondary);
1820
+ max-width: 320px;
1821
+ line-height: 1.5;
1822
+ }
1823
+
1824
+ /* ── Glowing API Highlight ──────────────────────────── */
1825
+ @keyframes glowPulse {
1826
+ 0% {
1827
+ box-shadow: 0 0 4px var(--violet-light);
1828
+ border-color: var(--violet-light);
1829
+ }
1830
+ 50% {
1831
+ box-shadow: 0 0 16px var(--violet);
1832
+ border-color: var(--violet);
1833
+ }
1834
+ 100% {
1835
+ box-shadow: 0 0 4px var(--violet-light);
1836
+ border-color: var(--violet-light);
1837
+ }
1838
+ }
1839
+ .highlight-glowing {
1840
+ animation: glowPulse 1.5s infinite ease-in-out;
1841
+ border-color: var(--violet-light) !important;
1842
+ }
1843
+
1844
+ /* ── Interactive Wizard UI ──────────────────────────── */
1845
+ .wizard-container {
1846
+ width: 100%;
1847
+ max-width: 600px;
1848
+ margin: 0 auto;
1849
+ position: relative;
1850
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1851
+ }
1852
+ #wizardStep1.active, #wizardStep2.active {
1853
+ background: var(--bg-card);
1854
+ border: 1px solid var(--border);
1855
+ border-radius: var(--r-xl);
1856
+ padding: 40px;
1857
+ box-shadow: var(--shadow-lg);
1858
+ position: relative;
1859
+ }
1860
+ .wizard-step {
1861
+ display: none;
1862
+ flex-direction: column;
1863
+ align-items: center;
1864
+ text-align: center;
1865
+ opacity: 0;
1866
+ transform: translateY(10px);
1867
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1868
+ }
1869
+ .wizard-step.active {
1870
+ display: flex;
1871
+ opacity: 1;
1872
+ transform: translateY(0);
1873
+ }
1874
+ .wizard-icon {
1875
+ font-size: 3rem;
1876
+ margin-bottom: 16px;
1877
+ filter: drop-shadow(0 0 12px var(--violet-glow));
1878
+ }
1879
+ .wizard-step-title {
1880
+ font-size: 1.4rem;
1881
+ font-weight: 700;
1882
+ margin-bottom: 8px;
1883
+ color: var(--text-primary);
1884
+ }
1885
+ .wizard-step-desc {
1886
+ font-size: 0.88rem;
1887
+ color: var(--text-secondary);
1888
+ max-width: 400px;
1889
+ line-height: 1.5;
1890
+ }
1891
+ .btn-back {
1892
+ position: absolute;
1893
+ top: 20px;
1894
+ left: 20px;
1895
+ background: none;
1896
+ border: 1px solid var(--border);
1897
+ color: var(--text-secondary);
1898
+ padding: 10px 16px;
1899
+ border-radius: var(--r-md);
1900
+ cursor: pointer;
1901
+ font-size: 1rem;
1902
+ transition: all 0.2s;
1903
+ }
1904
+ .btn-back:hover {
1905
+ background: var(--bg-hover);
1906
+ color: var(--text-primary);
1907
+ border-color: var(--border-mid);
1908
+ }
1909
+ .mt-16 { margin-top: 16px; }
1910
+ .mt-20 { margin-top: 20px; }
1911
+ .text-center { text-align: center; }
1912
+
1913
+ /* ── Dashed Create Project Card (From User Image) ─────── */
1914
+ .create-project-card {
1915
+ display: flex;
1916
+ flex-direction: column;
1917
+ align-items: center;
1918
+ justify-content: center;
1919
+ border: 1px dashed rgba(255, 37, 42, 0.35);
1920
+ border-radius: var(--r-xl);
1921
+ padding: 30px 24px;
1922
+ cursor: pointer;
1923
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1924
+ background: rgba(18, 18, 22, 0.4);
1925
+ backdrop-filter: blur(8px);
1926
+ -webkit-backdrop-filter: blur(8px);
1927
+ min-height: 180px;
1928
+ width: 260px;
1929
+ max-width: 280px;
1930
+ margin: 0;
1931
+ box-shadow: 0 4px 30px rgba(0, 0, 0, 0.2);
1932
+ }
1933
+ .create-project-card:hover {
1934
+ border-color: var(--cyan);
1935
+ background: rgba(255, 37, 42, 0.08);
1936
+ box-shadow: 0 0 30px rgba(255, 37, 42, 0.15), 0 0 1px rgba(34, 211, 238, 0.5);
1937
+ transform: translateY(-4px) scale(1.01);
1938
+ }
1939
+ .create-project-plus {
1940
+ font-size: 2.5rem;
1941
+ color: var(--text-secondary);
1942
+ border: 1px solid rgba(255, 255, 255, 0.1);
1943
+ border-radius: 16px;
1944
+ width: 64px;
1945
+ height: 64px;
1946
+ display: flex;
1947
+ align-items: center;
1948
+ justify-content: center;
1949
+ margin-bottom: 20px;
1950
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1951
+ background: rgba(255, 255, 255, 0.02);
1952
+ line-height: 1;
1953
+ }
1954
+ .create-project-card:hover .create-project-plus {
1955
+ color: #ffffff;
1956
+ border-color: var(--cyan);
1957
+ background: rgba(34, 211, 238, 0.1);
1958
+ box-shadow: 0 0 15px rgba(34, 211, 238, 0.3);
1959
+ transform: rotate(90deg);
1960
+ }
1961
+ .create-project-text {
1962
+ font-size: 0.9rem;
1963
+ font-weight: 700;
1964
+ letter-spacing: 0.1em;
1965
+ color: var(--text-secondary);
1966
+ text-transform: uppercase;
1967
+ transition: color 0.3s;
1968
+ }
1969
+ .create-project-card:hover .create-project-text {
1970
+ color: #ffffff;
1971
+ }
1972
+
1973
+ /* ── Settings Row ───────────────────────────────────── */
1974
+ .setting-row {
1975
+ display: flex;
1976
+ flex-direction: column;
1977
+ gap: 4px;
1978
+ }
1979
+ .setting-row .key-input-wrap {
1980
+ position: relative;
1981
+ }
1982
+
1983
+ /* ── Custom Dialog Modal ──────────────────────────────── */
1984
+ #customDialogModal .modal-box {
1985
+ border: 1px solid rgba(255, 37, 42, 0.35);
1986
+ box-shadow: 0 20px 50px rgba(0, 0, 0, 0.6), var(--shadow-violet);
1987
+ background: rgba(18, 18, 22, 0.96);
1988
+ backdrop-filter: blur(18px);
1989
+ -webkit-backdrop-filter: blur(18px);
1990
+ animation: modalScaleIn 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
1991
+ }
1992
+
1993
+ @keyframes modalScaleIn {
1994
+ from { transform: scale(0.92); opacity: 0; }
1995
+ to { transform: scale(1); opacity: 1; }
1996
+ }
1997
+
1998
+ #customDialogModal .modal-header h2 {
1999
+ font-size: 1.1rem;
2000
+ font-weight: 700;
2001
+ color: #ffffff;
2002
+ }
2003
+
2004
+ #customDialogInput {
2005
+ background: rgba(255, 255, 255, 0.03);
2006
+ border: 1px solid var(--border-mid);
2007
+ border-radius: var(--r-md);
2008
+ color: var(--text-primary);
2009
+ transition: all 0.25s ease;
2010
+ }
2011
+
2012
+ #customDialogInput:focus {
2013
+ border-color: var(--cyan);
2014
+ background: rgba(34, 211, 238, 0.04);
2015
+ box-shadow: 0 0 12px rgba(34, 211, 238, 0.15);
2016
+ outline: none;
2017
+ }
2018
+
2019
+
2020
+ /* ── Custom Platform Enhancements ─────────────────────── */
2021
+ .hidden {
2022
+ display: none !important;
2023
+ }
2024
+
2025
+ .section-area {
2026
+ display: block;
2027
+ }
2028
+ .section-area.hidden {
2029
+ display: none !important;
2030
+ }
2031
+
2032
+ .sections-switch {
2033
+ box-shadow: 0 4px 12px rgba(0,0,0,0.25);
2034
+ }
2035
+
2036
+ .section-switch-btn {
2037
+ font-family: var(--font-body);
2038
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
2039
+ }
2040
+
2041
+ .section-switch-btn.active {
2042
+ background: var(--violet) !important;
2043
+ color: #ffffff !important;
2044
+ box-shadow: 0 0 16px rgba(255, 37, 42, 0.4);
2045
+ }
2046
+
2047
+ /* Relation Schema Mapper Styling */
2048
+ .relation-mapper-container {
2049
+ display: grid;
2050
+ grid-template-columns: repeat(auto-fill, minmax(380px, 1fr));
2051
+ gap: 16px;
2052
+ width: 100%;
2053
+ }
2054
+
2055
+ .relation-card {
2056
+ background: var(--bg-card);
2057
+ border: 1px solid var(--border-mid);
2058
+ border-radius: var(--r-md);
2059
+ padding: 18px;
2060
+ display: flex;
2061
+ align-items: center;
2062
+ gap: 16px;
2063
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
2064
+ position: relative;
2065
+ width: 100%;
2066
+ }
2067
+
2068
+ .relation-card:hover {
2069
+ transform: translateY(-2px);
2070
+ border-color: var(--violet-light);
2071
+ box-shadow: 0 4px 20px rgba(255, 37, 42, 0.15);
2072
+ }
2073
+
2074
+ .relation-node {
2075
+ background: rgba(255, 255, 255, 0.03);
2076
+ border: 1px solid var(--border-low);
2077
+ padding: 10px 14px;
2078
+ border-radius: var(--r-sm);
2079
+ font-family: var(--font-mono);
2080
+ font-size: 0.88rem;
2081
+ color: var(--text-primary);
2082
+ display: flex;
2083
+ flex-direction: column;
2084
+ gap: 2px;
2085
+ min-width: 150px;
2086
+ text-align: center;
2087
+ }
2088
+
2089
+ .relation-node-type {
2090
+ font-size: 0.7rem;
2091
+ color: var(--text-secondary);
2092
+ text-transform: uppercase;
2093
+ }
2094
+
2095
+ .relation-connector {
2096
+ flex: 1;
2097
+ display: flex;
2098
+ flex-direction: column;
2099
+ align-items: center;
2100
+ justify-content: center;
2101
+ position: relative;
2102
+ min-width: 120px;
2103
+ }
2104
+
2105
+ .relation-line {
2106
+ height: 2px;
2107
+ background: linear-gradient(90deg, var(--violet) 0%, var(--cyan) 100%);
2108
+ width: 100%;
2109
+ border-radius: 1px;
2110
+ position: relative;
2111
+ }
2112
+
2113
+ .relation-line::after {
2114
+ content: '';
2115
+ position: absolute;
2116
+ right: 0;
2117
+ top: -4px;
2118
+ width: 0;
2119
+ height: 0;
2120
+ border-top: 5px solid transparent;
2121
+ border-bottom: 5px solid transparent;
2122
+ border-left: 8px solid var(--cyan);
2123
+ }
2124
+
2125
+ .relation-info {
2126
+ font-size: 0.76rem;
2127
+ color: var(--text-secondary);
2128
+ margin-top: 6px;
2129
+ text-align: center;
2130
+ line-height: 1.4;
2131
+ padding: 0 8px;
2132
+ }
2133
+
2134
+ /* Structured Insights Styling */
2135
+ .insight-header-card {
2136
+ background: linear-gradient(135deg, rgba(255, 37, 42, 0.08) 0%, rgba(34, 211, 238, 0.04) 100%);
2137
+ border: 1px solid rgba(255, 37, 42, 0.2);
2138
+ border-radius: var(--r-lg);
2139
+ padding: 20px;
2140
+ margin-bottom: 24px;
2141
+ }
2142
+
2143
+ .insight-header-title {
2144
+ font-size: 1.1rem;
2145
+ font-weight: 700;
2146
+ color: var(--violet-light);
2147
+ margin-bottom: 8px;
2148
+ display: flex;
2149
+ align-items: center;
2150
+ gap: 8px;
2151
+ }
2152
+
2153
+ .insight-header-text {
2154
+ font-size: 0.95rem;
2155
+ line-height: 1.6;
2156
+ color: var(--text-primary);
2157
+ }
2158
+
2159
+ .insight-stats-grid {
2160
+ display: grid;
2161
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
2162
+ gap: 16px;
2163
+ margin-bottom: 24px;
2164
+ }
2165
+
2166
+ .insight-stat-card {
2167
+ background: var(--bg-card);
2168
+ border: 1px solid var(--border-mid);
2169
+ border-radius: var(--r-md);
2170
+ padding: 16px;
2171
+ text-align: center;
2172
+ transition: all 0.25s ease;
2173
+ }
2174
+
2175
+ .insight-stat-card:hover {
2176
+ border-color: var(--cyan);
2177
+ box-shadow: 0 4px 15px rgba(34, 211, 238, 0.1);
2178
+ }
2179
+
2180
+ .insight-stat-val {
2181
+ font-family: var(--font-mono);
2182
+ font-size: 1.6rem;
2183
+ font-weight: 700;
2184
+ color: var(--cyan);
2185
+ margin-bottom: 4px;
2186
+ }
2187
+
2188
+ .insight-stat-lbl {
2189
+ font-size: 0.8rem;
2190
+ color: var(--text-secondary);
2191
+ font-weight: 600;
2192
+ }
2193
+
2194
+ .insight-warning-card {
2195
+ background: rgba(244, 63, 94, 0.03);
2196
+ border: 1px solid rgba(244, 63, 94, 0.25);
2197
+ border-radius: var(--r-md);
2198
+ padding: 16px;
2199
+ margin-top: 24px;
2200
+ display: flex;
2201
+ gap: 12px;
2202
+ align-items: flex-start;
2203
+ }
2204
+
2205
+ .insight-warning-card-icon {
2206
+ font-size: 1.4rem;
2207
+ color: var(--rose);
2208
+ line-height: 1;
2209
+ }
2210
+
2211
+ .insight-warning-card-body {
2212
+ display: flex;
2213
+ flex-direction: column;
2214
+ gap: 6px;
2215
+ }
2216
+
2217
+ .insight-warning-card-title {
2218
+ font-size: 0.95rem;
2219
+ font-weight: 700;
2220
+ color: #ff8b9e;
2221
+ }
2222
+
2223
+ .insight-warning-card-text {
2224
+ font-size: 0.88rem;
2225
+ line-height: 1.5;
2226
+ color: var(--text-secondary);
2227
+ }
2228
+
2229
+ /* ── ChatGPT Interface Layout Overrides ── */
2230
+ #resultsScreen.ai-chat-mode {
2231
+ height: 100% !important;
2232
+ min-height: 0 !important;
2233
+ max-height: 100% !important;
2234
+ overflow: hidden !important;
2235
+ padding-bottom: 12px !important;
2236
+ gap: 12px !important;
2237
+ }
2238
+
2239
+ #resultsScreen.ai-chat-mode #statsRow {
2240
+ display: none !important;
2241
+ }
2242
+
2243
+ #resultsScreen.ai-chat-mode .export-bar {
2244
+ display: none !important;
2245
+ }
2246
+
2247
+ #resultsScreen.ai-chat-mode #datasetExplorerCard {
2248
+ display: none !important;
2249
+ }
2250
+
2251
+ #resultsScreen.ai-chat-mode #areaChat {
2252
+ flex: 1 !important;
2253
+ display: flex !important;
2254
+ flex-direction: column !important;
2255
+ height: 100% !important;
2256
+ min-height: 0 !important;
2257
+ }
2258
+
2259
+ #resultsScreen.ai-chat-mode #areaChat > div {
2260
+ display: flex !important;
2261
+ flex-direction: column !important;
2262
+ height: 100% !important;
2263
+ min-height: 0 !important;
2264
+ gap: 0 !important;
2265
+ }
2266
+
2267
+ #resultsScreen.ai-chat-mode #chatContainerCard {
2268
+ flex: 1 !important;
2269
+ display: flex !important;
2270
+ flex-direction: column !important;
2271
+ height: 100% !important;
2272
+ min-height: 0 !important;
2273
+ max-height: none !important;
2274
+ margin-bottom: 0 !important;
2275
+ }
2276
+
2277
+ #resultsScreen.ai-chat-mode #chatMessages {
2278
+ flex: 1 !important;
2279
+ min-height: 0 !important;
2280
+ max-height: none !important;
2281
+ overflow-y: auto !important;
2282
+ }
2283
+
2284
+ /* ── Sidebar Action Buttons styling ── */
2285
+ .sidebar-action-btn {
2286
+ width: 100%;
2287
+ display: flex;
2288
+ align-items: center;
2289
+ justify-content: center;
2290
+ gap: 8px;
2291
+ font-size: 0.8rem;
2292
+ padding: 10px 12px;
2293
+ border-radius: var(--r-sm);
2294
+ font-weight: 600;
2295
+ cursor: pointer;
2296
+ transition: all 0.2s ease;
2297
+ }
2298
+
2299
+ .sidebar-action-btn.btn-secondary {
2300
+ background: var(--bg-elevated);
2301
+ border: 1px solid var(--border-mid);
2302
+ color: var(--text-primary);
2303
+ }
2304
+
2305
+ .sidebar-action-btn.btn-secondary:hover {
2306
+ background: var(--bg-hover);
2307
+ border-color: var(--violet-light);
2308
+ transform: translateY(-1px);
2309
+ }
2310
+
2311
+ .sidebar-action-btn.btn-primary {
2312
+ background: var(--violet);
2313
+ border: 1px solid var(--violet);
2314
+ color: #fff;
2315
+ }
2316
+
2317
+ .sidebar-action-btn.btn-primary:hover {
2318
+ background: #6d28d9;
2319
+ border-color: #6d28d9;
2320
+ transform: translateY(-1px);
2321
+ }
2322
+
2323
+ .sidebar-action-btn.btn-ghost {
2324
+ background: transparent;
2325
+ border: 1px dashed var(--border-mid);
2326
+ color: var(--text-secondary);
2327
+ }
2328
+
2329
+ .sidebar-action-btn.btn-ghost:hover {
2330
+ background: rgba(255, 255, 255, 0.02);
2331
+ border-color: var(--violet-light);
2332
+ color: var(--text-primary);
2333
+ transform: translateY(-1px);
2334
+ }
2335
+
2336
+
2337
+
2338
+
2339
+ /* --- Markdown Body Styles (AI Chat Tables & Lists) --- */
2340
+ .markdown-body table {
2341
+ width: 100%;
2342
+ border-collapse: collapse;
2343
+ margin: 1rem 0;
2344
+ font-size: 0.9em;
2345
+ border-radius: var(--r-md);
2346
+ overflow: hidden;
2347
+ box-shadow: inset 0 0 0 1px var(--border-color);
2348
+ }
2349
+ .markdown-body th, .markdown-body td {
2350
+ padding: 10px 14px;
2351
+ text-align: left;
2352
+ border-bottom: 1px solid var(--border-color);
2353
+ }
2354
+ .markdown-body th {
2355
+ background: rgba(255, 255, 255, 0.05);
2356
+ font-weight: 600;
2357
+ color: var(--text-primary);
2358
+ }
2359
+ .markdown-body tr:last-child td {
2360
+ border-bottom: none;
2361
+ }
2362
+ .markdown-body tr:nth-child(even) {
2363
+ background: rgba(255, 255, 255, 0.02);
2364
+ }
2365
+ .markdown-body ul, .markdown-body ol {
2366
+ margin: 0.8rem 0;
2367
+ padding-left: 1.5rem;
2368
+ }
2369
+ .markdown-body li {
2370
+ margin-bottom: 0.4rem;
2371
+ }
2372
+ .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4 {
2373
+ margin-top: 1.2rem;
2374
+ margin-bottom: 0.6rem;
2375
+ font-weight: 600;
2376
+ color: var(--text-primary);
2377
+ }
2378
+ .markdown-body h3 { font-size: 1.1em; }
2379
+ .markdown-body p { margin-bottom: 0.8rem; }
2380
+ .markdown-body p:last-child { margin-bottom: 0; }
2381
+ .markdown-body code {
2382
+ background: var(--bg-surface);
2383
+ padding: 2px 6px;
2384
+ border-radius: 4px;
2385
+ font-family: var(--font-mono);
2386
+ font-size: 0.9em;
2387
+ color: var(--accent-color);
2388
+ }
2389
+ .markdown-body pre {
2390
+ background: var(--bg-surface);
2391
+ padding: 12px;
2392
+ border-radius: var(--r-md);
2393
+ overflow-x: auto;
2394
+ margin: 1rem 0;
2395
+ border: 1px solid var(--border-color);
2396
+ }
2397
+ .markdown-body pre code {
2398
+ background: transparent;
2399
+ padding: 0;
2400
+ color: inherit;
2401
+ }
2402
+
2403
+
2404
+ /* --- ChatGPT-style Full Screen AI Chat Mode --- */
2405
+ #resultsScreen.ai-chat-mode .stats-row,
2406
+ #resultsScreen.ai-chat-mode .sections-switch,
2407
+ #resultsScreen.ai-chat-mode .export-bar,
2408
+ #resultsScreen.ai-chat-mode #datasetExplorerCard {
2409
+ display: none !important;
2410
+ }
2411
+
2412
+ #resultsScreen.ai-chat-mode {
2413
+ padding: 10px 20px !important;
2414
+ }
2415
+
2416
+ #resultsScreen.ai-chat-mode #areaChat {
2417
+ margin: 0 !important;
2418
+ }
2419
+
2420
+ #resultsScreen.ai-chat-mode #chatContainerCard {
2421
+ border: none !important;
2422
+ background: transparent !important;
2423
+ padding: 0 10px !important;
2424
+ box-shadow: none !important;
2425
+ }
2426
+
2427
+ #resultsScreen.ai-chat-mode #chatMessages {
2428
+ max-height: none !important;
2429
+ height: 100% !important;
2430
+ }
2431
+
2432
+ /* Fix text squishing inside chat bubbles */
2433
+ .chat-msg {
2434
+ align-items: flex-start;
2435
+ }
2436
+ .chat-bubble {
2437
+ width: fit-content;
2438
+ min-width: 0; /* Prevents extreme flex collapse in some browsers */
2439
+ word-break: break-word; /* Ensures long words wrap instead of breaking layout */
2440
+ }
2441
+
2442
+ /* ── Workspace Hub Selection Cards ─────────────────────── */
2443
+ .hub-card {
2444
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
2445
+ }
2446
+ .hub-card:hover {
2447
+ transform: translateY(-5px);
2448
+ border-color: var(--violet-light) !important;
2449
+ box-shadow: 0 10px 20px -5px rgba(167, 139, 250, 0.15);
2450
+ background: rgba(255, 255, 255, 0.015) !important;
2451
+ }
2452
+ .hub-card#btnEnterAgentic:hover {
2453
+ border-color: var(--cyan) !important;
2454
+ box-shadow: 0 10px 20px -5px rgba(6, 182, 212, 0.15);
2455
+ }
2456
+
2457
+ /* ── Floating Analysis Notification Toast ── */
2458
+ .analysis-notification-toast {
2459
+ position: fixed;
2460
+ top: 24px;
2461
+ right: 24px;
2462
+ background: var(--bg-elevated);
2463
+ border: 1px solid var(--border-mid);
2464
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5), 0 0 16px rgba(255, 37, 42, 0.15);
2465
+ border-radius: var(--r-lg);
2466
+ padding: 14px 18px;
2467
+ z-index: 9999;
2468
+ width: 320px;
2469
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
2470
+ animation: slideInNotif 0.3s cubic-bezier(0.16, 1, 0.3, 1);
2471
+ display: flex;
2472
+ flex-direction: column;
2473
+ gap: 8px;
2474
+ }
2475
+ @keyframes slideInNotif {
2476
+ from { transform: translateY(-20px) scale(0.95); opacity: 0; }
2477
+ to { transform: translateY(0) scale(1); opacity: 1; }
2478
+ }
2479
+ .analysis-notification-toast.hidden {
2480
+ display: none !important;
2481
+ }
2482
+ .notification-body {
2483
+ display: flex;
2484
+ align-items: center;
2485
+ gap: 12px;
2486
+ width: 100%;
2487
+ }
2488
+ .notif-spinner {
2489
+ width: 20px;
2490
+ height: 20px;
2491
+ border: 2px solid var(--violet-light);
2492
+ border-top-color: transparent;
2493
+ border-radius: 50%;
2494
+ animation: spin 1s linear infinite;
2495
+ flex-shrink: 0;
2496
+ }
2497
+ .notif-content {
2498
+ flex: 1;
2499
+ min-width: 0;
2500
+ }
2501
+ .notif-title {
2502
+ font-size: 0.85rem;
2503
+ font-weight: 700;
2504
+ color: #fff;
2505
+ white-space: nowrap;
2506
+ overflow: hidden;
2507
+ text-overflow: ellipsis;
2508
+ }
2509
+ .notif-details {
2510
+ font-size: 0.75rem;
2511
+ color: var(--text-secondary);
2512
+ margin-top: 2px;
2513
+ white-space: nowrap;
2514
+ overflow: hidden;
2515
+ text-overflow: ellipsis;
2516
+ }
2517
+ .notif-close-btn {
2518
+ background: none;
2519
+ border: none;
2520
+ color: var(--text-muted);
2521
+ cursor: pointer;
2522
+ font-size: 1.1rem;
2523
+ padding: 0 4px;
2524
+ line-height: 1;
2525
+ transition: color 0.2s;
2526
+ align-self: flex-end;
2527
+ margin-top: -6px;
2528
+ margin-right: -6px;
2529
+ }
2530
+ .notif-close-btn:hover {
2531
+ color: #fff;
2532
+ }
2533
+ /* Success state for completed job */
2534
+ .analysis-notification-toast.complete {
2535
+ border-color: var(--emerald);
2536
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5), 0 0 16px rgba(16, 185, 129, 0.15);
2537
+ }
2538
+ .analysis-notification-toast.complete .notif-spinner {
2539
+ border-color: var(--emerald);
2540
+ border-top-color: var(--emerald);
2541
+ background: rgba(16, 185, 129, 0.1);
2542
+ animation: none;
2543
+ display: flex;
2544
+ align-items: center;
2545
+ justify-content: center;
2546
+ }
2547
+ .analysis-notification-toast.complete .notif-spinner::after {
2548
+ content: '✓';
2549
+ color: var(--emerald);
2550
+ font-size: 0.75rem;
2551
+ font-weight: bold;
2552
+ }
2553
+
2554
+ /* Card Button hover animations */
2555
+ .hub-card:hover .btn-primary {
2556
+ transform: scale(1.02);
2557
+ box-shadow: 0 4px 12px rgba(139, 92, 246, 0.25);
2558
+ }
2559
+ .hub-card#btnEnterAgentic:hover .btn-primary {
2560
+ box-shadow: 0 4px 12px rgba(6, 182, 212, 0.25);
2561
+ }