pinokiod 1.3.89 → 1.3.91
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.
- package/kernel/api/local/index.js +1 -1
- package/package.json +1 -1
- package/server/index.js +111 -23
- package/server/public/install.js +2 -2
- package/server/views/browser-experimental.ejs +1 -1
- package/server/views/env_editor.ejs +130 -35
- package/server/views/pre.ejs +109 -0
- package/server/views/settings.ejs +1 -1
|
@@ -63,7 +63,7 @@ class Local {
|
|
|
63
63
|
}
|
|
64
64
|
*/
|
|
65
65
|
|
|
66
|
-
current_env = await Environment.get2(req.parent.path, kernel)
|
|
66
|
+
let current_env = await Environment.get2(req.parent.path, kernel)
|
|
67
67
|
|
|
68
68
|
// if the key at current_env.PINOKIO_SHARE_VAR (by default it's 'url') is the variable being set, trigger the share logic
|
|
69
69
|
if (current_env.PINOKIO_SHARE_VAR && current_env.PINOKIO_SHARE_VAR in req.params) {
|
package/package.json
CHANGED
package/server/index.js
CHANGED
|
@@ -172,6 +172,31 @@ class Server {
|
|
|
172
172
|
}
|
|
173
173
|
})
|
|
174
174
|
}
|
|
175
|
+
async init_env(env_dir_path) {
|
|
176
|
+
console.log("env_path",env_dir_path)
|
|
177
|
+
let current = this.kernel.path(env_dir_path, "ENVIRONMENT")
|
|
178
|
+
// if environment.json doesn't exist,
|
|
179
|
+
let exists = await this.exists(current)
|
|
180
|
+
console.log({ current, exists })
|
|
181
|
+
if (exists) {
|
|
182
|
+
// if ENVIRONMENT already exists, don't do anything
|
|
183
|
+
} else {
|
|
184
|
+
// if ENVIRONMENT doesn't exist, need to create one
|
|
185
|
+
// 1. if _ENVIRONMENT exists, create ENVIRONMENT by appending _ENVIRONMENT to ENVIRONMENT
|
|
186
|
+
// 2. if _ENVIRONMENT doesn't exist, just write ENVIRONMENT
|
|
187
|
+
// if _ENVIRONMENT exists,
|
|
188
|
+
let _environment = this.kernel.path(env_dir_path, "_ENVIRONMENT")
|
|
189
|
+
let _exists = await this.exists(_environment)
|
|
190
|
+
console.log({ _environment, _exists })
|
|
191
|
+
let content = await Environment.ENV("app")
|
|
192
|
+
if (_exists) {
|
|
193
|
+
let _environmentStr = await fs.promises.readFile(_environment, "utf8")
|
|
194
|
+
await fs.promises.writeFile(current, _environmentStr + "\n\\n\n" + content)
|
|
195
|
+
} else {
|
|
196
|
+
await fs.promises.writeFile(current, content)
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
175
200
|
async chrome(req, res, type) {
|
|
176
201
|
let name = req.params.name
|
|
177
202
|
let app_path = this.kernel.path("api", name, "pinokio.js")
|
|
@@ -230,26 +255,7 @@ class Server {
|
|
|
230
255
|
}
|
|
231
256
|
}
|
|
232
257
|
|
|
233
|
-
|
|
234
|
-
// if environment.json doesn't exist,
|
|
235
|
-
let exists = await this.exists(current)
|
|
236
|
-
if (exists) {
|
|
237
|
-
// if ENVIRONMENT already exists, don't do anything
|
|
238
|
-
} else {
|
|
239
|
-
// if ENVIRONMENT doesn't exist, need to create one
|
|
240
|
-
// 1. if _ENVIRONMENT exists, create ENVIRONMENT by appending _ENVIRONMENT to ENVIRONMENT
|
|
241
|
-
// 2. if _ENVIRONMENT doesn't exist, just write ENVIRONMENT
|
|
242
|
-
// if _ENVIRONMENT exists,
|
|
243
|
-
let _environment = this.kernel.path("api", name, "_ENVIRONMENT")
|
|
244
|
-
let _exists = await this.exists(_environment)
|
|
245
|
-
let content = await Environment.ENV("app")
|
|
246
|
-
if (_exists) {
|
|
247
|
-
let _environmentStr = await fs.promises.readFile(_environment, "utf8")
|
|
248
|
-
await fs.promises.writeFile(current, content + "\n\n" + _environmentStr)
|
|
249
|
-
} else {
|
|
250
|
-
await fs.promises.writeFile(current, content)
|
|
251
|
-
}
|
|
252
|
-
}
|
|
258
|
+
await this.init_env("api/" + name)
|
|
253
259
|
|
|
254
260
|
let mode = "run"
|
|
255
261
|
if (req.query && req.query.mode) {
|
|
@@ -2166,17 +2172,61 @@ class Server {
|
|
|
2166
2172
|
})
|
|
2167
2173
|
this.app.post("/env", async (req, res) => {
|
|
2168
2174
|
console.log("req.body", req.body)
|
|
2169
|
-
let fullpath = path.resolve(this.kernel.homedir, req.body.filepath)
|
|
2175
|
+
let fullpath = path.resolve(this.kernel.homedir, req.body.filepath, "ENVIRONMENT")
|
|
2170
2176
|
let updated = req.body.vals
|
|
2171
2177
|
await Util.update_env(fullpath, updated)
|
|
2172
2178
|
res.json({})
|
|
2173
2179
|
})
|
|
2180
|
+
this.app.get("/env", async (req, res) => {
|
|
2181
|
+
let env_path = path.resolve(this.kernel.homedir)
|
|
2182
|
+
await this.init_env(env_path)
|
|
2183
|
+
|
|
2184
|
+
let filepath = path.resolve(this.kernel.homedir, "ENVIRONMENT")
|
|
2185
|
+
let editorpath = "/edit/ENVIRONMENT"
|
|
2186
|
+
|
|
2187
|
+
const items = await Util.parse_env_detail(filepath)
|
|
2188
|
+
|
|
2189
|
+
|
|
2190
|
+
res.render("env_editor", {
|
|
2191
|
+
config: null,
|
|
2192
|
+
name: null,
|
|
2193
|
+
init: null,
|
|
2194
|
+
editorpath,
|
|
2195
|
+
items,
|
|
2196
|
+
theme: this.theme,
|
|
2197
|
+
filepath,
|
|
2198
|
+
agent: this.agent,
|
|
2199
|
+
})
|
|
2200
|
+
})
|
|
2174
2201
|
this.app.get("/env/*", async (req, res) => {
|
|
2202
|
+
|
|
2203
|
+
let env_path = req.params[0]
|
|
2204
|
+
await this.init_env(env_path)
|
|
2205
|
+
|
|
2175
2206
|
let pathComponents = req.params[0].split("/")
|
|
2176
|
-
let filepath = path.resolve(this.kernel.homedir, req.params[0])
|
|
2177
|
-
let editorpath = "/edit/" + req.params[0]
|
|
2207
|
+
let filepath = path.resolve(this.kernel.homedir, req.params[0], "ENVIRONMENT")
|
|
2208
|
+
let editorpath = "/edit/" + req.params[0] + "/ENVIRONMENT"
|
|
2209
|
+
|
|
2210
|
+
console.log({ pathComponents, filepath, editorpath, })
|
|
2178
2211
|
const items = await Util.parse_env_detail(filepath)
|
|
2212
|
+
|
|
2213
|
+
console.log(items)
|
|
2214
|
+
|
|
2215
|
+
let p = path.resolve(this.kernel.homedir, env_path, "pinokio.js")
|
|
2216
|
+
let config = (await this.kernel.loader.load(p)).resolved
|
|
2217
|
+
if (config.icon) {
|
|
2218
|
+
config.icon = `/${env_path}/${config.icon}?raw=true`
|
|
2219
|
+
}
|
|
2220
|
+
|
|
2221
|
+
let name
|
|
2222
|
+
if (env_path.startsWith("api")) {
|
|
2223
|
+
name = env_path.split("/")[1]
|
|
2224
|
+
}
|
|
2225
|
+
|
|
2179
2226
|
res.render("env_editor", {
|
|
2227
|
+
config,
|
|
2228
|
+
name,
|
|
2229
|
+
init: req.query ? req.query.init : null,
|
|
2180
2230
|
editorpath,
|
|
2181
2231
|
items,
|
|
2182
2232
|
theme: this.theme,
|
|
@@ -2184,6 +2234,44 @@ class Server {
|
|
|
2184
2234
|
agent: this.agent,
|
|
2185
2235
|
})
|
|
2186
2236
|
})
|
|
2237
|
+
this.app.get("/pre/:name", async (req, res) => {
|
|
2238
|
+
let p = path.resolve(this.kernel.homedir, "api", req.params.name, "pinokio.js")
|
|
2239
|
+
let config = (await this.kernel.loader.load(p)).resolved
|
|
2240
|
+
console.log("config", config)
|
|
2241
|
+
if (config && config.pre) {
|
|
2242
|
+
|
|
2243
|
+
config.pre.forEach((item) => {
|
|
2244
|
+
item.icon = `/api/${req.params.name}/${item.icon}?raw=true`
|
|
2245
|
+
})
|
|
2246
|
+
|
|
2247
|
+
res.render("pre", {
|
|
2248
|
+
name: req.params.name,
|
|
2249
|
+
theme: this.theme,
|
|
2250
|
+
agent: this.agent,
|
|
2251
|
+
name: req.params.name,
|
|
2252
|
+
items: config.pre
|
|
2253
|
+
})
|
|
2254
|
+
} else {
|
|
2255
|
+
res.redirect("/env/" + req.params.name)
|
|
2256
|
+
}
|
|
2257
|
+
})
|
|
2258
|
+
this.app.get("/initialize/:name", async (req, res) => {
|
|
2259
|
+
let p = path.resolve(this.kernel.homedir, "api", req.params.name, "pinokio.js")
|
|
2260
|
+
let config = (await this.kernel.loader.load(p)).resolved
|
|
2261
|
+
if (config) {
|
|
2262
|
+
// if pinokio.js exists
|
|
2263
|
+
if (config.pre && Array.isArray(config.pre)) {
|
|
2264
|
+
// if pre exists, redirect to /pre/:name
|
|
2265
|
+
res.redirect(`/pre/${req.params.name}`)
|
|
2266
|
+
} else {
|
|
2267
|
+
// if pre doesn't exist, redirect to /env/:name
|
|
2268
|
+
res.redirect(`/env/${req.params.name}`)
|
|
2269
|
+
}
|
|
2270
|
+
} else {
|
|
2271
|
+
// if pinokio.js doesn't exist, send to /browser/:name
|
|
2272
|
+
res.redirect(`/pinokio/browser/${req.params.name}`)
|
|
2273
|
+
}
|
|
2274
|
+
})
|
|
2187
2275
|
this.app.get("/share/:name", async (req, res) => {
|
|
2188
2276
|
let filepath = path.resolve(this.kernel.homedir, "api", req.params.name, "ENVIRONMENT")
|
|
2189
2277
|
//let filepath = path.resolve(this.kernel.homedir, req.params[0])
|
package/server/public/install.js
CHANGED
|
@@ -104,8 +104,8 @@ const install = async (name, url, term, socket, options) => {
|
|
|
104
104
|
})
|
|
105
105
|
} else {
|
|
106
106
|
// ask the backend to create install.json and start.json if gradio
|
|
107
|
-
//location.href =
|
|
108
|
-
location.href = `/
|
|
107
|
+
//location.href = `/pinokio/browser/${name}`
|
|
108
|
+
location.href = `/initialize/${name}`
|
|
109
109
|
|
|
110
110
|
}
|
|
111
111
|
}
|
|
@@ -561,7 +561,7 @@ body.dark .loader-container {
|
|
|
561
561
|
<a target="/share/<%=name%>" href="/share/<%=name%>", class="btn header-item frame-link" data-index="1" data-mode="refresh">
|
|
562
562
|
<div class='tab'><i class="fa-solid fa-wifi"></i> Share</div>
|
|
563
563
|
</a>
|
|
564
|
-
<a target="/env/api/<%=name
|
|
564
|
+
<a target="/env/api/<%=name%>" href="/env/api/<%=name%>", class="btn header-item frame-link" data-index="1" data-mode="refresh">
|
|
565
565
|
<div class='tab'><i class="fa-solid fa-gear"></i> Configure</div>
|
|
566
566
|
</a>
|
|
567
567
|
</div>
|
|
@@ -73,13 +73,25 @@ td.key {
|
|
|
73
73
|
.button:hover {
|
|
74
74
|
|
|
75
75
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
<% if (init) { %>
|
|
77
|
+
main {
|
|
78
|
+
width: 100%;
|
|
79
|
+
box-sizing: border-box;
|
|
80
|
+
max-width: 600px;
|
|
81
|
+
padding: 20px;
|
|
82
|
+
margin: 0 auto;
|
|
83
|
+
}
|
|
84
|
+
<% } else { %>
|
|
85
|
+
#editor {
|
|
86
|
+
width: 100%;
|
|
87
|
+
box-sizing: border-box;
|
|
88
|
+
max-width: 600px;
|
|
89
|
+
padding: 20px;
|
|
90
|
+
margin: 0 auto;
|
|
91
|
+
}
|
|
92
|
+
<% } %>
|
|
93
|
+
|
|
81
94
|
header .runner {
|
|
82
|
-
padding: 10px 0 0;
|
|
83
95
|
}
|
|
84
96
|
.disabled {
|
|
85
97
|
opacity: 0.7;
|
|
@@ -119,6 +131,59 @@ body.dark .comment {
|
|
|
119
131
|
#save {
|
|
120
132
|
background: royalblue;
|
|
121
133
|
}
|
|
134
|
+
a#customize {
|
|
135
|
+
text-decoration: underline;
|
|
136
|
+
cursor: pointer;
|
|
137
|
+
}
|
|
138
|
+
.e {
|
|
139
|
+
padding: 10px 0;
|
|
140
|
+
}
|
|
141
|
+
#editor {
|
|
142
|
+
padding: 20px 0;
|
|
143
|
+
}
|
|
144
|
+
.center {
|
|
145
|
+
display: flex;
|
|
146
|
+
align-items: center;
|
|
147
|
+
justify-content: center;
|
|
148
|
+
}
|
|
149
|
+
body {
|
|
150
|
+
display: block;
|
|
151
|
+
}
|
|
152
|
+
.card {
|
|
153
|
+
display: flex;
|
|
154
|
+
padding: 10px 0;
|
|
155
|
+
box-sizing: border-box;
|
|
156
|
+
}
|
|
157
|
+
.card img {
|
|
158
|
+
width: 100px;
|
|
159
|
+
border-radius: 10px;
|
|
160
|
+
}
|
|
161
|
+
.card .description {
|
|
162
|
+
opacity: 0.8;
|
|
163
|
+
}
|
|
164
|
+
.card .title {
|
|
165
|
+
font-weight: bold;
|
|
166
|
+
font-size: 30px;
|
|
167
|
+
letter-spacing: -1px;
|
|
168
|
+
}
|
|
169
|
+
.card .col {
|
|
170
|
+
padding-left: 10px;
|
|
171
|
+
}
|
|
172
|
+
h1 {
|
|
173
|
+
font-size: 50px;
|
|
174
|
+
font-family: georgia;
|
|
175
|
+
font-style: italic;
|
|
176
|
+
}
|
|
177
|
+
footer {
|
|
178
|
+
background: none;
|
|
179
|
+
padding: 0;
|
|
180
|
+
text-align: right;
|
|
181
|
+
display: block;
|
|
182
|
+
margin-bottom: 20px;
|
|
183
|
+
}
|
|
184
|
+
footer .btn {
|
|
185
|
+
margin-left: 10px;
|
|
186
|
+
}
|
|
122
187
|
</style>
|
|
123
188
|
<script>
|
|
124
189
|
document.addEventListener("DOMContentLoaded", async () => {
|
|
@@ -145,40 +210,70 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
145
210
|
return res.json()
|
|
146
211
|
})
|
|
147
212
|
console.log("res" ,res)
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
}
|
|
213
|
+
<% if (init && name) { %>
|
|
214
|
+
location.href = "/pinokio/browser/<%=name%>"
|
|
215
|
+
<% } else { %>
|
|
216
|
+
n.Noty({
|
|
217
|
+
text: `Updated!`
|
|
218
|
+
})
|
|
219
|
+
<% } %>
|
|
151
220
|
})
|
|
221
|
+
<% if (init) { %>
|
|
222
|
+
document.querySelector("#customize").addEventListener("click", (e) => {
|
|
223
|
+
e.preventDefault()
|
|
224
|
+
e.stopPropagation()
|
|
225
|
+
document.querySelector("#editor").classList.toggle("hidden")
|
|
226
|
+
})
|
|
227
|
+
<% } %>
|
|
152
228
|
})
|
|
153
229
|
</script>
|
|
154
230
|
</head>
|
|
155
|
-
<body class='
|
|
156
|
-
<
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
</header>
|
|
169
|
-
<main>
|
|
170
|
-
<div id='editor'>
|
|
171
|
-
<% items.forEach((item) => { %>
|
|
172
|
-
<% if (item.type === "comment") { %>
|
|
173
|
-
<div class='comment'><%=item.val.replaceAll(/^[ #]+/g, "")%></div>
|
|
174
|
-
<% } else { %>
|
|
175
|
-
<div class='env-item'>
|
|
176
|
-
<label for="<%=item.key%>"><%=item.key%></label>
|
|
177
|
-
<input id="<%=item.key%>" type="text" value="<%=item.val%>">
|
|
231
|
+
<body class='<%=theme%> <%=init ? 'center' : ''%>'>
|
|
232
|
+
<main>
|
|
233
|
+
<% if (init) { %>
|
|
234
|
+
<div>
|
|
235
|
+
<h1>Install</h1>
|
|
236
|
+
<% if (config) { %>
|
|
237
|
+
<div class='card'>
|
|
238
|
+
<% if (config.icon) { %>
|
|
239
|
+
<img src="<%=config.icon%>">
|
|
240
|
+
<% } %>
|
|
241
|
+
<div class='col'>
|
|
242
|
+
<div class='title'><%=config.title%></div>
|
|
243
|
+
<div class='description'><%=config.description%></div>
|
|
178
244
|
</div>
|
|
179
|
-
|
|
180
|
-
<% }
|
|
245
|
+
</div>
|
|
246
|
+
<% } %>
|
|
247
|
+
<footer>
|
|
248
|
+
<button id='customize' class='btn'><i class="fa-solid fa-gear"></i> Customize</button>
|
|
249
|
+
<div id='save' class='btn'>
|
|
250
|
+
<span class='save'><i class="fa-solid fa-check"></i> Install</span>
|
|
251
|
+
</div>
|
|
252
|
+
</footer>
|
|
181
253
|
</div>
|
|
182
|
-
|
|
254
|
+
<% } else { %>
|
|
255
|
+
<header class='navheader grabbable'>
|
|
256
|
+
<div class='runner'>
|
|
257
|
+
<div id='save' class='btn'>
|
|
258
|
+
<span class='save'><i class="fa-solid fa-check"></i> Save</span>
|
|
259
|
+
</div>
|
|
260
|
+
<a class='btn' href="<%=editorpath%>"><i class="fa-solid fa-pen-to-square"></i> Edit file</a>
|
|
261
|
+
<button class='btn' id='open-fs' data-filepath="<%=filepath%>"><i class="fa-solid fa-eye"></i> Open in File Explorer</button>
|
|
262
|
+
</div>
|
|
263
|
+
</header>
|
|
264
|
+
<% } %>
|
|
265
|
+
<div id='editor' class='<%=init ? "hidden" : ''%>'>
|
|
266
|
+
<% items.forEach((item) => { %>
|
|
267
|
+
<% if (item.type === "comment") { %>
|
|
268
|
+
<div class='comment'><%=item.val.replaceAll(/^[ #]+/g, "")%></div>
|
|
269
|
+
<% } else { %>
|
|
270
|
+
<div class='env-item'>
|
|
271
|
+
<label for="<%=item.key%>"><%=item.key%></label>
|
|
272
|
+
<input id="<%=item.key%>" type="text" value="<%=item.val%>">
|
|
273
|
+
</div>
|
|
274
|
+
<% } %>
|
|
275
|
+
<% }) %>
|
|
276
|
+
</div>
|
|
277
|
+
</main>
|
|
183
278
|
</body>
|
|
184
279
|
</html>
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<html class='columns'>
|
|
2
|
+
<head>
|
|
3
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
|
|
4
|
+
<script src="/hotkeys.min.js"></script>
|
|
5
|
+
<script src="/ace/ace.js"></script>
|
|
6
|
+
<script src="/noty.js"></script>
|
|
7
|
+
<script src="/notyq.js"></script>
|
|
8
|
+
<script src="/xterm.js"></script>
|
|
9
|
+
<script src="/xterm-addon-fit.js"></script>
|
|
10
|
+
<script src="/xterm-addon-web-links.js"></script>
|
|
11
|
+
<script src="/xterm-theme.js"></script>
|
|
12
|
+
<script src="/xterm-addon-search.js"></script>
|
|
13
|
+
<script src="/xterm-addon-search-bar.js"></script>
|
|
14
|
+
<script src="/sweetalert2.js"></script>
|
|
15
|
+
<script src="/Socket.js"></script>
|
|
16
|
+
<script src="/common.js"></script>
|
|
17
|
+
<script src="/he.js"></script>
|
|
18
|
+
<script src="/opener.js"></script>
|
|
19
|
+
<script src="/nav.js"></script>
|
|
20
|
+
<script src="/autoexpand.js"></script>
|
|
21
|
+
<script src="/modalinput.js"></script>
|
|
22
|
+
<script src="/simplemodal.js"></script>
|
|
23
|
+
<script src="/waitmodal.js"></script>
|
|
24
|
+
<script src="/notifyinput.js"></script>
|
|
25
|
+
<script src="/report.js"></script>
|
|
26
|
+
<link href="/xterm.min.css" rel="stylesheet" />
|
|
27
|
+
<link href="/css/fontawesome.min.css" rel="stylesheet">
|
|
28
|
+
<link href="/css/solid.min.css" rel="stylesheet">
|
|
29
|
+
<link href="/css/regular.min.css" rel="stylesheet">
|
|
30
|
+
<link href="/css/brands.min.css" rel="stylesheet">
|
|
31
|
+
<link href="/style.css" rel="stylesheet"/>
|
|
32
|
+
<link href="/noty.css" rel="stylesheet"/>
|
|
33
|
+
<% if (agent === "electron") { %>
|
|
34
|
+
<link href="/electron.css" rel="stylesheet"/>
|
|
35
|
+
<% } %>
|
|
36
|
+
<style>
|
|
37
|
+
main {
|
|
38
|
+
max-width: 500px;
|
|
39
|
+
margin: 50px auto;
|
|
40
|
+
width: 100%;
|
|
41
|
+
}
|
|
42
|
+
h1 {
|
|
43
|
+
letter-spacing: -1px;
|
|
44
|
+
}
|
|
45
|
+
.item {
|
|
46
|
+
border-radius: 5px;
|
|
47
|
+
padding: 10px;
|
|
48
|
+
box-sizing: border-box;
|
|
49
|
+
display: flex;
|
|
50
|
+
align-items: flex-start;
|
|
51
|
+
/*
|
|
52
|
+
border: 1px solid rgba(0,0,0,0.07);
|
|
53
|
+
*/
|
|
54
|
+
background: rgba(0,0,0,0.04);
|
|
55
|
+
margin: 10px 0;
|
|
56
|
+
|
|
57
|
+
}
|
|
58
|
+
.item .btn {
|
|
59
|
+
width: 50px;
|
|
60
|
+
text-align: center;
|
|
61
|
+
}
|
|
62
|
+
.item img {
|
|
63
|
+
width: 100px;
|
|
64
|
+
}
|
|
65
|
+
.item .col {
|
|
66
|
+
flex-grow: 1;
|
|
67
|
+
padding: 10px;
|
|
68
|
+
box-sizing: border-box;
|
|
69
|
+
}
|
|
70
|
+
footer {
|
|
71
|
+
background: none;
|
|
72
|
+
}
|
|
73
|
+
footer a.btn {
|
|
74
|
+
text-align: center;
|
|
75
|
+
display: block;
|
|
76
|
+
width: 100%;
|
|
77
|
+
}
|
|
78
|
+
.e {
|
|
79
|
+
padding: 5px 0;
|
|
80
|
+
}
|
|
81
|
+
</style>
|
|
82
|
+
</head>
|
|
83
|
+
<body class='columns <%=theme%>'>
|
|
84
|
+
<header class='navheader grabbable'>
|
|
85
|
+
</header>
|
|
86
|
+
<main>
|
|
87
|
+
<h1>Requirements</h1>
|
|
88
|
+
<div class='e'>
|
|
89
|
+
<div>To run <%=name%>, you need to have the following programs installed.</div>
|
|
90
|
+
<div>Get the apps if you haven't already, and press "Done".</div>
|
|
91
|
+
</div>
|
|
92
|
+
<div class='items'>
|
|
93
|
+
<% items.forEach((item) => { %>
|
|
94
|
+
<div class='item'>
|
|
95
|
+
<img src="<%=item.icon%>">
|
|
96
|
+
<div class='col'>
|
|
97
|
+
<div class='title'><%=item.title%></div>
|
|
98
|
+
<div class='description'><%=item.description%></div>
|
|
99
|
+
</div>
|
|
100
|
+
<a target="_blank" features="browser" href='<%=item.href%>' class='btn'>Get</a>
|
|
101
|
+
</div>
|
|
102
|
+
<% }) %>
|
|
103
|
+
</div>
|
|
104
|
+
<footer>
|
|
105
|
+
<a class='btn' href="/env/api/<%=name%>?init=true">Done</a>
|
|
106
|
+
</footer>
|
|
107
|
+
</main>
|
|
108
|
+
</body>
|
|
109
|
+
</html>
|
|
@@ -302,7 +302,7 @@ hr {
|
|
|
302
302
|
<br>
|
|
303
303
|
<div>Edit the system ENVIRONMENT file to customize pinokio system wide settings, such as where files are stored, terminal behavior, etc.</div>
|
|
304
304
|
<br>
|
|
305
|
-
<a class='btn' href="/env
|
|
305
|
+
<a class='btn' href="/env"><i class="fa-regular fa-pen-to-square"></i> Edit ENVIRONMENT</a>
|
|
306
306
|
</div>
|
|
307
307
|
<hr/>
|
|
308
308
|
<div class='troubleshoot'>
|