pinokiod 3.40.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 +1048 -970
  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 +229 -93
  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
@@ -156,10 +156,7 @@ a.ln:hover {
156
156
  color: red !important;
157
157
  }
158
158
  .line.align-top h3 {
159
- /*
160
159
  align-items: flex-start;
161
- */
162
- align-items: center;
163
160
  }
164
161
  .line a:hover {
165
162
  color: red;
@@ -177,7 +174,6 @@ a.ln:hover {
177
174
  .header-label {
178
175
  padding: 0;
179
176
  font-size: 30px;
180
- font-weight: lighter;
181
177
  /*
182
178
  text-align: center;
183
179
  */
@@ -243,7 +239,7 @@ a.ln:hover {
243
239
  margin-right: 10px;
244
240
  padding-top: 5px;
245
241
  padding-bottom: 0 !important;
246
- text-decoration: underline;
242
+ text-decoration: none;
247
243
  color: royalblue;
248
244
  cursor: pointer;
249
245
  }
@@ -285,16 +281,11 @@ td:first-child, th:first-child {
285
281
 
286
282
  body.dark .config {
287
283
  color: white;
288
- background: rgba(255,255,255,0.04);
289
284
  }
290
285
  .config {
291
- /*
292
- background: rgba(0,0,0,0.9);
293
- */
294
286
  color: black;
295
- text-align: left;
296
- padding: 40px;
297
- background: rgba(0,0,0,0.04);
287
+ padding: 30px;
288
+ margin: 10px 0;
298
289
  }
299
290
  .config-header {
300
291
  }
@@ -309,6 +300,8 @@ body.dark .config .btn {
309
300
  font-size: 16px;
310
301
  font-weight: bold;
311
302
  width: 100px;
303
+ /*
304
+ */
312
305
  background: royalblue;
313
306
  flex-shrink: 0;
314
307
  }
@@ -325,7 +318,9 @@ body.dark .config-row input[type=text] {
325
318
  background: white;
326
319
  }
327
320
  .config-row input[type=text] {
328
- padding: 5px 10px;
321
+ padding: 5px 15px;
322
+ border-top-left-radius: 30px;
323
+ border-bottom-left-radius: 30px;
329
324
  }
330
325
  .app-btns .btn {
331
326
  border-radius: 4px;
@@ -363,9 +358,11 @@ body.dark .config-row input[type=text] {
363
358
  background-color: #ccc;
364
359
  -webkit-transition: .4s;
365
360
  transition: .4s;
361
+ border-radius: 50px;
366
362
  }
367
363
 
368
364
  .slider:before {
365
+ border-radius: 50px;
369
366
  position: absolute;
370
367
  content: "";
371
368
  height: 30px;
@@ -380,6 +377,7 @@ body.dark .config-row input[type=text] {
380
377
  input:checked + .slider {
381
378
  /*
382
379
  background-color: #2196F3;
380
+ background: black;
383
381
  */
384
382
  background-color: royalblue;
385
383
  }
@@ -453,14 +451,6 @@ body.dark .desc {
453
451
  background: none !important;
454
452
  padding: 0 !important;
455
453
  }
456
- .grid-1, .grid-2, .grid-3 {
457
- background: rgba(0,0,0,0.04);
458
- margin-top: 5px;
459
- }
460
- body.dark .grid-1, body.dark .grid-2, body.dark .grid-3 {
461
- background: rgba(255,255,255,0.03);
462
- margin-top: 5px;
463
- }
464
454
  main {
465
455
  display: flex;
466
456
  }
@@ -468,7 +458,6 @@ aside {
468
458
  width: 200px;
469
459
  display: block;
470
460
  flex-shrink: 0;
471
- border-right: 1px solid rgba(0,0,0,0.04);
472
461
  }
473
462
  aside .tab i {
474
463
  width: 20px;
@@ -482,7 +471,9 @@ body.dark aside .tab:hover, aside .tab:hover {
482
471
  opacity: 1;
483
472
  }
484
473
  aside .tab {
485
- display: block;
474
+ display: flex;
475
+ align-items: center;
476
+ gap: 5px;
486
477
  color: black;
487
478
  text-decoration: none;
488
479
  padding: 10px;
@@ -687,6 +678,7 @@ body.dark .context-menu-wrapper {
687
678
  flex-shrink: 0;
688
679
  }
689
680
  body.dark .section-header {
681
+ background: rgba(255,255,255,0.04);
690
682
  /*
691
683
  border-bottom: 1px solid rgba(255,255,255,0.07);
692
684
  */
@@ -697,17 +689,18 @@ body.dark .section-header {
697
689
  */
698
690
  font-weight: normal;
699
691
  font-size: 14px;
700
- padding: 15px 5px;
692
+ padding: 30px 5px;
701
693
  /*
702
694
  margin: 0 0 15px;
703
695
  */
696
+ background: rgba(0,0,0,0.04);
704
697
  }
705
698
  .section-header h2 {
706
699
  font-size: 20px;
707
700
  font-weight: lighter;
708
701
  }
709
702
  .section-header .section {
710
- padding: 0;
703
+ box-sizing: border-box;
711
704
  }
712
705
  .section-header .section div {
713
706
  font-weight: normal;
@@ -724,6 +717,9 @@ body.dark .section-header {
724
717
  min-width: 0;
725
718
  word-wrap: break-word;
726
719
  }
720
+ body.dark .btn {
721
+ background: rgba(255,255,255,0.05);
722
+ }
727
723
  /*
728
724
  body.dark .btn {
729
725
  background: rgba(255,255,255,0.05) !important;
@@ -780,15 +776,20 @@ body.dark .open-menu, body.dark .browse {
780
776
  }
781
777
  .section {
782
778
  display: block;
779
+ min-width: 0;
783
780
  }
784
- .section h2 {
785
- margin: 0;
781
+ .line {
782
+ padding: 10px;
786
783
  }
787
784
  .line.align-top h3 .col .btn {
788
785
  box-sizing: border-box;
789
786
  margin-top: 5px;
790
787
  width: 100%;
791
788
  }
789
+ .c {
790
+ flex-grow: 1;
791
+ min-width: 0;
792
+ }
792
793
  .desc {
793
794
  font-size: 14px;
794
795
  color: rgba(0, 0, 0, 0.7);
@@ -806,22 +807,31 @@ body.dark .open-menu, body.dark .browse {
806
807
  display: grid;
807
808
  grid-template-columns: repeat(3, 1fr); /* Three equal columns */
808
809
  gap: 1rem; /* Optional spacing between columns */
809
- padding: 10px;
810
+ padding: 5px 0;
810
811
  }
811
812
  .section-header .grid-1, .section-header .grid-2, .section-header .grid-3 {
812
813
  background: none !important;
813
814
  padding: 0 !important;
814
815
  }
815
- .grid-1, .grid-2, .grid-3 {
816
- background: rgba(0,0,0,0.04);
817
- margin-top: 5px;
816
+ .section-header .section {
817
+ text-align: center;
818
+ padding: 0 10px;
818
819
  }
819
- body.dark .grid-1, body.dark .grid-2, body.dark .grid-3 {
820
- background: rgba(255,255,255,0.03);
821
- margin-top: 5px;
820
+ .section-header .section h2 {
821
+ margin: 0;
822
+ font-weight: bold;
823
+ text-align: center;
824
+ }
825
+ .section-header .section h2 i {
826
+ font-size: 30px;
827
+ width: 100%;
828
+ display: block;
829
+ text-align: center;
830
+ padding: 10px;
822
831
  }
823
832
  main {
824
833
  display: flex;
834
+ min-width: 0;
825
835
  }
826
836
  .help {
827
837
  padding:30px;
@@ -832,7 +842,6 @@ aside {
832
842
  width: 200px;
833
843
  display: block;
834
844
  flex-shrink: 0;
835
- border-right: 1px solid rgba(0,0,0,0.04);
836
845
  }
837
846
  aside .tab i {
838
847
  width: 20px;
@@ -846,7 +855,9 @@ body.dark aside .tab:hover, aside .tab:hover {
846
855
  opacity: 1;
847
856
  }
848
857
  aside .tab {
849
- display: block;
858
+ display: flex;
859
+ align-items: center;
860
+ gap: 5px;
850
861
  color: black;
851
862
  text-decoration: none;
852
863
  padding: 10px;
@@ -871,6 +882,11 @@ aside .selected {
871
882
  opacity: 1;
872
883
  }
873
884
  */
885
+ .loader {
886
+ padding: 50px;
887
+ text-align: center;
888
+ font-size: 40px;
889
+ }
874
890
  .submenu .tab {
875
891
  padding: 0;
876
892
  }
@@ -901,14 +917,28 @@ body.dark .net {
901
917
  justify-content: center;
902
918
  align-items: center;
903
919
  }
920
+ body.dark .troubleshoot {
921
+ color: rgba(255,255,255,0.5);
922
+ }
923
+ .troubleshoot {
924
+ color: rgba(0,0,0,0.5);
925
+ }
926
+ .network-name.expanded .btn {
927
+ border-top-right-radius: 30px;
928
+ border-bottom-right-radius: 30px;
929
+ border-top-left-radius: 0px;
930
+ border-bottom-left-radius: 0px;
931
+ }
904
932
  .network-name {
905
933
  display: flex;
906
934
  }
907
935
  .network-name .btn {
908
- border-radius: 0;
936
+ border-top-left-radius: 30px;
937
+ border-bottom-left-radius: 30px;
938
+ border-top-right-radius: 30px;
939
+ border-bottom-right-radius: 30px;
909
940
  }
910
941
  .network-name input[type=text] {
911
- border-radius: 0;
912
942
  border: none;
913
943
  background: rgba(0,0,0,0.1);
914
944
  }
@@ -923,6 +953,46 @@ body.dark .net {
923
953
  color: silver !important;
924
954
  }
925
955
 
956
+ @media only screen and (max-width: 800px) {
957
+ body {
958
+ display: flex !important;
959
+ flex-direction: row !important;
960
+ }
961
+ }
962
+ @media only screen and (max-width: 600px) {
963
+ aside {
964
+ width: unset;
965
+ flex-shrink: unset;
966
+ }
967
+ aside {
968
+ padding: 0 10px;
969
+ }
970
+ aside .tab i {
971
+ width: 100%;
972
+ }
973
+ aside .tab .caption {
974
+ display: none;
975
+ }
976
+ aside .tab {
977
+ margin: 0;
978
+ padding: 10px;
979
+ border-left: none;
980
+ }
981
+ aside .btn-tab {
982
+ flex-direction: column;
983
+ padding: 10px 0;
984
+ }
985
+ aside .btn-tab .btn {
986
+ display: flex;
987
+ justify-content: center;
988
+ }
989
+ aside .btn-tab .btn .caption {
990
+ display: none;
991
+ }
992
+ header .flexible {
993
+ min-width: unset;
994
+ }
995
+ }
926
996
 
927
997
  @media only screen and (max-width: 480px) {
928
998
  .btn2 {
@@ -936,6 +1006,8 @@ body.dark .net {
936
1006
  }
937
1007
  }
938
1008
  </style>
1009
+ <script src="/popper.min.js"></script>
1010
+ <script src="/tippy-bundle.umd.min.js"></script>
939
1011
  <script src="/hotkeys.min.js"></script>
940
1012
  <script src="/sweetalert2.js"></script>
941
1013
  <script src="/common.js"></script>
@@ -946,26 +1018,49 @@ body.dark .net {
946
1018
  <header class='navheader grabbable'>
947
1019
  <h1>
948
1020
  <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
949
- <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
950
- <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
951
- <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
952
- <div class='url-bar'>
953
- <% if (current_urls.https) { %>
954
- <a class='https-url' target="_blank" href="<%=current_urls.https%>"><i class="fa-solid fa-square-arrow-up-right"></i> <%=current_urls.https%></a>
955
- <% } %>
956
- <% if (current_urls.http) { %>
957
- <a class='http-url' target="_blank" href="<%=current_urls.http%>"><i class="fa-solid fa-square-arrow-up-right"></i> <%=current_urls.http%></a>
958
- <% } %>
959
- </div>
1021
+ <button class='btn2' id='back' data-tippy-content="back"><div><i class="fa-solid fa-chevron-left"></i></div></button>
1022
+ <button class='btn2' id='forward' data-tippy-content="forward"><div><i class="fa-solid fa-chevron-right"></i></div></button>
1023
+ <button class='btn2' id='refresh-page' data-tippy-content="refresh"><div><i class="fa-solid fa-rotate-right"></i></div></button>
1024
+ <button class='btn2' id='screenshot' data-tippy-content="take a screenshot"><i class="fa-solid fa-camera"></i></button>
960
1025
  <div class='flexible'></div>
961
- <a href="/connect" class='btn2'><div><i class="fa-solid fa-circle-user"></i></div><div>Connect</div></a>
962
- <div class='nav-btns'>
963
- <a class='btn2' href="<%=portal%>" target="_blank"><div><i class="fa-solid fa-question"></i></div><div>Help</div></a>
964
- <button class='btn2' id='genlog'><div><i class="fa-solid fa-laptop-code"></i></div><div>Logs</div></button>
965
- <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>
966
- <a class='btn2' href="/?mode=settings"><div><i class="fa-solid fa-gear"></i></div><div>Settings</div></a>
967
- <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>
1026
+ <a class='btn2' href="/columns" data-tippy-content="split into 2 columns">
1027
+ <div><i class="fa-solid fa-table-columns"></i></div>
1028
+ </a>
1029
+ <a class='btn2' href="/rows" data-tippy-content="split into 2 rows">
1030
+ <div><i class="fa-solid fa-table-columns fa-rotate-270"></i></div>
1031
+ </a>
1032
+ <div class="dropdown-content" id="dropdown-content">
1033
+ <button class='btn2' id='clone-win' data-tippy-content="clone this window">
1034
+ <div><i class="fa-solid fa-clone"></i><div>clone this window</div></div>
1035
+ </button>
1036
+ <button id='new-window' data-tippy-content="open a new window" title='open a new window' class='btn2' data-agent="<%=agent%>">
1037
+ <div><i class="fa-solid fa-plus"></i><div>new window</div></div>
1038
+ </button>
1039
+ </div>
1040
+ <!--
1041
+ <div class="dropdown btn2">
1042
+ <button class='btn2' id='window-management'>
1043
+ <div><i class="fa-regular fa-window-restore"></i></div>
1044
+ </button>
1045
+ <div class="dropdown-content" id="dropdown-content">
1046
+ <button class='btn2' id='clone-win' data-tippy-content="clone this window">
1047
+ <div><i class="fa-solid fa-clone"></i><div>clone this window</div></div>
1048
+ </button>
1049
+ <a class='btn2' href="/columns" data-tippy-content="split into 2 columns">
1050
+ <div><i class="fa-solid fa-table-columns"></i><div>split columns</div></div>
1051
+ </a>
1052
+ <a class='btn2' href="/rows" data-tippy-content="split into 2 rows">
1053
+ <div><i class="fa-solid fa-table-columns fa-rotate-270"></i><div>split rows</div></div>
1054
+ </a>
1055
+ <button id='new-window' data-tippy-content="open a new window" title='open a new window' class='btn2' data-agent="<%=agent%>">
1056
+ <div><i class="fa-solid fa-plus"></i><div>new window</div></div>
1057
+ </button>
1058
+ </div>
968
1059
  </div>
1060
+ -->
1061
+ <button class='btn2 hidden' id='close-window' data-tippy-content='close this section'>
1062
+ <div><i class="fa-solid fa-xmark"></i></div>
1063
+ </button>
969
1064
  </h1>
970
1065
  </header>
971
1066
  <!--
@@ -978,23 +1073,6 @@ body.dark .net {
978
1073
  </form>
979
1074
  -->
980
1075
  <main>
981
- <aside>
982
- <div class='btn-tab'>
983
- <a href="/init" class='btn'><i class="fa-solid fa-plus"></i> Create</a>
984
- <a class='btn' id='explore' href="/?mode=explore"><i class="fa-solid fa-globe"></i> Discover</a>
985
- </div>
986
- <a href="/" class='tab'><i class='fas fa-laptop-code'></i> Local</a>
987
- <a href="/network" class='tab selected'><i class="fa-solid fa-wifi"></i> Network</a>
988
- <% if (list.length > 0) { %>
989
- <% let brands = { win32: "windows", darwin: "apple", linux: "Linux" } %>
990
- <% list.forEach(({ host, name, platform, processes }, index) => { %>
991
- <!--
992
- <a href="http://<%=host%>:42000" class='submenu tab' target="_blank"><i class="fa-brands fa-<%=brands[platform]%>"></i> <%=name%> (<%=current_host === host ? 'this machine' : host%>)</a>
993
- -->
994
- <a href="/net/<%=name%>" class='submenu tab'><i class="fa-brands fa-<%=brands[platform]%>"></i> <%=name%> (<%=current_host === host ? 'this machine' : host%>)</a>
995
- <% }) %>
996
- <% } %>
997
- </aside>
998
1076
  <div class='c'>
999
1077
  <div class='container'>
1000
1078
  <div class='config'>
@@ -1024,7 +1102,7 @@ body.dark .net {
1024
1102
  <div id='advanced-label' class='link-label label'>Advanced</div>
1025
1103
  <div id='reset-label' class='btn'>Reset</div>
1026
1104
  -->
1027
- <div>
1105
+ <div class='troubleshoot'>
1028
1106
  Not working properly? <span id='reset-label' class='link-label label'>Try reinstalling the Network Module & Certificates</span>
1029
1107
  </div>
1030
1108
  </div>
@@ -1034,18 +1112,6 @@ body.dark .net {
1034
1112
  </div>
1035
1113
  </div>
1036
1114
  <div class='container'>
1037
- <div class="section-header">
1038
- <h3>
1039
- <div class="col">
1040
- <div class="grid-1">
1041
- <div class="section">
1042
- <h2>Servers running on this machine</h2>
1043
- <div>Pinokio automatically creates a proxy that makes all your local servers accessible from other machines on the same network.</div>
1044
- </div>
1045
- </div>
1046
- </div>
1047
- </h3>
1048
- </div>
1049
1115
  <div class='running-apps'>
1050
1116
  <div class='section-header'>
1051
1117
  <h3>
@@ -1053,25 +1119,32 @@ body.dark .net {
1053
1119
  <div class='col'>
1054
1120
  <div class='grid-3'>
1055
1121
  <div class='section'>
1056
- <h2><i class='fas fa-laptop-code'></i> Local</h2>
1057
- <div>These urls work on this machine only.</div>
1122
+ <h2><i class='fas fa-laptop-code'></i> This machine</h2>
1123
+ <div>Use these URLs on this machine.</div>
1058
1124
  </div>
1059
1125
  <div class='section'>
1060
- <h2><i class="fa-solid fa-wifi"></i> Network</h2><div>These urls work on any machine on the same local network.</div>
1126
+ <h2><i class="fa-solid fa-wifi"></i> Local network</h2><div>Use these URLs from other machines on the same local network.</div>
1061
1127
  </div>
1062
1128
  <div class='section'>
1063
- <h2><i class="fa-solid fa-podcast"></i> Peer</h2><div>These urls work on other pinokio peers on the same local network <a class='explain' data-type='peer'>How to start a peer</a></div>
1129
+ <h2><i class="fa-solid fa-podcast"></i> Local HTTPS network</h2><div>Use these URLs from other pinokio peers on the same local network <a class='explain' data-type='peer'>How to start a peer</a></div>
1064
1130
  </div>
1065
1131
  </div>
1066
1132
  </div>
1067
1133
  </h3>
1068
1134
  </div>
1135
+ <% if (requirements_pending || peer_active && processes.length === 0) { %>
1136
+ <div class='loader'>
1137
+ <i class="fa-solid fa-circle-notch fa-spin"></i>
1138
+ </div>
1139
+ <% } %>
1069
1140
  <% processes.forEach((item, index) => { %>
1070
1141
  <div class='line align-top' data-index="<%=index%>" data-name="<%=item.name%>" data-title="<%=item.name%>" data-description="<%=item.internal_router.join(' ')%> <%=item.port%>">
1071
1142
  <h3>
1072
1143
  <div class='item-icon'>
1073
1144
  <% if (item.icon) { %>
1074
- <img src="<%=item.icon%>">
1145
+ <div class='placeholder-icon'>
1146
+ <img src="<%=item.icon%>">
1147
+ </div>
1075
1148
  <% } else { %>
1076
1149
  <div class='placeholder-icon'>
1077
1150
  <i class="fa-solid fa-database"></i>
@@ -1099,12 +1172,68 @@ body.dark .net {
1099
1172
  </div>
1100
1173
  </div>
1101
1174
  </div>
1102
- </div>
1103
- </h3>
1175
+ </h3>
1176
+ </div>
1177
+ <% }) %>
1178
+ <% static_routes.forEach((route, index) => { %>
1179
+ <div class='line align-top' data-index="<%=processes.length+index%>" data-name="<%=route.name%>" data-title="<%=route.name%>" data-description="<%=route.internal_router.join(' ')%>">
1180
+ <h3>
1181
+ <div class='item-icon'>
1182
+ <div class='placeholder-icon'>
1183
+ <i class="fa-solid fa-database"></i>
1184
+ </div>
1185
+ </div>
1186
+ <div class='col'>
1187
+ <div class='title'><i class="fa-solid fa-circle"></i><span><%=route.name%></span></div>
1188
+ <div class='grid-3'>
1189
+ <div class='section'>
1190
+ <% route.internal_router.forEach((domain) => { %>
1191
+ <% if (domain.endsWith(".localhost")) { %>
1192
+ <a class='net' target="_blank" href="https://<%=domain%>">https://<%=domain%></a>
1193
+ <% } else { %>
1194
+ <a class='net' target="_blank" href="http://<%=domain%>">http://<%=domain%></a>
1195
+ <% } %>
1196
+ <% }) %>
1197
+ </div>
1198
+ <div class='section'>
1199
+ <% if (route.external_ip) { %>
1200
+ <a class='net' target="_blank" href="http://<%=route.external_ip%>">http://<%=route.external_ip%></a>
1201
+ <% } %>
1202
+ </div>
1203
+ <div class='section'>
1204
+ <% route.external_router.forEach((domain) => { %>
1205
+ <a class='net' target="_blank" href="https://<%=domain%>">https://<%=domain%></a>
1206
+ <% }) %>
1207
+ </div>
1208
+ </div>
1209
+ </div>
1210
+ </h3>
1211
+ </div>
1104
1212
  <% }) %>
1105
1213
  </div>
1106
1214
  </div>
1107
1215
  </div>
1216
+ <aside>
1217
+ <div class='btn-tab'>
1218
+ <a href="/init" class='btn'><i class="fa-solid fa-plus"></i><div class='caption'>Create</div></a>
1219
+ <a class='btn' id='explore' href="/?mode=explore"><i class="fa-solid fa-globe"></i><div class='caption'>Discover</div></a>
1220
+ </div>
1221
+ <a href="/" class='tab'><i class='fas fa-laptop-code'></i><div class='caption'>This machine</div></a>
1222
+ <a href="/network" class='tab selected'><i class="fa-solid fa-wifi"></i><div class='caption'>Local network</div></a>
1223
+ <% if (list.length > 0) { %>
1224
+ <% let brands = { win32: "windows", darwin: "apple", linux: "Linux" } %>
1225
+ <% list.forEach(({ host, name, platform, processes }, index) => { %>
1226
+ <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>
1227
+ <% }) %>
1228
+ <% } %>
1229
+ <a href="/connect" class='tab'><i class="fa-solid fa-plug"></i><div class='caption'>Login</div></a>
1230
+ <a class='tab' href="<%=portal%>" target="_blank"><i class="fa-solid fa-question"></i><div class='caption'>Help</div></a>
1231
+ <a class='tab' id='genlog'><i class="fa-solid fa-laptop-code"></i><div class='caption'>Logs</div></a>
1232
+ <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>
1233
+ <a class='tab' href="/screenshots"><i class="fa-solid fa-camera"></i><div class='caption'>Screenshots</div></a>
1234
+ <a class='tab' href="/tools"><i class="fa-solid fa-toolbox"></i><div class='caption'>Installed Tools</div></a>
1235
+ <a class='tab' href="/?mode=settings"><i class="fa-solid fa-gear"></i><div class='caption'>Settings</div></a>
1236
+ </aside>
1108
1237
  </main>
1109
1238
  <script>
1110
1239
  document.querySelector("#reset-label").addEventListener("click", async (e) => {
@@ -1171,17 +1300,23 @@ document.querySelector("#advanced-label").addEventListener("click", (e) => {
1171
1300
  if (document.querySelector("#active").checked) {
1172
1301
  console.log("checked")
1173
1302
  document.querySelector("#network_name").classList.remove("hidden")
1303
+ document.querySelector(".network-name").classList.add("expanded")
1174
1304
  } else {
1175
1305
  console.log("not checked")
1176
1306
  document.querySelector("#network_name").classList.add("hidden")
1307
+ document.querySelector(".network-name").classList.remove("expanded")
1177
1308
  }
1178
1309
  document.querySelector("#active").addEventListener("change", (e)=> {
1179
1310
  console.log(e.target.checked)
1180
1311
  if (e.target.checked) {
1181
1312
  document.querySelector("#network_name").classList.remove("hidden")
1313
+ document.querySelector(".network-name").classList.add("expanded")
1314
+ document.querySelector("#name").classList.remove("hidden")
1182
1315
  document.querySelector("#active-label").innerHTML = "On"
1183
1316
  } else {
1184
1317
  document.querySelector("#network_name").classList.add("hidden")
1318
+ document.querySelector(".network-name").classList.remove("expanded")
1319
+ document.querySelector("#name").classList.add("hidden")
1185
1320
  document.querySelector("#active-label").innerHTML = "Off"
1186
1321
  }
1187
1322
  })
@@ -1270,6 +1405,7 @@ document.querySelector("main").addEventListener("click", async (e) => {
1270
1405
  return res.json()
1271
1406
  })
1272
1407
  if (r.success) {
1408
+ document.querySelector("#network_name").classList.add("hidden")
1273
1409
  //alert("Successfully updated the pinokio home to " + val)
1274
1410
  document.querySelector(".loading").classList.remove("hidden")
1275
1411
  document.querySelector(".save").classList.add("hidden")
@@ -419,11 +419,10 @@ table h3 {
419
419
  <header class='navheader grabbable'>
420
420
  <h1>
421
421
  <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
422
- <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
423
- <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
424
- <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
422
+ <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div></button>
423
+ <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div></button>
424
+ <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div></button>
425
425
  <div class='flexible'></div>
426
- <a href="/connect" class='btn2'><div><i class="fa-solid fa-circle-user"></i></div><div>Connect</div></a>
427
426
  <div class='nav-btns'>
428
427
  <a class='btn2' href="<%=portal%>" target="_blank"><div><i class="fa-solid fa-question"></i></div><div>Help</div></a>
429
428
  <button class='btn2' id='genlog'><div><i class="fa-solid fa-laptop-code"></i></div><div>Logs</div></button>
@@ -402,9 +402,9 @@ input:checked + .slider:before {
402
402
  <header class='navheader grabbable'>
403
403
  <h1>
404
404
  <a class='home' href="/"><img class='icon' src="/pinokio-black.png"></a>
405
- <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div><div>Prev</div></button>
406
- <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div><div>Next</div></button>
407
- <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div><div>Refresh</div></button>
405
+ <button class='btn2' id='back'><div><i class="fa-solid fa-chevron-left"></i></div></button>
406
+ <button class='btn2' id='forward'><div><i class="fa-solid fa-chevron-right"></i></div></button>
407
+ <button class='btn2' id='refresh-page'><div><i class="fa-solid fa-rotate-right"></i></div></button>
408
408
  <a class='btn2 create-new' id='create-new-folder'><div><i class="fa-solid fa-folder-plus"></i></div><div>Create</div></a>
409
409
  <a href="/connect" class='btn2'><div><i class="fa-solid fa-circle-user"></i></div><div>Connect</div></a>
410
410
  <div class='flexible'></div>