pinokiod 3.24.0 → 3.26.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.
@@ -360,6 +360,14 @@ body.dark .net {
360
360
  display: block;
361
361
  background: none;
362
362
  }
363
+ .placeholder-icon {
364
+ font-size: 40px;
365
+ width: 50px;
366
+ height: 50px;
367
+ display: flex;
368
+ justify-content: center;
369
+ align-items: center;
370
+ }
363
371
  @media only screen and (max-width: 480px) {
364
372
  .btn2 {
365
373
  padding: 5px;
@@ -449,200 +457,120 @@ body.dark .net {
449
457
  <% } %>
450
458
  <% }) %>
451
459
  <% } %>
452
- <div class='tab'><i class="fa-solid fa-code"></i> Dev</div>
453
460
  </aside>
454
461
  <div class='container'>
455
- <form class='search'>
456
- <!--
457
- <div class='app-btns'>
458
- <a class='btn create-new' href="/init"><i class="fa-solid fa-plus"></i> Build</a>
459
- <a class='btn' id='explore' href="/?mode=explore"><i class="fa-solid fa-magnifying-glass"></i> Discover</a>
462
+ <form class='search'>
463
+ <!--
464
+ <div class='app-btns'>
465
+ <a class='btn create-new' href="/init"><i class="fa-solid fa-plus"></i> Build</a>
466
+ <a class='btn' id='explore' href="/?mode=explore"><i class="fa-solid fa-magnifying-glass"></i> Discover</a>
467
+ </div>
468
+ -->
469
+ <input type='search' class="flexible" placeholder='Search apps'>
470
+ </form>
471
+ <div class='running-apps'>
472
+ <% if (current_host === host) { %>
473
+ <div class='section-header'>
474
+ <h3>
475
+ <div class='blank'></div>
476
+ <div class='col'>
477
+ <div class='grid-3'>
478
+ <div class='section'>
479
+ <h2><i class='fas fa-laptop-code'></i> Local</h2>
480
+ <div>accessible from this machine</div>
481
+ </div>
482
+ <div class='section'>
483
+ <h2><i class="fa-solid fa-wifi"></i> Network</h2><div>accessible from any machine on the local network</div>
484
+ </div>
485
+ <div class='section'>
486
+ <h2><i class="fa-solid fa-podcast"></i> Peer</h2><div>accessible from any pinokio peer on the local network <a class='explain' data-type='peer'>How to start a peer</a></div>
487
+ </div>
488
+ </div>
489
+ </div>
490
+ </h3>
460
491
  </div>
461
- -->
462
- <input type='search' class="flexible" placeholder='Search apps'>
463
- </form>
464
- <div class='running-apps'>
465
- <% if (current_host === host) { %>
466
- <div class='section-header'>
492
+ <% processes.forEach((item, index) => { %>
493
+ <div class='line align-top' data-index="<%=index%>" data-name="<%=item.name%>" data-title="<%=item.name%>" data-description="<%=item.internal_router.join(' ')%> <%=item.port%>">
467
494
  <h3>
468
- <div class='blank'></div>
495
+ <div class='item-icon'>
496
+ <% if (favicons[item.external_ip]) { %>
497
+ <img src="<%=favicons[item.external_ip]%>">
498
+ <% } else { %>
499
+ <div class='placeholder-icon'>
500
+ <i class="fa-solid fa-database"></i>
501
+ </div>
502
+ <!--
503
+ <img src="/pinokio-black.png">
504
+ -->
505
+ <% } %>
506
+ </div>
469
507
  <div class='col'>
508
+ <div class='title'><i class="fa-solid fa-circle"></i><span><%=titles[item.ip] || item.name%></span></div>
470
509
  <div class='grid-3'>
471
510
  <div class='section'>
472
- <h2><i class='fas fa-laptop-code'></i> Local</h2>
473
- <div>accessible from this machine</div>
511
+ <% item.internal_router.forEach((domain) => { %>
512
+ <a class='net' target="_blank" href="https://<%=domain%>">https://<%=domain%></a>
513
+ <% }) %>
514
+ <a class='net' target="_blank" href="http://localhost:<%=item.port%>">http://localhost:<%=item.port%></a>
474
515
  </div>
475
516
  <div class='section'>
476
- <h2><i class="fa-solid fa-wifi"></i> Network</h2><div>accessible from any machine on the local network</div>
517
+ <% if (item.external_ip) { %>
518
+ <a class='net' target="_blank" href="http://<%=item.external_ip%>">http://<%=item.external_ip%></a>
519
+ <% } %>
477
520
  </div>
478
521
  <div class='section'>
479
- <h2><i class="fa-solid fa-podcast"></i> Peer</h2><div>accessible from any pinokio peer on the local network <a class='explain' data-type='peer'>How to start a peer</a></div>
480
- </div>
481
- </div>
482
- </div>
483
- </h3>
484
- </div>
485
- <% processes.forEach((item, index) => { %>
486
- <div class='line align-top' data-index="<%=index%>" data-name="<%=item.name%>" data-title="<%=item.name%>" data-description="<%=item.internal_router.join(' ')%> <%=item.port%>">
487
- <h3>
488
- <div class='item-icon'>
489
- <% if (favicons[item.external_ip]) { %>
490
- <img src="<%=favicons[item.external_ip]%>">
491
- <% } else { %>
492
- <img src="/pinokio-black.png">
493
- <% } %>
494
- </div>
495
- <div class='col'>
496
- <div class='title'><i class="fa-solid fa-circle"></i><span><%=titles[item.ip] || item.name%></span></div>
497
- <div class='grid-3'>
498
- <div class='section'>
499
- <% item.internal_router.forEach((domain) => { %>
500
- <a class='net' target="_blank" href="https://<%=domain%>">https://<%=domain%></a>
501
- <% }) %>
502
- <a class='net' target="_blank" href="http://localhost:<%=item.port%>">http://localhost:<%=item.port%></a>
503
- </div>
504
- <div class='section'>
505
- <% if (item.external_ip) { %>
506
- <a class='net' target="_blank" href="http://<%=item.external_ip%>">http://<%=item.external_ip%></a>
507
- <% } %>
508
- </div>
509
- <div class='section'>
510
- <% item.external_router.forEach((domain) => { %>
511
- <a class='net' target="_blank" href="https://<%=domain%>">https://<%=domain%></a>
512
- <% }) %>
513
- </div>
522
+ <% item.external_router.forEach((domain) => { %>
523
+ <a class='net' target="_blank" href="https://<%=domain%>">https://<%=domain%></a>
524
+ <% }) %>
514
525
  </div>
515
526
  </div>
516
527
  </div>
517
- </h3>
518
- <% }) %>
519
- <% } else { %>
520
- <div class='section-header'>
521
- <h3>
522
- <div class='blank'></div>
523
- <div class='col'>
524
- <div class='grid-1'>
525
- <div class='section'>
526
- <h2>Endpoints</h2><div>accessible through peer network</div>
527
- </div>
528
+ </div>
529
+ </h3>
530
+ <% }) %>
531
+ <% } else { %>
532
+ <div class='section-header'>
533
+ <h3>
534
+ <div class='blank'></div>
535
+ <div class='col'>
536
+ <div class='grid-1'>
537
+ <div class='section'>
538
+ <h2>Endpoints</h2><div>accessible through peer network</div>
528
539
  </div>
529
540
  </div>
530
- </h3>
531
- </div>
532
- <% processes.forEach((item, index) => { %>
533
- <div class='line align-top' data-index="<%=index%>" data-name="<%=item.name%>" data-title="<%=item.name%>" data-description="<%=item.external_router.join(' ')%> <%=item.external_ip%>">
534
- <h3>
535
- <div class='item-icon'>
536
- <% if (favicons[item.ip]) { %>
537
- <img src="<%=favicons[item.ip]%>">
538
- <% } else { %>
539
- <img src="/pinokio-black.png">
540
- <% } %>
541
- </div>
542
- <div class='col'>
543
- <div class='title'><i class="fa-solid fa-circle"></i><span><%=titles[item.ip] || item.name%></span></div>
544
- <div class='grid-1'>
545
- <div class='section'>
546
- <% if (item.external_ip) { %>
547
- <a class='net' target="_blank" href="http://<%=item.external_ip%>">http://<%=item.external_ip%></a>
548
- <% } %>
549
- <% item.external_router.forEach((domain) => { %>
550
- <a class='net' target="_blank" href="https://<%=domain%>">https://<%=domain%></a>
551
- <% }) %>
552
- </div>
553
- </div>
554
- </div>
555
- </h3>
556
541
  </div>
557
- <% }) %>
558
- <% } %>
559
- <% running.forEach((item) => { %>
560
- <a href="<%=item.browser_url%>" data-description="<%=item.description%>" data-index="<%=item.index%>" data-name="<%=item.name%>" data-title="<%=item.name%>" data-uri="<%=item.uri%>" data-icon="<%=item.icon%>" data-path="<%=item.path%>" data-iconpath="<%=item.iconpath ? item.iconpath : ''%>" class='line align-top'>
542
+ </h3>
543
+ </div>
544
+ <% processes.forEach((item, index) => { %>
545
+ <div class='line align-top' data-index="<%=index%>" data-name="<%=item.name%>" data-title="<%=item.name%>" data-description="<%=item.external_router.join(' ')%> <%=item.external_ip%>">
561
546
  <h3>
562
547
  <div class='item-icon'>
563
- <% if (item.icon) { %>
564
- <img src="<%=item.icon%>">
548
+ <% if (favicons[item.ip]) { %>
549
+ <img src="<%=favicons[item.ip]%>">
565
550
  <% } else { %>
566
- <% if (theme === 'dark') { %>
567
- <img src="/pinokio-white.png">
568
- <% } else { %>
569
- <img src="/pinokio-black.png">
570
- <% } %>
551
+ <div class='placeholder-icon'>
552
+ <i class="fa-solid fa-database"></i>
553
+ </div>
571
554
  <% } %>
572
555
  </div>
573
556
  <div class='col'>
574
- <div class='uri'><%=item.filepath%></div>
575
- <div class='title'><%=item.name%></div>
576
- <div class='description'><%=item.description%></div>
577
- <div class='menu-btns'>
578
- <button class='btn browse' data-src="<%=item.browser_url%>/dev">
579
- <i class='fa-solid fa-code'></i> Dev
580
- </button>
581
- <button class='btn open-menu'>
582
- <i class="fa-solid fa-bars"></i><span> Menu</span>
583
- </button>
584
- <div class='context-menu collapsed'>
585
- <div class='context-menu-wrapper'>
586
- <button class='btn' data-filepath="<%=item.filepath%>">
587
- <i class="fa-solid fa-folder-open"></i> Open</button>
588
- </button>
589
- <button class='btn copy-menu' data-src="<%=item.browser_url%>/dev">
590
- <i class='fa-solid fa-copy'></i> Copy
591
- </button>
592
- <button class='btn move-menu' data-src="<%=item.browser_url%>/dev" data-disable="To move the folder, the app should not be running.">
593
- <i class="fa-solid fa-right-to-bracket"></i> Move
594
- </button>
595
- <button class='btn edit-menu' data-src="<%=item.browser_url%>/dev">
596
- <i class='fa-solid fa-pen-to-square'></i> Edit
597
- </button>
598
- <button class='btn del' data-src="<%=item.url%>" data-disable="To delete the folder, the app should not be running.">
599
- <i class="fa-solid fa-trash-can"></i> Delete
600
- </button>
601
- </div>
602
- </div>
603
- <% if (item.running_scripts) { %>
604
- <% item.running_scripts.forEach((s) => { %>
605
- <% if (s.id) { %>
606
- <button class='btn shutdown' data-id="<%=s.id%>" data-type="<%=s.type ? s.type : ''%>">
607
- <i class="fa-solid fa-stop"></i> Stop <%=s.name%>&nbsp;
608
- <i class='fa-solid fa-spin fa-circle-notch'></i>
609
- </button>
610
- <% } else { %>
611
- <button class='btn shutdown' data-src="<%=s.path%>">
612
- <i class="fa-solid fa-stop"></i> Stop <%=s.name%>&nbsp;
613
- <i class='fa-solid fa-spin fa-circle-notch'></i>
614
- </button>
615
- <% } %>
616
- <% }) %>
617
- <% } %>
618
- </div>
619
- <% if (item.shortcuts && item.shortcuts.length > 0) { %>
620
- <div class='btns'>
621
- <% item.shortcuts.forEach((btn) => { %>
622
- <% if (btn.btn) { %>
623
- <button data-action="<%=btn.action ? JSON.stringify(btn.action) : ''%>" class='btn menu-btn'><%-btn.btn%></button>
624
- <% } %>
557
+ <div class='title'><i class="fa-solid fa-circle"></i><span><%=titles[item.ip] || item.name%></span></div>
558
+ <div class='grid-1'>
559
+ <div class='section'>
560
+ <% if (item.external_ip) { %>
561
+ <a class='net' target="_blank" href="http://<%=item.external_ip%>">http://<%=item.external_ip%></a>
562
+ <% } %>
563
+ <% item.external_router.forEach((domain) => { %>
564
+ <a class='net' target="_blank" href="https://<%=domain%>">https://<%=domain%></a>
625
565
  <% }) %>
626
566
  </div>
627
- <% } %>
628
- </div>
629
- <!--
630
- <div class='spinner'>
631
- <i class="fa-solid fa-chevron-right"></i>
567
+ </div>
632
568
  </div>
633
- -->
634
569
  </h3>
635
- </a>
570
+ </div>
636
571
  <% }) %>
637
- </div>
638
- <% if (list.length === 0) { %>
639
- <div class='placeholder'>
640
- <h1>Welcome.</h1>
641
- <br>
642
- <div>Get started by installing some Pinokio scripts.</div>
643
- <a href="/?mode=explore" class='btn'><i class="fa-solid fa-globe"></i> Visit Discover Page</a>
644
- </div>
645
- <% } %>
572
+ <% } %>
573
+ </div>
646
574
  </div>
647
575
  </main>
648
576
  <script>
@@ -131,8 +131,10 @@ a.badge {
131
131
  text-decoration: none;
132
132
  }
133
133
  body.dark .btn {
134
- color: white;
134
+ background: rgba(255,255,255,0.05) !important;
135
+ /*
135
136
  border: 1px solid rgba(255,255,255,0.3);
137
+ */
136
138
  }
137
139
  body.dark .badge {
138
140
  background: rgba(255,255,255,0.1);
@@ -588,7 +590,6 @@ input[type=search] {
588
590
  <a href="/net/<%=name%>" class='submenu tab'><i class="fa-brands fa-<%=brands[platform]%>"></i> <%=name%> (<%=current_host === host ? 'this machine' : host%>)</a>
589
591
  <% }) %>
590
592
  <% } %>
591
- <div class='tab'><i class="fa-solid fa-code"></i> Dev</div>
592
593
  </aside>
593
594
  <div class='container'>
594
595
  <div class='config'>
@@ -15,7 +15,7 @@
15
15
  <div <%=item.default ? 'data-default' : ''%> data-action="<%=JSON.stringify(item.action)%>" class='btn header-item frame-link <%=item.display || ""%>'>
16
16
  <div class='tab'><%-item.btn%></div>
17
17
  </div>
18
- <% } else if (item.run) { %>
18
+ <% } else if (item.run && typeof item.run === 'string') { %>
19
19
  <div data-run="<%=item.run%>" data-cwd="<%=item.cwd%>" class='btn header-item frame-link <%=item.display || ""%>'>
20
20
  <div class='tab'><%-item.btn%></div>
21
21
  </div>
@@ -0,0 +1,268 @@
1
+ <html>
2
+ <head>
3
+ <meta charset="UTF-8">
4
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
5
+ <link href="/xterm.min.css" rel="stylesheet" />
6
+ <link href="/css/fontawesome.min.css" rel="stylesheet">
7
+ <link href="/css/solid.min.css" rel="stylesheet">
8
+ <link href="/css/regular.min.css" rel="stylesheet">
9
+ <link href="/css/brands.min.css" rel="stylesheet">
10
+ <link href="/markdown.css" rel="stylesheet"/>
11
+ <link href="/noty.css" rel="stylesheet"/>
12
+ <link href="/style.css" rel="stylesheet"/>
13
+ <% if (agent === "electron") { %>
14
+ <link href="/electron.css" rel="stylesheet"/>
15
+ <% } %>
16
+ <style>
17
+ body.frozen {
18
+ display: flex;
19
+ flex-direction: column;
20
+ height: 100%;
21
+ }
22
+ #table > table {
23
+ border-left: 2px solid black;
24
+ padding-left: 5px;
25
+ margin: 10px 0;
26
+ }
27
+ .highlight {
28
+ background: yellow;
29
+ width: 100px;
30
+ }
31
+ th {
32
+ background: rgba(0,0,0,0.1);
33
+ padding: 10px;
34
+ font-size: 12px;
35
+ }
36
+ td {
37
+ font-size: 12px;
38
+ padding: 10px;
39
+ }
40
+ td.val {
41
+ background: rgba(0,0,0,0.06);
42
+ }
43
+ td.key {
44
+ background: rgba(0,0,0,0.1);
45
+ }
46
+ .button {
47
+ cursor: pointer;
48
+ background: rgba(0,0,0,0.8);
49
+ color: white;
50
+ padding: 5px 10px;
51
+ border-radius: 4px;
52
+ }
53
+ .button:hover {
54
+
55
+ }
56
+ main {
57
+ width: 100%;
58
+ box-sizing: border-box;
59
+ max-width: 600px;
60
+ padding: 20px;
61
+ margin: 0 auto;
62
+ }
63
+
64
+ header .btn {
65
+ font-family: Sans-serif;
66
+ display: block;
67
+ margin-left: 10px;
68
+ font-style: normal;
69
+ font-size: 12px;
70
+ font-weight: normal;
71
+ padding: 5px 10px;
72
+ }
73
+ .disabled {
74
+ opacity: 0.7;
75
+ }
76
+ body.dark .env-item input[type=text] {
77
+ background: white;
78
+ }
79
+ .env-item input[type=text] {
80
+ width: 100%;
81
+ padding: 10px;
82
+ box-sizing: border-box;
83
+ border: none;
84
+ background: rgba(0,0,100, 0.1);
85
+ }
86
+ body.dark .env-item label {
87
+ color: cornflowerblue;
88
+ }
89
+ .env-item label {
90
+ color: royalblue;
91
+ display: block;
92
+ margin-bottom: 5px;
93
+ font-weight: bold;
94
+ font-size: 18px;
95
+ }
96
+ .env-item.highlighted {
97
+ border: 5px solid red;
98
+ }
99
+ .env-item {
100
+ /*
101
+ padding-top: 10px;
102
+ padding-bottom: 30px;
103
+ */
104
+ padding: 10px;
105
+ margin-bottom: 20px;
106
+ }
107
+ body.dark .comment {
108
+ border-left: 2px solid white;
109
+ }
110
+ .comment {
111
+ opacity: 0.8;
112
+ border-left: 2px solid black;
113
+ padding-left: 10px;
114
+ }
115
+ body.dark #save {
116
+ background: rgba(255,255,255,0.06);
117
+ }
118
+ #save {
119
+ width: 200px;
120
+ border-radius: 50px;
121
+ display: flex;
122
+ justify-content: center;
123
+ align-items: center;
124
+ font-size: 14px;
125
+ font-weight: bold;
126
+ }
127
+ a#customize {
128
+ text-decoration: underline;
129
+ cursor: pointer;
130
+ }
131
+ .e {
132
+ padding: 10px 0;
133
+ }
134
+ #editor {
135
+ padding: 20px 0;
136
+ }
137
+ .center {
138
+ display: flex;
139
+ align-items: center;
140
+ justify-content: center;
141
+ }
142
+ body {
143
+ display: block;
144
+ }
145
+ .card {
146
+ text-align: center;
147
+ /*
148
+ display: flex;
149
+ */
150
+ align-items: center;
151
+ box-sizing: border-box;
152
+ display: flex;
153
+ flex-direction: column;
154
+ gap: 15px;
155
+ }
156
+ .card img {
157
+ width: 100px;
158
+ border-radius: 10px;
159
+ }
160
+ .card .description {
161
+ opacity: 0.8;
162
+ }
163
+ .card .title {
164
+ font-weight: bold;
165
+ font-size: 20px;
166
+ }
167
+ .card .col {
168
+ padding-left: 10px;
169
+ }
170
+ h1 {
171
+ font-size: 50px;
172
+ padding-bottom: 20px;
173
+ }
174
+ footer {
175
+ background: none;
176
+ padding: 0;
177
+ text-align: right;
178
+ display: flex;
179
+ margin: 10px 0 20px 0;
180
+ }
181
+ footer .btn {
182
+ margin-left: 10px;
183
+ display: inline-block;
184
+ -webkit-appearance: button;
185
+ -moz-appearance: button;
186
+ appearance: button;
187
+
188
+ }
189
+ footer .btn.go-home {
190
+ margin-left: 0px;
191
+ }
192
+ .btn.home-button {
193
+ background: none !important;
194
+ margin: 0 !important;
195
+ font-size: 16px !important;
196
+ }
197
+ #editor {
198
+ height: auto;
199
+ }
200
+ .env-title {
201
+ font-weight: bold;
202
+ margin-bottom: 5px;
203
+ }
204
+ .env-description {
205
+ margin-bottom: 10px;
206
+ }
207
+ .warning {
208
+ padding: 10px;
209
+ margin: 10px 0 20px;
210
+ border-left: 5px solid rgba(0,0,0,0.1);
211
+ }
212
+ .warning a {
213
+ text-decoration: none;
214
+ color: royalblue;
215
+ }
216
+ .auto {
217
+ display: flex;
218
+ align-items: center;
219
+ gap: 3px;
220
+ }
221
+ </style>
222
+ </head>
223
+ <body class='<%=theme%> center' data-agent="<%=agent%>">
224
+ <main>
225
+ <div>
226
+ <div class='card'>
227
+ <img src="<%=image%>">
228
+ <div class='title'><%=name%></div>
229
+ <% if (link) { %>
230
+ <a href="<%=link%>" id='save' class='btn'>
231
+ <span class='save'><i class="fa-solid fa-play"></i> Launch</span>
232
+ </a>
233
+ <% } %>
234
+ <div class='auto'>
235
+ <input type='checkbox' <%=autolaunch ? 'checked' : ''%> id='autolaunch' />
236
+ <label for='autolaunch'>automatically launch</label>
237
+ </div>
238
+ <div class='message'></div>
239
+ </div>
240
+ </div>
241
+ </main>
242
+ <script>
243
+ let checkbox = document.querySelector("#autolaunch")
244
+ let save = document.querySelector("#save")
245
+ document.querySelector("#autolaunch").addEventListener("change", (e) => {
246
+ console.log({ checked: checkbox.checked })
247
+ let url = new URL(save.href)
248
+ if (checkbox.checked) {
249
+ url.searchParams.set("autolaunch", "1")
250
+ } else {
251
+ url.searchParams.set("autolaunch", "0")
252
+ }
253
+ save.href = url.toString()
254
+ })
255
+ console.log({ checked: checkbox.checked })
256
+ <% if (autolaunch) { %>
257
+ document.querySelector(".message").innerHTML = `<i class="fas fa-circle-notch fa-spin"></i> launching...`
258
+ setTimeout(() => {
259
+ if (checkbox.checked) {
260
+ document.querySelector("#save").click()
261
+ } else {
262
+ document.querySelector(".message").innerHTML = ""
263
+ }
264
+ }, 2000)
265
+ <% } %>
266
+ </script>
267
+ </body>
268
+ </html>