@runflow-ai/cli 0.2.5 → 0.2.7

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 (50) hide show
  1. package/dist/commands/agents/agents.command.js +244 -93
  2. package/dist/commands/agents/agents.command.js.map +1 -1
  3. package/dist/commands/login/login.command.js +23 -9
  4. package/dist/commands/login/login.command.js.map +1 -1
  5. package/dist/commands/prompts/prompts.command.js +13 -13
  6. package/dist/commands/prompts/prompts.command.js.map +1 -1
  7. package/dist/commands/test/test.command.d.ts +27 -0
  8. package/dist/commands/test/test.command.js +326 -0
  9. package/dist/commands/test/test.command.js.map +1 -0
  10. package/dist/commands/users/users.command.js +16 -19
  11. package/dist/commands/users/users.command.js.map +1 -1
  12. package/dist/common/api-client.js +4 -1
  13. package/dist/common/api-client.js.map +1 -1
  14. package/dist/common/banner.js +34 -1
  15. package/dist/common/banner.js.map +1 -1
  16. package/dist/common/config.d.ts +1 -1
  17. package/dist/common/config.js +42 -6
  18. package/dist/common/config.js.map +1 -1
  19. package/dist/common/logger.js +34 -1
  20. package/dist/common/logger.js.map +1 -1
  21. package/dist/common/system-check.d.ts +18 -0
  22. package/dist/common/system-check.js +118 -0
  23. package/dist/common/system-check.js.map +1 -0
  24. package/dist/common/ui.js +13 -4
  25. package/dist/common/ui.js.map +1 -1
  26. package/dist/common/validator.d.ts +13 -0
  27. package/dist/common/validator.js +191 -0
  28. package/dist/common/validator.js.map +1 -0
  29. package/dist/index.js +42 -5
  30. package/dist/index.js.map +1 -1
  31. package/package.json +10 -3
  32. package/scenarios/README.md +71 -0
  33. package/scenarios/memory-conversation.json +23 -0
  34. package/scenarios/test-messages-array.json +19 -0
  35. package/scenarios/test-metadata-custom.json +22 -0
  36. package/scenarios/webhook-hubspot-contact.json +40 -0
  37. package/scenarios/webhook-meta-messenger.json +33 -0
  38. package/scenarios/webhook-shopify.json +24 -0
  39. package/scenarios/webhook-slack-message.json +21 -0
  40. package/scenarios/webhook-stripe.json +22 -0
  41. package/scenarios/webhook-twilio-sms.json +21 -0
  42. package/scenarios/webhook-twilio-whatsapp.json +22 -0
  43. package/scenarios/webhook-zendesk-ticket.json +25 -0
  44. package/static/README.md +221 -0
  45. package/static/app.js +1381 -0
  46. package/static/frontend-server-template.js +24 -0
  47. package/static/index.html +340 -0
  48. package/static/runflow-logo.png +0 -0
  49. package/static/style.css +1354 -0
  50. package/static/test-server-template.js +561 -0
