more-compute 0.1.2__py3-none-any.whl → 0.1.3__py3-none-any.whl

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 (67) hide show
  1. frontend/.DS_Store +0 -0
  2. frontend/.gitignore +41 -0
  3. frontend/README.md +36 -0
  4. frontend/__init__.py +1 -0
  5. frontend/app/favicon.ico +0 -0
  6. frontend/app/globals.css +1537 -0
  7. frontend/app/layout.tsx +173 -0
  8. frontend/app/page.tsx +11 -0
  9. frontend/components/AddCellButton.tsx +42 -0
  10. frontend/components/Cell.tsx +244 -0
  11. frontend/components/CellButton.tsx +58 -0
  12. frontend/components/CellOutput.tsx +70 -0
  13. frontend/components/ErrorDisplay.tsx +208 -0
  14. frontend/components/ErrorModal.tsx +154 -0
  15. frontend/components/MarkdownRenderer.tsx +84 -0
  16. frontend/components/Notebook.tsx +520 -0
  17. frontend/components/Sidebar.tsx +46 -0
  18. frontend/components/popups/ComputePopup.tsx +879 -0
  19. frontend/components/popups/FilterPopup.tsx +427 -0
  20. frontend/components/popups/FolderPopup.tsx +171 -0
  21. frontend/components/popups/MetricsPopup.tsx +168 -0
  22. frontend/components/popups/PackagesPopup.tsx +112 -0
  23. frontend/components/popups/PythonPopup.tsx +292 -0
  24. frontend/components/popups/SettingsPopup.tsx +68 -0
  25. frontend/eslint.config.mjs +25 -0
  26. frontend/lib/api.ts +469 -0
  27. frontend/lib/settings.ts +87 -0
  28. frontend/lib/websocket-native.ts +202 -0
  29. frontend/lib/websocket.ts +134 -0
  30. frontend/next-env.d.ts +6 -0
  31. frontend/next.config.mjs +17 -0
  32. frontend/next.config.ts +7 -0
  33. frontend/package-lock.json +5676 -0
  34. frontend/package.json +41 -0
  35. frontend/postcss.config.mjs +5 -0
  36. frontend/public/assets/icons/add.svg +1 -0
  37. frontend/public/assets/icons/check.svg +1 -0
  38. frontend/public/assets/icons/copy.svg +1 -0
  39. frontend/public/assets/icons/folder.svg +1 -0
  40. frontend/public/assets/icons/metric.svg +1 -0
  41. frontend/public/assets/icons/packages.svg +1 -0
  42. frontend/public/assets/icons/play.svg +1 -0
  43. frontend/public/assets/icons/python.svg +265 -0
  44. frontend/public/assets/icons/setting.svg +1 -0
  45. frontend/public/assets/icons/stop.svg +1 -0
  46. frontend/public/assets/icons/trash.svg +1 -0
  47. frontend/public/assets/icons/up-down.svg +1 -0
  48. frontend/public/assets/icons/x.svg +1 -0
  49. frontend/public/file.svg +1 -0
  50. frontend/public/fonts/Fira.ttf +0 -0
  51. frontend/public/fonts/Tiempos.woff2 +0 -0
  52. frontend/public/fonts/VeraMono.ttf +0 -0
  53. frontend/public/globe.svg +1 -0
  54. frontend/public/next.svg +1 -0
  55. frontend/public/vercel.svg +1 -0
  56. frontend/public/window.svg +1 -0
  57. frontend/tailwind.config.ts +29 -0
  58. frontend/tsconfig.json +27 -0
  59. frontend/types/notebook.ts +58 -0
  60. kernel_run.py +6 -0
  61. {more_compute-0.1.2.dist-info → more_compute-0.1.3.dist-info}/METADATA +1 -1
  62. more_compute-0.1.3.dist-info/RECORD +85 -0
  63. {more_compute-0.1.2.dist-info → more_compute-0.1.3.dist-info}/top_level.txt +1 -0
  64. more_compute-0.1.2.dist-info/RECORD +0 -26
  65. {more_compute-0.1.2.dist-info → more_compute-0.1.3.dist-info}/WHEEL +0 -0
  66. {more_compute-0.1.2.dist-info → more_compute-0.1.3.dist-info}/entry_points.txt +0 -0
  67. {more_compute-0.1.2.dist-info → more_compute-0.1.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,1537 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ /* MoreCompute Notebook Styles - Marimo inspired */
6
+
7
+
8
+ @font-face {
9
+ font-family: 'Fira';
10
+ font-style: normal;
11
+ font-weight: 400;
12
+ font-display: swap;
13
+ src: url('/fonts/Fira.ttf') format('truetype');
14
+ }
15
+
16
+ @font-face {
17
+ font-family: 'Tiempos';
18
+ font-style: normal;
19
+ font-weight: 400;
20
+ font-display: swap;
21
+ src: url('/fonts/Tiempos.woff2') format('woff2');
22
+ }
23
+
24
+ * {
25
+ margin: 0;
26
+ padding: 0;
27
+ box-sizing: border-box;
28
+ }
29
+
30
+ :root {
31
+ --mc-background: #E9E7E3;
32
+
33
+ /* Font Family Custom Properties */
34
+ --font-sans: 'CustomFont', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
35
+ --font-mono: 'VeraMono', 'CustomMono', 'Fira Code', 'Monaco', 'Cascadia Code', 'Roboto Mono', monospace;
36
+ --font-display: 'DisplayFont', 'Inter', system-ui, sans-serif;
37
+ --mc-cell-background: #F4EEE7;
38
+ --mc-text-color: #575042;
39
+ --mc-markdown-color: #372E25;
40
+ --mc-markdown-heading-color: #624204;
41
+ --mc-markdown-paragraph-color: #575042;
42
+ --mc-line-number-color: #9ca3af;
43
+ --text-secondary: #6b7280;
44
+ }
45
+
46
+ @media (prefers-color-scheme: light) {
47
+ :root {
48
+ --mc-cell-background: #F4EEE7;
49
+ }
50
+ }
51
+
52
+ @media (prefers-color-scheme: dark) {
53
+ :root {
54
+ --mc-cell-background: #0B1118;
55
+ }
56
+ }
57
+
58
+ body {
59
+ font-family:
60
+ -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
61
+ background-color: var(--mc-background);
62
+ color: var(--mc-text-color);
63
+ line-height: 1.6;
64
+ overflow-x: hidden;
65
+ }
66
+
67
+ #app {
68
+ min-height: 100vh;
69
+ padding: 0;
70
+ display: flex;
71
+ }
72
+
73
+ /* Kernel Status Banner */
74
+ .kernel-banner {
75
+ position: fixed;
76
+ top: 0;
77
+ left: 0;
78
+ right: 0;
79
+ z-index: 1000;
80
+ background: linear-gradient(180deg, #ef4444 0%, #dc2626 50%, #ffffff 100%);
81
+ padding: 12px 20px;
82
+ border-bottom: 1px solid #fca5a5;
83
+ animation: slideDown 0.3s ease-out;
84
+ }
85
+
86
+ @keyframes slideDown {
87
+ 0% {
88
+ transform: translateY(-100%);
89
+ opacity: 0;
90
+ }
91
+ 100% {
92
+ transform: translateY(0);
93
+ opacity: 1;
94
+ }
95
+ }
96
+
97
+ .kernel-message {
98
+ max-width: 900px;
99
+ margin: 0 auto;
100
+ display: flex;
101
+ flex-direction: column;
102
+ align-items: center;
103
+ text-align: center;
104
+ }
105
+
106
+ .kernel-status-text {
107
+ font-weight: 600;
108
+ font-size: 14px;
109
+ color: #ffffff;
110
+ margin-bottom: 2px;
111
+ }
112
+
113
+ .kernel-subtitle {
114
+ font-size: 12px;
115
+ color: #fecaca;
116
+ }
117
+
118
+ /* Kernel Status Bar */
119
+ .kernel-status-bar {
120
+ position: fixed;
121
+ top: 20px;
122
+ right: 20px;
123
+ z-index: 100;
124
+ }
125
+
126
+ .kernel-status-indicator {
127
+ display: flex;
128
+ align-items: center;
129
+ background: rgba(255, 255, 255, 0.95);
130
+ border: 1px solid #e5e7eb;
131
+ border-radius: 20px;
132
+ padding: 8px 12px;
133
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
134
+ backdrop-filter: blur(8px);
135
+ font-size: 12px;
136
+ font-weight: 500;
137
+ }
138
+
139
+ .status-dot {
140
+ width: 8px;
141
+ height: 8px;
142
+ border-radius: 50%;
143
+ margin-right: 8px;
144
+ transition: background-color 0.3s ease;
145
+ }
146
+
147
+ .status-dot.connecting {
148
+ background-color: #fbbf24;
149
+ animation: pulse 2s infinite;
150
+ }
151
+
152
+ .status-dot.connected {
153
+ background-color: #10b981;
154
+ }
155
+
156
+ .status-dot.disconnected {
157
+ background-color: #ef4444;
158
+ }
159
+
160
+ @keyframes pulse {
161
+ 0%,
162
+ 100% {
163
+ opacity: 1;
164
+ }
165
+ 50% {
166
+ opacity: 0.5;
167
+ }
168
+ }
169
+
170
+ .status-text {
171
+ color: #6b7280;
172
+ }
173
+
174
+ /* Notebook Wrapper */
175
+ .notebook-wrapper {
176
+ max-width: 1100px;
177
+ margin: 0 auto;
178
+ padding: 40px 20px;
179
+ }
180
+
181
+ .notebook {
182
+ position: relative;
183
+ }
184
+
185
+ /* Empty State */
186
+ .empty-state {
187
+ display: flex;
188
+ justify-content: center;
189
+ align-items: center;
190
+ min-height: 200px;
191
+ }
192
+
193
+ /* Add Cell Lines */
194
+ .add-cell-line {
195
+ position: relative;
196
+ height: 0;
197
+ width: 100%;
198
+ opacity: 0;
199
+ transition: opacity 0.2s ease;
200
+ z-index: 10;
201
+ pointer-events: none; /* Don't block interactions by default */
202
+ }
203
+
204
+ .add-cell-line:hover {
205
+ opacity: 1;
206
+ pointer-events: auto; /* Re-enable interactions on hover */
207
+ }
208
+
209
+ .add-cell-line::before {
210
+ content: "";
211
+ position: absolute;
212
+ top: -10px;
213
+ left: 0;
214
+ right: 0;
215
+ height: 20px;
216
+ background: transparent;
217
+ pointer-events: auto; /* Allow hover detection */
218
+ }
219
+
220
+ /* Extra padding for top cell hover area */
221
+ .add-line-above::before {
222
+ height: 40px;
223
+ top: -14px;
224
+ left: 50px;
225
+ right: 50px;
226
+ }
227
+
228
+ /* Extended hover area for add-line-below to capture hover below cells */
229
+ .add-line-below::before {
230
+ content: "";
231
+ position: absolute;
232
+ top: -8px;
233
+ left: 0;
234
+ right: 0;
235
+ height: 16px; /* Smaller hover area to avoid blocking cell clicks */
236
+ background: transparent;
237
+ pointer-events: auto; /* Allow hover detection */
238
+ }
239
+
240
+ .add-cell-line::after {
241
+ content: "";
242
+ position: absolute;
243
+ top: -10px;
244
+ left: 0;
245
+ right: 0;
246
+ height: 1px;
247
+ background: #DBC7A8;
248
+ opacity: 0;
249
+ transition: opacity 0.2s ease;
250
+ }
251
+
252
+ .add-cell-line:hover::after {
253
+ opacity: 1;
254
+ }
255
+
256
+ .add-cell-button {
257
+ position: absolute;
258
+ top: -27px;
259
+ left: 50%;
260
+ transform: translateX(-50%);
261
+ display: flex;
262
+ align-items: center;
263
+ justify-content: center;
264
+ opacity: 0;
265
+ transition: opacity 0.2s ease;
266
+ pointer-events: auto;
267
+ z-index: 100;
268
+ }
269
+
270
+ .add-cell-line:hover .add-cell-button {
271
+ opacity: 1;
272
+ }
273
+
274
+ .add-cell-button img {
275
+ width: 14px;
276
+ height: 14px;
277
+ filter: brightness(0) invert(1);
278
+ }
279
+
280
+ .cell-type-menu {
281
+ display: flex;
282
+ flex-direction: row;
283
+ gap: 16px;
284
+ justify-content: center;
285
+ align-items: center;
286
+ opacity: 0;
287
+ transition: opacity 0.2s ease;
288
+ pointer-events: none;
289
+ z-index: 20;
290
+ }
291
+
292
+ .add-cell-line:hover .cell-type-menu {
293
+ opacity: 1;
294
+ pointer-events: auto;
295
+ }
296
+
297
+ /* Create hover area that includes both button and menu */
298
+ .add-cell-button::after {
299
+ content: "";
300
+ position: absolute;
301
+ top: 0;
302
+ left: -20px;
303
+ right: -20px;
304
+ bottom: -40px;
305
+ z-index: 19;
306
+ }
307
+
308
+ .cell-type-option {
309
+ display: flex;
310
+ align-items: center;
311
+ justify-content: center;
312
+ gap: 8px;
313
+ padding: 8px 16px;
314
+ border: 1px solid #DBC7A8;
315
+ background: #fff;
316
+ cursor: pointer;
317
+ font-size: 14px;
318
+ font-weight: 500;
319
+ border-radius: 8px;
320
+ color: #575042;
321
+ font-family: 'Fira';
322
+ letter-spacing: -0.02em;
323
+ }
324
+
325
+ .cell-type-option:hover {
326
+ background: #E9E7E3;
327
+ cursor: pointer;
328
+ }
329
+
330
+ /* Cell Wrapper */
331
+ .cell-wrapper {
332
+ position: relative;
333
+ margin: 0;
334
+ }
335
+
336
+ .cell-status-indicator {
337
+ position: absolute;
338
+ top: 14px;
339
+ left: -48px;
340
+ width: auto; /* allow room for timer */
341
+ height: 24px;
342
+ display: flex;
343
+ flex-direction: column;
344
+ align-items: center;
345
+ justify-content: center;
346
+ gap: 2px;
347
+ padding: 0 2px;
348
+ }
349
+
350
+ .cell-status-indicator .status-placeholder {
351
+ width: 14px;
352
+ height: 14px;
353
+ }
354
+
355
+ .status-indicator {
356
+ display: inline-flex;
357
+ align-items: center;
358
+ justify-content: center;
359
+ font-family: monospace;
360
+ font-size: 12px;
361
+ color: inherit;
362
+ margin-top: -1px;
363
+ }
364
+
365
+ .status-bracket {
366
+ opacity: 0.3;
367
+ }
368
+
369
+ .cell-status-indicator .status-timer {
370
+ margin-left: 0;
371
+ font-size: 9px;
372
+ color: #6b7280;
373
+ min-width: auto;
374
+ text-align: center;
375
+ line-height: 1;
376
+ white-space: nowrap;
377
+ }
378
+
379
+ /* Main Cell */
380
+ .cell {
381
+ position: relative;
382
+ margin: 20px 0;
383
+ padding: 0;
384
+ background: var(--mc-cell-background);
385
+ border: 2px solid #DBC7A8;
386
+ border-radius: 0.5px;
387
+ transition: all 0.2s ease;
388
+ overflow: hidden;
389
+ }
390
+
391
+ .cell:hover {
392
+ box-shadow: 2px 4px 0 #E2DACC;
393
+ }
394
+
395
+ .cell.active {
396
+ border-color: #3b82f6;
397
+ box-shadow: 0 0 0 1px #3b82f6;
398
+ }
399
+
400
+ /* Markdown display mode - no borders or background */
401
+ .cell.markdown-display-mode {
402
+ border: none !important;
403
+ background: transparent !important;
404
+ margin: 0;
405
+ padding: 0;
406
+ box-shadow: none;
407
+ }
408
+
409
+ .cell.markdown-display-mode:hover {
410
+ box-shadow: none;
411
+ }
412
+
413
+ .cell.markdown-display-mode .cell-content {
414
+ border: none !important;
415
+ background: transparent !important;
416
+ padding: 0;
417
+ margin: 0;
418
+ }
419
+
420
+ /* Override markdown hover background for display mode */
421
+ .cell.markdown-display-mode .markdown-rendered:hover {
422
+ background: transparent !important;
423
+ }
424
+
425
+ /* Ensure markdown renderer has no background and reduced padding in display mode */
426
+ .cell.markdown-display-mode .markdown-rendered {
427
+ background: transparent !important;
428
+ padding: 2px 4px !important;
429
+ }
430
+
431
+ /* Cell Hover Controls */
432
+ .cell-hover-controls {
433
+ position: absolute;
434
+ top: 8px;
435
+ right: 8px;
436
+ z-index: 15;
437
+ opacity: 0;
438
+ transition: opacity 0.2s ease;
439
+ }
440
+
441
+ .cell:hover .cell-hover-controls {
442
+ opacity: 1;
443
+ }
444
+
445
+ .cell-actions-right {
446
+ display: flex;
447
+ gap: 4px;
448
+ align-items: center;
449
+ }
450
+
451
+ .cell-button {
452
+ /* Styling is handled by inline styles in CellButton component */
453
+ }
454
+
455
+ .cell-actions-right {
456
+ display: flex;
457
+ gap: 4px;
458
+ align-items: center;
459
+ }
460
+
461
+ /* Legacy cell-action styles removed - now handled by CellButton component */
462
+
463
+ /* Simple spin animation for loader icon */
464
+ .mc-spin {
465
+ animation: mc-spin 0.9s linear infinite;
466
+ }
467
+
468
+ @keyframes mc-spin {
469
+ 0% {
470
+ transform: rotate(0deg);
471
+ }
472
+ 100% {
473
+ transform: rotate(360deg);
474
+ }
475
+ }
476
+
477
+ /* Cell Content */
478
+ .cell-content {
479
+ position: relative;
480
+ background: var(--mc-cell-background);
481
+ }
482
+
483
+ .cell-input {
484
+ padding: 0;
485
+ }
486
+
487
+ .cell-editor-container {
488
+ position: relative;
489
+ }
490
+
491
+ .cell-editor {
492
+ width: 100%;
493
+ border: none;
494
+ outline: none;
495
+ resize: none;
496
+ font-family: 'Fira', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
497
+ font-size: 14px;
498
+ line-height: 1.6;
499
+ padding: 16px 20px;
500
+ background: transparent;
501
+ color: var(--mc-text-color);
502
+ min-height: 100px;
503
+ }
504
+
505
+ .cell-editor:focus {
506
+ outline: none;
507
+ }
508
+
509
+ /* Markdown editor styling - uses Fira font for better readability */
510
+ .markdown-editor-container {
511
+ /* Inherits from cell-editor-container */
512
+ }
513
+
514
+ .markdown-editor {
515
+ font-family: 'Fira', 'CustomFont', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif !important;
516
+ /* Keep other properties from .cell-editor */
517
+ }
518
+
519
+ /* Code editor styling - keeps monospace font */
520
+ .code-editor-container {
521
+ /* Inherits from cell-editor-container */
522
+ }
523
+
524
+ .code-editor {
525
+ /* Inherits monospace font from .cell-editor */
526
+ }
527
+
528
+ /* CodeMirror Styling */
529
+ .CodeMirror {
530
+ height: auto;
531
+ font-family: 'Fira', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
532
+ font-size: 14px;
533
+ line-height: 1.6;
534
+ border: none;
535
+ background: transparent;
536
+ color: var(--mc-text-color);
537
+ }
538
+
539
+ .CodeMirror-focused {
540
+ outline: none;
541
+ }
542
+
543
+ .CodeMirror-scroll {
544
+ /* Content-based sizing - start small and grow with content */
545
+ min-height: 32px; /* Single line minimum */
546
+ padding: 8px 16px;
547
+ transition: min-height 0.2s ease;
548
+ background: var(--mc-cell-background);
549
+ }
550
+
551
+ /* Auto-sizing based on content */
552
+ .CodeMirror {
553
+ /* Let CodeMirror size itself based on content */
554
+ height: auto !important;
555
+ min-height: 32px;
556
+ }
557
+
558
+ .CodeMirror-sizer {
559
+ min-height: auto !important;
560
+ }
561
+
562
+ /* Smart sizing classes applied dynamically */
563
+ .cell.cell-empty .CodeMirror-scroll {
564
+ min-height: 32px; /* Very compact for empty cells */
565
+ }
566
+
567
+ .cell.cell-single-line .CodeMirror-scroll {
568
+ min-height: 40px; /* Slightly more space for single line */
569
+ }
570
+
571
+ .cell.cell-focused .CodeMirror-scroll {
572
+ min-height: 48px; /* More space when focused for editing */
573
+ }
574
+
575
+ .CodeMirror-cursor {
576
+ border-left: 2px solid #3b82f6;
577
+ }
578
+
579
+ .CodeMirror-selected {
580
+ background: #dbeafe;
581
+ }
582
+
583
+ .CodeMirror-line {
584
+ padding: 0;
585
+ }
586
+
587
+ .CodeMirror-placeholder {
588
+ color: #9ca3af !important;
589
+ font-style: italic;
590
+ }
591
+
592
+ /* Line numbers styling */
593
+ .CodeMirror-linenumbers {
594
+ background: var(--mc-cell-background);
595
+ border-right: 1px solid #e5e7eb;
596
+ padding-right: 8px;
597
+ min-width: 30px;
598
+ }
599
+
600
+ .CodeMirror-linenumber {
601
+ color: var(--mc-line-number-color);
602
+ font-size: 11px;
603
+ text-align: right;
604
+ padding: 0 5px 0 0;
605
+ min-width: 20px;
606
+ }
607
+
608
+ .CodeMirror-gutters {
609
+ background: var(--mc-cell-background);
610
+ border-right: 1px solid #e5e7eb;
611
+ }
612
+
613
+ /* Markdown Rendered Content - Auto-sizing */
614
+ .markdown-rendered {
615
+ padding: 8px 16px;
616
+ line-height: 1.7;
617
+ color: var(--mc-markdown-color);
618
+ cursor: pointer;
619
+ min-height: auto; /* Let content determine height */
620
+ }
621
+
622
+ /* Smart sizing for markdown content */
623
+ .cell.cell-empty .markdown-rendered,
624
+ .cell.cell-empty .text-cell-output {
625
+ min-height: 24px; /* Very compact for empty markdown */
626
+ padding: 4px 12px;
627
+ }
628
+
629
+ .cell.cell-single-line .markdown-rendered,
630
+ .cell.cell-single-line .text-cell-output {
631
+ min-height: 32px; /* Single line markdown */
632
+ padding: 6px 14px;
633
+ }
634
+
635
+ .markdown-rendered:hover {
636
+ background: rgba(59, 130, 246, 0.02);
637
+ }
638
+
639
+ .markdown-rendered h1, .markdown-rendered h2, .markdown-rendered h3,
640
+ .markdown-rendered h4, .markdown-rendered h5, .markdown-rendered h6 {
641
+ margin: 0px 0 0px 0;
642
+ font-weight: 600;
643
+ color: var(--mc-markdown-heading-color);
644
+ font-family: 'Tiempos', serif;
645
+ }
646
+
647
+ .markdown-rendered h1 {
648
+ font-size: 1.5em;
649
+ }
650
+ .markdown-rendered h2 {
651
+ font-size: 1.3em;
652
+ }
653
+ .markdown-rendered h3 {
654
+ font-size: 1.1em;
655
+ }
656
+
657
+ .markdown-rendered p {
658
+ margin: 8px 0;
659
+ font-family: 'Fira', monospace;
660
+ letter-spacing: -0.02em;
661
+ color: var(--mc-markdown-paragraph-color);
662
+ }
663
+
664
+ .markdown-rendered ul,
665
+ .markdown-rendered ol {
666
+ margin: 8px 0;
667
+ padding-left: 20px;
668
+ }
669
+
670
+ .markdown-rendered li {
671
+ margin: 4px 0;
672
+ font-family: 'Fira', sans-serif;
673
+ color: var(--mc-markdown-paragraph-color);
674
+ }
675
+
676
+ .markdown-rendered code {
677
+ background: #f3f4f6;
678
+ padding: 2px 4px;
679
+ border-radius: 3px;
680
+ font-family: 'Fira', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
681
+ font-size: 0.9em;
682
+ }
683
+
684
+ .markdown-rendered pre {
685
+ background: #f9fafb;
686
+ padding: 12px;
687
+ border-radius: 6px;
688
+ margin: 12px 0;
689
+ overflow-x: auto;
690
+ }
691
+
692
+ .markdown-rendered pre code {
693
+ background: none;
694
+ padding: 0;
695
+ font-family: 'Fira', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
696
+ }
697
+
698
+ .markdown-rendered blockquote {
699
+ border-left: 3px solid #d1d5db;
700
+ padding-left: 12px;
701
+ margin: 12px 0;
702
+ color: var(--mc-markdown-paragraph-color);
703
+ font-style: italic;
704
+ font-family: 'Fira', sans-serif;
705
+ }
706
+
707
+ .markdown-rendered a {
708
+ color: var(--mc-markdown-paragraph-color);
709
+ text-decoration: none;
710
+ font-family: 'Fira', sans-serif;
711
+ }
712
+
713
+ .markdown-rendered a:hover {
714
+ text-decoration: underline;
715
+ }
716
+
717
+ .markdown-rendered .empty-markdown {
718
+ color: #9ca3af;
719
+ font-style: italic;
720
+ }
721
+
722
+ /* Execution Indicator */
723
+ .execution-indicator {
724
+ position: absolute;
725
+ top: 16px;
726
+ left: -40px;
727
+ display: flex;
728
+ flex-direction: column;
729
+ align-items: center;
730
+ font-size: 11px;
731
+ color: #6b7280;
732
+ width: 30px;
733
+ }
734
+
735
+ .execution-count {
736
+ font-family: 'Fira', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
737
+ font-size: 10px;
738
+ color: #9ca3af;
739
+ }
740
+
741
+ .execution-time {
742
+ font-size: 9px;
743
+ color: #d1d5db;
744
+ margin-top: 2px;
745
+ }
746
+
747
+ /* Execution Status Icon */
748
+ .execution-status {
749
+ position: absolute;
750
+ top: 8px;
751
+ left: 8px;
752
+ z-index: 16;
753
+ opacity: 0;
754
+ animation: fadeInStatus 0.3s ease forwards;
755
+ }
756
+
757
+ @keyframes fadeInStatus {
758
+ 0% {
759
+ opacity: 0;
760
+ transform: scale(0.8);
761
+ }
762
+ 100% {
763
+ opacity: 1;
764
+ transform: scale(1);
765
+ }
766
+ }
767
+
768
+ .status-icon {
769
+ width: 16px;
770
+ height: 16px;
771
+ display: block;
772
+ }
773
+
774
+ /* Cell Output */
775
+ .cell-output {
776
+ border-top: 1px solid #f3f4f6;
777
+ background: #fafafa;
778
+ }
779
+
780
+ .output-content {
781
+ padding: 16px 20px;
782
+ }
783
+
784
+ .output-stream {
785
+ background: #f9fafb;
786
+ padding: 12px 16px;
787
+ margin: 8px 0;
788
+ border-radius: 6px;
789
+ font-family: 'Fira', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
790
+ font-size: 13px;
791
+ white-space: pre-wrap;
792
+ word-wrap: break-word;
793
+ border-left: 3px solid #e5e7eb;
794
+ }
795
+
796
+ .output-stream.stdout {
797
+ color: #374151;
798
+ border-left-color: #6b7280;
799
+ }
800
+
801
+ .output-stream.stderr {
802
+ color: #dc2626;
803
+ background: #fef2f2;
804
+ border-left-color: #ef4444;
805
+ }
806
+
807
+ .output-result {
808
+ background: var(--mc-cell-background);
809
+ padding: 12px 16px;
810
+ margin: 8px 0;
811
+ border-radius: 6px;
812
+ border: 1px solid #e5e7eb;
813
+ font-family: 'Fira', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
814
+ font-size: 13px;
815
+ white-space: pre-wrap;
816
+ word-wrap: break-word;
817
+ }
818
+
819
+ .output-error {
820
+ background: #fef2f2;
821
+ color: #dc2626;
822
+ padding: 12px 16px;
823
+ margin: 8px 0;
824
+ border-radius: 6px;
825
+ border: 1px solid #fecaca;
826
+ font-family: 'Fira', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
827
+ font-size: 13px;
828
+ white-space: pre-wrap;
829
+ word-wrap: break-word;
830
+ }
831
+
832
+ /* Executing State */
833
+ .cell.executing {
834
+ border-color: #fbbf24;
835
+ background: linear-gradient(90deg, #fffbeb 0%, #ffffff 100%);
836
+ }
837
+
838
+ .cell.executing .execution-count {
839
+ color: #f59e0b;
840
+ }
841
+
842
+ .cell.executing .execution-count::after {
843
+ content: " •";
844
+ animation: blink 1s infinite;
845
+ }
846
+
847
+ @keyframes blink {
848
+ 0%,
849
+ 50% {
850
+ opacity: 1;
851
+ }
852
+ 51%,
853
+ 100% {
854
+ opacity: 0.3;
855
+ }
856
+ }
857
+
858
+ /* Drag and Drop */
859
+ .sortable-ghost {
860
+ opacity: 0.4;
861
+ }
862
+
863
+ .sortable-drag {
864
+ transform: rotate(5deg);
865
+ z-index: 1000;
866
+ }
867
+
868
+ /* Responsive */
869
+ @media (max-width: 768px) {
870
+ .notebook-wrapper {
871
+ padding: 20px 10px;
872
+ max-width: 100%;
873
+ }
874
+
875
+ .execution-indicator {
876
+ display: none;
877
+ }
878
+
879
+ .cell-hover-controls {
880
+ position: relative;
881
+ top: auto;
882
+ right: auto;
883
+ opacity: 1;
884
+ padding: 8px 12px;
885
+ background: #f9fafb;
886
+ border-bottom: 1px solid #e5e7eb;
887
+ justify-content: flex-end;
888
+ }
889
+ }
890
+
891
+ /* Sidebar Styles */
892
+ .sidebar {
893
+ width: 60px;
894
+ background: #f8fafc;
895
+ border-right: 1px solid #e2e8f0;
896
+ display: flex;
897
+ flex-direction: column;
898
+ padding: 16px 0;
899
+ position: fixed;
900
+ left: 0;
901
+ top: 0;
902
+ bottom: 0;
903
+ z-index: 50;
904
+ }
905
+
906
+ .sidebar-item {
907
+ position: relative;
908
+ width: 48px;
909
+ height: 48px;
910
+ margin: 4px auto;
911
+ border-radius: 8px;
912
+ display: flex;
913
+ align-items: center;
914
+ justify-content: center;
915
+ cursor: pointer;
916
+ transition: all 0.2s ease;
917
+ }
918
+
919
+ .sidebar-item:hover {
920
+ background: #e2e8f0;
921
+ }
922
+
923
+ .sidebar-item.active {
924
+ background: #3b82f6;
925
+ }
926
+
927
+ .sidebar-item.active .sidebar-icon {
928
+ filter: brightness(0) invert(1);
929
+ }
930
+
931
+ .sidebar-icon {
932
+ width: 20px;
933
+ height: 20px;
934
+ opacity: 0.7;
935
+ transition: opacity 0.2s ease;
936
+ }
937
+
938
+ .sidebar-item:hover .sidebar-icon {
939
+ opacity: 1;
940
+ }
941
+
942
+ .sidebar-tooltip {
943
+ position: absolute;
944
+ left: 60px;
945
+ top: 50%;
946
+ transform: translateY(-50%);
947
+ background: #1f2937;
948
+ color: white;
949
+ padding: 6px 8px;
950
+ border-radius: 4px;
951
+ font-size: 12px;
952
+ white-space: nowrap;
953
+ opacity: 0;
954
+ visibility: hidden;
955
+ transition: all 0.2s ease;
956
+ z-index: 1000;
957
+ }
958
+
959
+ .sidebar-item:hover .sidebar-tooltip {
960
+ opacity: 1;
961
+ visibility: visible;
962
+ }
963
+
964
+ .sidebar-icon-wrapper {
965
+ display: flex;
966
+ align-items: center;
967
+ justify-content: center;
968
+ width: 24px;
969
+ height: 24px;
970
+ color: #4b5563;
971
+ }
972
+
973
+ .sidebar-icon-image {
974
+ width: 18px;
975
+ height: 18px;
976
+ }
977
+
978
+ /* Main content adjustment */
979
+ .main-content {
980
+ flex: 1;
981
+ margin-left: 60px;
982
+ }
983
+
984
+ /* Popup Overlay */
985
+ .popup-overlay {
986
+ position: fixed;
987
+ left: 60px;
988
+ top: 0;
989
+ width: min(480px, calc(100vw - 60px));
990
+ height: 100vh;
991
+ background: var(--mc-background);
992
+ border-right: 1px solid #e2e8f0;
993
+ box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);
994
+ z-index: 40;
995
+ display: flex;
996
+ flex-direction: column;
997
+ }
998
+
999
+ /* Popup Content */
1000
+ .popup-content {
1001
+ flex: 1;
1002
+ padding: 24px;
1003
+ display: flex;
1004
+ flex-direction: column;
1005
+ min-height: 0; /* Allow children to scroll within fixed-height overlay */
1006
+ }
1007
+
1008
+ .popup-header {
1009
+ display: flex;
1010
+ align-items: center;
1011
+ justify-content: space-between;
1012
+ margin-bottom: 20px;
1013
+ padding-bottom: 12px;
1014
+ border-bottom: 1px solid #e5e7eb;
1015
+ }
1016
+
1017
+ .popup-title {
1018
+ font-size: 18px;
1019
+ font-weight: 600;
1020
+ color: #1f2937;
1021
+ }
1022
+
1023
+ .popup-close {
1024
+ background: none;
1025
+ border: none;
1026
+ font-size: 20px;
1027
+ color: #6b7280;
1028
+ cursor: pointer;
1029
+ padding: 4px;
1030
+ border-radius: 4px;
1031
+ transition: all 0.2s ease;
1032
+ }
1033
+
1034
+ .popup-close:hover {
1035
+ background: #f3f4f6;
1036
+ color: #374151;
1037
+ }
1038
+
1039
+ /* File Browser Styles */
1040
+ .file-tree {
1041
+ font-size: 14px;
1042
+ }
1043
+
1044
+ .file-browser {
1045
+ display: flex;
1046
+ flex-direction: column;
1047
+ flex: 1;
1048
+ min-height: 0;
1049
+ background: var(--mc-background);
1050
+ }
1051
+
1052
+ .file-toolbar {
1053
+ display: flex;
1054
+ gap: 8px;
1055
+ align-items: center;
1056
+ margin: 10px 0; /* even spacing above and below */
1057
+ }
1058
+
1059
+ .file-toolbar-btn {
1060
+ background: var(--mc-cell-background);
1061
+ color: var(--mc-text-color);
1062
+ border: 1px solid #e5e7eb;
1063
+ padding: 6px 10px;
1064
+ border-radius: 6px;
1065
+ font-size: 12px;
1066
+ cursor: pointer;
1067
+ transition:
1068
+ background-color 0.2s ease,
1069
+ color 0.2s ease;
1070
+ display: inline-flex;
1071
+ align-items: center;
1072
+ gap: 6px;
1073
+ }
1074
+
1075
+ /* Icon-only variant (bordered, compact) */
1076
+ .file-toolbar-btn.icon {
1077
+ border: 1px solid #e5e7eb;
1078
+ background: var(--mc-cell-background);
1079
+ padding: 6px;
1080
+ }
1081
+
1082
+ .file-toolbar-btn.icon:hover {
1083
+ background: #f3f4f6;
1084
+ }
1085
+
1086
+ .file-toolbar-btn:hover:not(:disabled) {
1087
+ background: #e5e7eb;
1088
+ }
1089
+
1090
+ .file-toolbar-btn:disabled {
1091
+ opacity: 0.5;
1092
+ cursor: not-allowed;
1093
+ }
1094
+
1095
+ .file-path-header {
1096
+ padding: 8px 0;
1097
+ margin-bottom: 12px;
1098
+ font-size: 12px;
1099
+ color: #6b7280;
1100
+ border-bottom: 1px solid #e5e7eb;
1101
+ }
1102
+
1103
+ .file-path-label {
1104
+ font-weight: 600;
1105
+ color: #4b5563;
1106
+ }
1107
+
1108
+ .popup-body {
1109
+ flex: 1;
1110
+ display: flex;
1111
+ flex-direction: column;
1112
+ overflow: hidden;
1113
+ min-height: 0; /* Critical for inner scroll areas in flex layouts */
1114
+ }
1115
+
1116
+ .file-list {
1117
+ display: flex;
1118
+ flex-direction: column;
1119
+ gap: 4px;
1120
+ flex: 1;
1121
+ min-height: 0;
1122
+ overflow-y: auto;
1123
+ }
1124
+
1125
+ .file-item {
1126
+ display: flex;
1127
+ align-items: center;
1128
+ padding: 8px 10px;
1129
+ border-radius: 6px;
1130
+ cursor: pointer;
1131
+ transition: background-color 0.2s ease;
1132
+ border: 1px solid transparent;
1133
+ }
1134
+
1135
+ .file-item.directory .file-icon {
1136
+ filter: hue-rotate(200deg);
1137
+ }
1138
+
1139
+ .file-item:hover {
1140
+ background: #f3f4f6;
1141
+ border-color: #e5e7eb;
1142
+ }
1143
+
1144
+ .file-icon {
1145
+ width: 18px;
1146
+ height: 18px;
1147
+ margin-right: 10px;
1148
+ color: #4b5563;
1149
+ }
1150
+
1151
+ .file-meta {
1152
+ display: flex;
1153
+ flex-direction: column;
1154
+ }
1155
+
1156
+ .file-name {
1157
+ font-weight: 500;
1158
+ color: var(--mc-text-color);
1159
+ }
1160
+
1161
+ .file-details {
1162
+ font-size: 11px;
1163
+ color: #6b7280;
1164
+ }
1165
+
1166
+ .file-preview {
1167
+ display: flex;
1168
+ flex-direction: column;
1169
+ flex: 1;
1170
+ border: 1px solid #e5e7eb;
1171
+ border-radius: 8px;
1172
+ overflow: hidden;
1173
+ }
1174
+
1175
+ .file-preview-header {
1176
+ padding: 12px 16px;
1177
+ background: #f9fafb;
1178
+ border-bottom: 1px solid #e5e7eb;
1179
+ }
1180
+
1181
+ .file-preview-body {
1182
+ padding: 16px;
1183
+ flex: 1;
1184
+ min-height: 0;
1185
+ overflow-y: auto;
1186
+ background: var(--mc-background);
1187
+ color: var(--mc-markdown-color);
1188
+ border-radius: 0 0 8px 8px;
1189
+ }
1190
+
1191
+ .file-preview-loading {
1192
+ color: #94a3b8;
1193
+ font-size: 13px;
1194
+ }
1195
+
1196
+ .file-preview-content {
1197
+ font-family: 'Fira', 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace;
1198
+ font-size: 13px;
1199
+ white-space: pre-wrap;
1200
+ word-break: break-word;
1201
+ color: var(--mc-markdown-color);
1202
+ }
1203
+
1204
+ .file-tree.empty {
1205
+ color: #6b7280;
1206
+ font-style: italic;
1207
+ padding: 8px;
1208
+ }
1209
+
1210
+ /* Python Environment Styles */
1211
+ .python-env-list {
1212
+ max-height: 300px;
1213
+ overflow-y: auto;
1214
+ }
1215
+
1216
+ .env-item {
1217
+ display: flex;
1218
+ align-items: center;
1219
+ justify-content: space-between;
1220
+ padding: 12px;
1221
+ margin: 8px 0;
1222
+ border: 1px solid #e5e7eb;
1223
+ border-radius: 6px;
1224
+ cursor: pointer;
1225
+ transition: all 0.2s ease;
1226
+ }
1227
+
1228
+ .env-item:hover {
1229
+ border-color: #3b82f6;
1230
+ background: #f8fafc;
1231
+ }
1232
+
1233
+ .env-item.active {
1234
+ border-color: #3b82f6;
1235
+ background: #eff6ff;
1236
+ }
1237
+
1238
+ .env-info {
1239
+ display: flex;
1240
+ flex-direction: column;
1241
+ }
1242
+
1243
+ .env-name {
1244
+ font-weight: 500;
1245
+ color: #1f2937;
1246
+ }
1247
+
1248
+ .env-path {
1249
+ font-size: 12px;
1250
+ color: #6b7280;
1251
+ margin-top: 2px;
1252
+ }
1253
+
1254
+ .env-version {
1255
+ font-size: 12px;
1256
+ color: #3b82f6;
1257
+ font-weight: 500;
1258
+ }
1259
+
1260
+ .settings-editor {
1261
+ width: 100%;
1262
+ height: 400px;
1263
+ font-family: 'Fira', 'SF Mono', Monaco, monospace;
1264
+ font-size: 13px;
1265
+ border: 1px solid #e5e7eb;
1266
+ border-radius: 6px;
1267
+ padding: 12px;
1268
+ resize: vertical;
1269
+ background: #f9fafb;
1270
+ }
1271
+
1272
+ .settings-actions {
1273
+ display: flex;
1274
+ justify-content: flex-end;
1275
+ gap: 8px;
1276
+ margin-top: 12px;
1277
+ }
1278
+
1279
+ .btn {
1280
+ padding: 8px 16px;
1281
+ border: none;
1282
+ border-radius: 6px;
1283
+ font-size: 14px;
1284
+ font-weight: 500;
1285
+ cursor: pointer;
1286
+ transition: all 0.2s ease;
1287
+ }
1288
+
1289
+ .btn-primary {
1290
+ background: #3b82f6;
1291
+ color: white;
1292
+ }
1293
+
1294
+ .btn-primary:hover {
1295
+ background: #2563eb;
1296
+ }
1297
+
1298
+ .btn-secondary {
1299
+ background: #f3f4f6;
1300
+ color: #374151;
1301
+ border: 1px solid #d1d5db;
1302
+ }
1303
+
1304
+ .btn-secondary:hover {
1305
+ background: #e5e7eb;
1306
+ }
1307
+
1308
+ /* Metrics Popup Styles */
1309
+ .metrics-container {
1310
+ font-size: 14px;
1311
+ }
1312
+
1313
+ .metrics-grid {
1314
+ display: grid;
1315
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1316
+ gap: 12px;
1317
+ }
1318
+
1319
+ .metric-panel {
1320
+ border: 1px solid #e5e7eb;
1321
+ border-radius: 8px;
1322
+ background: var(--mc-cell-background);
1323
+ }
1324
+
1325
+ .metric-panel-header {
1326
+ padding: 8px 12px;
1327
+ border-bottom: 1px solid #e5e7eb;
1328
+ }
1329
+
1330
+ .metric-panel-title {
1331
+ font-size: 12px;
1332
+ color: #6b7280;
1333
+ font-weight: 600;
1334
+ }
1335
+
1336
+ .metric-panel-body {
1337
+ padding: 10px 12px;
1338
+ }
1339
+
1340
+ .metric-big-value .value {
1341
+ font-size: 20px;
1342
+ font-weight: 700;
1343
+ color: var(--mc-text-color);
1344
+ }
1345
+
1346
+ .metric-big-value .subtitle {
1347
+ font-size: 12px;
1348
+ color: #6b7280;
1349
+ }
1350
+
1351
+ .mini-chart {
1352
+ margin-top: 6px;
1353
+ }
1354
+
1355
+ .metrics-footer {
1356
+ margin-top: 8px;
1357
+ display: flex;
1358
+ align-items: center;
1359
+ justify-content: space-between;
1360
+ color: #6b7280;
1361
+ }
1362
+
1363
+ .metrics-placeholder {
1364
+ text-align: center;
1365
+ padding: 40px 20px;
1366
+ color: #6b7280;
1367
+ }
1368
+
1369
+ .metrics-placeholder h3 {
1370
+ font-size: 24px;
1371
+ margin-bottom: 16px;
1372
+ color: #1f2937;
1373
+ }
1374
+
1375
+ .metrics-placeholder p {
1376
+ margin-bottom: 24px;
1377
+ font-size: 16px;
1378
+ }
1379
+
1380
+ .coming-soon {
1381
+ background: #f9fafb;
1382
+ border: 1px solid #e5e7eb;
1383
+ border-radius: 8px;
1384
+ padding: 24px;
1385
+ margin: 20px 0;
1386
+ }
1387
+
1388
+ .coming-soon ul {
1389
+ list-style: none;
1390
+ padding: 0;
1391
+ margin: 16px 0;
1392
+ }
1393
+
1394
+ .coming-soon li {
1395
+ padding: 8px 0;
1396
+ border-bottom: 1px solid #f3f4f6;
1397
+ display: flex;
1398
+ align-items: center;
1399
+ font-size: 14px;
1400
+ color: #374151;
1401
+ }
1402
+
1403
+ .coming-soon li:last-child {
1404
+ border-bottom: none;
1405
+ }
1406
+
1407
+ .coming-soon p:last-child {
1408
+ margin-top: 20px;
1409
+ font-style: italic;
1410
+ color: #9ca3af;
1411
+ font-size: 14px;
1412
+ }
1413
+
1414
+ /* Packages Popup Styles */
1415
+ .packages-container {
1416
+ display: flex;
1417
+ flex-direction: column;
1418
+ gap: 12px;
1419
+ height: 100%;
1420
+ }
1421
+
1422
+ .packages-toolbar {
1423
+ display: flex;
1424
+ align-items: center;
1425
+ justify-content: space-between;
1426
+ gap: 12px;
1427
+ }
1428
+
1429
+ .packages-search {
1430
+ display: flex;
1431
+ align-items: center;
1432
+ gap: 8px;
1433
+ flex: 1;
1434
+ background: var(--mc-cell-background);
1435
+ border: 1px solid #e5e7eb;
1436
+ border-radius: 8px;
1437
+ padding: 8px 10px;
1438
+ }
1439
+
1440
+ .packages-search-input {
1441
+ flex: 1;
1442
+ border: none;
1443
+ outline: none;
1444
+ background: transparent;
1445
+ font-size: 14px;
1446
+ color: var(--mc-text-color);
1447
+ }
1448
+
1449
+ .packages-search-icon {
1450
+ color: #6b7280;
1451
+ }
1452
+
1453
+ .packages-subtext {
1454
+ display: inline-flex;
1455
+ align-items: center;
1456
+ gap: 6px;
1457
+ font-size: 12px;
1458
+ color: #6b7280;
1459
+ }
1460
+
1461
+ .packages-table {
1462
+ display: flex;
1463
+ flex-direction: column;
1464
+ border: 1px solid #e5e7eb;
1465
+ border-radius: 8px;
1466
+ overflow: hidden;
1467
+ background: var(--mc-cell-background);
1468
+ }
1469
+
1470
+ .packages-table-header {
1471
+ display: grid;
1472
+ grid-template-columns: 1fr 140px;
1473
+ gap: 8px;
1474
+ padding: 10px 12px;
1475
+ font-size: 12px;
1476
+ font-weight: 600;
1477
+ color: #6b7280;
1478
+ border-bottom: 1px solid #e5e7eb;
1479
+ background: #f9fafb;
1480
+ }
1481
+
1482
+ .packages-list {
1483
+ overflow-y: auto;
1484
+ max-height: calc(100vh - 260px);
1485
+ }
1486
+
1487
+ .package-row {
1488
+ display: grid;
1489
+ grid-template-columns: 1fr 140px;
1490
+ gap: 8px;
1491
+ padding: 10px 12px;
1492
+ border-bottom: 1px solid #f3f4f6;
1493
+ }
1494
+
1495
+ .package-row:last-child {
1496
+ border-bottom: none;
1497
+ }
1498
+
1499
+ .package-name {
1500
+ color: var(--mc-text-color);
1501
+ }
1502
+
1503
+ .package-version {
1504
+ color: #374151;
1505
+ }
1506
+
1507
+ .file-tree-container {
1508
+ flex: 1;
1509
+ min-height: 0;
1510
+ display: flex;
1511
+ flex-direction: column;
1512
+ overflow-y: auto;
1513
+ }
1514
+
1515
+ .file-tree {
1516
+ flex: 1;
1517
+ display: flex;
1518
+ flex-direction: column;
1519
+ min-height: 0;
1520
+ }
1521
+
1522
+ .file-list {
1523
+ display: flex;
1524
+ flex-direction: column;
1525
+ gap: 4px;
1526
+ flex: 1;
1527
+ min-height: 0;
1528
+ overflow-y: auto;
1529
+ }
1530
+
1531
+ @font-face {
1532
+ font-family: 'VeraMono';
1533
+ src: url('/fonts/VeraMono.ttf') format('truetype');
1534
+ font-weight: normal;
1535
+ font-style: normal;
1536
+ font-display: swap;
1537
+ }