pinokiod 3.41.0 → 3.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/kernel/api/browser/index.js +3 -1
  2. package/kernel/api/cloudflare/index.js +3 -3
  3. package/kernel/api/index.js +187 -51
  4. package/kernel/api/loading/index.js +15 -0
  5. package/kernel/api/process/index.js +7 -0
  6. package/kernel/api/shell/index.js +0 -2
  7. package/kernel/bin/browserless.js +22 -0
  8. package/kernel/bin/caddy.js +36 -4
  9. package/kernel/bin/index.js +4 -1
  10. package/kernel/bin/setup.js +38 -5
  11. package/kernel/connect/backend.js +110 -0
  12. package/kernel/connect/config.js +171 -0
  13. package/kernel/connect/index.js +18 -7
  14. package/kernel/connect/providers/huggingface/index.js +98 -0
  15. package/kernel/connect/providers/x/index.js +0 -1
  16. package/kernel/environment.js +91 -19
  17. package/kernel/git.js +46 -3
  18. package/kernel/index.js +119 -39
  19. package/kernel/peer.js +40 -5
  20. package/kernel/plugin.js +3 -2
  21. package/kernel/procs.js +27 -20
  22. package/kernel/prototype.js +30 -16
  23. package/kernel/router/common.js +1 -1
  24. package/kernel/router/connector.js +1 -3
  25. package/kernel/router/index.js +38 -4
  26. package/kernel/router/localhost_home_router.js +5 -1
  27. package/kernel/router/localhost_port_router.js +27 -1
  28. package/kernel/router/localhost_static_router.js +93 -0
  29. package/kernel/router/localhost_variable_router.js +14 -9
  30. package/kernel/router/peer_peer_router.js +3 -0
  31. package/kernel/router/peer_static_router.js +43 -0
  32. package/kernel/router/peer_variable_router.js +15 -14
  33. package/kernel/router/processor.js +26 -1
  34. package/kernel/router/rewriter.js +59 -0
  35. package/kernel/scripts/git/commit +11 -1
  36. package/kernel/shell.js +8 -3
  37. package/kernel/util.js +65 -6
  38. package/package.json +2 -1
  39. package/server/index.js +1037 -964
  40. package/server/public/common.js +382 -1
  41. package/server/public/fscreator.js +0 -1
  42. package/server/public/loading.js +17 -0
  43. package/server/public/notifyinput.js +0 -1
  44. package/server/public/opener.js +4 -2
  45. package/server/public/style.css +310 -11
  46. package/server/socket.js +7 -1
  47. package/server/views/app.ejs +1747 -351
  48. package/server/views/columns.ejs +338 -0
  49. package/server/views/connect/huggingface.ejs +353 -0
  50. package/server/views/connect/index.ejs +410 -0
  51. package/server/views/connect/x.ejs +43 -9
  52. package/server/views/connect.ejs +709 -49
  53. package/server/views/container.ejs +357 -0
  54. package/server/views/d.ejs +251 -62
  55. package/server/views/download.ejs +54 -10
  56. package/server/views/editor.ejs +11 -0
  57. package/server/views/explore.ejs +40 -15
  58. package/server/views/file_explorer.ejs +25 -246
  59. package/server/views/form.ejs +44 -1
  60. package/server/views/frame.ejs +39 -1
  61. package/server/views/github.ejs +48 -11
  62. package/server/views/help.ejs +48 -7
  63. package/server/views/index.ejs +119 -58
  64. package/server/views/index2.ejs +3 -4
  65. package/server/views/init/index.ejs +651 -197
  66. package/server/views/install.ejs +1 -1
  67. package/server/views/mini.ejs +47 -18
  68. package/server/views/net.ejs +199 -67
  69. package/server/views/network.ejs +220 -94
  70. package/server/views/network2.ejs +3 -4
  71. package/server/views/old_network.ejs +3 -3
  72. package/server/views/prototype/index.ejs +48 -11
  73. package/server/views/review.ejs +1005 -0
  74. package/server/views/rows.ejs +341 -0
  75. package/server/views/screenshots.ejs +1020 -0
  76. package/server/views/settings.ejs +160 -23
  77. package/server/views/setup.ejs +49 -7
  78. package/server/views/setup_home.ejs +43 -10
  79. package/server/views/shell.ejs +7 -1
  80. package/server/views/start.ejs +14 -9
  81. package/server/views/terminal.ejs +13 -2
  82. package/server/views/tools.ejs +1015 -0
