@ssebastien/tcmd 0.1.3 → 0.1.7
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/README.md +256 -62
- package/bin/tcmd +10 -2
- package/bin/tcmd.js +13 -2
- package/desktop/dist/index.html +13 -0
- package/desktop/dist/main.js +20298 -0
- package/desktop/dist/style.css +1515 -0
- package/desktop/frontend/index.html +13 -0
- package/package.json +19 -6
- package/public/fonts/OFL.txt +93 -0
- package/public/index.html +14 -0
- package/public/licenses/LUCIDE.txt +43 -0
- package/public/main.js +20679 -0
- package/public/style.css +1515 -0
- package/scripts/build-desktop.js +31 -0
- package/scripts/serve-web.js +61 -0
- package/src/js/tcmd/components/App.html +80 -14
- package/src/js/tcmd/components/App.js +339 -114
- package/src/js/tcmd/components/App.xml +76 -22
- package/src/js/tcmd/components/BookmarkList.html +5 -5
- package/src/js/tcmd/components/BookmarkList.js +15 -41
- package/src/js/tcmd/components/BookmarkList.xml +1 -2
- package/src/js/tcmd/components/BookmarkRow.html +2 -1
- package/src/js/tcmd/components/BookmarkRow.js +14 -9
- package/src/js/tcmd/components/BookmarkRow.xml +1 -1
- package/src/js/tcmd/components/Breadcrumbs.js +1 -1
- package/src/js/tcmd/components/CommandArgRow.html +28 -0
- package/src/js/tcmd/components/CommandArgRow.js +146 -30
- package/src/js/tcmd/components/CommandArgRow.xml +55 -4
- package/src/js/tcmd/components/CommandBar.html +2 -2
- package/src/js/tcmd/components/CommandBar.js +33 -27
- package/src/js/tcmd/components/CommandBar.xml +2 -2
- package/src/js/tcmd/components/CommandItem.html +1 -1
- package/src/js/tcmd/components/CommandItem.js +25 -25
- package/src/js/tcmd/components/CommandItem.xml +2 -2
- package/src/js/tcmd/components/CommandPanel.html +29 -0
- package/src/js/tcmd/components/CommandPanel.js +78 -52
- package/src/js/tcmd/components/CommandPanel.xml +49 -25
- package/src/js/tcmd/components/Confirm.html +2 -2
- package/src/js/tcmd/components/EntryDetail.html +7 -7
- package/src/js/tcmd/components/EntryDetail.js +22 -8
- package/src/js/tcmd/components/FileList.html +5 -1
- package/src/js/tcmd/components/FileList.js +2 -1
- package/src/js/tcmd/components/FilePicker.html +10 -0
- package/src/js/tcmd/components/FilePicker.js +43 -0
- package/src/js/tcmd/components/FilePicker.xml +13 -0
- package/src/js/tcmd/components/FilePickerRow.html +6 -0
- package/src/js/tcmd/components/FilePickerRow.js +27 -0
- package/src/js/tcmd/components/FilePickerRow.xml +10 -0
- package/src/js/tcmd/components/FilePreview.html +14 -4
- package/src/js/tcmd/components/FilePreview.js +111 -12
- package/src/js/tcmd/components/FilePreview.xml +28 -8
- package/src/js/tcmd/components/FileRow.html +2 -1
- package/src/js/tcmd/components/FileRow.js +70 -12
- package/src/js/tcmd/components/FilterBar.html +1 -1
- package/src/js/tcmd/components/FilterBar.js +14 -4
- package/src/js/tcmd/components/FilterBar.xml +1 -1
- package/src/js/tcmd/components/Frame.js +324 -0
- package/src/js/tcmd/components/Help.html +15 -0
- package/src/js/tcmd/components/Help.js +260 -0
- package/src/js/tcmd/components/Help.xml +13 -4
- package/src/js/tcmd/components/HelpRow.html +8 -0
- package/src/js/tcmd/components/HelpRow.xml +7 -0
- package/src/js/tcmd/components/OverlayList.html +8 -0
- package/src/js/tcmd/components/OverlayList.js +69 -0
- package/src/js/tcmd/components/{CommandPalette.xml → OverlayList.xml} +2 -5
- package/src/js/tcmd/components/OverlayRow.html +5 -0
- package/src/js/tcmd/components/OverlayRow.js +47 -0
- package/src/js/tcmd/components/OverlayRow.xml +9 -0
- package/src/js/tcmd/components/Summary.html +1 -1
- package/src/js/tcmd/components/Summary.js +1 -6
- package/src/js/tcmd/components/format.js +4 -23
- package/src/js/tcmd/components/icons.js +176 -5
- package/src/js/tcmd/components/index.js +9 -5
- package/src/js/tcmd/components/rows.js +176 -48
- package/src/js/tcmd/core/base64.js +64 -0
- package/src/js/tcmd/core/bookmarks.js +45 -8
- package/src/js/tcmd/core/commands.js +978 -260
- package/src/js/tcmd/core/concurrency.js +59 -0
- package/src/js/tcmd/core/decompress.js +117 -0
- package/src/js/tcmd/core/directory.js +219 -93
- package/src/js/tcmd/core/format.js +36 -0
- package/src/js/tcmd/core/fs.js +438 -54
- package/src/js/tcmd/core/history.js +58 -0
- package/src/js/tcmd/core/index.js +3 -9
- package/src/js/tcmd/core/journal.js +93 -0
- package/src/js/tcmd/core/keymap.js +42 -6
- package/src/js/tcmd/core/operations.js +813 -48
- package/src/js/tcmd/core/os.js +29 -3
- package/src/js/tcmd/core/pane.js +33 -8
- package/src/js/tcmd/core/panel.js +280 -104
- package/src/js/tcmd/core/path.js +30 -3
- package/src/js/tcmd/core/permissions.js +107 -0
- package/src/js/tcmd/core/picker.js +156 -0
- package/src/js/tcmd/core/preview.js +102 -0
- package/src/js/tcmd/core/script.js +7 -95
- package/src/js/tcmd/core/selection.js +9 -1
- package/src/js/tcmd/core/session.js +498 -200
- package/src/js/tcmd/core/watch.js +153 -0
- package/src/js/tcmd/desktop/backend/api.js +165 -0
- package/src/js/tcmd/desktop/backend/fs.js +626 -0
- package/src/js/tcmd/desktop/backend/main.ts +9 -0
- package/src/js/tcmd/desktop/bookmarks.js +23 -0
- package/src/js/tcmd/desktop/fs.js +91 -0
- package/src/js/tcmd/desktop/main.js +194 -0
- package/src/js/tcmd/desktop/os.js +33 -0
- package/src/js/tcmd/index.js +0 -1
- package/src/js/tcmd/tui/app.js +118 -60
- package/src/js/tcmd/tui/catalogue.js +238 -42
- package/src/js/tcmd/tui/index.js +18 -19
- package/src/js/tcmd/tui/opentui.js +33 -0
- package/src/js/tcmd/tui/syntax.js +91 -0
- package/src/js/tcmd/tui/theme.js +32 -2
- package/src/js/tcmd/vendor/bzip2.js +276 -0
- package/src/js/tcmd/web/app.js +225 -41
- package/src/js/tcmd/web/bookmarks.js +36 -0
- package/src/js/tcmd/web/catalogue.js +81 -38
- package/src/js/tcmd/web/effects.js +223 -0
- package/src/js/tcmd/web/header.html +1 -1
- package/src/js/tcmd/web/header.js +15 -11
- package/src/js/tcmd/web/http.js +13 -0
- package/src/js/tcmd/web/index.js +2 -2
- package/src/js/tcmd/web/main.js +6 -66
- package/src/js/tcmd/web/opfs.js +297 -30
- package/src/js/tcmd/web/seed.js +4 -4
- package/src/js/tcmd/web/server.js +124 -21
- package/src/js/tcmd/web/theme.js +4 -0
- package/tinyjs.json +16 -0
- package/src/js/tcmd/components/CommandPalette.html +0 -7
- package/src/js/tcmd/components/CommandPalette.js +0 -58
- package/src/js/tcmd/components/PaletteRow.html +0 -3
- package/src/js/tcmd/components/PaletteRow.js +0 -43
- package/src/js/tcmd/components/PaletteRow.xml +0 -4
- package/src/js/tcmd/tui/frame.js +0 -269
- package/src/js/tcmd/tui/help.js +0 -32
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Project: TinyCommand
|
|
2
|
+
// License: BSD
|
|
3
|
+
// Build the self-contained webview bundle. tinyjs invokes this hook on
|
|
4
|
+
// `tinyjs build`; `desktop:dev` also runs it before opening the native window.
|
|
5
|
+
|
|
6
|
+
import { copyFile, mkdir } from "node:fs/promises"
|
|
7
|
+
import { fileURLToPath } from "node:url"
|
|
8
|
+
|
|
9
|
+
const root = new URL("../", import.meta.url)
|
|
10
|
+
const output = new URL("../desktop/dist/", import.meta.url)
|
|
11
|
+
await mkdir(output, { recursive: true })
|
|
12
|
+
|
|
13
|
+
const result = await Bun.build({
|
|
14
|
+
entrypoints: [fileURLToPath(new URL("../src/js/tcmd/desktop/main.js", import.meta.url))],
|
|
15
|
+
outdir: fileURLToPath(output),
|
|
16
|
+
target: "browser",
|
|
17
|
+
naming: "main.js",
|
|
18
|
+
})
|
|
19
|
+
if (!result.success) throw new AggregateError(result.logs, "Could not build the TinyCommand desktop frontend")
|
|
20
|
+
|
|
21
|
+
await copyFile(new URL("../desktop/frontend/index.html", import.meta.url), new URL("index.html", output))
|
|
22
|
+
await copyFile(new URL("../public/style.css", import.meta.url), new URL("style.css", output))
|
|
23
|
+
await mkdir(new URL("../desktop/dist/fonts/", import.meta.url), { recursive: true })
|
|
24
|
+
await copyFile(
|
|
25
|
+
new URL("../public/fonts/M+1CodeNerdFontMono-Regular.ttf", import.meta.url),
|
|
26
|
+
new URL("../desktop/dist/fonts/M+1CodeNerdFontMono-Regular.ttf", import.meta.url),
|
|
27
|
+
)
|
|
28
|
+
await copyFile(new URL("../public/fonts/OFL.txt", import.meta.url), new URL("../desktop/dist/fonts/OFL.txt", import.meta.url))
|
|
29
|
+
await mkdir(new URL("../desktop/dist/licenses/", import.meta.url), { recursive: true })
|
|
30
|
+
await copyFile(new URL("../public/licenses/LUCIDE.txt", import.meta.url), new URL("../desktop/dist/licenses/LUCIDE.txt", import.meta.url))
|
|
31
|
+
console.log(`TinyCommand desktop frontend built in ${fileURLToPath(output)}`)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Project: TinyCommand
|
|
2
|
+
// Author: Sebastien Pierre
|
|
3
|
+
// License: BSD
|
|
4
|
+
// Created: 2026-09-27
|
|
5
|
+
|
|
6
|
+
// Module: scripts/serve-web
|
|
7
|
+
// CLI for the web view server: serves `public/` plus the `/api/*` filesystem
|
|
8
|
+
// API (see `src/js/tcmd/web/server.js`). The page uses OPFS when the browser
|
|
9
|
+
// has it and falls back to the API otherwise, so both backends come from this
|
|
10
|
+
// one command.
|
|
11
|
+
//
|
|
12
|
+
// Environment: HOST (default 127.0.0.1, an IP literal: 0.0.0.0 or :: serves
|
|
13
|
+
// every interface), PORT (default 8787), TCMD_WEB_ROOT (default "/", like the
|
|
14
|
+
// TUI).
|
|
15
|
+
|
|
16
|
+
import { createWebServer } from "../src/js/tcmd/web/server.js"
|
|
17
|
+
import { isIP } from "node:net"
|
|
18
|
+
import { fileURLToPath } from "node:url"
|
|
19
|
+
|
|
20
|
+
// Function: hostUrl
|
|
21
|
+
// The URL a client should open. IPv6 literals (possibly zone-qualified) are
|
|
22
|
+
// bracketed so the result is a valid URL.
|
|
23
|
+
function hostUrl(hostname, port) {
|
|
24
|
+
const host = isIP(hostname) === 6 ? `[${hostname}]` : hostname
|
|
25
|
+
return `http://${host}:${port}`
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Function: main
|
|
29
|
+
// Starts the existing loopback server. Published packages include the bundle;
|
|
30
|
+
// a source checkout builds it on demand without depending on the caller's cwd.
|
|
31
|
+
async function main(options = {}) {
|
|
32
|
+
const publicDir = options.publicDir ?? new URL("../public/", import.meta.url)
|
|
33
|
+
if (!(await Bun.file(new URL("main.js", publicDir)).exists())) {
|
|
34
|
+
const build = await Bun.build({
|
|
35
|
+
entrypoints: [fileURLToPath(new URL("../src/js/tcmd/web/main.js", import.meta.url))],
|
|
36
|
+
outdir: fileURLToPath(publicDir),
|
|
37
|
+
target: "browser",
|
|
38
|
+
})
|
|
39
|
+
if (!build.success) throw new AggregateError(build.logs, "Could not build the web UI")
|
|
40
|
+
}
|
|
41
|
+
const result = createWebServer({ ...options, publicDir })
|
|
42
|
+
const host = result.server.hostname
|
|
43
|
+
// A machine name resolves to several addresses (often including link-local
|
|
44
|
+
// IPv6), but the server binds only one of them, so prefer an IP literal.
|
|
45
|
+
if (host !== "127.0.0.1" && host !== "localhost" && isIP(host) === 0) {
|
|
46
|
+
console.warn(
|
|
47
|
+
`tcmd web: warning: ${host} is a name; bound to one of its addresses only.\n` +
|
|
48
|
+
` Use an IP literal instead (0.0.0.0 or :: for every interface).`
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
console.log(`tcmd web: ${hostUrl(host, result.server.port)}`)
|
|
52
|
+
console.log(`filesystem API: /api/* rooted at ${result.root}`)
|
|
53
|
+
console.log("use ?fs=http for your files, or ?fs=opfs for browser storage")
|
|
54
|
+
return result
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (import.meta.main) await main()
|
|
58
|
+
|
|
59
|
+
export { hostUrl, main }
|
|
60
|
+
|
|
61
|
+
// EOF
|
|
@@ -1,28 +1,94 @@
|
|
|
1
|
-
<div class="app" tabindex="0" on:keydown="keys">
|
|
2
|
-
<
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
<div class="app" ref="root" tabindex="0" out:class="appModeClass" on:keydown="keys">
|
|
2
|
+
<svg class="lucide-defs" aria-hidden="true" focusable="false">
|
|
3
|
+
<defs>
|
|
4
|
+
<symbol id="lucide-folder-plus" viewBox="0 0 24 24"><path d="M12 10v6"/><path d="M9 13h6"/><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"/></symbol>
|
|
5
|
+
<symbol id="lucide-arrow-left" viewBox="0 0 24 24"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></symbol>
|
|
6
|
+
<symbol id="lucide-arrow-right" viewBox="0 0 24 24"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></symbol>
|
|
7
|
+
<symbol id="lucide-arrow-up" viewBox="0 0 24 24"><path d="m5 12 7-7 7 7"/><path d="M12 19V5"/></symbol>
|
|
8
|
+
<symbol id="lucide-refresh-cw" viewBox="0 0 24 24"><path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"/><path d="M21 3v5h-5"/><path d="M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"/><path d="M8 16H3v5"/></symbol>
|
|
9
|
+
<symbol id="lucide-columns-2" viewBox="0 0 24 24"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M12 3v18"/></symbol>
|
|
10
|
+
<symbol id="lucide-panel-right" viewBox="0 0 24 24"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M15 3v18"/></symbol>
|
|
11
|
+
<symbol id="lucide-terminal" viewBox="0 0 24 24"><path d="M12 19h8"/><path d="m4 17 6-6-6-6"/></symbol>
|
|
12
|
+
<symbol id="lucide-circle-question-mark" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/><path d="M12 17h.01"/></symbol>
|
|
13
|
+
<symbol id="lucide-chevron-right" viewBox="0 0 24 24"><path d="m9 18 6-6-6-6"/></symbol>
|
|
14
|
+
<symbol id="lucide-arrow-down" viewBox="0 0 24 24"><path d="M12 5v14"/><path d="m19 12-7 7-7-7"/></symbol>
|
|
15
|
+
<symbol id="lucide-check" viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></symbol>
|
|
16
|
+
<symbol id="lucide-bookmark" viewBox="0 0 24 24"><path d="M17 3a2 2 0 0 1 2 2v15a1 1 0 0 1-1.496.868l-4.512-2.578a2 2 0 0 0-1.984 0l-4.512 2.578A1 1 0 0 1 5 20V5a2 2 0 0 1 2-2z"/></symbol>
|
|
17
|
+
<symbol id="lucide-maximize" viewBox="0 0 24 24"><path d="M8 3H5a2 2 0 0 0-2 2v3"/><path d="M21 8V5a2 2 0 0 0-2-2h-3"/><path d="M3 16v3a2 2 0 0 0 2 2h3"/><path d="M16 21h3a2 2 0 0 0 2-2v-3"/></symbol>
|
|
18
|
+
<symbol id="lucide-trash" viewBox="0 0 24 24"><path d="M10 11v6"/><path d="M14 11v6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"/><path d="M3 6h18"/><path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/></symbol>
|
|
19
|
+
<symbol id="lucide-power" viewBox="0 0 24 24"><path d="M12 2v10"/><path d="M18.4 6.6a9 9 0 1 1-12.77.04"/></symbol>
|
|
20
|
+
<symbol id="lucide-search" viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/></symbol>
|
|
21
|
+
<symbol id="lucide-folder" viewBox="0 0 24 24"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"/></symbol>
|
|
22
|
+
<symbol id="lucide-link-2" viewBox="0 0 24 24"><path d="M9 17H7A5 5 0 0 1 7 7h2"/><path d="M15 7h2a5 5 0 1 1 0 10h-2"/><line x1="8" x2="16" y1="12" y2="12"/></symbol>
|
|
23
|
+
<symbol id="lucide-cpu" viewBox="0 0 24 24"><path d="M12 20v2"/><path d="M12 2v2"/><path d="M17 20v2"/><path d="M17 2v2"/><path d="M2 12h2"/><path d="M2 17h2"/><path d="M2 7h2"/><path d="M20 12h2"/><path d="M20 17h2"/><path d="M20 7h2"/><path d="M7 20v2"/><path d="M7 2v2"/><rect x="4" y="4" width="16" height="16" rx="2"/><rect x="8" y="8" width="8" height="8" rx="1"/></symbol>
|
|
24
|
+
<symbol id="lucide-file" viewBox="0 0 24 24"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"/><path d="M14 2v5a1 1 0 0 0 1 1h5"/></symbol>
|
|
25
|
+
<symbol id="lucide-file-code" viewBox="0 0 24 24"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"/><path d="M14 2v5a1 1 0 0 0 1 1h5"/><path d="m10 13-2 2 2 2"/><path d="m14 13 2 2-2 2"/></symbol>
|
|
26
|
+
<symbol id="lucide-file-text" viewBox="0 0 24 24"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"/><path d="M14 2v5a1 1 0 0 0 1 1h5"/><path d="M10 9H8"/><path d="M16 13H8"/><path d="M16 17H8"/></symbol>
|
|
27
|
+
<symbol id="lucide-file-image" viewBox="0 0 24 24"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"/><path d="M14 2v5a1 1 0 0 0 1 1h5"/><circle cx="10" cy="12" r="2"/><path d="m20 17-1.296-1.296a2.41 2.41 0 0 0-3.408 0L9 22"/></symbol>
|
|
28
|
+
<symbol id="lucide-audio-lines" viewBox="0 0 24 24"><path d="M2 10v3"/><path d="M6 6v11"/><path d="M10 3v18"/><path d="M14 8v7"/><path d="M18 5v13"/><path d="M22 10v3"/></symbol>
|
|
29
|
+
<symbol id="lucide-video" viewBox="0 0 24 24"><path d="m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5"/><rect x="2" y="6" width="14" height="12" rx="2"/></symbol>
|
|
30
|
+
<symbol id="lucide-file-archive" viewBox="0 0 24 24"><path d="M13.659 22H18a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v11.5"/><path d="M14 2v5a1 1 0 0 0 1 1h5"/><path d="M8 12v-1"/><path d="M8 18v-2"/><path d="M8 7V6"/><circle cx="8" cy="20" r="2"/></symbol>
|
|
31
|
+
<symbol id="lucide-database" viewBox="0 0 24 24"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M3 5V19A9 3 0 0 0 21 19V5"/><path d="M3 12A9 3 0 0 0 21 12"/></symbol>
|
|
32
|
+
<symbol id="lucide-settings" viewBox="0 0 24 24"><path d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"/><circle cx="12" cy="12" r="3"/></symbol>
|
|
33
|
+
</defs>
|
|
34
|
+
</svg>
|
|
35
|
+
<div when="!desktopMode" out="headerView|Header"></div>
|
|
36
|
+
<div class="desktop-toolbar" when="desktopMode" role="toolbar" aria-label="File browser">
|
|
37
|
+
<div class="desktop-toolbar-group">
|
|
38
|
+
<button class="desktop-toolbar-button is-primary" type="button" title="Open a folder" aria-label="Open a folder" on:click="!toolbar:open-folder"><svg class="toolbar-icon ui-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24"><use href="#lucide-folder-plus"></use></svg><span>Open folder</span></button>
|
|
39
|
+
<button class="desktop-toolbar-button" type="button" title="Go back" aria-label="Go back" on:click="!toolbar:back"><svg class="toolbar-icon ui-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24"><use href="#lucide-arrow-left"></use></svg><span>Back</span></button>
|
|
40
|
+
<button class="desktop-toolbar-button" type="button" title="Go forward" aria-label="Go forward" on:click="!toolbar:forward"><svg class="toolbar-icon ui-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24"><use href="#lucide-arrow-right"></use></svg><span>Forward</span></button>
|
|
41
|
+
<button class="desktop-toolbar-button" type="button" title="Go to the parent folder" aria-label="Go to the parent folder" on:click="!toolbar:up"><svg class="toolbar-icon ui-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24"><use href="#lucide-arrow-up"></use></svg><span>Up</span></button>
|
|
42
|
+
<button class="desktop-toolbar-button" type="button" title="Refresh the active folder" aria-label="Refresh the active folder" on:click="!toolbar:refresh"><svg class="toolbar-icon ui-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24"><use href="#lucide-refresh-cw"></use></svg><span>Refresh</span></button>
|
|
43
|
+
</div>
|
|
44
|
+
<span class="desktop-toolbar-separator" aria-hidden="true"></span>
|
|
45
|
+
<div class="desktop-toolbar-group">
|
|
46
|
+
<button class="desktop-toolbar-button" type="button" title="Switch between Explorer and Commander" aria-label="Switch view mode" on:click="!toolbar:toggle-mode"><svg class="toolbar-icon ui-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24"><use href="#lucide-columns-2"></use></svg><span out="desktopViewLabel"></span></button>
|
|
47
|
+
<button class="desktop-toolbar-button" type="button" title="Toggle the preview pane" aria-label="Toggle the preview pane" on:click="!toolbar:toggle-preview"><svg class="toolbar-icon ui-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24"><use href="#lucide-panel-right"></use></svg><span out="desktopPreviewLabel"></span></button>
|
|
48
|
+
</div>
|
|
49
|
+
<span class="desktop-toolbar-spacer"></span>
|
|
50
|
+
<div class="desktop-toolbar-group">
|
|
51
|
+
<button class="desktop-toolbar-button" type="button" title="Open the command panel" aria-label="Open the command panel" on:click="!toolbar:commands"><svg class="toolbar-icon ui-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24"><use href="#lucide-terminal"></use></svg><span>Commands</span><svg class="toolbar-chevron ui-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24"><use href="#lucide-chevron-right"></use></svg></button>
|
|
52
|
+
<button class="desktop-toolbar-button" type="button" title="Show keyboard shortcuts" aria-label="Show keyboard shortcuts" on:click="!toolbar:help"><svg class="toolbar-icon ui-icon" aria-hidden="true" focusable="false" viewBox="0 0 24 24"><use href="#lucide-circle-question-mark"></use></svg><span>Help</span></button>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
<section class="resize-hint" when="tooSmall">
|
|
56
|
+
<h2 out="minSizeTitle"></h2>
|
|
57
|
+
<p out="minSizeHint"></p>
|
|
58
|
+
</section>
|
|
59
|
+
<main class="panes" when="!tooSmall">
|
|
60
|
+
<section class="pane pane-parent" when="showParentPane" out:class="parentPaneClass" on:click="parentId!pane:activate">
|
|
5
61
|
<div class="pane-header">
|
|
6
|
-
<div out="
|
|
62
|
+
<div when="!parentFilterOn" out="parentCrumbsView|Breadcrumbs"></div>
|
|
63
|
+
<div out="parentFilterView|FilterBar"></div>
|
|
64
|
+
</div>
|
|
65
|
+
<div data-slot="list" out="parentListView|FileList"></div>
|
|
66
|
+
<div out="parentDetailView|EntryDetail"></div>
|
|
67
|
+
</section>
|
|
68
|
+
<section class="pane pane-left" when="showLeftPane" out:class="leftPaneClass" on:click="leftId!pane:activate">
|
|
69
|
+
<div class="pane-header">
|
|
70
|
+
<div when="!leftFilterOn" out="leftCrumbsView|Breadcrumbs"></div>
|
|
7
71
|
<div out="leftFilterView|FilterBar"></div>
|
|
8
72
|
</div>
|
|
9
|
-
<div out="leftListView|FileList"></div>
|
|
73
|
+
<div data-slot="list" out="leftListView|FileList"></div>
|
|
10
74
|
<div out="leftDetailView|EntryDetail"></div>
|
|
11
|
-
<div out="leftSummaryView|Summary"></div>
|
|
12
75
|
</section>
|
|
13
|
-
<section class="pane pane-right" out:class="rightPaneClass" on:click="rightId!pane:activate">
|
|
76
|
+
<section class="pane pane-right" when="showRightPane" out:class="rightPaneClass" on:click="rightId!pane:activate">
|
|
14
77
|
<div class="pane-header">
|
|
15
|
-
<div out="rightCrumbsView|Breadcrumbs"></div>
|
|
78
|
+
<div when="!rightFilterOn" out="rightCrumbsView|Breadcrumbs"></div>
|
|
16
79
|
<div out="rightFilterView|FilterBar"></div>
|
|
17
80
|
</div>
|
|
18
|
-
<div out="rightListView|FileList"></div>
|
|
81
|
+
<div data-slot="list" out="rightListView|FileList"></div>
|
|
19
82
|
<div out="rightDetailView|EntryDetail"></div>
|
|
20
|
-
<div out="rightSummaryView|Summary"></div>
|
|
21
83
|
</section>
|
|
22
|
-
<div when="
|
|
84
|
+
<div data-slot="inspector" when="showInspectorInline" out="previewView|FilePreview"></div>
|
|
85
|
+
<div class="preview-max" when="showPreviewFull" out="previewView|FilePreview"></div>
|
|
23
86
|
</main>
|
|
24
|
-
<
|
|
25
|
-
<div when="
|
|
87
|
+
<div out="commandBarView|CommandBar"></div>
|
|
88
|
+
<div class="viewer" when="showViewer" role="dialog" aria-modal="true" aria-label="File inspector" tabindex="-1" on:click="!dialog:viewer-cancel" out="previewView|FilePreview"></div>
|
|
89
|
+
<div when="panelOpen" out="panelView|CommandPanel"></div>
|
|
26
90
|
<div when="bookmarkOpen" out="bookmarkView|BookmarkList"></div>
|
|
91
|
+
<div when="overlayOpen" out="overlayView|OverlayList"></div>
|
|
27
92
|
<div out="confirmView|Confirm"></div>
|
|
93
|
+
<div when="helpOpen" out="helpView|Help"></div>
|
|
28
94
|
</div>
|