@mjasano/devtunnel 1.2.0 → 1.4.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.
@@ -0,0 +1,857 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ body {
8
+ background-color: #0d1117;
9
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
10
+ height: 100vh;
11
+ display: flex;
12
+ flex-direction: column;
13
+ color: #c9d1d9;
14
+ }
15
+
16
+ .header {
17
+ background-color: #161b22;
18
+ padding: 12px 20px;
19
+ display: flex;
20
+ align-items: center;
21
+ justify-content: space-between;
22
+ border-bottom: 1px solid #30363d;
23
+ }
24
+
25
+ .header h1 {
26
+ color: #fff;
27
+ font-size: 18px;
28
+ font-weight: 600;
29
+ display: flex;
30
+ align-items: center;
31
+ gap: 10px;
32
+ }
33
+
34
+ .header h1 .logo {
35
+ width: 24px;
36
+ height: 24px;
37
+ background: linear-gradient(135deg, #58a6ff, #8b5cf6);
38
+ border-radius: 6px;
39
+ }
40
+
41
+ .header-right {
42
+ display: flex;
43
+ align-items: center;
44
+ gap: 16px;
45
+ }
46
+
47
+ .system-info {
48
+ display: flex;
49
+ align-items: center;
50
+ gap: 12px;
51
+ padding: 4px 10px;
52
+ background-color: #21262d;
53
+ border-radius: 6px;
54
+ font-size: 11px;
55
+ font-family: monospace;
56
+ }
57
+
58
+ .system-stat {
59
+ display: flex;
60
+ align-items: center;
61
+ gap: 4px;
62
+ color: #8b949e;
63
+ }
64
+
65
+ .system-stat .stat-icon {
66
+ color: #6e7681;
67
+ font-size: 10px;
68
+ }
69
+
70
+ .system-stat span:last-child {
71
+ color: #c9d1d9;
72
+ }
73
+
74
+ .session-indicator {
75
+ display: flex;
76
+ align-items: center;
77
+ gap: 8px;
78
+ padding: 6px 12px;
79
+ background-color: #21262d;
80
+ border-radius: 6px;
81
+ font-size: 12px;
82
+ color: #8b949e;
83
+ }
84
+
85
+ .session-indicator .dot {
86
+ width: 8px;
87
+ height: 8px;
88
+ border-radius: 50%;
89
+ background-color: #3fb950;
90
+ }
91
+
92
+ .status {
93
+ display: flex;
94
+ align-items: center;
95
+ gap: 8px;
96
+ color: #8b949e;
97
+ font-size: 13px;
98
+ }
99
+
100
+ .status-dot {
101
+ width: 8px;
102
+ height: 8px;
103
+ border-radius: 50%;
104
+ background-color: #f85149;
105
+ }
106
+
107
+ .status-dot.connected {
108
+ background-color: #3fb950;
109
+ }
110
+
111
+ .btn-logout {
112
+ padding: 6px 12px;
113
+ background-color: transparent;
114
+ color: #8b949e;
115
+ border: 1px solid #30363d;
116
+ border-radius: 6px;
117
+ font-size: 12px;
118
+ cursor: pointer;
119
+ transition: all 0.15s ease;
120
+ }
121
+
122
+ .btn-logout:hover {
123
+ background-color: #21262d;
124
+ color: #c9d1d9;
125
+ border-color: #8b949e;
126
+ }
127
+
128
+ .main-container {
129
+ flex: 1;
130
+ display: flex;
131
+ overflow: hidden;
132
+ }
133
+
134
+ #terminal-container {
135
+ flex: 1;
136
+ padding: 10px;
137
+ background-color: #0d1117;
138
+ overflow: hidden;
139
+ }
140
+
141
+ #terminal {
142
+ height: 100%;
143
+ }
144
+
145
+ .sidebar {
146
+ width: 320px;
147
+ background-color: #161b22;
148
+ border-left: 1px solid #30363d;
149
+ display: flex;
150
+ flex-direction: column;
151
+ }
152
+
153
+ .sidebar-section {
154
+ border-bottom: 1px solid #30363d;
155
+ }
156
+
157
+ .sidebar-header {
158
+ padding: 12px 16px;
159
+ display: flex;
160
+ align-items: center;
161
+ justify-content: space-between;
162
+ cursor: pointer;
163
+ }
164
+
165
+ .sidebar-header:hover {
166
+ background-color: #21262d;
167
+ }
168
+
169
+ .sidebar-header h2 {
170
+ font-size: 13px;
171
+ font-weight: 600;
172
+ color: #c9d1d9;
173
+ text-transform: uppercase;
174
+ letter-spacing: 0.5px;
175
+ }
176
+
177
+ .sidebar-header .count {
178
+ background-color: #30363d;
179
+ padding: 2px 8px;
180
+ border-radius: 10px;
181
+ font-size: 11px;
182
+ color: #8b949e;
183
+ }
184
+
185
+ .sidebar-content {
186
+ padding: 8px;
187
+ max-height: 200px;
188
+ overflow-y: auto;
189
+ }
190
+
191
+ .tunnel-form {
192
+ padding: 12px;
193
+ display: flex;
194
+ gap: 8px;
195
+ }
196
+
197
+ .tunnel-form input {
198
+ flex: 1;
199
+ padding: 8px 12px;
200
+ background-color: #0d1117;
201
+ border: 1px solid #30363d;
202
+ border-radius: 6px;
203
+ color: #c9d1d9;
204
+ font-size: 13px;
205
+ }
206
+
207
+ .tunnel-form input:focus {
208
+ outline: none;
209
+ border-color: #58a6ff;
210
+ }
211
+
212
+ .tunnel-form input::placeholder {
213
+ color: #6e7681;
214
+ }
215
+
216
+ .btn {
217
+ padding: 8px 16px;
218
+ border-radius: 6px;
219
+ border: none;
220
+ font-size: 13px;
221
+ font-weight: 500;
222
+ cursor: pointer;
223
+ transition: all 0.15s ease;
224
+ }
225
+
226
+ .btn-primary {
227
+ background-color: #238636;
228
+ color: #fff;
229
+ }
230
+
231
+ .btn-primary:hover {
232
+ background-color: #2ea043;
233
+ }
234
+
235
+ .btn-primary:disabled {
236
+ background-color: #21262d;
237
+ color: #484f58;
238
+ cursor: not-allowed;
239
+ }
240
+
241
+ .btn-sm {
242
+ padding: 4px 8px;
243
+ font-size: 12px;
244
+ }
245
+
246
+ .btn-danger {
247
+ background-color: transparent;
248
+ color: #f85149;
249
+ }
250
+
251
+ .btn-danger:hover {
252
+ background-color: rgba(248, 81, 73, 0.1);
253
+ }
254
+
255
+ .btn-ghost {
256
+ background-color: transparent;
257
+ color: #8b949e;
258
+ }
259
+
260
+ .btn-ghost:hover {
261
+ background-color: #21262d;
262
+ color: #c9d1d9;
263
+ }
264
+
265
+ .item-card {
266
+ background-color: #0d1117;
267
+ border: 1px solid #30363d;
268
+ border-radius: 8px;
269
+ padding: 10px 12px;
270
+ margin-bottom: 8px;
271
+ }
272
+
273
+ .item-card.active {
274
+ border-color: #58a6ff;
275
+ }
276
+
277
+ .item-card-header {
278
+ display: flex;
279
+ align-items: center;
280
+ justify-content: space-between;
281
+ margin-bottom: 6px;
282
+ }
283
+
284
+ .item-title {
285
+ font-weight: 600;
286
+ font-size: 13px;
287
+ display: flex;
288
+ align-items: center;
289
+ gap: 8px;
290
+ }
291
+
292
+ .item-status {
293
+ font-size: 10px;
294
+ padding: 2px 6px;
295
+ border-radius: 10px;
296
+ font-weight: 500;
297
+ }
298
+
299
+ .item-status.active {
300
+ background-color: rgba(46, 160, 67, 0.2);
301
+ color: #3fb950;
302
+ }
303
+
304
+ .item-status.connecting {
305
+ background-color: rgba(187, 128, 9, 0.2);
306
+ color: #d29922;
307
+ }
308
+
309
+ .item-status.error, .item-status.stopped {
310
+ background-color: rgba(110, 118, 129, 0.2);
311
+ color: #8b949e;
312
+ }
313
+
314
+ .item-meta {
315
+ font-size: 11px;
316
+ color: #6e7681;
317
+ }
318
+
319
+ .item-url {
320
+ display: flex;
321
+ align-items: center;
322
+ gap: 6px;
323
+ margin-top: 8px;
324
+ }
325
+
326
+ .item-url input {
327
+ flex: 1;
328
+ padding: 5px 8px;
329
+ background-color: #161b22;
330
+ border: 1px solid #30363d;
331
+ border-radius: 4px;
332
+ color: #58a6ff;
333
+ font-size: 11px;
334
+ font-family: monospace;
335
+ }
336
+
337
+ .item-url input:focus {
338
+ outline: none;
339
+ }
340
+
341
+ .btn-copy {
342
+ padding: 5px 8px;
343
+ background-color: #21262d;
344
+ color: #c9d1d9;
345
+ border: 1px solid #30363d;
346
+ border-radius: 4px;
347
+ font-size: 11px;
348
+ cursor: pointer;
349
+ }
350
+
351
+ .btn-copy:hover {
352
+ background-color: #30363d;
353
+ }
354
+
355
+ .btn-copy.copied {
356
+ background-color: #238636;
357
+ border-color: #238636;
358
+ }
359
+
360
+ .empty-state {
361
+ padding: 24px 16px;
362
+ text-align: center;
363
+ color: #6e7681;
364
+ font-size: 12px;
365
+ }
366
+
367
+ .reconnect-overlay {
368
+ position: fixed;
369
+ top: 0;
370
+ left: 0;
371
+ right: 0;
372
+ bottom: 0;
373
+ background-color: rgba(0, 0, 0, 0.8);
374
+ display: none;
375
+ justify-content: center;
376
+ align-items: center;
377
+ z-index: 1000;
378
+ }
379
+
380
+ .reconnect-overlay.show {
381
+ display: flex;
382
+ }
383
+
384
+ .reconnect-box {
385
+ background-color: #161b22;
386
+ padding: 30px 40px;
387
+ border-radius: 12px;
388
+ text-align: center;
389
+ border: 1px solid #30363d;
390
+ }
391
+
392
+ .reconnect-box h2 {
393
+ color: #fff;
394
+ margin-bottom: 12px;
395
+ font-size: 18px;
396
+ }
397
+
398
+ .reconnect-box p {
399
+ color: #8b949e;
400
+ margin-bottom: 20px;
401
+ font-size: 14px;
402
+ }
403
+
404
+ .reconnect-btn {
405
+ background-color: #238636;
406
+ color: #fff;
407
+ border: none;
408
+ padding: 10px 24px;
409
+ border-radius: 6px;
410
+ cursor: pointer;
411
+ font-size: 14px;
412
+ font-weight: 500;
413
+ }
414
+
415
+ .reconnect-btn:hover {
416
+ background-color: #2ea043;
417
+ }
418
+
419
+ .toast {
420
+ position: fixed;
421
+ bottom: 20px;
422
+ right: 340px;
423
+ background-color: #161b22;
424
+ border: 1px solid #30363d;
425
+ padding: 12px 16px;
426
+ border-radius: 8px;
427
+ display: none;
428
+ align-items: center;
429
+ gap: 10px;
430
+ z-index: 1001;
431
+ animation: slideIn 0.3s ease;
432
+ }
433
+
434
+ .toast.show {
435
+ display: flex;
436
+ }
437
+
438
+ .toast.success {
439
+ border-color: #238636;
440
+ }
441
+
442
+ .toast.error {
443
+ border-color: #f85149;
444
+ }
445
+
446
+ /* Tab Bar */
447
+ .tab-bar {
448
+ display: flex;
449
+ background-color: #161b22;
450
+ border-bottom: 1px solid #30363d;
451
+ padding: 0 12px;
452
+ }
453
+
454
+ .tab {
455
+ padding: 10px 20px;
456
+ font-size: 13px;
457
+ color: #8b949e;
458
+ cursor: pointer;
459
+ border-bottom: 2px solid transparent;
460
+ transition: all 0.15s ease;
461
+ display: flex;
462
+ align-items: center;
463
+ gap: 8px;
464
+ }
465
+
466
+ .tab:hover {
467
+ color: #c9d1d9;
468
+ background-color: #21262d;
469
+ }
470
+
471
+ .tab.active {
472
+ color: #c9d1d9;
473
+ border-bottom-color: #58a6ff;
474
+ }
475
+
476
+ .tab-icon {
477
+ font-size: 14px;
478
+ }
479
+
480
+ /* Editor Container */
481
+ #editor-container {
482
+ flex: 1;
483
+ display: none;
484
+ flex-direction: column;
485
+ background-color: #0d1117;
486
+ overflow: hidden;
487
+ }
488
+
489
+ #editor-container.active {
490
+ display: flex;
491
+ }
492
+
493
+ #terminal-container.hidden {
494
+ display: none;
495
+ }
496
+
497
+ /* Terminal Tabs */
498
+ .terminal-tabs {
499
+ display: flex;
500
+ background-color: #161b22;
501
+ border-bottom: 1px solid #30363d;
502
+ overflow-x: auto;
503
+ min-height: 35px;
504
+ align-items: center;
505
+ }
506
+
507
+ .terminal-tab {
508
+ display: flex;
509
+ align-items: center;
510
+ gap: 8px;
511
+ padding: 8px 12px;
512
+ font-size: 12px;
513
+ color: #8b949e;
514
+ background-color: #0d1117;
515
+ border-right: 1px solid #30363d;
516
+ cursor: pointer;
517
+ white-space: nowrap;
518
+ }
519
+
520
+ .terminal-tab:hover {
521
+ background-color: #161b22;
522
+ }
523
+
524
+ .terminal-tab.active {
525
+ color: #c9d1d9;
526
+ background-color: #161b22;
527
+ }
528
+
529
+ .terminal-tab-close {
530
+ width: 16px;
531
+ height: 16px;
532
+ display: flex;
533
+ align-items: center;
534
+ justify-content: center;
535
+ border-radius: 4px;
536
+ font-size: 14px;
537
+ line-height: 1;
538
+ }
539
+
540
+ .terminal-tab-close:hover {
541
+ background-color: #30363d;
542
+ }
543
+
544
+ .terminal-tab-new {
545
+ width: 28px;
546
+ height: 28px;
547
+ margin: 0 4px;
548
+ background-color: transparent;
549
+ border: 1px solid #30363d;
550
+ border-radius: 4px;
551
+ color: #8b949e;
552
+ font-size: 16px;
553
+ cursor: pointer;
554
+ display: flex;
555
+ align-items: center;
556
+ justify-content: center;
557
+ }
558
+
559
+ .terminal-tab-new:hover {
560
+ background-color: #21262d;
561
+ color: #c9d1d9;
562
+ }
563
+
564
+ .terminal-tab .tmux-badge {
565
+ color: #3fb950;
566
+ font-size: 10px;
567
+ }
568
+
569
+ .editor-tabs {
570
+ display: flex;
571
+ background-color: #161b22;
572
+ border-bottom: 1px solid #30363d;
573
+ overflow-x: auto;
574
+ min-height: 35px;
575
+ }
576
+
577
+ .editor-tab {
578
+ display: flex;
579
+ align-items: center;
580
+ gap: 8px;
581
+ padding: 8px 12px;
582
+ font-size: 12px;
583
+ color: #8b949e;
584
+ background-color: #0d1117;
585
+ border-right: 1px solid #30363d;
586
+ cursor: pointer;
587
+ white-space: nowrap;
588
+ }
589
+
590
+ .editor-tab:hover {
591
+ background-color: #161b22;
592
+ }
593
+
594
+ .editor-tab.active {
595
+ color: #c9d1d9;
596
+ background-color: #161b22;
597
+ }
598
+
599
+ .editor-tab.modified::after {
600
+ content: '';
601
+ width: 6px;
602
+ height: 6px;
603
+ background-color: #d29922;
604
+ border-radius: 50%;
605
+ }
606
+
607
+ .editor-tab-close {
608
+ width: 16px;
609
+ height: 16px;
610
+ display: flex;
611
+ align-items: center;
612
+ justify-content: center;
613
+ border-radius: 4px;
614
+ font-size: 14px;
615
+ line-height: 1;
616
+ }
617
+
618
+ .editor-tab-close:hover {
619
+ background-color: #30363d;
620
+ }
621
+
622
+ #monaco-editor {
623
+ flex: 1;
624
+ min-height: 0;
625
+ }
626
+
627
+ .editor-empty {
628
+ flex: 1;
629
+ display: flex;
630
+ flex-direction: column;
631
+ align-items: center;
632
+ justify-content: center;
633
+ color: #6e7681;
634
+ font-size: 14px;
635
+ }
636
+
637
+ .editor-empty-icon {
638
+ font-size: 48px;
639
+ margin-bottom: 16px;
640
+ opacity: 0.5;
641
+ }
642
+
643
+ /* File Tree */
644
+ .file-tree {
645
+ font-size: 12px;
646
+ }
647
+
648
+ .file-item {
649
+ display: flex;
650
+ align-items: center;
651
+ gap: 6px;
652
+ padding: 4px 8px;
653
+ cursor: pointer;
654
+ border-radius: 4px;
655
+ }
656
+
657
+ .file-item:hover {
658
+ background-color: #21262d;
659
+ }
660
+
661
+ .file-item.active {
662
+ background-color: rgba(56, 139, 253, 0.15);
663
+ }
664
+
665
+ .file-item-icon {
666
+ width: 16px;
667
+ text-align: center;
668
+ flex-shrink: 0;
669
+ }
670
+
671
+ .file-item-name {
672
+ overflow: hidden;
673
+ text-overflow: ellipsis;
674
+ white-space: nowrap;
675
+ }
676
+
677
+ .file-item.directory > .file-item-icon {
678
+ color: #58a6ff;
679
+ }
680
+
681
+ .file-item.file > .file-item-icon {
682
+ color: #8b949e;
683
+ }
684
+
685
+ .file-children {
686
+ margin-left: 12px;
687
+ }
688
+
689
+ .breadcrumb {
690
+ display: flex;
691
+ align-items: center;
692
+ gap: 4px;
693
+ padding: 8px 12px;
694
+ font-size: 11px;
695
+ color: #8b949e;
696
+ border-bottom: 1px solid #30363d;
697
+ overflow-x: auto;
698
+ }
699
+
700
+ .breadcrumb-item {
701
+ cursor: pointer;
702
+ padding: 2px 4px;
703
+ border-radius: 4px;
704
+ }
705
+
706
+ .breadcrumb-item:hover {
707
+ background-color: #21262d;
708
+ color: #c9d1d9;
709
+ }
710
+
711
+ .breadcrumb-sep {
712
+ color: #484f58;
713
+ }
714
+
715
+ /* File Search */
716
+ .file-search {
717
+ padding: 8px 12px;
718
+ border-bottom: 1px solid #30363d;
719
+ }
720
+
721
+ .file-search input {
722
+ width: 100%;
723
+ padding: 6px 10px;
724
+ background-color: #0d1117;
725
+ border: 1px solid #30363d;
726
+ border-radius: 4px;
727
+ color: #c9d1d9;
728
+ font-size: 12px;
729
+ }
730
+
731
+ .file-search input:focus {
732
+ outline: none;
733
+ border-color: #58a6ff;
734
+ }
735
+
736
+ .file-search input::placeholder {
737
+ color: #6e7681;
738
+ }
739
+
740
+
741
+ /* Context Menu */
742
+ .context-menu {
743
+ position: fixed;
744
+ background-color: #161b22;
745
+ border: 1px solid #30363d;
746
+ border-radius: 6px;
747
+ padding: 4px 0;
748
+ min-width: 150px;
749
+ z-index: 1000;
750
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
751
+ }
752
+
753
+ .context-menu-item {
754
+ padding: 8px 12px;
755
+ font-size: 12px;
756
+ color: #c9d1d9;
757
+ cursor: pointer;
758
+ display: flex;
759
+ align-items: center;
760
+ gap: 8px;
761
+ }
762
+
763
+ .context-menu-item:hover {
764
+ background-color: #21262d;
765
+ }
766
+
767
+ .context-menu-item.danger {
768
+ color: #f85149;
769
+ }
770
+
771
+ .context-menu-divider {
772
+ height: 1px;
773
+ background-color: #30363d;
774
+ margin: 4px 0;
775
+ }
776
+
777
+ /* Modal */
778
+ .modal-overlay {
779
+ position: fixed;
780
+ top: 0;
781
+ left: 0;
782
+ right: 0;
783
+ bottom: 0;
784
+ background-color: rgba(0, 0, 0, 0.6);
785
+ display: none;
786
+ justify-content: center;
787
+ align-items: center;
788
+ z-index: 1000;
789
+ }
790
+
791
+ .modal-overlay.show {
792
+ display: flex;
793
+ }
794
+
795
+ .modal {
796
+ background-color: #161b22;
797
+ border: 1px solid #30363d;
798
+ border-radius: 8px;
799
+ padding: 20px;
800
+ min-width: 300px;
801
+ }
802
+
803
+ .modal h3 {
804
+ margin-bottom: 16px;
805
+ font-size: 16px;
806
+ color: #c9d1d9;
807
+ }
808
+
809
+ .modal input {
810
+ width: 100%;
811
+ padding: 8px 12px;
812
+ background-color: #0d1117;
813
+ border: 1px solid #30363d;
814
+ border-radius: 6px;
815
+ color: #c9d1d9;
816
+ font-size: 14px;
817
+ margin-bottom: 16px;
818
+ }
819
+
820
+ .modal input:focus {
821
+ outline: none;
822
+ border-color: #58a6ff;
823
+ }
824
+
825
+ .modal-actions {
826
+ display: flex;
827
+ justify-content: flex-end;
828
+ gap: 8px;
829
+ }
830
+
831
+ @keyframes slideIn {
832
+ from {
833
+ transform: translateY(20px);
834
+ opacity: 0;
835
+ }
836
+ to {
837
+ transform: translateY(0);
838
+ opacity: 1;
839
+ }
840
+ }
841
+
842
+ @media (max-width: 768px) {
843
+ .main-container {
844
+ flex-direction: column;
845
+ }
846
+
847
+ .sidebar {
848
+ width: 100%;
849
+ max-height: 250px;
850
+ border-left: none;
851
+ border-top: 1px solid #30363d;
852
+ }
853
+
854
+ .toast {
855
+ right: 20px;
856
+ }
857
+ }