@@ -0,0 +1,1354 @@
1
+ /* ============================================================================
2
+ Runflow Test Interface - Enterprise Design System
3
+ Version: 2.0.0
4
+ Description: Professional styling for developer testing interface
5
+ ============================================================================ */
6
+
7
+ /* ============================================================================
8
+ CSS Variables & Design Tokens
9
+ ============================================================================ */
10
+
11
+ :root {
12
+ /* Brand Colors */
13
+ --brand-50: #eef2ff;
14
+ --brand-100: #e0e7ff;
15
+ --brand-200: #c7d2fe;
16
+ --brand-300: #a5b4fc;
17
+ --brand-400: #818cf8;
18
+ --brand-500: #6366f1;
19
+ --brand-600: #4f46e5;
20
+ --brand-700: #4338ca;
21
+ --brand-800: #3730a3;
22
+ --brand-900: #312e81;
23
+
24
+ /* Semantic Colors */
25
+ --primary: var(--brand-600);
26
+ --primary-hover: var(--brand-700);
27
+ --primary-light: var(--brand-100);
28
+ --success: #059669;
29
+ --success-light: #10b981;
30
+ --warning: #d97706;
31
+ --warning-light: #fbbf24;
32
+ --error: #dc2626;
33
+ --error-light: #f87171;
34
+ --info: #0284c7;
35
+ --info-light: #38bdf8;
36
+
37
+ /* Neutral Palette */
38
+ --gray-50: #f8fafc;
39
+ --gray-100: #f1f5f9;
40
+ --gray-200: #e2e8f0;
41
+ --gray-300: #cbd5e1;
42
+ --gray-400: #94a3b8;
43
+ --gray-500: #64748b;
44
+ --gray-600: #475569;
45
+ --gray-700: #334155;
46
+ --gray-800: #1e293b;
47
+ --gray-900: #0f172a;
48
+ --gray-950: #020617;
49
+
50
+ /* Typography */
51
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
52
+ --font-mono: 'SF Mono', Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
53
+
54
+ --text-xs: 0.75rem;
55
+ --text-sm: 0.875rem;
56
+ --text-base: 1rem;
57
+ --text-lg: 1.125rem;
58
+ --text-xl: 1.25rem;
59
+ --text-2xl: 1.5rem;
60
+
61
+ /* Spacing Scale */
62
+ --space-1: 0.25rem;
63
+ --space-2: 0.5rem;
64
+ --space-3: 0.75rem;
65
+ --space-4: 1rem;
66
+ --space-5: 1.25rem;
67
+ --space-6: 1.5rem;
68
+ --space-8: 2rem;
69
+ --space-10: 2.5rem;
70
+
71
+ /* Border Radius */
72
+ --radius-sm: 0.25rem;
73
+ --radius-md: 0.375rem;
74
+ --radius-lg: 0.5rem;
75
+ --radius-xl: 0.75rem;
76
+ --radius-2xl: 1rem;
77
+ --radius-full: 9999px;
78
+
79
+ /* Shadows - Cleaner and more subtle */
80
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.04);
81
+ --shadow-md: 0 2px 4px rgba(0, 0, 0, 0.06);
82
+ --shadow-lg: 0 4px 8px rgba(0, 0, 0, 0.08);
83
+ --shadow-xl: 0 8px 16px rgba(0, 0, 0, 0.1);
84
+
85
+ /* Transitions */
86
+ --transition-fast: 150ms ease;
87
+ --transition-base: 200ms ease;
88
+ --transition-slow: 300ms ease;
89
+
90
+ /* Layout */
91
+ --header-height: 4rem;
92
+ --footer-height: 3rem;
93
+ --sidebar-width: 320px;
94
+ --max-width: 1400px;
95
+ }
96
+
97
+ /* ============================================================================
98
+ Base Styles & Reset
99
+ ============================================================================ */
100
+
101
+ *,
102
+ *::before,
103
+ *::after {
104
+ box-sizing: border-box;
105
+ margin: 0;
106
+ padding: 0;
107
+ }
108
+
109
+ html {
110
+ font-size: 16px;
111
+ -webkit-font-smoothing: antialiased;
112
+ -moz-osx-font-smoothing: grayscale;
113
+ }
114
+
115
+ body {
116
+ font-family: var(--font-sans);
117
+ font-size: var(--text-base);
118
+ line-height: 1.6;
119
+ color: var(--gray-900);
120
+ background: var(--gray-50);
121
+ min-height: 100vh;
122
+ }
123
+
124
+ /* ============================================================================
125
+ Layout Structure
126
+ ============================================================================ */
127
+
128
+ .container {
129
+ max-width: var(--max-width);
130
+ margin: 0 auto;
131
+ padding: var(--space-4);
132
+ height: 100vh;
133
+ display: flex;
134
+ flex-direction: column;
135
+ gap: var(--space-4);
136
+ overflow: hidden;
137
+ }
138
+
139
+ /* ============================================================================
140
+ Header Styles
141
+ ============================================================================ */
142
+
143
+ .app-header {
144
+ background: white;
145
+ border-radius: var(--radius-xl);
146
+ box-shadow: var(--shadow-sm);
147
+ transition: box-shadow var(--transition-base);
148
+ flex-shrink: 0;
149
+ }
150
+
151
+ .app-header:hover {
152
+ box-shadow: var(--shadow-md);
153
+ }
154
+
155
+ .header-content {
156
+ display: flex;
157
+ justify-content: space-between;
158
+ align-items: center;
159
+ padding: var(--space-4) var(--space-6);
160
+ }
161
+
162
+ .header-left {
163
+ display: flex;
164
+ align-items: center;
165
+ gap: var(--space-8);
166
+ }
167
+
168
+ .logo-section {
169
+ display: flex;
170
+ align-items: center;
171
+ gap: var(--space-3);
172
+ }
173
+
174
+ .logo-image {
175
+ width: 40px;
176
+ height: 40px;
177
+ object-fit: contain;
178
+ }
179
+
180
+ .logo-icon {
181
+ width: 40px;
182
+ height: 40px;
183
+ background: var(--primary);
184
+ color: white;
185
+ border-radius: var(--radius-lg);
186
+ display: flex;
187
+ align-items: center;
188
+ justify-content: center;
189
+ font-weight: 700;
190
+ font-size: var(--text-xl);
191
+ }
192
+
193
+ .brand-text {
194
+ display: flex;
195
+ flex-direction: column;
196
+ }
197
+
198
+ .brand-title {
199
+ font-size: var(--text-xl);
200
+ font-weight: 700;
201
+ color: var(--gray-900);
202
+ line-height: 1.2;
203
+ }
204
+
205
+ .brand-subtitle {
206
+ font-size: var(--text-xs);
207
+ color: var(--gray-500);
208
+ text-transform: uppercase;
209
+ letter-spacing: 0.05em;
210
+ }
211
+
212
+ .project-info {
213
+ display: flex;
214
+ align-items: center;
215
+ gap: var(--space-2);
216
+ padding: var(--space-2) var(--space-4);
217
+ background: var(--gray-50);
218
+ border-radius: var(--radius-full);
219
+ }
220
+
221
+ .project-label {
222
+ font-size: var(--text-sm);
223
+ color: var(--gray-500);
224
+ }
225
+
226
+ .project-name {
227
+ font-size: var(--text-sm);
228
+ font-weight: 600;
229
+ color: var(--gray-700);
230
+ }
231
+
232
+ /* Connection Status */
233
+ .connection-status,
234
+ .status {
235
+ display: flex;
236
+ align-items: center;
237
+ gap: var(--space-2);
238
+ padding: var(--space-2) var(--space-4);
239
+ background: var(--gray-50);
240
+ border-radius: var(--radius-full);
241
+ transition: all var(--transition-base);
242
+ }
243
+
244
+ .connection-status.connected,
245
+ .status.connected {
246
+ background: var(--success);
247
+ color: white;
248
+ }
249
+
250
+ .connection-status.error,
251
+ .status.error {
252
+ background: var(--error);
253
+ color: white;
254
+ }
255
+
256
+ /* Status Dot */
257
+ .status .dot {
258
+ width: 8px;
259
+ height: 8px;
260
+ border-radius: 50%;
261
+ background: var(--gray-400);
262
+ }
263
+
264
+ .status-indicator {
265
+ width: 8px;
266
+ height: 8px;
267
+ border-radius: 50%;
268
+ background: var(--gray-400);
269
+ animation: pulse 2s infinite;
270
+ }
271
+
272
+ .connected .status-indicator {
273
+ background: white;
274
+ animation: pulse 2s infinite;
275
+ }
276
+
277
+ .status-text {
278
+ font-size: var(--text-sm);
279
+ font-weight: 500;
280
+ }
281
+
282
+ /* ============================================================================
283
+ Main Content Layout
284
+ ============================================================================ */
285
+
286
+ .main-content {
287
+ flex: 1;
288
+ display: grid;
289
+ grid-template-columns: minmax(0, 1fr) var(--sidebar-width);
290
+ gap: var(--space-4);
291
+ min-height: 0; /* Important for flexbox to work properly */
292
+ overflow: hidden;
293
+ width: 100%;
294
+ }
295
+
296
+ /* ============================================================================
297
+ Chat Container
298
+ ============================================================================ */
299
+
300
+ .chat-container {
301
+ background: white;
302
+ border-radius: var(--radius-xl);
303
+ box-shadow: var(--shadow-sm);
304
+ display: flex;
305
+ flex-direction: column;
306
+ height: 100%;
307
+ min-height: 0;
308
+ min-width: 0;
309
+ overflow: hidden;
310
+ }
311
+
312
+ /* Messages Area */
313
+ .messages {
314
+ flex: 1 1 auto;
315
+ padding: var(--space-4);
316
+ overflow-y: auto;
317
+ overflow-x: hidden;
318
+ scroll-behavior: smooth;
319
+ background: white;
320
+ min-height: 0; /* CRITICAL for flexbox scrolling to work */
321
+ max-height: 100%;
322
+ width: 100%;
323
+ }
324
+
325
+ /* Custom scrollbar for messages */
326
+ .messages::-webkit-scrollbar {
327
+ width: 6px;
328
+ }
329
+
330
+ .messages::-webkit-scrollbar-track {
331
+ background: var(--gray-100);
332
+ border-radius: var(--radius-full);
333
+ }
334
+
335
+ .messages::-webkit-scrollbar-thumb {
336
+ background: var(--gray-400);
337
+ border-radius: var(--radius-full);
338
+ }
339
+
340
+ .messages::-webkit-scrollbar-thumb:hover {
341
+ background: var(--gray-500);
342
+ }
343
+
344
+ /* Message Styles */
345
+ .message {
346
+ margin-bottom: var(--space-3);
347
+ animation: messageSlide 0.3s ease;
348
+ width: 100%;
349
+ max-width: 100%;
350
+ overflow: hidden;
351
+ }
352
+
353
+ @keyframes messageSlide {
354
+ from {
355
+ opacity: 0;
356
+ transform: translateY(10px);
357
+ }
358
+ to {
359
+ opacity: 1;
360
+ transform: translateY(0);
361
+ }
362
+ }
363
+
364
+ .message-bubble {
365
+ display: inline-block;
366
+ max-width: 75%;
367
+ padding: var(--space-3) var(--space-4);
368
+ border-radius: var(--radius-xl);
369
+ position: relative;
370
+ line-height: 1.5;
371
+ overflow-x: hidden;
372
+ word-break: break-word;
373
+ }
374
+
375
+ /* Message Types */
376
+ .message.system .message-bubble {
377
+ background: var(--brand-50);
378
+ color: var(--brand-700);
379
+ max-width: 100%;
380
+ border: 1px solid var(--brand-100);
381
+ font-weight: 500;
382
+ }
383
+
384
+ .message.user {
385
+ text-align: right;
386
+ }
387
+
388
+ .message.user .message-bubble {
389
+ background: var(--brand-600);
390
+ color: white;
391
+ margin-left: auto;
392
+ text-align: left;
393
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
394
+ }
395
+
396
+ .message.assistant .message-bubble {
397
+ background: white;
398
+ border: 1px solid var(--gray-200);
399
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
400
+ color: var(--gray-800);
401
+ max-width: 100%;
402
+ }
403
+
404
+ .message.error .message-bubble {
405
+ background: var(--error);
406
+ color: white;
407
+ border: 1px solid var(--error);
408
+ }
409
+
410
+ /* Message Header */
411
+ .message-header {
412
+ display: flex;
413
+ align-items: center;
414
+ margin-bottom: var(--space-2);
415
+ }
416
+
417
+ .message-type {
418
+ font-size: var(--text-xs);
419
+ font-weight: 600;
420
+ text-transform: uppercase;
421
+ letter-spacing: 0.05em;
422
+ opacity: 0.9;
423
+ }
424
+
425
+ /* Message Content */
426
+ .message .content {
427
+ font-size: var(--text-sm);
428
+ line-height: 1.7;
429
+ word-wrap: break-word;
430
+ }
431
+
432
+ .message .content strong {
433
+ font-weight: 600;
434
+ color: inherit;
435
+ }
436
+
437
+ /* Message Metadata */
438
+ .message-metadata {
439
+ display: flex;
440
+ flex-wrap: wrap;
441
+ gap: var(--space-2);
442
+ margin-top: var(--space-2);
443
+ padding-top: var(--space-2);
444
+ border-top: 1px solid rgba(0, 0, 0, 0.05);
445
+ }
446
+
447
+ .message.user .message-metadata {
448
+ border-top-color: rgba(255, 255, 255, 0.15);
449
+ }
450
+
451
+ .meta-item {
452
+ font-size: 11px;
453
+ padding: 2px 8px;
454
+ background: rgba(0, 0, 0, 0.05);
455
+ border-radius: var(--radius-full);
456
+ color: var(--gray-600);
457
+ }
458
+
459
+ .message.user .meta-item {
460
+ background: rgba(255, 255, 255, 0.15);
461
+ color: rgba(255, 255, 255, 0.9);
462
+ }
463
+
464
+ /* Message Footer */
465
+ .message-footer {
466
+ display: flex;
467
+ align-items: center;
468
+ gap: var(--space-2);
469
+ margin-top: var(--space-2);
470
+ }
471
+
472
+ .message .content pre {
473
+ background: var(--gray-900);
474
+ color: var(--gray-100);
475
+ padding: var(--space-3);
476
+ border-radius: var(--radius-md);
477
+ margin: var(--space-2) 0;
478
+ overflow-x: auto;
479
+ font-family: var(--font-mono);
480
+ font-size: var(--text-xs);
481
+ }
482
+
483
+ .message.user .content pre {
484
+ background: rgba(255, 255, 255, 0.15);
485
+ color: white;
486
+ }
487
+
488
+ .message.assistant .content pre {
489
+ background: var(--gray-800);
490
+ color: var(--gray-100);
491
+ }
492
+
493
+ .message .timestamp {
494
+ font-size: var(--text-xs);
495
+ opacity: 0.6;
496
+ margin-top: var(--space-2);
497
+ }
498
+
499
+ .message.user .timestamp {
500
+ opacity: 0.8;
501
+ }
502
+
503
+ .message .duration {
504
+ display: inline-block;
505
+ margin-left: var(--space-2);
506
+ padding: 2px 6px;
507
+ background: var(--gray-100);
508
+ color: var(--gray-600);
509
+ border-radius: var(--radius-sm);
510
+ font-size: 10px;
511
+ font-weight: 600;
512
+ font-family: var(--font-mono);
513
+ }
514
+
515
+ .message.user .duration {
516
+ background: rgba(255, 255, 255, 0.2);
517
+ color: rgba(255, 255, 255, 0.9);
518
+ }
519
+
520
+ /* JSON Toggle */
521
+ .json-toggle-wrapper {
522
+ margin-top: var(--space-3);
523
+ padding-top: var(--space-3);
524
+ border-top: 1px solid var(--gray-200);
525
+ width: 100%;
526
+ max-width: 100%;
527
+ overflow: hidden;
528
+ }
529
+
530
+ .json-toggle {
531
+ background: var(--gray-100);
532
+ border: 1px solid var(--gray-200);
533
+ border-radius: var(--radius-md);
534
+ padding: var(--space-2) var(--space-3);
535
+ font-size: var(--text-xs);
536
+ color: var(--gray-700);
537
+ cursor: pointer;
538
+ transition: all var(--transition-fast);
539
+ font-weight: 500;
540
+ }
541
+
542
+ .json-toggle:hover {
543
+ background: var(--gray-200);
544
+ color: var(--gray-900);
545
+ }
546
+
547
+ .json-response {
548
+ margin-top: var(--space-3);
549
+ border-radius: var(--radius-lg);
550
+ overflow: hidden;
551
+ animation: slideDown 0.3s ease;
552
+ max-width: 100%;
553
+ }
554
+
555
+ @keyframes slideDown {
556
+ from {
557
+ opacity: 0;
558
+ transform: translateY(-10px);
559
+ }
560
+ to {
561
+ opacity: 1;
562
+ transform: translateY(0);
563
+ }
564
+ }
565
+
566
+ .json-response pre {
567
+ background: var(--gray-900);
568
+ color: var(--gray-100);
569
+ padding: var(--space-4);
570
+ margin: 0;
571
+ font-size: var(--text-xs);
572
+ max-height: 250px;
573
+ overflow: auto;
574
+ white-space: pre;
575
+ word-wrap: normal;
576
+ max-width: 100%;
577
+ }
578
+
579
+ /* Custom scrollbar for JSON */
580
+ .json-response pre::-webkit-scrollbar {
581
+ width: 8px;
582
+ height: 8px;
583
+ }
584
+
585
+ .json-response pre::-webkit-scrollbar-track {
586
+ background: var(--gray-800);
587
+ }
588
+
589
+ .json-response pre::-webkit-scrollbar-thumb {
590
+ background: var(--gray-600);
591
+ border-radius: var(--radius-sm);
592
+ }
593
+
594
+ .json-response pre::-webkit-scrollbar-corner {
595
+ background: var(--gray-800);
596
+ }
597
+
598
+ /* Scenario Select Styling */
599
+ #scenarioSelect optgroup {
600
+ font-weight: 600;
601
+ color: var(--gray-700);
602
+ background: var(--gray-50);
603
+ }
604
+
605
+ #scenarioSelect option {
606
+ padding: var(--space-2);
607
+ font-weight: 400;
608
+ }
609
+
610
+ /* ============================================================================
611
+ Input Form
612
+ ============================================================================ */
613
+
614
+ .input-form {
615
+ display: flex;
616
+ gap: var(--space-3);
617
+ padding: var(--space-4) var(--space-6);
618
+ background: white;
619
+ border-top: 1px solid var(--gray-200);
620
+ flex-shrink: 0; /* Never shrink */
621
+ flex-grow: 0; /* Never grow */
622
+ backdrop-filter: blur(10px);
623
+ background: rgba(255, 255, 255, 0.98);
624
+ }
625
+
626
+ .input-wrapper {
627
+ flex: 1;
628
+ position: relative;
629
+ display: flex;
630
+ align-items: center;
631
+ }
632
+
633
+ .message-input {
634
+ width: 100%;
635
+ padding: var(--space-3) var(--space-4);
636
+ padding-right: var(--space-10);
637
+ font-size: var(--text-sm);
638
+ border: 2px solid var(--gray-200);
639
+ border-radius: var(--radius-lg);
640
+ background: white;
641
+ transition: all var(--transition-base);
642
+ }
643
+
644
+ .message-input:focus {
645
+ outline: none;
646
+ border-color: var(--primary);
647
+ box-shadow: 0 0 0 3px var(--primary-light);
648
+ }
649
+
650
+ .clear-btn {
651
+ position: absolute;
652
+ right: var(--space-3);
653
+ background: none;
654
+ border: none;
655
+ color: var(--gray-400);
656
+ cursor: pointer;
657
+ padding: var(--space-2);
658
+ border-radius: var(--radius-md);
659
+ transition: all var(--transition-fast);
660
+ }
661
+
662
+ .clear-btn:hover {
663
+ color: var(--gray-600);
664
+ background: var(--gray-100);
665
+ }
666
+
667
+ .send-button {
668
+ padding: var(--space-3) var(--space-6);
669
+ background: var(--primary);
670
+ color: white;
671
+ border: none;
672
+ border-radius: var(--radius-lg);
673
+ font-size: var(--text-sm);
674
+ font-weight: 600;
675
+ cursor: pointer;
676
+ transition: all var(--transition-base);
677
+ display: flex;
678
+ align-items: center;
679
+ gap: var(--space-2);
680
+ }
681
+
682
+ .send-button:hover:not(:disabled) {
683
+ background: var(--primary-hover);
684
+ transform: translateY(-1px);
685
+ box-shadow: var(--shadow-md);
686
+ }
687
+
688
+ .send-button:disabled {
689
+ opacity: 0.5;
690
+ cursor: not-allowed;
691
+ }
692
+
693
+ /* ============================================================================
694
+ Sidebar Tabs
695
+ ============================================================================ */
696
+
697
+ .sidebar-tabs {
698
+ display: flex;
699
+ gap: 4px;
700
+ padding: 8px 12px;
701
+ background: var(--gray-50);
702
+ border-bottom: 1px solid var(--gray-200);
703
+ }
704
+
705
+ .sidebar-tab {
706
+ flex: 1;
707
+ display: flex;
708
+ align-items: center;
709
+ justify-content: center;
710
+ gap: 6px;
711
+ padding: 8px 12px;
712
+ border: none;
713
+ background: transparent;
714
+ color: var(--gray-600);
715
+ font-size: 13px;
716
+ font-weight: 500;
717
+ cursor: pointer;
718
+ border-radius: var(--radius-md);
719
+ transition: all var(--transition-fast);
720
+ }
721
+
722
+ .sidebar-tab:hover {
723
+ background: var(--gray-100);
724
+ color: var(--gray-800);
725
+ }
726
+
727
+ .sidebar-tab.active {
728
+ background: white;
729
+ color: var(--primary);
730
+ box-shadow: var(--shadow-sm);
731
+ }
732
+
733
+ .sidebar-tab .tab-icon {
734
+ font-size: 14px;
735
+ }
736
+
737
+ .sidebar-tab .tab-label {
738
+ font-size: 12px;
739
+ }
740
+
741
+ .tab-content {
742
+ display: none;
743
+ }
744
+
745
+ .tab-content.active {
746
+ display: block;
747
+ }
748
+
749
+ /* ============================================================================
750
+ Sidebar
751
+ ============================================================================ */
752
+
753
+ .sidebar {
754
+ display: flex;
755
+ flex-direction: column;
756
+ gap: var(--space-3);
757
+ height: 100%;
758
+ min-height: 0;
759
+ overflow-y: auto;
760
+ overflow-x: hidden;
761
+ padding-right: var(--space-2);
762
+ width: var(--sidebar-width);
763
+ flex-shrink: 0;
764
+ }
765
+
766
+ /* Custom scrollbar for sidebar */
767
+ .sidebar::-webkit-scrollbar {
768
+ width: 4px;
769
+ }
770
+
771
+ .sidebar::-webkit-scrollbar-track {
772
+ background: transparent;
773
+ }
774
+
775
+ .sidebar::-webkit-scrollbar-thumb {
776
+ background: var(--gray-300);
777
+ border-radius: var(--radius-full);
778
+ }
779
+
780
+ .sidebar::-webkit-scrollbar-thumb:hover {
781
+ background: var(--gray-400);
782
+ }
783
+
784
+ /* Panel Styles */
785
+ .panel {
786
+ background: white;
787
+ border-radius: var(--radius-xl);
788
+ box-shadow: var(--shadow-sm);
789
+ padding: var(--space-4);
790
+ transition: all var(--transition-base);
791
+ flex-shrink: 0;
792
+ }
793
+
794
+ .panel:hover {
795
+ box-shadow: var(--shadow-md);
796
+ }
797
+
798
+ .panel-title {
799
+ font-size: var(--text-sm);
800
+ font-weight: 600;
801
+ color: var(--gray-900);
802
+ margin-bottom: var(--space-3);
803
+ display: flex;
804
+ align-items: center;
805
+ gap: var(--space-2);
806
+ }
807
+
808
+ .panel-icon {
809
+ font-size: var(--text-base);
810
+ }
811
+
812
+ /* Info Items */
813
+ .info-item {
814
+ display: flex;
815
+ justify-content: space-between;
816
+ align-items: center;
817
+ padding: var(--space-2) 0;
818
+ font-size: var(--text-sm);
819
+ border-bottom: 1px solid var(--gray-100);
820
+ }
821
+
822
+ .info-item:last-child {
823
+ border-bottom: none;
824
+ }
825
+
826
+ /* Settings Group */
827
+ .settings-group {
828
+ display: flex;
829
+ flex-direction: column;
830
+ gap: var(--space-3);
831
+ }
832
+
833
+ .setting-item {
834
+ display: flex;
835
+ align-items: center;
836
+ gap: var(--space-2);
837
+ cursor: pointer;
838
+ font-size: var(--text-sm);
839
+ color: var(--gray-700);
840
+ transition: color var(--transition-fast);
841
+ }
842
+
843
+ .setting-item:hover {
844
+ color: var(--gray-900);
845
+ }
846
+
847
+ .setting-item input[type="checkbox"] {
848
+ cursor: pointer;
849
+ }
850
+
851
+ .setting-item-input {
852
+ margin-top: var(--space-3);
853
+ padding-top: var(--space-3);
854
+ border-top: 1px solid var(--gray-200);
855
+ }
856
+
857
+ .setting-item-input label {
858
+ display: block;
859
+ font-size: var(--text-sm);
860
+ font-weight: 500;
861
+ color: var(--gray-700);
862
+ margin-bottom: var(--space-1);
863
+ }
864
+
865
+ .info-item strong {
866
+ color: var(--gray-600);
867
+ font-weight: 500;
868
+ }
869
+
870
+ .info-item span {
871
+ color: var(--gray-900);
872
+ font-weight: 600;
873
+ }
874
+
875
+ /* Status Indicators */
876
+ .status-ready {
877
+ color: var(--success);
878
+ }
879
+
880
+ .status-error {
881
+ color: var(--error);
882
+ }
883
+
884
+ /* Control Buttons Grid */
885
+ .controls-grid {
886
+ display: grid;
887
+ gap: var(--space-3);
888
+ }
889
+
890
+ .control-btn {
891
+ display: flex;
892
+ align-items: center;
893
+ justify-content: center;
894
+ gap: var(--space-2);
895
+ padding: var(--space-2) var(--space-4);
896
+ background: white;
897
+ border: 1px solid var(--gray-200);
898
+ border-radius: var(--radius-md);
899
+ font-size: var(--text-sm);
900
+ font-weight: 500;
901
+ color: var(--gray-700);
902
+ cursor: pointer;
903
+ transition: all var(--transition-fast);
904
+ height: 36px;
905
+ }
906
+
907
+ .control-btn:hover {
908
+ background: var(--gray-50);
909
+ color: var(--gray-900);
910
+ border-color: var(--gray-300);
911
+ }
912
+
913
+ .control-btn:active {
914
+ transform: translateY(1px);
915
+ }
916
+
917
+ .control-btn.refresh-btn:hover {
918
+ background: var(--brand-50);
919
+ color: var(--brand-700);
920
+ border-color: var(--brand-200);
921
+ }
922
+
923
+ .control-btn.export-btn:hover {
924
+ background: var(--success);
925
+ color: white;
926
+ border-color: var(--success);
927
+ }
928
+
929
+ .control-btn.danger:hover {
930
+ background: var(--error);
931
+ color: white;
932
+ border-color: var(--error);
933
+ }
934
+
935
+ .btn-icon {
936
+ font-size: var(--text-base);
937
+ }
938
+
939
+ /* Example Buttons */
940
+ .example-buttons {
941
+ display: grid;
942
+ grid-template-columns: 1fr 1fr;
943
+ gap: var(--space-2);
944
+ }
945
+
946
+ .example-btn {
947
+ padding: var(--space-2) var(--space-3);
948
+ background: white;
949
+ border: 1px solid var(--gray-200);
950
+ border-radius: var(--radius-md);
951
+ font-size: var(--text-xs);
952
+ color: var(--gray-700);
953
+ cursor: pointer;
954
+ transition: all var(--transition-fast);
955
+ text-align: center;
956
+ font-weight: 500;
957
+ }
958
+
959
+ .example-btn:hover {
960
+ background: var(--brand-50);
961
+ border-color: var(--brand-200);
962
+ color: var(--brand-700);
963
+ }
964
+
965
+ .example-btn:active {
966
+ transform: scale(0.98);
967
+ }
968
+
969
+ /* ============================================================================
970
+ Footer
971
+ ============================================================================ */
972
+
973
+ .app-footer {
974
+ background: white;
975
+ border-radius: var(--radius-xl);
976
+ box-shadow: var(--shadow-sm);
977
+ padding: var(--space-3) var(--space-6);
978
+ flex-shrink: 0;
979
+ }
980
+
981
+ .footer-content {
982
+ display: flex;
983
+ justify-content: space-between;
984
+ align-items: center;
985
+ }
986
+
987
+ .footer-left {
988
+ display: flex;
989
+ align-items: center;
990
+ gap: var(--space-4);
991
+ }
992
+
993
+ .powered-by {
994
+ font-size: var(--text-sm);
995
+ color: var(--gray-600);
996
+ }
997
+
998
+ .powered-by strong {
999
+ color: var(--primary);
1000
+ font-weight: 600;
1001
+ }
1002
+
1003
+ .version {
1004
+ font-size: var(--text-xs);
1005
+ color: var(--gray-400);
1006
+ padding: var(--space-1) var(--space-2);
1007
+ background: var(--gray-100);
1008
+ border-radius: var(--radius-md);
1009
+ }
1010
+
1011
+ .shortcuts {
1012
+ display: flex;
1013
+ align-items: center;
1014
+ gap: var(--space-2);
1015
+ font-size: var(--text-sm);
1016
+ color: var(--gray-600);
1017
+ }
1018
+
1019
+ .shortcut kbd {
1020
+ padding: var(--space-1) var(--space-2);
1021
+ background: var(--gray-100);
1022
+ border: 1px solid var(--gray-300);
1023
+ border-radius: var(--radius-sm);
1024
+ font-family: var(--font-mono);
1025
+ font-size: var(--text-xs);
1026
+ font-weight: 600;
1027
+ color: var(--gray-700);
1028
+ }
1029
+
1030
+ .shortcut-separator {
1031
+ color: var(--gray-400);
1032
+ }
1033
+
1034
+ /* ============================================================================
1035
+ Loading Overlay
1036
+ ============================================================================ */
1037
+
1038
+ .loading-overlay {
1039
+ position: fixed;
1040
+ top: 0;
1041
+ left: 0;
1042
+ right: 0;
1043
+ bottom: 0;
1044
+ background: rgba(255, 255, 255, 0.95);
1045
+ backdrop-filter: blur(10px);
1046
+ display: flex;
1047
+ align-items: center;
1048
+ justify-content: center;
1049
+ z-index: 9999;
1050
+ transition: opacity var(--transition-slow);
1051
+ }
1052
+
1053
+ .loading-content {
1054
+ text-align: center;
1055
+ padding: var(--space-8);
1056
+ background: white;
1057
+ border-radius: var(--radius-2xl);
1058
+ box-shadow: var(--shadow-xl);
1059
+ }
1060
+
1061
+ .loading-spinner {
1062
+ width: 48px;
1063
+ height: 48px;
1064
+ margin: 0 auto var(--space-4);
1065
+ border: 3px solid var(--gray-200);
1066
+ border-top-color: var(--primary);
1067
+ border-radius: 50%;
1068
+ animation: spin 1s linear infinite;
1069
+ }
1070
+
1071
+ .loading-title {
1072
+ font-size: var(--text-xl);
1073
+ font-weight: 700;
1074
+ color: var(--gray-900);
1075
+ margin-bottom: var(--space-2);
1076
+ }
1077
+
1078
+ .loading-message {
1079
+ font-size: var(--text-sm);
1080
+ color: var(--gray-600);
1081
+ margin-bottom: var(--space-4);
1082
+ }
1083
+
1084
+ .loading-steps {
1085
+ display: flex;
1086
+ flex-direction: column;
1087
+ gap: var(--space-2);
1088
+ text-align: left;
1089
+ margin-top: var(--space-4);
1090
+ }
1091
+
1092
+ .loading-step {
1093
+ font-size: var(--text-sm);
1094
+ color: var(--gray-500);
1095
+ padding-left: var(--space-6);
1096
+ position: relative;
1097
+ }
1098
+
1099
+ .loading-step::before {
1100
+ content: '○';
1101
+ position: absolute;
1102
+ left: 0;
1103
+ color: var(--gray-400);
1104
+ }
1105
+
1106
+ .loading-step.active::before {
1107
+ content: '●';
1108
+ color: var(--primary);
1109
+ animation: pulse 1s infinite;
1110
+ }
1111
+
1112
+ .loading-step.completed::before {
1113
+ content: '✓';
1114
+ color: var(--success);
1115
+ }
1116
+
1117
+ /* ============================================================================
1118
+ Animations
1119
+ ============================================================================ */
1120
+
1121
+ @keyframes spin {
1122
+ to { transform: rotate(360deg); }
1123
+ }
1124
+
1125
+ @keyframes pulse {
1126
+ 0%, 100% { opacity: 1; }
1127
+ 50% { opacity: 0.5; }
1128
+ }
1129
+
1130
+ /* ============================================================================
1131
+ Utility Classes
1132
+ ============================================================================ */
1133
+
1134
+ .sr-only {
1135
+ position: absolute;
1136
+ width: 1px;
1137
+ height: 1px;
1138
+ padding: 0;
1139
+ margin: -1px;
1140
+ overflow: hidden;
1141
+ clip: rect(0, 0, 0, 0);
1142
+ white-space: nowrap;
1143
+ border: 0;
1144
+ }
1145
+
1146
+ .spinner {
1147
+ width: 16px;
1148
+ height: 16px;
1149
+ border: 2px solid rgba(255, 255, 255, 0.3);
1150
+ border-top-color: white;
1151
+ border-radius: 50%;
1152
+ animation: spin 0.6s linear infinite;
1153
+ }
1154
+
1155
+ /* ============================================================================
1156
+ Responsive Design
1157
+ ============================================================================ */
1158
+
1159
+ @media (max-width: 1024px) {
1160
+ .main-content {
1161
+ grid-template-columns: 1fr;
1162
+ }
1163
+
1164
+ .sidebar {
1165
+ display: grid;
1166
+ grid-template-columns: repeat(2, 1fr);
1167
+ gap: var(--space-4);
1168
+ }
1169
+ }
1170
+
1171
+ @media (max-width: 768px) {
1172
+ .header-content {
1173
+ flex-direction: column;
1174
+ gap: var(--space-3);
1175
+ }
1176
+
1177
+ .footer-content {
1178
+ flex-direction: column;
1179
+ gap: var(--space-3);
1180
+ text-align: center;
1181
+ }
1182
+
1183
+ .shortcuts {
1184
+ flex-wrap: wrap;
1185
+ justify-content: center;
1186
+ }
1187
+
1188
+ .sidebar {
1189
+ grid-template-columns: 1fr;
1190
+ }
1191
+ }
1192
+
1193
+ /* ============================================================================
1194
+ Dark Theme Support (Optional)
1195
+ ============================================================================ */
1196
+
1197
+ [data-theme="dark"] {
1198
+ --gray-50: #020617;
1199
+ --gray-100: #0f172a;
1200
+ --gray-200: #1e293b;
1201
+ --gray-300: #334155;
1202
+ --gray-400: #475569;
1203
+ --gray-500: #64748b;
1204
+ --gray-600: #94a3b8;
1205
+ --gray-700: #cbd5e1;
1206
+ --gray-800: #e2e8f0;
1207
+ --gray-900: #f1f5f9;
1208
+ --gray-950: #f8fafc;
1209
+ }
1210
+
1211
+ /* ============================================================================
1212
+ Print Styles
1213
+ ============================================================================ */
1214
+
1215
+ @media print {
1216
+ .sidebar,
1217
+ .app-footer,
1218
+ .input-form,
1219
+ .loading-overlay {
1220
+ display: none;
1221
+ }
1222
+
1223
+ .main-content {
1224
+ grid-template-columns: 1fr;
1225
+ }
1226
+
1227
+ .messages {
1228
+ max-height: none;
1229
+ }
1230
+ }
1231
+
1232
+ /* ============================================================================
1233
+ Traces Panel Styles
1234
+ ============================================================================ */
1235
+
1236
+ .traces-panel {
1237
+ margin-top: 0;
1238
+ }
1239
+
1240
+ .trace-item {
1241
+ padding: 12px;
1242
+ margin-bottom: 8px;
1243
+ background: var(--gray-50);
1244
+ border: 1px solid var(--gray-200);
1245
+ border-radius: var(--radius-md);
1246
+ cursor: pointer;
1247
+ transition: all var(--transition-fast);
1248
+ }
1249
+
1250
+ .trace-item:hover {
1251
+ background: white;
1252
+ border-color: var(--primary);
1253
+ box-shadow: var(--shadow-sm);
1254
+ }
1255
+
1256
+ .trace-item-header {
1257
+ display: flex;
1258
+ justify-content: space-between;
1259
+ align-items: center;
1260
+ margin-bottom: 6px;
1261
+ }
1262
+
1263
+ .trace-item-title {
1264
+ font-size: 13px;
1265
+ font-weight: 600;
1266
+ color: var(--gray-800);
1267
+ display: flex;
1268
+ align-items: center;
1269
+ gap: 6px;
1270
+ }
1271
+
1272
+ .trace-item-badge {
1273
+ display: inline-flex;
1274
+ align-items: center;
1275
+ padding: 2px 8px;
1276
+ border-radius: var(--radius-full);
1277
+ font-size: 10px;
1278
+ font-weight: 600;
1279
+ text-transform: uppercase;
1280
+ letter-spacing: 0.05em;
1281
+ }
1282
+
1283
+ .trace-item-badge.phone {
1284
+ background: var(--brand-100);
1285
+ color: var(--brand-700);
1286
+ }
1287
+
1288
+ .trace-item-badge.email {
1289
+ background: #dbeafe;
1290
+ color: #0284c7;
1291
+ }
1292
+
1293
+ .trace-item-badge.session {
1294
+ background: var(--gray-200);
1295
+ color: var(--gray-700);
1296
+ }
1297
+
1298
+ .trace-item-meta {
1299
+ display: flex;
1300
+ gap: 12px;
1301
+ font-size: 11px;
1302
+ color: var(--gray-600);
1303
+ }
1304
+
1305
+ .trace-item-stat {
1306
+ display: flex;
1307
+ align-items: center;
1308
+ gap: 4px;
1309
+ }
1310
+
1311
+ .trace-details-tree {
1312
+ font-family: var(--font-mono);
1313
+ font-size: 11px;
1314
+ line-height: 1.6;
1315
+ }
1316
+
1317
+ .trace-node {
1318
+ padding: 8px;
1319
+ margin: 4px 0;
1320
+ background: var(--gray-50);
1321
+ border-left: 2px solid var(--gray-300);
1322
+ border-radius: var(--radius-sm);
1323
+ }
1324
+
1325
+ .trace-node.success {
1326
+ border-left-color: var(--success);
1327
+ }
1328
+
1329
+ .trace-node.error {
1330
+ border-left-color: var(--error);
1331
+ background: rgba(220, 38, 38, 0.05);
1332
+ }
1333
+
1334
+ .trace-node-header {
1335
+ display: flex;
1336
+ justify-content: space-between;
1337
+ align-items: center;
1338
+ font-weight: 600;
1339
+ margin-bottom: 4px;
1340
+ color: var(--gray-800);
1341
+ }
1342
+
1343
+ .trace-node-meta {
1344
+ font-size: 10px;
1345
+ color: var(--gray-600);
1346
+ margin-top: 4px;
1347
+ }
1348
+
1349
+ .trace-children {
1350
+ margin-left: 16px;
1351
+ margin-top: 8px;
1352
+ border-left: 1px dashed var(--gray-300);
1353
+ padding-left: 12px;
1354
+ }