pinokiod 3.9.3 → 3.9.13

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.
@@ -1,3 +1,4 @@
1
+ /*
1
2
  aside .menu, aside .temp-menu, aside .footer, aside .grid-btns, aside .system, aside #new-tab {
2
3
  -webkit-app-region: no-drag !important;
3
4
  cursor: auto;
@@ -11,6 +12,7 @@ aside {
11
12
  -webkit-app-region: drag;
12
13
  padding: 25px 0px 0px !important;
13
14
  }
15
+ */
14
16
  .grabbable {
15
17
  cursor: grab;
16
18
  -webkit-app-region: drag;
@@ -36,6 +36,8 @@ const ModalInput = async (params, uri) => {
36
36
  }).join("")
37
37
  input = `<select data-id="${field.key}">${items}</select>`
38
38
  }
39
+ } else if (type === 'checkbox') {
40
+ input = `<div class='checkbox-row'><input data-type="checkbox" type="checkbox" data-id="${field.key}" value="${field.key}" />${field.text}</div>`
39
41
  } else if (type === 'file') {
40
42
  input = `<div class='dropzone' data-type='file' data-id='${field.key}'></div>`
41
43
  //input = `<input type='file' data-id="${field.key}" />`
@@ -84,11 +86,14 @@ const ModalInput = async (params, uri) => {
84
86
  for(let field of form) {
85
87
  let input = Swal.getPopup().querySelector("[data-id='" + field.key + "']")
86
88
  let type = input.getAttribute("data-type")
87
- if (type !== 'file') {
89
+ debugger
90
+ if (type !== 'file' && type !== 'checkbox') {
88
91
  response[field.key] = input.value
89
92
  }
93
+ if (type === 'checkbox') {
94
+ response[field.key] = input.checked
95
+ }
90
96
 
91
- // let type = input.getAttribute("type")
92
97
  // if (type === 'file') {
93
98
  // const file = input.files[0];
94
99
  // const reader = new FileReader();
@@ -8,6 +8,8 @@ document.addEventListener("click", async (e) => {
8
8
  }
9
9
  }
10
10
  if (el) {
11
+ e.preventDefault()
12
+ e.stopPropagation()
11
13
  let filepath = el.getAttribute("data-filepath")
12
14
  let command = el.getAttribute("data-command")
13
15
  await fetch("/openfs", {
@@ -26,6 +28,36 @@ document.addEventListener("click", async (e) => {
26
28
  return
27
29
  }
28
30
 
31
+ // [data-run] runs commands kernel.exec (without a shell UI)
32
+ el = e.target.closest("[data-run]")
33
+ if (!el) {
34
+ let run = e.target.getAttribute("[data-run]")
35
+ if (run) {
36
+ el = e.target
37
+ }
38
+ }
39
+ if (el) {
40
+ debugger
41
+ e.preventDefault()
42
+ e.stopPropagation()
43
+ let run = el.getAttribute("data-run")
44
+ let cwd = el.getAttribute("data-cwd")
45
+ await fetch("/runcmd", {
46
+ method: "post",
47
+ headers: {
48
+ "Content-Type": "application/json"
49
+ },
50
+ body: JSON.stringify({
51
+ run,
52
+ cwd
53
+ })
54
+ }).then((res) => {
55
+ return res.json()
56
+ })
57
+ // window.open("about:blank", "_blank", "file://" + filepath)
58
+ return
59
+ }
60
+
29
61
  // target=_blank should open in new window
30
62
  el = e.target.closest("[target=_blank]")
31
63
  if (!el) {
@@ -80,7 +80,11 @@
80
80
  .drawer.vertical-collapsed {
81
81
  max-height: 0;
82
82
  }
83
- .dynamic {
83
+ .dynamic.selected {
84
+ background: rgba(0,0,0,0.05);
85
+ }
86
+ body.dark .dynamic.selected {
87
+ background: rgba(0,150,250,0.05);
84
88
  }
85
89
  .dynamic-item img {
86
90
  width: 20px !important;
@@ -149,7 +153,13 @@ body.dark .type-tabs {
149
153
  .navheader {
150
154
  backdrop-filter: blur(16px);
151
155
 
156
+ /*
152
157
  padding: 15px 10px 5px;
158
+ */
159
+ padding: 15px;
160
+ }
161
+ .navheader .btn2 {
162
+ text-transform: lowercase;
153
163
  }
154
164
  body.columns footer {
155
165
  }
@@ -1132,6 +1142,7 @@ body.dark .line .btn {
1132
1142
  }
1133
1143
  .line .btn {
1134
1144
  background: rgba(0,0,0,0.9);
1145
+ text-transform: lowercase;
1135
1146
  /*
1136
1147
  border: 1px solid rgba(0,0,0,0.1);
1137
1148
  color: rgba(0,0,0,0.7);
@@ -1191,6 +1202,7 @@ body.dark .line.align-top h3 .col .title a {
1191
1202
  }
1192
1203
  .line.align-top h3 .col .btn {
1193
1204
  padding: 4px 10px;
1205
+ margin-right: 5px;
1194
1206
  }
1195
1207
  body.dark .line.align-top h3 .col .btn.label {
1196
1208
  background: rgba(255,255,255,0.05);
@@ -1430,6 +1442,19 @@ body.dark .swal2-modal input {
1430
1442
  outline: none !important;
1431
1443
  -webkit-appearance: none !important;
1432
1444
  }
1445
+ .swal2-modal input[type=checkbox] {
1446
+ width: 14px;
1447
+ height: 14px;
1448
+ background: white;
1449
+ margin-right: 5px;
1450
+ }
1451
+ .swal2-modal input[type=checkbox]:checked {
1452
+ background: royalblue;
1453
+ }
1454
+ .swal2-modal .checkbox-row {
1455
+ display: flex;
1456
+ align-items: center;
1457
+ }
1433
1458
  .swal2-container {
1434
1459
  font-size: 14px !important;
1435
1460
  z-index: 100000 !important;
@@ -1788,8 +1813,14 @@ footer.status {
1788
1813
  background: black;
1789
1814
  }
1790
1815
  */
1816
+ body.dark .btn.red {
1817
+ color: rgba(230,0,0,1) !important;
1818
+ border: 1px solid rgba(210,0,0,0.7) !important;
1819
+ }
1791
1820
  .btn.red {
1792
- background: brown !important;
1821
+ color: rgba(210,0,0,0.8) !important;
1822
+ border: 1px solid rgba(210,0,0,0.3);
1823
+ background: none;
1793
1824
  }
1794
1825
 
1795
1826
  #error-screen {
package/server/socket.js CHANGED
@@ -83,7 +83,12 @@ class Socket {
83
83
  ******************************************************************/
84
84
 
85
85
  // req.uri is always http or absolute path
86
- let id = this.parent.kernel.api.filePath(req.uri)
86
+ let id
87
+ if (req.id) {
88
+ id = req.id
89
+ } else {
90
+ id = this.parent.kernel.api.filePath(req.uri)
91
+ }
87
92
 
88
93
  if (req.status) {
89
94
  ws.send(JSON.stringify({
@@ -121,8 +126,8 @@ class Socket {
121
126
  // if the shell is running, don't do anything
122
127
  // if the shell is not running, run the request
123
128
  let shell = this.parent.kernel.shell.get(sh)
124
- console.log("get shell for", sh, shell)
125
129
  if (!shell) {
130
+ await this.parent.kernel.clearLog(req.id)
126
131
  this.parent.kernel.api.process(req)
127
132
  }
128
133
  // if it's not killed, don't do anything
@@ -171,7 +176,6 @@ class Socket {
171
176
  this.subscriptions.get(id).add(ws);
172
177
  }
173
178
  trigger(e) {
174
-
175
179
  // send to id session
176
180
  let id
177
181
  if (e.kernel) {
@@ -106,6 +106,11 @@ main iframe {
106
106
  height: 100%;
107
107
  border: none;
108
108
  }
109
+ /*
110
+ .header-item.indent {
111
+ padding-left: 23px !important;
112
+ }
113
+ */
109
114
  .header-item {
110
115
  /*
111
116
  display: block;
@@ -122,7 +127,6 @@ main iframe {
122
127
  .header-item .btn2 {
123
128
  margin: 0;
124
129
  border: none;
125
- padding: 5px;
126
130
  /*
127
131
  color: var(--light-color);
128
132
  */
@@ -161,7 +165,7 @@ body.dark .header-item.btn {
161
165
  color: var(--dark-color);
162
166
  }
163
167
  .header-item.btn {
164
- padding: 10px;
168
+ padding: 8px;
165
169
  background: none !important;
166
170
  color: var(--light-color);
167
171
  }
@@ -192,6 +196,9 @@ body.dark #new-window {
192
196
  background: rgba(255,255,255,0.04);
193
197
  }
194
198
  */
199
+ .app-info-card img {
200
+ padding: 10px;
201
+ }
195
202
  .app-info {
196
203
 
197
204
  /*
@@ -249,13 +256,45 @@ body.dark .header-btns {
249
256
  */
250
257
  }
251
258
  .app-info-card {
259
+ /*
252
260
  padding: 10px !important;
261
+ */
262
+ display: flex;
253
263
  }
254
264
  .app-info .btn {
255
265
  width: 100%;
266
+ box-sizing: border-box;
267
+ }
268
+ body.dark .app-info .mode-section {
269
+ background: rgba(0,0,0,0.4);
270
+ }
271
+ .app-info .mode-section {
272
+ background: rgba(0,0,0,0.06);
273
+ padding: 20px;
274
+ box-sizing: border-box;
275
+ width: 100%;
276
+ text-align: left;
277
+ }
278
+ .app-info .mode-section .desc {
279
+ font-weight: normal;
280
+ opacity: 0.7;
281
+ }
282
+ .app-info .mode-section h3 {
283
+ font-size: 18px;
284
+ line-height: 26px;
285
+ margin: 0;
286
+ }
287
+ body.dark .app-info .mode-section .btn {
288
+ border: 1px solid rgba(255,255,255,0.1);
289
+ }
290
+ .app-info .mode-section .btn {
291
+ margin-top: 10px;
292
+ text-align: center;
256
293
  }
257
294
  .app-info-card > * {
295
+ /*
258
296
  padding: 5px;
297
+ */
259
298
  color: var(--light-color);
260
299
  text-decoration: none;
261
300
  box-sizing: border-box;
@@ -263,6 +302,9 @@ body.dark .header-btns {
263
302
  body.dark .app-info-card > * {
264
303
  color: var(--dark-color);
265
304
  }
305
+ .app-info-title {
306
+ padding: 10px;
307
+ }
266
308
  .footer {
267
309
  /*
268
310
  display: flex;
@@ -389,6 +431,14 @@ body.dark .grid-btns .btn2 {
389
431
  }
390
432
  .tab i {
391
433
  margin-right: 10px;
434
+ font-size: 12px;
435
+ width: 12px;
436
+ }
437
+ .menu-item-image {
438
+ width: 16px !important;
439
+ height: 16px !important;
440
+ margin-right: 10px;
441
+ background: white;
392
442
  }
393
443
  .temp-menu {
394
444
  /*
@@ -544,8 +594,12 @@ body.dark #new-tab {
544
594
  border-top: 1px solid rgba(255,255,255,0.04);
545
595
  */
546
596
  }
597
+ body.dark .submenu {
598
+ border-left: 1px solid rgba(255,255,255,0.3);
599
+ }
547
600
  .submenu {
548
- padding-left: 15px;
601
+ border-left: 1px solid black;
602
+ margin-left: 15px;
549
603
  box-sizing: border-box;
550
604
  }
551
605
  .loader-dialog {
@@ -602,6 +656,7 @@ body.dark .loader-container {
602
656
  z-index: 5;
603
657
  }
604
658
  .appcanvas {
659
+ overflow: auto;
605
660
  display: flex;
606
661
  flex-grow: 1;
607
662
  border-top: 1px solid rgba(0, 0,0 ,0.04);
@@ -663,6 +718,7 @@ body.dark .appcanvas {
663
718
  <script src="/hotkeys.min.js"></script>
664
719
  <script src="/sweetalert2.js"></script>
665
720
  <script src="/nav.js"></script>
721
+ <script src="/common.js"></script>
666
722
  <script src="/opener.js"></script>
667
723
  <script src="/report.js"></script>
668
724
  <script src="/normalize.js"></script>
@@ -689,7 +745,7 @@ body.dark .appcanvas {
689
745
  <a class='btn2' id='explore' href="/?mode=explore"><div><i class="fa-solid fa-globe"></i></div><div>Discover</div></a>
690
746
  <a href="/network" class='btn2'><div><i class="fa-solid fa-wifi"></i></div><div>Network</div></a>
691
747
  <a href="/connect" class='btn2'><div><i class="fa-solid fa-circle-user"></i></div><div>Connect</div></a>
692
- <input type='url' id='location' readonly>
748
+ <input type='url' id='location' readonly value="<%=execUrl%>">
693
749
  <div class='nav-btns'>
694
750
  <a class='btn2' href="<%=portal%>" target="_blank"><div><i class="fa-solid fa-question"></i></div><div>Help</div></a>
695
751
  <button class='btn2' id='genlog'><div><i class="fa-solid fa-laptop-code"></i></div><div>Logs</div></button>
@@ -708,83 +764,98 @@ body.dark .appcanvas {
708
764
  <aside class='active'>
709
765
  <div class='header-top header-item'>
710
766
  <div class='app-info'>
767
+ <% if (type !== 'run') { %>
768
+ <div class='mode-section'>
769
+ <h3><i class='fa-solid fa-code'></i> Dev mode</h3>
770
+ <div class='desc'>In dev mode, 'default' scripts do not automatically start</div>
771
+ <a class='btn' href="."><i class="fa-solid fa-circle-play"></i> Switch to Run mode</a>
772
+ </div>
773
+ <% } %>
711
774
  <div class='app-info-card'>
712
775
  <% if (config.icon) { %>
713
776
  <img src="<%=config.icon%>"/>
714
777
  <% } else { %>
715
778
  <i class="fa-regular fa-circle-dot"></i>
716
779
  <% } %>
717
- <div><%=config.title%></div>
718
- <div class="folderpath">/api/<%=name%></div>
780
+ <div class='app-info-title'><%=config.title%></div>
719
781
  </div>
720
782
  <div class='header-btns'>
721
- <a class='btn header-item frame-link' href="/prototype">
722
- <div class='tab'>
723
- <i class='fa-solid fa-bolt'></i> Setup
724
- </div>
725
- </a>
726
- <button class='btn header-item frame-link' id='edit-toggle'>
783
+ <div class='btn header-item frame-link revealer' id='edit-toggle' data-group='.edit-group'>
727
784
  <div class='tab'>
728
785
  <i class='fa-solid fa-pen-to-square'></i> Edit
729
786
  </div>
730
- </button>
731
- </div>
732
- <div class='editsubmenu submenu hidden'>
733
- <div class='btn header-item frame-link' id='edit'>
734
- <div class='tab'><i class="fa-solid fa-pencil"></i> Edit info</div>
735
- </div>
736
- <div class='btn header-item frame-link' id='move'>
737
- <div class='tab'><i class="fa-solid fa-right-to-bracket"></i> Move folder</div>
787
+ <div class='loader'><i class="fa-solid fa-caret-down"></i><i class="fa-solid fa-caret-up hidden"></i></div>
738
788
  </div>
739
- <div class='btn header-item frame-link' id='copy'>
740
- <div class='tab'><i class="fa-solid fa-copy"></i> Copy folder</div>
741
- </div>
742
- <div class='btn header-item frame-link' id='delete' data-name="<%=name%>">
743
- <div class='tab'><i class="fa-solid fa-trash-can"></i> Delete folder</div>
789
+ <div class='edit-group editsubmenu submenu hidden'>
790
+ <a <%=config.init_required ? 'data-init' : ''%> class='btn header-item frame-link' href="/prototype?type=init&path=<%=path%>">
791
+ <div class='tab'>
792
+ <i class='fa-solid fa-bolt'></i> Initialize
793
+ </div>
794
+ </a>
795
+ <a class='btn header-item frame-link' href="/prototype?type=extension&path=<%=path%>">
796
+ <div class='tab'>
797
+ <i class='fa-solid fa-puzzle-piece'></i> Extensions
798
+ </div>
799
+ </a>
800
+ <div class='btn header-item frame-link' id='edit'>
801
+ <div class='tab'><i class="fa-solid fa-pencil"></i> Edit info</div>
802
+ </div>
803
+ <div class='btn header-item frame-link' id='move'>
804
+ <div class='tab'><i class="fa-solid fa-right-to-bracket"></i> Move folder</div>
805
+ </div>
806
+ <div class='btn header-item frame-link' id='copy'>
807
+ <div class='tab'><i class="fa-solid fa-copy"></i> Copy folder</div>
808
+ </div>
809
+ <div class='btn header-item frame-link' id='delete' data-name="<%=name%>">
810
+ <div class='tab'><i class="fa-solid fa-trash-can"></i> Delete folder</div>
811
+ </div>
744
812
  </div>
745
813
  </div>
746
814
  </div>
747
815
  </div>
748
816
  <div class='m n system' data-type="n">
749
- <!--<a data-index="0" target="<%=src%>" href="<%=src%>" class='btn header-item frame-link'>-->
750
- <!--
751
- <div id='copy' data-name="<%=name%>" class='btn header-item frame-link'>
752
- <div class='tab'><i class="fa-solid fa-copy"></i> Copy</div>
753
- </div>
754
- <div id='delete' data-name="<%=name%>" class='btn header-item frame-link'>
755
- <div class='tab'><i class="fa-solid fa-trash-can"></i> Delete</div>
756
- </div>
757
- -->
758
817
  <a target="<%=src%>" href="<%=src%>" class='btn header-item frame-link' data-index="0">
759
818
  <div class='tab'><i class="fa-regular fa-folder-open"></i> Files <div class='disk-usage'></div></div>
760
819
  </a>
820
+ <% if (profile || feed) { %>
821
+ <div class='btn header-item frame-link revealer' data-group='.info-group'>
822
+ <div class='tab'>
823
+ <i class='fa-solid fa-circle-info'></i> Info
824
+ </div>
825
+ <div class='loader'><i class="fa-solid fa-caret-down"></i><i class="fa-solid fa-caret-up hidden"></i></div>
826
+ </div>
827
+ <div class='info-group submenu hidden'>
828
+ <% if (profile) { %>
829
+ <a target="_blank" href="<%=profile%>" class='btn header-item frame-link'>
830
+ <div class='tab'><i class="fa-regular fa-circle-user"></i> Publisher</div>
831
+ </a>
832
+ <% } %>
833
+ <% if (feed) { %>
834
+ <a target="_blank" href="<%=feed%>" class='btn header-item frame-link'>
835
+ <div class='tab'><i class="fa-solid fa-rss"></i> Newsfeed</div>
836
+ </a>
837
+ <% } %>
838
+ </div>
839
+ <% } %>
761
840
  <div class='dynamic'>
762
841
  <% if (plugin_menu) { %>
763
842
  <%- include('./partials/dynamic', { dynamic: plugin_menu, }) %>
764
843
  <% } %>
765
844
  </div>
766
- <!--
767
- <a target="run_frame" href="/run/<%=name%>" class='btn header-item frame-link' data-index="1">
768
- <div class='tab'><i class="fa-solid fa-bolt-lightning"></i> Run...</div>
769
- </a>
770
- -->
771
- <!--
772
- <a target="_blank" href="/terminal/<%=name%>/<%=Date.now()%>" class='btn header-item frame-link' data-index="1">
773
- <div class='tab'><i class="fa-solid fa-terminal"></i> Terminal</div>
774
- </a>
775
- -->
776
- <a target="_blank" href="<%=profile%>" class='btn header-item frame-link'>
777
- <div class='tab'><i class="fa-regular fa-circle-user"></i> Publisher</div>
778
- </a>
779
- <a target="_blank" href="<%=feed%>" class='btn header-item frame-link'>
780
- <div class='tab'><i class="fa-solid fa-rss"></i> Newsfeed</div>
781
- </a>
782
- <a target="/share/<%=name%>" href="/share/<%=name%>", class="btn header-item frame-link" data-index="2" data-mode="refresh">
783
- <div class='tab'><i class="fa-solid fa-wifi"></i> Share</div>
784
- </a>
785
- <a target="/env/api/<%=name%>" href="/env/api/<%=name%>", class="btn header-item frame-link" data-index="3" data-mode="refresh">
786
- <div class='tab'><i class="fa-solid fa-gear"></i> Configure</div>
787
- </a>
845
+ <div class='btn header-item frame-link revealer' data-group='.config-group'>
846
+ <div class='tab'>
847
+ <i class='fa-solid fa-gear'></i> Settings
848
+ </div>
849
+ <div class='loader'><i class="fa-solid fa-caret-down"></i><i class="fa-solid fa-caret-up hidden"></i></div>
850
+ </div>
851
+ <div class='config-group submenu hidden'>
852
+ <a target="/share/<%=name%>" href="/share/<%=name%>", class="btn header-item frame-link" data-index="2" data-mode="refresh">
853
+ <div class='tab'><i class="fa-solid fa-wifi"></i> Share</div>
854
+ </a>
855
+ <a target="/env/api/<%=name%>" href="/env/api/<%=name%>", class="btn header-item frame-link" data-index="3" data-mode="refresh">
856
+ <div class='tab'><i class="fa-solid fa-gear"></i> Configure</div>
857
+ </a>
858
+ </div>
788
859
  </div>
789
860
  <div class='m h menu' data-type='h'>
790
861
  <% if (config.menu) { %>
@@ -851,15 +922,6 @@ body.dark .appcanvas {
851
922
  </nav>
852
923
  -->
853
924
  <main class='browserview'>
854
- <% if (false) { %>
855
- <% if (config.menu) { %>
856
- <% config.menu.forEach((item) => { %>
857
- <% if (item.btn && item.src) { %>
858
- <iframe name='<%=item.src%>' class='hidden'></iframe>
859
- <% } %>
860
- <% }) %>
861
- <% } %>
862
- <% } %>
863
925
  </main>
864
926
  </div>
865
927
  </div>
@@ -975,6 +1037,11 @@ body.dark .appcanvas {
975
1037
  // } else {
976
1038
  // selection = document.querySelector("[data-default]")
977
1039
  // }
1040
+ let init = document.querySelector("[data-init]")
1041
+ if (init) {
1042
+ location.href = init.href
1043
+ return
1044
+ }
978
1045
  let selection = document.querySelector("[data-default]")
979
1046
 
980
1047
  // console.log("> 3")
@@ -1060,9 +1127,20 @@ body.dark .appcanvas {
1060
1127
 
1061
1128
  // Instantiate a frame with the selected target's href
1062
1129
  let url = target.href
1130
+
1131
+ if (!url) {
1132
+ return
1133
+ }
1063
1134
  // document.querySelector("#open-browser").href = url
1064
1135
  // document.querySelector("#clone-tab").setAttribute("data-href", url)
1065
- document.querySelector("#location").value = url
1136
+
1137
+ //document.querySelector("#location").value = url
1138
+
1139
+ if (target.pathname.startsWith("/run")) {
1140
+ document.querySelector("#location").value = target.pathname.slice(4)
1141
+ } else {
1142
+ document.querySelector("#location").value = target.pathname
1143
+ }
1066
1144
 
1067
1145
 
1068
1146
  // select the selected target element (tab)
@@ -1376,11 +1454,13 @@ body.dark .appcanvas {
1376
1454
  document.querySelector("#menu").classList.toggle("margin")
1377
1455
  })
1378
1456
  }
1457
+ /*
1379
1458
  document.querySelector("#edit-toggle").addEventListener("click", async (e) => {
1380
1459
  e.preventDefault()
1381
1460
  e.stopPropagation()
1382
1461
  document.querySelector(".editsubmenu").classList.toggle("hidden")
1383
1462
  })
1463
+ */
1384
1464
  document.querySelector("#move").addEventListener("click", async (e) => {
1385
1465
  e.preventDefault()
1386
1466
  e.stopPropagation()
@@ -1507,6 +1587,24 @@ body.dark .appcanvas {
1507
1587
  document.querySelector("aside").addEventListener("click", async (e) => {
1508
1588
  let target
1509
1589
 
1590
+ // 0. handle dropdowns
1591
+ if (e.target.classList.contains("revealer")) {
1592
+ target = e.target
1593
+ } else {
1594
+ target = e.target.closest(".revealer")
1595
+ }
1596
+
1597
+ if (target) {
1598
+ e.preventDefault()
1599
+ e.stopPropagation()
1600
+ let group = target.getAttribute("data-group")
1601
+ document.querySelector(group).classList.toggle("hidden")
1602
+ target.querySelector(".loader .fa-caret-down").classList.toggle("hidden")
1603
+ target.querySelector(".loader .fa-caret-up").classList.toggle("hidden")
1604
+ return
1605
+ }
1606
+
1607
+
1510
1608
 
1511
1609
  // 1. handle delete
1512
1610
  if (e.target.classList.contains("del")) {
@@ -1626,7 +1724,10 @@ body.dark .appcanvas {
1626
1724
  } else {
1627
1725
  if (target.classList.contains("reveal")) {
1628
1726
  // nested menu
1727
+ target.closest(".dynamic").classList.toggle("selected")
1629
1728
  target.closest(".nested-menu").querySelector(".submenu").classList.toggle("hidden")
1729
+ target.querySelector(".loader .fa-caret-down").classList.toggle("hidden")
1730
+ target.querySelector(".loader .fa-caret-up").classList.toggle("hidden")
1630
1731
  e.preventDefault()
1631
1732
  e.stopPropagation()
1632
1733
  } else {
@@ -1640,13 +1741,17 @@ body.dark .appcanvas {
1640
1741
  //location.hash = target.getAttribute("href")
1641
1742
 
1642
1743
  if (target.closest(".h")) {
1643
- location.hash = target.target
1744
+ if (target.target) {
1745
+ location.hash = target.target
1746
+ }
1644
1747
  } else {
1645
1748
  let index = target.getAttribute("data-index")
1646
1749
  let type = target.closest(".m").getAttribute("data-type")
1647
1750
 
1648
1751
 
1649
- location.hash = type + index
1752
+ if (type) {
1753
+ location.hash = type + index
1754
+ }
1650
1755
  }
1651
1756
 
1652
1757
  document.querySelectorAll(".frame-link").forEach((el) => {
@@ -1722,7 +1827,10 @@ body.dark .appcanvas {
1722
1827
  // }, 500)
1723
1828
  // })
1724
1829
  }
1725
- renderSelection()
1830
+ <% if (type === "run" && env.PINOKIO_SCRIPT_DEFAULT && env.PINOKIO_SCRIPT_DEFAULT.toString().toLowerCase() === "true") { %>
1831
+
1832
+ renderSelection()
1833
+ <% } %>
1726
1834
  }
1727
1835
  }
1728
1836
  if (document.querySelector("#genlog")) {
@@ -1762,9 +1870,14 @@ body.dark .appcanvas {
1762
1870
  } else if (event.data.action.type === "location") {
1763
1871
  let url = event.data.action.url
1764
1872
  console.log({ action: event.data.action })
1765
- //document.querySelector("#open-browser").href = url
1766
- //document.querySelector("#location").innerHTML = url
1767
- document.querySelector("#location").value = url
1873
+
1874
+ //document.querySelector("#location").value = url
1875
+ let pathname = new URL(url).pathname
1876
+ if (pathname.startsWith("/run")) {
1877
+ document.querySelector("#location").value = pathname.slice(4)
1878
+ } else {
1879
+ document.querySelector("#location").value = pathname
1880
+ }
1768
1881
  }
1769
1882
  } else if (event.data.type) {
1770
1883
  let asideHidden = (window.getComputedStyle(document.querySelector("aside")).display === "none")
@@ -1808,6 +1921,9 @@ body.dark .appcanvas {
1808
1921
 
1809
1922
  });
1810
1923
  refresh_du()
1924
+ <% if (type !== 'run') { %>
1925
+ document.querySelector(".dynamic .reveal").click()
1926
+ <% } %>
1811
1927
  /*
1812
1928
  document.addEventListener("keydown", (e) => {
1813
1929
  let size = document.querySelectorAll(".selectable").length
@@ -215,6 +215,7 @@ footer .btn.go-home {
215
215
  }
216
216
  .env-title {
217
217
  font-weight: bold;
218
+ margin-bottom: 5px;
218
219
  }
219
220
  .env-description {
220
221
  margin-bottom: 10px;
@@ -456,7 +456,7 @@ const n = new N()
456
456
  let socket = new Socket()
457
457
  const pull = async () => {
458
458
  socket.close()
459
- await new Promise((resolve, reject) => {
459
+ await new Promise(async (resolve, reject) => {
460
460
  if (!term) {
461
461
  <% if (theme === "dark") { %>
462
462
  await createTerm(xtermTheme.FrontEndDelight)