clideck 1.22.2
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/LICENSE +21 -0
- package/README.md +77 -0
- package/activity.js +56 -0
- package/agent-presets.json +93 -0
- package/assets/clideck-themes.jpg +0 -0
- package/bin/clideck.js +2 -0
- package/config.js +96 -0
- package/handlers.js +297 -0
- package/opencode-bridge.js +148 -0
- package/opencode-plugin/clideck-bridge.js +24 -0
- package/package.json +47 -0
- package/paths.js +41 -0
- package/plugin-loader.js +285 -0
- package/plugins/trim-clip/clideck-plugin.json +13 -0
- package/plugins/trim-clip/client.js +31 -0
- package/plugins/trim-clip/index.js +10 -0
- package/plugins/voice-input/clideck-plugin.json +49 -0
- package/plugins/voice-input/client.js +196 -0
- package/plugins/voice-input/index.js +342 -0
- package/plugins/voice-input/python/mel_filters.npz +0 -0
- package/plugins/voice-input/python/whisper_turbo.py +416 -0
- package/plugins/voice-input/python/worker.py +135 -0
- package/public/fx/bold-beep-idle.mp3 +0 -0
- package/public/fx/default-beep.mp3 +0 -0
- package/public/fx/echo-beep-idle.mp3 +0 -0
- package/public/fx/musical-beep-idle.mp3 +0 -0
- package/public/fx/small-bleep-idle.mp3 +0 -0
- package/public/fx/soft-beep.mp3 +0 -0
- package/public/fx/space-idle.mp3 +0 -0
- package/public/img/claude-code.png +0 -0
- package/public/img/clideck-logo-icon.png +0 -0
- package/public/img/clideck-logo-terminal-panel.png +0 -0
- package/public/img/codex.png +0 -0
- package/public/img/gemini.png +0 -0
- package/public/img/opencode.png +0 -0
- package/public/index.html +243 -0
- package/public/js/app.js +794 -0
- package/public/js/color-mode.js +51 -0
- package/public/js/confirm.js +27 -0
- package/public/js/creator.js +201 -0
- package/public/js/drag.js +134 -0
- package/public/js/folder-picker.js +81 -0
- package/public/js/hotkeys.js +90 -0
- package/public/js/nav.js +56 -0
- package/public/js/profiles.js +22 -0
- package/public/js/prompts.js +325 -0
- package/public/js/settings.js +489 -0
- package/public/js/state.js +15 -0
- package/public/js/terminals.js +905 -0
- package/public/js/toast.js +62 -0
- package/public/js/utils.js +27 -0
- package/public/tailwind.css +1 -0
- package/server.js +126 -0
- package/sessions.js +375 -0
- package/telemetry-receiver.js +129 -0
- package/themes.js +247 -0
- package/transcript.js +90 -0
- package/utils.js +66 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<title>CliDeck</title>
|
|
6
|
+
<link rel="icon" type="image/png" href="/img/clideck-logo-icon.png">
|
|
7
|
+
<link rel="stylesheet" href="/xterm.css">
|
|
8
|
+
<link rel="stylesheet" href="/tailwind.css">
|
|
9
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
10
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
11
|
+
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@700&display=swap" rel="stylesheet">
|
|
12
|
+
</head>
|
|
13
|
+
<body class="flex h-screen bg-slate-950 text-slate-200 font-sans overflow-hidden">
|
|
14
|
+
|
|
15
|
+
<!-- Navigation Rail -->
|
|
16
|
+
<nav id="nav-rail" class="w-12 flex-shrink-0 bg-slate-900 border-r border-slate-700/50 flex flex-col items-center py-3 gap-1">
|
|
17
|
+
<button class="rail-btn relative w-9 h-9 flex items-center justify-center rounded-lg text-slate-200 bg-slate-800 transition-colors" data-panel="chats" title="Sessions">
|
|
18
|
+
<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>
|
|
19
|
+
<span id="rail-unread" class="hidden absolute -top-1 -right-1 min-w-[16px] h-4 px-1 rounded-full text-[10px] font-bold flex items-center justify-center" style="background:var(--color-rail-badge-bg);color:var(--color-rail-badge-text)"></span>
|
|
20
|
+
</button>
|
|
21
|
+
<button class="rail-btn w-9 h-9 flex items-center justify-center rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-800/50 transition-colors" data-panel="prompts" title="Prompt Library">
|
|
22
|
+
<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><path d="M14 2v6h6"/><path d="M16 13H8"/><path d="M16 17H8"/></svg>
|
|
23
|
+
</button>
|
|
24
|
+
<button class="rail-btn w-9 h-9 flex items-center justify-center rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-800/50 transition-colors" data-panel="plugins" title="Plugins">
|
|
25
|
+
<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2v4m0 12v4M2 12h4m12 0h4"/><circle cx="12" cy="12" r="3"/><path d="M12 8V6m0 12v-2M8 12H6m12 0h-2"/></svg>
|
|
26
|
+
</button>
|
|
27
|
+
<div class="flex-1"></div>
|
|
28
|
+
<button class="theme-toggle rail-btn w-9 h-9 flex items-center justify-center rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-800/50 transition-colors" id="btn-theme-toggle" title="Toggle light/dark mode">
|
|
29
|
+
<svg class="icon-sun w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
|
|
30
|
+
<svg class="icon-moon w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>
|
|
31
|
+
</button>
|
|
32
|
+
<button class="rail-btn w-9 h-9 flex items-center justify-center rounded-lg text-slate-500 hover:text-slate-300 hover:bg-slate-800/50 transition-colors" id="rail-settings" title="Settings">
|
|
33
|
+
<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M10.3 4.3c.4-1.7 2.9-1.7 3.4 0a1.7 1.7 0 0 0 2.6 1.1c1.5-.9 3.3.8 2.4 2.4a1.7 1.7 0 0 0 1 2.5c1.8.4 1.8 2.9 0 3.4a1.7 1.7 0 0 0-1 2.5c.9 1.6-.9 3.3-2.4 2.4a1.7 1.7 0 0 0-2.6 1c-.4 1.8-2.9 1.8-3.4 0a1.7 1.7 0 0 0-2.5-1.1c-1.6.9-3.3-.8-2.4-2.3a1.7 1.7 0 0 0-1.1-2.6c-1.7-.4-1.7-2.9 0-3.3a1.7 1.7 0 0 0 1.1-2.6c-.9-1.6.8-3.3 2.4-2.4 1 .6 2.3.1 2.5-1"/><circle cx="12" cy="12" r="3"/></svg>
|
|
34
|
+
</button>
|
|
35
|
+
</nav>
|
|
36
|
+
|
|
37
|
+
<!-- Sidebar -->
|
|
38
|
+
<aside id="sidebar" class="w-[354px] min-w-[354px] bg-slate-900 border-r border-slate-700/50 flex flex-col">
|
|
39
|
+
<!-- Chats panel -->
|
|
40
|
+
<div id="panel-chats" class="flex flex-col flex-1 min-h-0">
|
|
41
|
+
<div class="flex items-center justify-between px-3 pt-3 pb-2">
|
|
42
|
+
<span class="text-sm font-bold text-slate-200 tracking-tight" style="font-family:'JetBrains Mono',monospace">CliDeck</span>
|
|
43
|
+
<div class="flex items-center gap-1">
|
|
44
|
+
<span id="save-indicator" class="save-indicator" title="Sessions saved">
|
|
45
|
+
<svg class="save-tick" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6L9 17l-5-5"/></svg>
|
|
46
|
+
<svg class="save-spin" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><path d="M12 2a10 10 0 0 1 10 10"/></svg>
|
|
47
|
+
</span>
|
|
48
|
+
<button class="icon-btn w-7 h-7 flex items-center justify-center rounded-md border border-slate-600 text-slate-400 hover:bg-slate-700 hover:text-slate-200 transition-colors" id="btn-new-project" title="New project">
|
|
49
|
+
<svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/><path d="M12 11v6M9 14h6"/></svg>
|
|
50
|
+
</button>
|
|
51
|
+
<button class="icon-btn w-7 h-7 flex items-center justify-center rounded-md border border-slate-600 text-slate-400 hover:bg-slate-700 hover:text-slate-200 transition-colors text-sm" id="btn-new" title="New session">+</button>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
<div class="px-2.5 pb-2.5 flex flex-col gap-2">
|
|
55
|
+
<div class="relative">
|
|
56
|
+
<svg class="absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-slate-500 pointer-events-none" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/></svg>
|
|
57
|
+
<input id="search-input" type="text" placeholder="Search" class="w-full pl-9 pr-3 py-[7px] text-[13px] bg-slate-800/50 rounded-full text-slate-300 placeholder-slate-600 outline-none border border-transparent focus:border-slate-600/60 focus:bg-slate-800/80 transition-all">
|
|
58
|
+
</div>
|
|
59
|
+
<div class="flex bg-slate-800/30 rounded-lg p-[3px]">
|
|
60
|
+
<button class="filter-tab flex-1 text-[11px] font-medium py-[5px] rounded-md transition-all bg-slate-700/60 text-slate-200" data-tab="all">All</button>
|
|
61
|
+
<button class="filter-tab flex-1 text-[11px] font-medium py-[5px] rounded-md transition-all text-slate-500 hover:text-slate-400 flex items-center justify-center gap-1" data-tab="unread">
|
|
62
|
+
Unread
|
|
63
|
+
<span id="unread-badge" class="hidden min-w-[16px] h-4 px-1 rounded-full bg-blue-500/15 text-blue-400 text-[10px] font-semibold inline-flex items-center justify-center">0</span>
|
|
64
|
+
</button>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
<div id="session-list" class="tmx-scroll flex-1 overflow-y-auto border-t border-slate-700/50"></div>
|
|
68
|
+
</div>
|
|
69
|
+
<!-- Prompts panel (rendered by prompts.js) -->
|
|
70
|
+
<div id="panel-prompts" class="hidden flex-col flex-1 min-h-0"></div>
|
|
71
|
+
<!-- Plugins panel -->
|
|
72
|
+
<div id="panel-plugins" class="hidden flex-col flex-1 min-h-0">
|
|
73
|
+
<div class="px-4 py-3 border-b border-slate-700/50">
|
|
74
|
+
<span class="text-xs font-semibold uppercase tracking-wider text-slate-500">Plugins</span>
|
|
75
|
+
</div>
|
|
76
|
+
<div id="plugins-list" class="flex-1 overflow-y-auto py-2"></div>
|
|
77
|
+
</div>
|
|
78
|
+
<!-- Settings panel (category nav in sidebar) -->
|
|
79
|
+
<div id="panel-settings" class="hidden flex-col flex-1 min-h-0">
|
|
80
|
+
<div class="px-4 py-3 border-b border-slate-700/50">
|
|
81
|
+
<span class="text-xs font-semibold uppercase tracking-wider text-slate-500">Settings</span>
|
|
82
|
+
</div>
|
|
83
|
+
<div id="settings-nav" class="flex-1 overflow-y-auto pt-1">
|
|
84
|
+
<button class="settings-cat active-cat flex items-center gap-2.5 w-full text-left px-4 py-2.5 text-sm text-slate-200 bg-slate-800/60 transition-colors" data-cat="general">
|
|
85
|
+
<svg class="w-4 h-4 flex-shrink-0 text-slate-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M10.3 4.3c.4-1.7 2.9-1.7 3.4 0a1.7 1.7 0 0 0 2.6 1.1c1.5-.9 3.3.8 2.4 2.4a1.7 1.7 0 0 0 1 2.5c1.8.4 1.8 2.9 0 3.4a1.7 1.7 0 0 0-1 2.5c.9 1.6-.9 3.3-2.4 2.4a1.7 1.7 0 0 0-2.6 1c-.4 1.8-2.9 1.8-3.4 0a1.7 1.7 0 0 0-2.5-1.1c-1.6.9-3.3-.8-2.4-2.3a1.7 1.7 0 0 0-1.1-2.6c-1.7-.4-1.7-2.9 0-3.3a1.7 1.7 0 0 0 1.1-2.6c-.9-1.6.8-3.3 2.4-2.4 1 .6 2.3.1 2.5-1"/><circle cx="12" cy="12" r="3"/></svg>
|
|
86
|
+
General
|
|
87
|
+
</button>
|
|
88
|
+
<button class="settings-cat flex items-center gap-2.5 w-full text-left px-4 py-2.5 text-sm text-slate-500 hover:text-slate-300 hover:bg-slate-800/30 transition-colors" data-cat="agents">
|
|
89
|
+
<svg class="w-4 h-4 flex-shrink-0 text-slate-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2"/><path d="M8 21h8"/><path d="M12 17v4"/><path d="M7 10l2 2 4-4"/></svg>
|
|
90
|
+
CLI Agents
|
|
91
|
+
</button>
|
|
92
|
+
<button class="settings-cat flex items-center gap-2.5 w-full text-left px-4 py-2.5 text-sm text-slate-500 hover:text-slate-300 hover:bg-slate-800/30 transition-colors" data-cat="notifications">
|
|
93
|
+
<svg class="w-4 h-4 flex-shrink-0 text-slate-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/></svg>
|
|
94
|
+
Notifications
|
|
95
|
+
</button>
|
|
96
|
+
<button class="settings-cat flex items-center gap-2.5 w-full text-left px-4 py-2.5 text-sm text-slate-500 hover:text-slate-300 hover:bg-slate-800/30 transition-colors" data-cat="appearance">
|
|
97
|
+
<svg class="w-4 h-4 flex-shrink-0 text-slate-400" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 2a7 7 0 0 0 0 20 4 4 0 0 1 0-8 4 4 0 0 0 0-8"/><circle cx="12" cy="9" r="1.5" fill="currentColor"/></svg>
|
|
98
|
+
Appearance
|
|
99
|
+
</button>
|
|
100
|
+
</div>
|
|
101
|
+
</div>
|
|
102
|
+
</aside>
|
|
103
|
+
|
|
104
|
+
<!-- Main -->
|
|
105
|
+
<main id="main" class="flex-1 flex relative">
|
|
106
|
+
<div id="terminals" class="absolute inset-0" style="pointer-events:none"></div>
|
|
107
|
+
<div id="plugin-toolbar" class="absolute top-2 right-3 z-10 flex gap-1.5 empty:hidden"></div>
|
|
108
|
+
<div id="empty" class="absolute inset-0 flex flex-col items-center justify-center select-none">
|
|
109
|
+
<img src="/img/clideck-logo-terminal-panel.png" alt="CliDeck" class="w-44 opacity-60 mb-5" draggable="false">
|
|
110
|
+
<p class="text-slate-500 text-[13px] leading-relaxed text-center">Press <kbd class="px-1.5 py-0.5 rounded bg-slate-800 text-slate-300 text-[11px] font-mono">+</kbd> to start a new session<br>or resume a previous one from the sidebar</p>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
<!-- Settings overlay (content panels only — category nav is in sidebar panel-settings) -->
|
|
114
|
+
<div id="settings-overlay" class="absolute inset-0 z-[200] bg-slate-950 hidden overflow-y-auto">
|
|
115
|
+
|
|
116
|
+
<!-- General -->
|
|
117
|
+
<div id="settings-general" class="settings-panel p-6 max-w-xl">
|
|
118
|
+
<h3 class="text-xs font-semibold uppercase tracking-wider text-slate-500 mb-4">General</h3>
|
|
119
|
+
<div class="mb-5">
|
|
120
|
+
<label class="block text-xs text-slate-400 mb-1.5">Default working directory</label>
|
|
121
|
+
<div class="flex gap-2">
|
|
122
|
+
<input type="text" id="cfg-default-path" placeholder="/Users/you/projects"
|
|
123
|
+
class="flex-1 px-3 py-2 text-sm bg-slate-800 border border-slate-600 rounded-md text-slate-200 placeholder-slate-500 outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500/30 transition-colors">
|
|
124
|
+
<button class="px-3 py-2 text-xs bg-slate-800 border border-slate-600 rounded-md text-slate-300 hover:bg-slate-700 transition-colors" id="btn-browse-path">Browse</button>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
<h3 class="text-xs font-semibold uppercase tracking-wider text-slate-500 mb-3 mt-8">Behavior</h3>
|
|
128
|
+
<label class="flex items-center gap-2 text-sm text-slate-300 cursor-pointer">
|
|
129
|
+
<input type="checkbox" id="cfg-confirm-close" name="cfg-confirm-close" class="accent-blue-500">
|
|
130
|
+
Confirm before closing a session
|
|
131
|
+
</label>
|
|
132
|
+
</div>
|
|
133
|
+
|
|
134
|
+
<!-- CLI Agents -->
|
|
135
|
+
<div id="settings-agents" class="settings-panel hidden p-6 max-w-2xl">
|
|
136
|
+
<div class="flex items-center justify-between mb-4">
|
|
137
|
+
<h3 class="text-xs font-semibold uppercase tracking-wider text-slate-500">CLI Agents</h3>
|
|
138
|
+
<button class="px-3 py-1.5 text-xs bg-slate-800 border border-slate-600 rounded-md text-slate-300 hover:bg-slate-700 transition-colors" id="btn-add-agent">+ Add agent</button>
|
|
139
|
+
</div>
|
|
140
|
+
<div id="agent-list" class="space-y-3"></div>
|
|
141
|
+
</div>
|
|
142
|
+
|
|
143
|
+
<!-- Notifications -->
|
|
144
|
+
<div id="settings-notifications" class="settings-panel hidden p-6 max-w-xl">
|
|
145
|
+
<h3 class="text-xs font-semibold uppercase tracking-wider text-slate-500 mb-4">Notifications</h3>
|
|
146
|
+
<div class="mb-5">
|
|
147
|
+
<label class="flex items-center gap-2 text-sm text-slate-300 cursor-pointer">
|
|
148
|
+
<input type="checkbox" id="cfg-notify-idle" name="cfg-notify-idle" class="accent-blue-500">
|
|
149
|
+
Notify when an agent finishes working
|
|
150
|
+
<span id="notify-permission-status" class="hidden text-[11px] ml-auto"></span>
|
|
151
|
+
</label>
|
|
152
|
+
<p class="text-xs text-slate-500 mt-1.5 ml-6">Get a browser notification when a session goes from working to idle</p>
|
|
153
|
+
</div>
|
|
154
|
+
<div class="mb-5">
|
|
155
|
+
<label class="flex items-center gap-2 text-sm text-slate-300 cursor-pointer">
|
|
156
|
+
<input type="checkbox" id="cfg-notify-sound" name="cfg-notify-sound" class="accent-blue-500" checked>
|
|
157
|
+
Play sound when an agent finishes working
|
|
158
|
+
</label>
|
|
159
|
+
<p class="text-xs text-slate-500 mt-1.5 ml-6">Audio beep on working-to-idle transitions</p>
|
|
160
|
+
</div>
|
|
161
|
+
<div id="notify-sound-row" class="mb-5 ml-6">
|
|
162
|
+
<label class="block text-xs text-slate-400 mb-1.5">Notification sound</label>
|
|
163
|
+
<div class="flex items-center gap-2">
|
|
164
|
+
<select id="cfg-notify-sound-pick" class="flex-1 px-3 py-1.5 text-sm bg-slate-800 border border-slate-600 rounded-md text-slate-200 outline-none focus:border-blue-500 transition-colors cursor-pointer">
|
|
165
|
+
<option value="default-beep">Default</option>
|
|
166
|
+
<option value="soft-beep">Soft</option>
|
|
167
|
+
<option value="bold-beep-idle">Bold</option>
|
|
168
|
+
<option value="echo-beep-idle">Echo</option>
|
|
169
|
+
<option value="musical-beep-idle">Musical</option>
|
|
170
|
+
<option value="small-bleep-idle">Bleep</option>
|
|
171
|
+
<option value="space-idle">Space</option>
|
|
172
|
+
</select>
|
|
173
|
+
<button id="btn-sound-preview" class="flex-shrink-0 w-8 h-8 flex items-center justify-center rounded-md border border-slate-600 text-slate-400 hover:text-slate-200 hover:bg-slate-700 transition-colors" title="Preview sound">
|
|
174
|
+
<svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"/><path d="M15.54 8.46a5 5 0 0 1 0 7.07"/><path d="M19.07 4.93a10 10 0 0 1 0 14.14"/></svg>
|
|
175
|
+
</button>
|
|
176
|
+
</div>
|
|
177
|
+
</div>
|
|
178
|
+
<div class="mb-5">
|
|
179
|
+
<label class="block text-xs text-slate-400 mb-1.5 ml-6">Minimum working time before notifying</label>
|
|
180
|
+
<select id="cfg-notify-min-work" class="ml-6 px-3 py-1.5 text-sm bg-slate-800 border border-slate-600 rounded-md text-slate-200 outline-none focus:border-blue-500 transition-colors cursor-pointer">
|
|
181
|
+
<option value="5">5 seconds</option>
|
|
182
|
+
<option value="10" selected>10 seconds</option>
|
|
183
|
+
<option value="20">20 seconds</option>
|
|
184
|
+
<option value="30">30 seconds</option>
|
|
185
|
+
<option value="60">60 seconds</option>
|
|
186
|
+
</select>
|
|
187
|
+
</div>
|
|
188
|
+
<div class="mt-6 px-4 py-3 rounded-lg bg-slate-800/50 border border-slate-700/40">
|
|
189
|
+
<p class="text-[11px] font-medium text-slate-400 mb-1.5">When do notifications fire?</p>
|
|
190
|
+
<div class="text-[11px] text-slate-500 leading-relaxed space-y-1">
|
|
191
|
+
<p><span class="text-slate-400">Sound</span> — plays for background sessions. If you're viewing the session, no sound.</p>
|
|
192
|
+
<p><span class="text-slate-400">Browser</span> — only when the CliDeck tab is not in focus.</p>
|
|
193
|
+
<p><span class="text-slate-400">Mute</span> — right-click a session to mute both sound and browser notifications.</p>
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
|
|
198
|
+
<!-- Appearance -->
|
|
199
|
+
<div id="settings-appearance" class="settings-panel hidden p-6 max-w-xl">
|
|
200
|
+
<h3 class="text-xs font-semibold uppercase tracking-wider text-slate-500 mb-4">Appearance</h3>
|
|
201
|
+
<div class="mb-5">
|
|
202
|
+
<label class="block text-xs text-slate-400 mb-1.5">Default terminal theme</label>
|
|
203
|
+
<input type="hidden" id="cfg-default-theme" name="cfg-default-theme" value="default">
|
|
204
|
+
<button type="button" id="default-theme-trigger" class="w-full px-3 py-2 text-sm bg-slate-800 border border-slate-600 rounded-md text-slate-200 text-left flex items-center justify-between outline-none hover:border-slate-500 transition-colors cursor-pointer">
|
|
205
|
+
<span id="default-theme-label" class="theme-label truncate">Default</span>
|
|
206
|
+
<span class="text-slate-500 text-xs ml-2">▾</span>
|
|
207
|
+
</button>
|
|
208
|
+
<div id="default-theme-preview" class="mt-2 rounded-md overflow-hidden text-[11px] font-mono leading-[1.45] whitespace-pre"></div>
|
|
209
|
+
</div>
|
|
210
|
+
</div>
|
|
211
|
+
|
|
212
|
+
</div>
|
|
213
|
+
|
|
214
|
+
<!-- Confirmation dialog -->
|
|
215
|
+
<div id="confirm-close" class="absolute inset-0 z-[250] bg-black/60 backdrop-blur-sm hidden items-center justify-center">
|
|
216
|
+
<div class="bg-slate-800 border border-slate-600 rounded-xl shadow-2xl shadow-black/50 w-80 flex flex-col">
|
|
217
|
+
<div id="cc-message" class="px-5 py-4 text-sm">Close this session? The terminal process will be killed.</div>
|
|
218
|
+
<div class="px-4 py-3 border-t border-slate-700 flex justify-end gap-2">
|
|
219
|
+
<button id="cc-cancel" class="px-3 py-1.5 text-xs rounded-md border border-slate-600 text-slate-300 hover:bg-slate-700 transition-colors">Cancel</button>
|
|
220
|
+
<button id="cc-confirm" class="px-3 py-1.5 text-xs rounded-md bg-red-600 text-white hover:bg-red-500 transition-colors">Delete</button>
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
</div>
|
|
224
|
+
|
|
225
|
+
<!-- Folder picker -->
|
|
226
|
+
<div id="folder-picker" class="absolute inset-0 z-[300] bg-black/60 backdrop-blur-sm hidden items-center justify-center">
|
|
227
|
+
<div class="bg-slate-800 border border-slate-600 rounded-xl shadow-2xl shadow-black/50 w-[420px] max-h-[460px] flex flex-col">
|
|
228
|
+
<div class="px-4 py-3 border-b border-slate-700 text-sm font-semibold">Choose Directory</div>
|
|
229
|
+
<div id="fp-path" class="px-4 py-2 text-xs text-slate-400 border-b border-slate-700 break-all"></div>
|
|
230
|
+
<div id="fp-listing" class="flex-1 overflow-y-auto py-1 min-h-[200px]"></div>
|
|
231
|
+
<div class="px-4 py-3 border-t border-slate-700 flex justify-end gap-2">
|
|
232
|
+
<button id="fp-cancel" class="px-3 py-1.5 text-xs rounded-md border border-slate-600 text-slate-300 hover:bg-slate-700 transition-colors">Cancel</button>
|
|
233
|
+
<button id="fp-select" class="px-3 py-1.5 text-xs rounded-md bg-blue-600 text-white hover:bg-blue-500 transition-colors disabled:bg-slate-600 disabled:text-slate-400 disabled:cursor-not-allowed">Select</button>
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
</div>
|
|
237
|
+
</main>
|
|
238
|
+
|
|
239
|
+
<script src="/xterm.js"></script>
|
|
240
|
+
<script src="/addon-fit.js"></script>
|
|
241
|
+
<script type="module" src="/js/app.js"></script>
|
|
242
|
+
</body>
|
|
243
|
+
</html>
|