crushdataai 1.0.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/ui/styles.css ADDED
@@ -0,0 +1,680 @@
1
+ :root {
2
+ --primary: #8B5CF6;
3
+ --primary-dark: #7C3AED;
4
+ --primary-light: #A78BFA;
5
+ --bg: #F8FAFC;
6
+ --sidebar-bg: #FFFFFF;
7
+ --card: #FFFFFF;
8
+ --border: #E2E8F0;
9
+ --border-light: #F1F5F9;
10
+ --text: #1E293B;
11
+ --text-muted: #64748B;
12
+ --text-light: #94A3B8;
13
+ --success: #10B981;
14
+ --error: #EF4444;
15
+ --warning: #F59E0B;
16
+ }
17
+
18
+ * {
19
+ box-sizing: border-box;
20
+ margin: 0;
21
+ padding: 0;
22
+ }
23
+
24
+ body {
25
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
26
+ background: var(--bg);
27
+ color: var(--text);
28
+ min-height: 100vh;
29
+ display: flex;
30
+ }
31
+
32
+ /* Sidebar */
33
+ .sidebar {
34
+ width: 280px;
35
+ background: var(--sidebar-bg);
36
+ border-right: 1px solid var(--border);
37
+ display: flex;
38
+ flex-direction: column;
39
+ height: 100vh;
40
+ position: fixed;
41
+ left: 0;
42
+ top: 0;
43
+ }
44
+
45
+ .sidebar-header {
46
+ padding: 1.25rem;
47
+ border-bottom: 1px solid var(--border);
48
+ }
49
+
50
+ .logo {
51
+ display: flex;
52
+ align-items: center;
53
+ gap: 0.75rem;
54
+ }
55
+
56
+ .logo-icon {
57
+ width: 36px;
58
+ height: 36px;
59
+ background: linear-gradient(135deg, var(--primary), #EC4899);
60
+ border-radius: 10px;
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: center;
64
+ }
65
+
66
+ .logo-icon svg {
67
+ width: 20px;
68
+ height: 20px;
69
+ fill: white;
70
+ }
71
+
72
+ .logo-text {
73
+ font-size: 1.1rem;
74
+ font-weight: 700;
75
+ }
76
+
77
+ .logo-text span {
78
+ background: linear-gradient(135deg, var(--primary), #EC4899);
79
+ -webkit-background-clip: text;
80
+ background-clip: text;
81
+ -webkit-text-fill-color: transparent;
82
+ }
83
+
84
+ .sidebar-section {
85
+ padding: 1rem;
86
+ flex: 1;
87
+ overflow-y: auto;
88
+ }
89
+
90
+ .sidebar-title {
91
+ font-size: 0.7rem;
92
+ font-weight: 600;
93
+ text-transform: uppercase;
94
+ letter-spacing: 0.05em;
95
+ color: var(--text-light);
96
+ margin-bottom: 0.75rem;
97
+ padding: 0 0.5rem;
98
+ }
99
+
100
+ .connection-list {
101
+ list-style: none;
102
+ }
103
+
104
+ .connection-item {
105
+ display: flex;
106
+ align-items: center;
107
+ gap: 0.75rem;
108
+ padding: 0.625rem 0.75rem;
109
+ border-radius: 8px;
110
+ cursor: pointer;
111
+ transition: all 0.15s;
112
+ margin-bottom: 0.25rem;
113
+ }
114
+
115
+ .connection-item:hover {
116
+ background: var(--border-light);
117
+ }
118
+
119
+ .connection-item.active {
120
+ background: rgba(139, 92, 246, 0.1);
121
+ color: var(--primary);
122
+ }
123
+
124
+ .connection-item .icon {
125
+ font-size: 1.25rem;
126
+ width: 32px;
127
+ height: 32px;
128
+ background: var(--border-light);
129
+ border-radius: 6px;
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: center;
133
+ }
134
+
135
+ .connection-item.active .icon {
136
+ background: rgba(139, 92, 246, 0.15);
137
+ }
138
+
139
+ .connection-item .info {
140
+ flex: 1;
141
+ min-width: 0;
142
+ }
143
+
144
+ .connection-item .name {
145
+ font-size: 0.875rem;
146
+ font-weight: 500;
147
+ white-space: nowrap;
148
+ overflow: hidden;
149
+ text-overflow: ellipsis;
150
+ }
151
+
152
+ .connection-item .type {
153
+ font-size: 0.75rem;
154
+ color: var(--text-muted);
155
+ }
156
+
157
+ .connection-item .status {
158
+ width: 8px;
159
+ height: 8px;
160
+ border-radius: 50%;
161
+ background: var(--success);
162
+ }
163
+
164
+ .add-connection-btn {
165
+ display: flex;
166
+ align-items: center;
167
+ gap: 0.5rem;
168
+ width: 100%;
169
+ padding: 0.625rem 0.75rem;
170
+ background: transparent;
171
+ border: 1px dashed var(--border);
172
+ border-radius: 8px;
173
+ color: var(--text-muted);
174
+ font-size: 0.875rem;
175
+ cursor: pointer;
176
+ transition: all 0.15s;
177
+ margin-top: 0.5rem;
178
+ }
179
+
180
+ .add-connection-btn:hover {
181
+ border-color: var(--primary);
182
+ color: var(--primary);
183
+ background: rgba(139, 92, 246, 0.05);
184
+ }
185
+
186
+ /* Main Content */
187
+ .main {
188
+ margin-left: 280px;
189
+ flex: 1;
190
+ padding: 1.5rem 2rem;
191
+ height: 100vh;
192
+ overflow: hidden;
193
+ display: flex;
194
+ flex-direction: column;
195
+ min-width: 0;
196
+ /* Prevents flex item from overflowing */
197
+ }
198
+
199
+ .main-header {
200
+ display: flex;
201
+ justify-content: space-between;
202
+ align-items: center;
203
+ margin-bottom: 1.5rem;
204
+ }
205
+
206
+ .main-title {
207
+ font-size: 1.5rem;
208
+ font-weight: 600;
209
+ }
210
+
211
+ .main-subtitle {
212
+ font-size: 0.875rem;
213
+ color: var(--text-muted);
214
+ }
215
+
216
+ /* Panels */
217
+ .panel {
218
+ background: var(--card);
219
+ border: 1px solid var(--border);
220
+ border-radius: 12px;
221
+ margin-bottom: 1.5rem;
222
+ }
223
+
224
+ .panel-header {
225
+ display: flex;
226
+ justify-content: space-between;
227
+ align-items: center;
228
+ padding: 1rem 1.25rem;
229
+ border-bottom: 1px solid var(--border);
230
+ }
231
+
232
+ .panel-title {
233
+ font-size: 0.95rem;
234
+ font-weight: 600;
235
+ display: flex;
236
+ align-items: center;
237
+ gap: 0.5rem;
238
+ }
239
+
240
+ .panel-body {
241
+ padding: 1.25rem;
242
+ }
243
+
244
+ /* Tables Grid */
245
+ .tables-grid {
246
+ display: grid;
247
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
248
+ gap: 1rem;
249
+ }
250
+
251
+ .table-card {
252
+ background: var(--border-light);
253
+ border: 1px solid var(--border);
254
+ border-radius: 10px;
255
+ padding: 1rem;
256
+ cursor: pointer;
257
+ transition: all 0.2s;
258
+ }
259
+
260
+ .table-card:hover {
261
+ border-color: var(--primary-light);
262
+ transform: translateY(-2px);
263
+ box-shadow: 0 4px 12px rgba(139, 92, 246, 0.1);
264
+ }
265
+
266
+ .table-card.selected {
267
+ border-color: var(--primary);
268
+ background: rgba(139, 92, 246, 0.05);
269
+ }
270
+
271
+ #connection-details {
272
+ display: flex;
273
+ flex-direction: column;
274
+ height: 100%;
275
+ overflow: hidden;
276
+ }
277
+
278
+ #table-data-panel {
279
+ display: flex;
280
+ flex-direction: column;
281
+ flex: 1;
282
+ overflow: hidden;
283
+ margin-bottom: 0;
284
+ }
285
+
286
+ #table-data-panel .panel-body {
287
+ flex: 1;
288
+ overflow: auto;
289
+ padding: 0;
290
+ }
291
+
292
+ #table-data-panel .panel-header,
293
+ #table-data-panel .panel-footer {
294
+ flex-shrink: 0;
295
+ }
296
+
297
+ .table-card .table-icon {
298
+ width: 40px;
299
+ height: 40px;
300
+ background: white;
301
+ border-radius: 8px;
302
+ display: flex;
303
+ align-items: center;
304
+ justify-content: center;
305
+ margin-bottom: 0.75rem;
306
+ border: 1px solid var(--border);
307
+ }
308
+
309
+ .table-card .table-name {
310
+ font-size: 0.875rem;
311
+ font-weight: 600;
312
+ margin-bottom: 0.25rem;
313
+ }
314
+
315
+ .table-card .table-rows {
316
+ font-size: 0.75rem;
317
+ color: var(--text-muted);
318
+ }
319
+
320
+ /* Empty State */
321
+ .empty-state {
322
+ text-align: center;
323
+ padding: 3rem 2rem;
324
+ color: var(--text-muted);
325
+ }
326
+
327
+ .empty-state svg {
328
+ width: 64px;
329
+ height: 64px;
330
+ margin-bottom: 1rem;
331
+ opacity: 0.4;
332
+ }
333
+
334
+ .empty-state h3 {
335
+ font-size: 1rem;
336
+ font-weight: 600;
337
+ color: var(--text);
338
+ margin-bottom: 0.5rem;
339
+ }
340
+
341
+ .empty-state p {
342
+ font-size: 0.875rem;
343
+ margin-bottom: 1.5rem;
344
+ }
345
+
346
+ /* Buttons */
347
+ .btn {
348
+ background: linear-gradient(135deg, var(--primary), var(--primary-dark));
349
+ color: white;
350
+ border: none;
351
+ border-radius: 8px;
352
+ padding: 0.625rem 1.25rem;
353
+ font-size: 0.875rem;
354
+ font-weight: 500;
355
+ font-family: inherit;
356
+ cursor: pointer;
357
+ transition: all 0.2s;
358
+ display: inline-flex;
359
+ align-items: center;
360
+ gap: 0.5rem;
361
+ }
362
+
363
+ .btn:hover {
364
+ transform: translateY(-1px);
365
+ box-shadow: 0 4px 12px rgba(139, 92, 246, 0.3);
366
+ }
367
+
368
+ .btn-secondary {
369
+ background: white;
370
+ border: 1px solid var(--border);
371
+ color: var(--text);
372
+ }
373
+
374
+ .btn-secondary:hover {
375
+ background: var(--border-light);
376
+ box-shadow: none;
377
+ transform: none;
378
+ }
379
+
380
+ .btn-sm {
381
+ padding: 0.5rem 0.875rem;
382
+ font-size: 0.8rem;
383
+ }
384
+
385
+ /* Modal */
386
+ .modal-overlay {
387
+ display: none;
388
+ position: fixed;
389
+ inset: 0;
390
+ background: rgba(0, 0, 0, 0.5);
391
+ z-index: 100;
392
+ align-items: center;
393
+ justify-content: center;
394
+ }
395
+
396
+ .modal-overlay.active {
397
+ display: flex;
398
+ }
399
+
400
+ .modal {
401
+ background: white;
402
+ border-radius: 16px;
403
+ width: 100%;
404
+ max-width: 520px;
405
+ max-height: 90vh;
406
+ overflow-y: auto;
407
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);
408
+ }
409
+
410
+ .modal-header {
411
+ display: flex;
412
+ justify-content: space-between;
413
+ align-items: center;
414
+ padding: 1.25rem;
415
+ border-bottom: 1px solid var(--border);
416
+ }
417
+
418
+ .modal-title {
419
+ font-size: 1.1rem;
420
+ font-weight: 600;
421
+ }
422
+
423
+ .modal-close {
424
+ background: none;
425
+ border: none;
426
+ cursor: pointer;
427
+ padding: 0.5rem;
428
+ color: var(--text-muted);
429
+ border-radius: 6px;
430
+ }
431
+
432
+ .modal-close:hover {
433
+ background: var(--border-light);
434
+ color: var(--text);
435
+ }
436
+
437
+ .modal-body {
438
+ padding: 1.25rem;
439
+ }
440
+
441
+ /* Source Selection */
442
+ .source-grid {
443
+ display: grid;
444
+ grid-template-columns: repeat(3, 1fr);
445
+ gap: 0.75rem;
446
+ margin-bottom: 1.5rem;
447
+ }
448
+
449
+ .source-btn-wrapper {
450
+ position: relative;
451
+ }
452
+
453
+ .source-btn {
454
+ background: white;
455
+ border: 2px solid var(--border);
456
+ border-radius: 10px;
457
+ padding: 1rem 0.5rem;
458
+ cursor: pointer;
459
+ transition: all 0.2s;
460
+ text-align: center;
461
+ width: 100%;
462
+ }
463
+
464
+ .source-btn:hover {
465
+ border-color: var(--primary-light);
466
+ }
467
+
468
+ .source-btn.selected {
469
+ border-color: var(--primary);
470
+ background: rgba(139, 92, 246, 0.05);
471
+ }
472
+
473
+ .source-btn .icon {
474
+ font-size: 1.5rem;
475
+ margin-bottom: 0.375rem;
476
+ }
477
+
478
+ .source-btn .name {
479
+ font-size: 0.75rem;
480
+ font-weight: 500;
481
+ color: var(--text);
482
+ }
483
+
484
+ .help-btn {
485
+ position: absolute;
486
+ top: 4px;
487
+ right: 4px;
488
+ width: 18px;
489
+ height: 18px;
490
+ border-radius: 50%;
491
+ background: var(--border);
492
+ border: none;
493
+ color: var(--text-muted);
494
+ font-size: 0.7rem;
495
+ font-weight: 600;
496
+ cursor: pointer;
497
+ transition: all 0.2s;
498
+ display: flex;
499
+ align-items: center;
500
+ justify-content: center;
501
+ }
502
+
503
+ .help-btn:hover {
504
+ background: var(--primary);
505
+ color: white;
506
+ }
507
+
508
+ /* Form */
509
+ .form-group {
510
+ margin-bottom: 1rem;
511
+ }
512
+
513
+ label {
514
+ display: block;
515
+ font-size: 0.8rem;
516
+ font-weight: 500;
517
+ color: var(--text-muted);
518
+ margin-bottom: 0.375rem;
519
+ }
520
+
521
+ input {
522
+ width: 100%;
523
+ background: white;
524
+ border: 1px solid var(--border);
525
+ border-radius: 8px;
526
+ padding: 0.625rem 0.875rem;
527
+ color: var(--text);
528
+ font-size: 0.875rem;
529
+ font-family: inherit;
530
+ transition: all 0.2s;
531
+ }
532
+
533
+ input:focus {
534
+ outline: none;
535
+ border-color: var(--primary);
536
+ box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.1);
537
+ }
538
+
539
+ input::placeholder {
540
+ color: var(--text-light);
541
+ }
542
+
543
+ .form-row {
544
+ display: grid;
545
+ grid-template-columns: 1fr 1fr;
546
+ gap: 0.75rem;
547
+ }
548
+
549
+ .modal-footer {
550
+ display: flex;
551
+ justify-content: flex-end;
552
+ gap: 0.75rem;
553
+ padding: 1rem 1.25rem;
554
+ border-top: 1px solid var(--border);
555
+ background: var(--border-light);
556
+ border-radius: 0 0 16px 16px;
557
+ }
558
+
559
+ .hidden {
560
+ display: none !important;
561
+ }
562
+
563
+ /* Message */
564
+ .message {
565
+ padding: 0.75rem 1rem;
566
+ border-radius: 8px;
567
+ margin-top: 1rem;
568
+ font-size: 0.875rem;
569
+ }
570
+
571
+ .message.success {
572
+ background: rgba(16, 185, 129, 0.1);
573
+ color: #059669;
574
+ }
575
+
576
+ .message.error {
577
+ background: rgba(239, 68, 68, 0.1);
578
+ color: #DC2626;
579
+ }
580
+
581
+ /* Data Table Preview */
582
+ .preview-table {
583
+ width: 100%;
584
+ border-collapse: collapse;
585
+ font-size: 0.8rem;
586
+ }
587
+
588
+ .preview-table th {
589
+ background: var(--border-light);
590
+ padding: 0.375rem 0.75rem;
591
+ text-align: left;
592
+ font-weight: 600;
593
+ color: var(--text);
594
+ border-bottom: 2px solid var(--border);
595
+ white-space: nowrap;
596
+ position: sticky;
597
+ top: 0;
598
+ z-index: 10;
599
+ }
600
+
601
+ .preview-table td {
602
+ padding: 0.25rem 0.75rem;
603
+ border-bottom: 1px solid var(--border);
604
+ color: var(--text-muted);
605
+ }
606
+
607
+ .preview-table tr:hover td {
608
+ background: var(--border-light);
609
+ }
610
+
611
+ .preview-header {
612
+ display: flex;
613
+ align-items: center;
614
+ gap: 0.75rem;
615
+ }
616
+
617
+ .table-badge {
618
+ background: rgba(139, 92, 246, 0.1);
619
+ color: var(--primary);
620
+ padding: 0.25rem 0.75rem;
621
+ border-radius: 20px;
622
+ font-size: 0.75rem;
623
+ font-weight: 500;
624
+ }
625
+
626
+ .panel-footer {
627
+ padding: 0.875rem 1.25rem;
628
+ border-top: 1px solid var(--border);
629
+ display: flex;
630
+ justify-content: space-between;
631
+ align-items: center;
632
+ background: var(--border-light);
633
+ border-radius: 0 0 12px 12px;
634
+ }
635
+
636
+ .pagination {
637
+ display: flex;
638
+ align-items: center;
639
+ gap: 0.5rem;
640
+ }
641
+
642
+ .pagination .page-btn {
643
+ background: white;
644
+ border: 1px solid var(--border);
645
+ border-radius: 6px;
646
+ padding: 0.375rem 0.75rem;
647
+ font-size: 0.8rem;
648
+ cursor: pointer;
649
+ transition: all 0.15s;
650
+ }
651
+
652
+ .pagination .page-btn:hover:not(:disabled) {
653
+ border-color: var(--primary);
654
+ color: var(--primary);
655
+ }
656
+
657
+ .pagination .page-btn:disabled {
658
+ opacity: 0.5;
659
+ cursor: not-allowed;
660
+ }
661
+
662
+ .pagination .page-info {
663
+ font-size: 0.8rem;
664
+ color: var(--text-muted);
665
+ padding: 0 0.5rem;
666
+ }
667
+
668
+ .rows-per-page {
669
+ display: flex;
670
+ align-items: center;
671
+ gap: 0.5rem;
672
+ font-size: 0.8rem;
673
+ color: var(--text-muted);
674
+ }
675
+
676
+ .rows-per-page select {
677
+ width: auto;
678
+ padding: 0.25rem 0.5rem;
679
+ font-size: 0.8rem;
680
+ }