@@ -19,12 +19,14 @@ html {
19
19
  height: 100%;
20
20
  overflow: hidden;
21
21
  }
22
+ /*
22
23
  body {
23
24
  height: 100%;
24
25
  overflow: auto;
25
26
  display: flex;
26
27
  flex-direction: column;
27
28
  }
29
+ */
28
30
  .line2 {
29
31
  display: flex;
30
32
  align-items: center;
@@ -60,16 +62,6 @@ body {
60
62
  display: flex;
61
63
  align-items: center;
62
64
  }
63
- .btn {
64
- margin: 5px;
65
- width: 100px;
66
- text-align: center;
67
- padding: 10px;
68
- background: black;
69
- color: white;
70
- text-decoration: none;
71
- font-weight: normal;
72
- }
73
65
  .item {
74
66
  display: flex;
75
67
  align-items: flex-start;
@@ -102,7 +94,9 @@ body {
102
94
  main {
103
95
  flex-grow: 1;
104
96
  display: flex;
97
+ /*
105
98
  flex-direction: column;
99
+ */
106
100
  }
107
101
  .setup-items {
108
102
  display: flex;
@@ -137,7 +131,6 @@ body.dark .card {
137
131
  color: royalblue !important;
138
132
  }
139
133
  .card .desc {
140
- opacity: 0.7;
141
134
  }
142
135
  .card h3 {
143
136
  margin: 0;
@@ -156,12 +149,9 @@ body.dark .config {
156
149
  color: white;
157
150
  }
158
151
  .config {
159
- /*
160
- background: rgba(0,0,0,0.9);
161
- */
162
152
  color: black;
163
153
  padding: 30px;
164
- text-align: left;
154
+ margin: 10px 0;
165
155
  }
166
156
  .config-header {
167
157
  }
@@ -188,14 +178,17 @@ body.dark .config {
188
178
  }
189
179
  .header-label {
190
180
  padding: 0;
191
- font-size: 50px;
192
- letter-spacing: -2px;
193
- font-weight: lighter;
181
+ font-size: 30px;
194
182
  /*
195
183
  text-align: center;
196
184
  */
197
185
  text-transform: capitalize;
198
186
  }
187
+ body.dark .container {
188
+ color: white;
189
+ }
190
+ .container {
191
+ }
199
192
  .dark .container-row {
200
193
  background: rgba(255, 255, 255, 0.04);
201
194
  }
@@ -217,7 +210,583 @@ body.dark .config {
217
210
  padding: 10px 0;
218
211
  opacity: 0.7;
219
212
  }
213
+ .line2 {
214
+ display: flex;
215
+ align-items: center;
216
+ cursor: pointer;
217
+ background: rgba(0,0,100,0.04);
218
+ }
219
+ .line2 a {
220
+ text-decoration: none;
221
+ color: black;
222
+ }
223
+ .status {
224
+ padding: 10px;
225
+ margin: 10px;
226
+ border-radius: 10px;
227
+ }
228
+ .status.offline {
229
+ background: silver;
230
+ }
231
+ .status.online {
232
+ background: yellowgreen;
233
+ }
234
+ .switch {
235
+ padding: 10px;
236
+ margin: 10px 0;
237
+ }
238
+ .switch[data-online=true] {
239
+ color: yellowgreen;
240
+ }
241
+ .button {
242
+ padding: 10px;
243
+ }
244
+ .on, .off {
245
+ display: flex;
246
+ align-items: center;
247
+ }
248
+ header .runner {
249
+ padding: 10px 0 0;
250
+ }
251
+ .proxy {
252
+ padding: 0 10px;
253
+ text-align: right;
254
+ }
255
+ .proxy a {
256
+ text-decoration: none;
257
+ display: inline-block;
258
+ padding: 5px 10px;
259
+ border-radius: 2px;
260
+ background: black;
261
+ color: white;
262
+ }
263
+ .browser-options-btns {
264
+ display: flex;
265
+ padding-top: 5px;
266
+ }
267
+ .browser-options-row {
268
+ /*
269
+ border-top: 1px solid rgba(0,0,0,0.1);
270
+ border-bottom: 1px solid rgba(0,0,0,0.1);
271
+ */
272
+ display: flex;
273
+ padding: 10px;
274
+ align-items: flex-start;
275
+ }
276
+ .browser-options-row h3 {
277
+ margin: 0;
278
+ font-size: 14px;
279
+ margin-bottom: 3px;
280
+ }
281
+ .browser-options-row .btn.disabled {
282
+ opacity: 0.7;
283
+ }
284
+ .browser-options-row .btn {
285
+ font-weight: bold;
286
+ width: 100px;
287
+ text-align: center;
288
+ display: block;
289
+ margin-right: 10px;
290
+ flex-shrink: 0;
291
+ padding: 5px;
292
+ }
293
+ .badge {
294
+ font-size: 12px;
295
+ padding: 5px 10px;
296
+ background: rgba(0,0,100,0.1);
297
+ border-radius: 5px;
298
+ display: inline-block;
299
+ margin-top: 5px;
300
+ }
301
+ a.badge {
302
+ color: royalblue;
303
+ text-decoration: none;
304
+ cursor: pointer;
305
+ }
306
+ .badge a {
307
+ color: royalblue;
308
+ text-decoration: none;
309
+ }
310
+ body.dark .btn {
311
+ color: white;
312
+ background: rgba(255,255,255,0.05) !important;
313
+ }
314
+ body.dark .badge {
315
+ background: rgba(255,255,255,0.1);
316
+ }
317
+ /*
318
+ body.dark .browser-options-row {
319
+ border-top: 1px solid rgba(255,255,255,0.05);
320
+ border-bottom: 1px solid rgba(255,255,255,0.05);
321
+ }
322
+ */
323
+ body.dark .context-menu-wrapper {
324
+ background: rgba(0,0,0,0.9);
325
+ color: white;
326
+ }
327
+ .context-menu-wrapper {
328
+ background: rgba(0,0,0,0.06) !important;
329
+ }
330
+ .context-menu {
331
+ /*
332
+ max-height: 10000px;
333
+ overflow: hidden;
334
+ transition: max-height 1s ease-in-out;
335
+ */
336
+ display: flex;
337
+ margin: 0 5px 0 0;
338
+ }
339
+ .context-menu .btn:hover {
340
+ color: cornflowerblue !important;
341
+ }
342
+ .context-menu .btn {
343
+ background: none !important;
344
+ border: none !important;
345
+ display: block;
346
+ width: 80px;
347
+ padding: 6px 10px !important;
348
+ text-align: left;
349
+ color: black;
350
+ }
351
+ .blank {
352
+ width: 50px;
353
+ height: 50px;
354
+ flex-shrink: 0;
355
+ }
356
+ body.dark .section-header {
357
+ /*
358
+ border-bottom: 1px solid rgba(255,255,255,0.07);
359
+ */
360
+ }
361
+ .section-header {
362
+ /*
363
+ border-bottom: 1px solid rgba(0, 0, 0,0.04);
364
+ */
365
+ font-weight: normal;
366
+ font-size: 14px;
367
+ padding: 15px 5px;
368
+ /*
369
+ margin: 0 0 15px;
370
+ */
371
+ }
372
+ .section-header h2 {
373
+ font-size: 20px;
374
+ font-weight: lighter;
375
+ }
376
+ .section-header .section {
377
+ padding: 0;
378
+ }
379
+ .section-header .section div {
380
+ font-weight: normal;
381
+ opacity: 0.6;
382
+ font-size: 14px;
383
+ }
384
+ .section-header h3 {
385
+ display: flex;
386
+ margin: 0;
387
+ }
388
+ .section-header .col {
389
+ padding-left: 10px;
390
+ flex-grow: 1;
391
+ min-width: 0;
392
+ word-wrap: break-word;
393
+ }
394
+ .tab .btn {
395
+ color: black;
396
+ background: none !important;
397
+ }
398
+ body.dark .tab .btn {
399
+ background: none !important;
400
+ }
401
+ .app-btns .btn {
402
+ border-radius: 4px;
403
+ padding: 8px 10px;
404
+ width: 70px;
405
+ /*
406
+ padding: 6px 10px;
407
+ */
408
+ text-align: center;
409
+ }
410
+ body.dark .context-menu .btn {
411
+ color: white;
412
+ }
413
+ .context-menu.collapsed {
414
+ /*
415
+ max-height: 0;
416
+ */
417
+ display: none;
418
+ }
419
+ body.dark .open-menu, body.dark .browse {
420
+ border: none !important;
421
+ /*
422
+ background: black !important;
423
+ */
424
+ color: white !important;
425
+ }
426
+ .open-menu:hover, .browse:hover, body.dark .open-menu:hover, body.dark .browse:hover {
427
+ color: royalblue !important;
428
+ }
429
+ .open-menu, .browse {
430
+ width: 80px;
431
+ border-radius: 0 !important;
432
+ background: rgba(0,0,0,0.04) !important;
433
+ color: black !important;
434
+ /*
435
+ border: 1px solid rgba(0, 0, 0, 0.3);
436
+ */
437
+ }
438
+ .open-menu.selected {
439
+ border: none !important;
440
+ /*
441
+ background: none !important;
442
+ */
443
+ }
444
+ .open-menu.selected span {
445
+ display: none;
446
+ }
447
+ .sections {
448
+ display: flex;
449
+ }
450
+ .section {
451
+ display: block;
452
+ }
453
+ .section h2 {
454
+ margin: 0;
455
+ }
456
+ .line.align-top h3 .col .btn {
457
+ box-sizing: border-box;
458
+ margin-top: 5px;
459
+ width: 100%;
460
+ }
461
+ .desc {
462
+ font-size: 14px;
463
+ padding: 5px 0;
464
+ font-weight: normal;
465
+ }
466
+ .section-container {
467
+ display: grid;
468
+ grid-template-columns: repeat(2, 1fr); /* Three equal columns */
469
+ gap: 1rem; /* Optional spacing between columns */
470
+ }
471
+ .grid-2 {
472
+ display: grid;
473
+ grid-template-columns: repeat(2, 1fr); /* Three equal columns */
474
+ gap: 1rem; /* Optional spacing between columns */
475
+ }
476
+ .grid-1 {
477
+ padding: 10px;
478
+ }
479
+ .grid-3 {
480
+ display: grid;
481
+ grid-template-columns: repeat(3, 1fr); /* Three equal columns */
482
+ gap: 1rem; /* Optional spacing between columns */
483
+ padding: 10px;
484
+ }
485
+ .section-header .grid-1, .section-header .grid-2, .section-header .grid-3 {
486
+ background: none !important;
487
+ padding: 0 !important;
488
+ }
489
+ .grid-1, .grid-2, .grid-3 {
490
+ background: rgba(0,0,0,0.04);
491
+ margin-top: 5px;
492
+ }
493
+ body.dark .grid-1, body.dark .grid-2, body.dark .grid-3 {
494
+ background: rgba(255,255,255,0.03);
495
+ margin-top: 5px;
496
+ }
497
+ main {
498
+ display: flex;
499
+ }
500
+ aside {
501
+ width: 200px;
502
+ display: block;
503
+ flex-shrink: 0;
504
+ }
505
+ aside .tab i {
506
+ width: 20px;
507
+ text-align: center;
508
+ }
509
+ body.dark aside .tab {
510
+ color: white;
511
+ }
512
+ body.dark aside .tab:hover, aside .tab:hover {
513
+ color: royalblue !important;
514
+ opacity: 1;
515
+ }
516
+ aside .tab {
517
+ display: flex;
518
+ align-items: center;
519
+ gap: 5px;
520
+ color: black;
521
+ text-decoration: none;
522
+ padding: 10px;
523
+ font-size: 12px;
524
+ opacity: 0.5;
525
+ border-left: 10px solid transparent;
526
+ }
527
+ body.dark aside .tab.selected {
528
+ color: white;
529
+ }
530
+ aside .selected {
531
+ font-weight: bold;
532
+ opacity: 1;
533
+ }
534
+ /*
535
+ body.dark aside .selected {
536
+ border-left: 10px solid white;
537
+ }
538
+ aside .selected {
539
+ border-left: 10px solid black;
540
+ font-weight: bold;
541
+ opacity: 1;
542
+ }
543
+ */
544
+ .tab-content {
545
+ width: 100%;
546
+ display: flex;
547
+ flex-direction: column;
548
+ flex-wrap: wrap;
549
+ gap: 15px;
550
+ }
551
+ .tab:hover {
552
+ color: royalblue;
553
+ }
554
+ .tab-content .tab {
555
+ text-decoration: none;
556
+ display: flex;
557
+ font-size: 14px;
558
+ font-weight: bold;
559
+ color: black;
560
+ overflow: hidden;
561
+ box-sizing: border-box;
562
+ align-items: center;
563
+ gap: 5px;
564
+ background: rgba(0,0,0,0.04);
565
+ border-radius: 5px;
566
+ }
567
+ .tab .desc {
568
+ flex-grow: 1;
569
+ text-align: right;
570
+ }
571
+ body.dark aside .tab {
572
+ background: none;
573
+ }
574
+ body.dark .tab {
575
+ color: white;
576
+ background: rgba(255,255,255,0.03);
577
+ }
578
+ .tab h2 {
579
+ margin: 0;
580
+ font-size: 14px;
581
+ }
582
+ .tab .col {
583
+ flex-grow: 1;
584
+ margin-left: 10px;
585
+ }
586
+ .tab .emoji {
587
+ width: 30px;
588
+ height: 30px;
589
+ font-size: 20px;
590
+ box-sizing: border-box;
591
+ text-align:center;
592
+ display: flex;
593
+ justify-content: center;
594
+ align-items: center;
595
+ }
596
+ .tab i.img {
597
+ height: 30px;
598
+ width: 30px;
599
+ display: flex;
600
+ justify-content: center;
601
+ font-size: 20px;
602
+ align-items: center;
603
+ border-radius: 3px;
604
+ }
605
+ .tab .profile img, .tab .profile i {
606
+ height: 30px;
607
+ width: 30px;
608
+ font-size: 30px;
609
+ border-radius: 3px;
610
+ }
611
+ .menu-container {
612
+ max-width: 800px;
613
+ padding: 20px;
614
+ align-items: flex-start;
615
+ }
616
+ .menu-container {
617
+ display: flex;
618
+ box-sizing: border-box;
619
+ }
620
+ .submenu .tab {
621
+ padding: 0;
622
+ }
623
+ body.dark .net:hover, .net:hover {
624
+ color: royalblue;
625
+ }
626
+ body.dark .net {
627
+ /*
628
+ border-left: 3px solid white;
629
+ */
630
+ color: rgba(255,255,255,0.7);
631
+ }
632
+ .net {
633
+ color: rgba(0,0,0,0.7);
634
+ width: auto;
635
+ margin: 3px 0;
636
+ /*
637
+ padding-left: 5px;
638
+ border-left: 3px solid black;
639
+ */
640
+ font-size: 12px;
641
+ text-decoration: none;
642
+ display: block;
643
+ background: none;
644
+ }
645
+ .net .mark {
646
+ background: rgba(0,0,0,0.9);
647
+ border-radius: 3px;
648
+ color: white;
649
+ width: 40px;
650
+ display: inline-block;
651
+ text-align: center;
652
+ margin-right: 5px;
653
+ padding: 2px 8px;
654
+ font-size: 12px;
655
+ }
656
+ body.dark .net .mark {
657
+ background: white;
658
+ color: black;
659
+ }
660
+ .placeholder-icon {
661
+ font-size: 40px;
662
+ width: 50px;
663
+ height: 50px;
664
+ display: flex;
665
+ justify-content: center;
666
+ align-items: center;
667
+ }
668
+ .launch-btns .btn {
669
+ text-transform: capitalize;
670
+ }
671
+ .launch-btns {
672
+ display: flex;
673
+ }
674
+ .launch-btns .btn.launch{
675
+ width: 150px !important;
676
+ text-align: center !important;
677
+ }
678
+ .installed-apps .title i {
679
+ color: silver !important;
680
+ }
681
+ .tab.connected p {
682
+ margin: 0;
683
+ }
684
+ .tab.connected {
685
+ display: block;
686
+ }
687
+ .tab.connected .tab {
688
+ border-radius: 0;
689
+ }
690
+ .tab.connected .tab {
691
+ background: none;
692
+ }
693
+ td.bold {
694
+ font-weight: bold;
695
+ width: 100px;
696
+ }
697
+ /*
698
+ .tab.connected .desc, .tab.connected i, .tab.connected h2{
699
+ color: #78b61a;
700
+ }
701
+ body.dark .tab.connected .desc, body.dark .tab.connected i, body.dark .tab.connected h2{
702
+ color: greenyellow;
703
+ }
704
+ */
705
+ .profile {
706
+ width: 100%;
707
+ padding: 10px;
708
+ display: flex;
709
+ gap: 10px;
710
+ font-size: 14px;
711
+ box-sizing: border-box;
712
+ }
713
+ .profile-column {
714
+ flex-grow: 1;
715
+ }
716
+ .profile-column table {
717
+ width: 100%;
718
+ }
719
+ body.dark .profile td {
720
+ background: rgba(255,255,255,0.04);
721
+ }
722
+ .profile td {
723
+ min-width: 100px;
724
+ vertical-align: top;
725
+ font-size: 14px;
726
+ padding:6px 10px;
727
+ white-space: pre-wrap;
728
+ background: rgba(0,0,0,0.04);
729
+ }
730
+ .app-icon {
731
+ width: 25px;
732
+ padding: 5px;
733
+ }
734
+
735
+ @media only screen and (max-width: 800px) {
736
+ body {
737
+ display: flex !important;
738
+ flex-direction: row !important;
739
+ }
740
+ }
741
+ @media only screen and (max-width: 600px) {
742
+ aside {
743
+ width: unset;
744
+ flex-shrink: unset;
745
+ }
746
+ aside {
747
+ padding: 0 10px;
748
+ }
749
+ aside .tab i {
750
+ width: 100%;
751
+ }
752
+ aside .tab .caption {
753
+ display: none;
754
+ }
755
+ aside .tab {
756
+ margin: 0;
757
+ padding: 10px;
758
+ border-left: none;
759
+ }
760
+ aside .btn-tab {
761
+ flex-direction: column;
762
+ padding: 10px 0;
763
+ }
764
+ aside .btn-tab .btn {
765
+ display: flex;
766
+ justify-content: center;
767
+ }
768
+ aside .btn-tab .btn .caption {
769
+ display: none;
770
+ }
771
+ header .flexible {
772
+ min-width: unset;
773
+ }
774
+ }
775
+
776
+ @media only screen and (max-width: 480px) {
777
+ .btn2 {
778
+ padding: 5px;
779
+ font-size: 11px;
780
+ }
781
+ .nav-btns {
782
+ flex-grow: 1;
783
+ justify-content: center;
784
+ padding: 0;
785
+ }
786
+ }
220
787
  </style>
788
+ <script src="/popper.min.js"></script>
789
+ <script src="/tippy-bundle.umd.min.js"></script>
221
790
  <script src="/hotkeys.min.js"></script>
222
791
  <script src="/sweetalert2.js"></script>
223
792
  <script src="/common.js"></script>
@@ -228,48 +797,139 @@ body.dark .config {
228
797
  <header class='navheader grabbable'>
229
798
  <h1>
230
799
  <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
231
- <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
232
- <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
233
- <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
800
+ <button class='btn2' id='back' data-tippy-content="back"><div><i class="fa-solid fa-chevron-left"></i></div></button>
801
+ <button class='btn2' id='forward' data-tippy-content="forward"><div><i class="fa-solid fa-chevron-right"></i></div></button>
802
+ <button class='btn2' id='refresh-page' data-tippy-content="refresh"><div><i class="fa-solid fa-rotate-right"></i></div></button>
803
+ <button class='btn2' id='screenshot' data-tippy-content="take a screenshot"><i class="fa-solid fa-camera"></i></button>
234
804
  <div class='flexible'></div>
235
- <a href="/connect" class='btn2'><div><i class="fa-solid fa-circle-user"></i></div><div>Connect</div></a>
236
- <div class='nav-btns'>
237
- <a class='btn2' href="<%=portal%>" target="_blank"><div><i class="fa-solid fa-question"></i></div><div>Help</div></a>
238
- <button class='btn2' id='genlog'><div><i class="fa-solid fa-laptop-code"></i></div><div>Logs</div></button>
239
- <a id='downloadlogs' download class='hidden btn2' href="/pinokio/logs.zip"><div><i class="fa-solid fa-download"></i></div><div>Download logs</div></a>
240
- <a class='btn2' href="/?mode=settings"><div><i class="fa-solid fa-gear"></i></div><div>Settings</div></a>
241
- <button id='new-window' title='open a new window' class='btn2' data-agent="<%=agent%>"><div><i class="fa-solid fa-plus"></i></div><div>Window</div></button>
805
+ <a class='btn2' href="/columns" data-tippy-content="split into 2 columns">
806
+ <div><i class="fa-solid fa-table-columns"></i></div>
807
+ </a>
808
+ <a class='btn2' href="/rows" data-tippy-content="split into 2 rows">
809
+ <div><i class="fa-solid fa-table-columns fa-rotate-270"></i></div>
810
+ </a>
811
+ <div class="dropdown btn2">
812
+ <button class='btn2' id='window-management'>
813
+ <div><i class="fa-solid fa-plus"></i></div>
814
+ </button>
815
+ <div class="dropdown-content" id="dropdown-content">
816
+ <button class='btn2' id='clone-win' data-tippy-content="clone this window">
817
+ <div><i class="fa-solid fa-clone"></i><div>clone this window</div></div>
818
+ </button>
819
+ <button id='new-window' data-tippy-content="open a new window" title='open a new window' class='btn2' data-agent="<%=agent%>">
820
+ <div><i class="fa-solid fa-plus"></i><div>new window</div></div>
821
+ </button>
822
+ </div>
242
823
  </div>
243
- </h1>
824
+ <!--
825
+ <div class="dropdown btn2">
826
+ <button class='btn2' id='window-management'>
827
+ <div><i class="fa-regular fa-window-restore"></i></div>
828
+ </button>
829
+ <div class="dropdown-content" id="dropdown-content">
830
+ <button class='btn2' id='clone-win' data-tippy-content="clone this window">
831
+ <div><i class="fa-solid fa-clone"></i><div>clone this window</div></div>
832
+ </button>
833
+ <a class='btn2' href="/columns" data-tippy-content="split into 2 columns">
834
+ <div><i class="fa-solid fa-table-columns"></i><div>split columns</div></div>
835
+ </a>
836
+ <a class='btn2' href="/rows" data-tippy-content="split into 2 rows">
837
+ <div><i class="fa-solid fa-table-columns fa-rotate-270"></i><div>split rows</div></div>
838
+ </a>
839
+ <button id='new-window' data-tippy-content="open a new window" title='open a new window' class='btn2' data-agent="<%=agent%>">
840
+ <div><i class="fa-solid fa-plus"></i><div>new window</div></div>
841
+ </button>
842
+ </div>
843
+ </div>
844
+ -->
845
+ <button class='btn2 hidden' id='close-window' data-tippy-content='close this section'>
846
+ <div><i class="fa-solid fa-xmark"></i></div>
847
+ </button>
244
848
  </h1>
245
849
  </header>
246
850
  <main>
851
+ <div class='container'>
247
852
  <div class='config'>
248
853
  <div class='config-header'>
249
- <div class='header-label'><i class='fa-solid fa-circle-user'></i> Connect</div>
250
- <div class='desc'>Authenticate 3rd party services with Pinokio.</div>
854
+ <div class='header-label'><i class="fa-solid fa-plug"></i> Login</div>
855
+ <div class='desc'>Log into localhost apps with 3rd party services.</div>
251
856
  </div>
252
857
  </div>
253
- <div class='container'>
254
- <div class='container-row'>
255
- <% items.forEach((item) => { %>
256
- <a class='card' href="<%=item.url%>">
257
- <i class="<%=item.icon%>"></i>
258
- <div class='col'>
259
- <h3><%=item.title%></h3>
260
- <div class='desc'><%=item.description%></div>
261
- </div>
262
- </a>
263
- <% }) %>
858
+ <div class='menu-container'>
859
+ <div class='tab-content'>
860
+ <% items.forEach((item) => { %>
861
+ <% if (item.profile) { %>
862
+ <a href="<%=item.url%>" class="tab connected" target="_blank">
863
+ <div class='tab'>
864
+ <% if (item.image) { %>
865
+ <img class="app-icon" src="<%=item.image%>"/>
866
+ <% } else if (item.icon) { %>
867
+ <i class="<%=item.icon%> img"></i>
868
+ <% } else if (item.emoji) { %>
869
+ <div class='emoji'><%=item.emoji%></div>
870
+ <% } %>
871
+ <h2><%=item.title%></h2>
872
+ <div class="desc"><%-item.description%></div>
873
+ <div class="btn">
874
+ <i class="fa-solid fa-angle-right"></i>
875
+ </div>
876
+ </div>
877
+ <div class="profile">
878
+ <% if (item.profile.image) { %>
879
+ <img src="<%=item.profile.image%>">
880
+ <% } else if (item.profile.icon) { %>
881
+ <i class="<%=item.profile.icon%>"></i>
882
+ <% } %>
883
+ <div class='profile-column'>
884
+ <table>
885
+ <% item.profile.items.forEach((row) => { %>
886
+ <tr><td class='bold'><%=row.key%></td><td><%=row.val%></td></tr>
887
+ <% }) %>
888
+ </table>
889
+ </div>
890
+ </div>
891
+ </a>
892
+ <% } else { %>
893
+ <a href="<%=item.url%>" class="tab" target="_blank">
894
+ <% if (item.image) { %>
895
+ <img class="icon" src="<%=item.image%>"/>
896
+ <% } else if (item.icon) { %>
897
+ <i class="<%=item.icon%> img"></i>
898
+ <% } else if (item.emoji) { %>
899
+ <div class='emoji'><%=item.emoji%></div>
900
+ <% } %>
901
+ <h2><%=item.title%></h2>
902
+ <div class="desc"><%=item.description%></div>
903
+ <div class="btn">
904
+ <i class="fa-solid fa-angle-right"></i>
905
+ </div>
906
+ </a>
907
+ <% } %>
908
+ <% }) %>
264
909
  </div>
265
- <!--
266
- <div class='config-row' id='network_name'>
267
- <div class='label'>Network Name</div>
268
- <input id='name' type='text' value="name">
269
- </div>
270
- <button class='btn save'>Save</button>
271
- -->
272
910
  </div>
911
+ </div>
912
+ <aside>
913
+ <div class='btn-tab'>
914
+ <a href="/init" class='btn'><i class="fa-solid fa-plus"></i><div class='caption'>Create</div></a>
915
+ <a class='btn' id='explore' href="/?mode=explore"><i class="fa-solid fa-globe"></i><div class='caption'>Discover</div></a>
916
+ </div>
917
+ <a href="/" class='tab'><i class='fas fa-laptop-code'></i><div class='caption'>This machine</div></a>
918
+ <a href="/network" class='tab'><i class="fa-solid fa-wifi"></i><div class='caption'>Local network</div></a>
919
+ <% if (list.length > 0) { %>
920
+ <% let brands = { win32: "windows", darwin: "apple", linux: "Linux" } %>
921
+ <% list.forEach(({ host, name, platform, processes }, index) => { %>
922
+ <a href="/net/<%=name%>" class='submenu tab'><i class="fa-brands fa-<%=brands[platform]%>"></i><div class='caption'><%=name%> (<%=current_host === host ? 'this machine' : host%>)</div></a>
923
+ <% }) %>
924
+ <% } %>
925
+ <a href="/connect" class='tab selected'><i class="fa-solid fa-plug"></i><div class='caption'>Login</div></a>
926
+ <a class='tab' href="<%=portal%>" target="_blank"><i class="fa-solid fa-question"></i><div class='caption'>Help</div></a>
927
+ <a class='tab' id='genlog'><i class="fa-solid fa-laptop-code"></i><div class='caption'>Logs</div></a>
928
+ <a id='downloadlogs' download class='hidden btn2' href="/pinokio/logs.zip"><i class="fa-solid fa-download"></i><div class='caption'>Download logs</div></a>
929
+ <a class='tab' href="/screenshots"><i class="fa-solid fa-camera"></i><div class='caption'>Screenshots</div></a>
930
+ <a class='tab' href="/tools"><i class="fa-solid fa-toolbox"></i><div class='caption'>Installed Tools</div></a>
931
+ <a class='tab' href="/?mode=settings"><i class="fa-solid fa-gear"></i><div class='caption'>Settings</div></a>
932
+ </aside>
273
933
  </main>
274
934
  </body>
275
935
  </html>