tmux-weblink 0.3.2 → 0.3.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tmux-weblink",
3
- "version": "0.3.2",
3
+ "version": "0.3.3",
4
4
  "description": "Access your tmux sessions from the browser. A continuation of tmux-web and persalink.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,253 +0,0 @@
1
- function s(){return`
2
- #terminal-layout {
3
- display: flex;
4
- flex: 1;
5
- min-height: 0;
6
- overflow: hidden;
7
- }
8
- #session-sidebar {
9
- width: 220px;
10
- flex-shrink: 0;
11
- background: var(--panel-bg);
12
- border-right: 1px solid var(--panel-border);
13
- display: flex;
14
- flex-direction: column;
15
- overflow: hidden;
16
- transition: width 0.2s ease, border-color 0.2s ease;
17
- }
18
- #session-sidebar.collapsed {
19
- width: 0;
20
- border-right-color: transparent;
21
- }
22
- #session-sidebar .sidebar-header {
23
- display: flex;
24
- align-items: center;
25
- justify-content: space-between;
26
- padding: 10px 12px;
27
- border-bottom: 1px solid var(--panel-border);
28
- font-size: var(--text-xs);
29
- font-weight: 600;
30
- letter-spacing: 0.05em;
31
- text-transform: uppercase;
32
- color: var(--panel-accent);
33
- font-family: var(--font-mono);
34
- flex-shrink: 0;
35
- }
36
- #session-sidebar .sidebar-list {
37
- flex: 1;
38
- overflow-y: auto;
39
- padding: 8px 0;
40
- scrollbar-width: thin;
41
- scrollbar-color: var(--panel-border) transparent;
42
- }
43
- #session-sidebar .sidebar-list::-webkit-scrollbar { width: 4px; }
44
- #session-sidebar .sidebar-list::-webkit-scrollbar-track { background: transparent; }
45
- #session-sidebar .sidebar-list::-webkit-scrollbar-thumb {
46
- background: var(--panel-border); border-radius: 2px;
47
- }
48
- #session-sidebar .sidebar-list::-webkit-scrollbar-thumb:hover { background: var(--panel-muted); }
49
- #session-sidebar .sidebar-empty {
50
- padding: 16px;
51
- text-align: center;
52
- color: var(--panel-muted);
53
- font-size: var(--text-xs);
54
- font-family: var(--font-mono);
55
- }
56
- #session-sidebar .sidebar-row {
57
- display: flex;
58
- align-items: center;
59
- gap: 8px;
60
- width: 100%;
61
- min-height: 40px;
62
- padding: 8px 12px;
63
- background: none;
64
- border: none;
65
- border-bottom: 1px solid var(--panel-border);
66
- color: var(--page-fg);
67
- cursor: pointer;
68
- text-align: left;
69
- font-family: var(--font-mono);
70
- font-size: var(--text-sm);
71
- transition: background 0.15s;
72
- text-decoration: none;
73
- }
74
- #session-sidebar .sidebar-row:last-child { border-bottom: none; }
75
- #session-sidebar .sidebar-row:hover { background: color-mix(in srgb, var(--panel-accent) 8%, transparent); }
76
- #session-sidebar .sidebar-row.current {
77
- background: color-mix(in srgb, var(--panel-accent) 12%, transparent);
78
- color: var(--panel-accent);
79
- font-weight: 500;
80
- }
81
- #session-sidebar .sidebar-row-name {
82
- flex: 1;
83
- min-width: 0;
84
- overflow: hidden;
85
- text-overflow: ellipsis;
86
- white-space: nowrap;
87
- }
88
- #session-sidebar .sidebar-row-dot {
89
- width: 8px;
90
- height: 8px;
91
- border-radius: 50%;
92
- background: var(--panel-muted);
93
- flex-shrink: 0;
94
- }
95
- #session-sidebar .sidebar-row.current .sidebar-row-dot { background: var(--panel-accent); }
96
- #session-sidebar .sidebar-row.attached .sidebar-row-dot { background: var(--panel-success); }
97
- #session-sidebar-toggle {
98
- display: none;
99
- align-items: center;
100
- justify-content: center;
101
- background: none;
102
- border: none;
103
- color: var(--panel-muted);
104
- cursor: pointer;
105
- min-width: 44px;
106
- min-height: 44px;
107
- padding: 8px;
108
- border-radius: 10px;
109
- transition: color 0.15s, background 0.15s;
110
- font-size: var(--text-sm);
111
- }
112
- #session-sidebar-toggle:hover { color: var(--panel-accent); background: color-mix(in srgb, var(--panel-accent) 8%, transparent); }
113
- #session-sidebar-toggle svg { width: 18px; height: 18px; fill: currentColor; }
114
- @media (max-width: 768px) {
115
- #session-sidebar {
116
- position: fixed;
117
- left: 0;
118
- top: 0;
119
- height: 100%;
120
- z-index: 1000;
121
- width: min(280px, 80vw);
122
- transform: translateX(-100%);
123
- transition: transform 0.25s ease;
124
- }
125
- #session-sidebar.open { transform: translateX(0); }
126
- #session-sidebar.collapsed { width: min(280px, 80vw); }
127
- #session-sidebar-backdrop {
128
- position: fixed;
129
- inset: 0;
130
- background: rgba(0,0,0,0.45);
131
- z-index: 999;
132
- opacity: 0;
133
- pointer-events: none;
134
- transition: opacity 0.2s ease;
135
- }
136
- #session-sidebar-backdrop.open { opacity: 1; pointer-events: auto; }
137
- #session-sidebar-toggle { display: flex; }
138
- }
139
- @media (min-width: 769px) {
140
- #session-sidebar-backdrop { display: none; }
141
- }
142
- `}function i(e){return`
143
- <div id="session-sidebar-backdrop"></div>
144
- <aside id="session-sidebar" aria-label="Sessions">
145
- <div class="sidebar-header">
146
- <span>Sessions</span>
147
- <button type="button" id="session-sidebar-close" class="header-icon-btn" aria-label="Close sessions">\xD7</button>
148
- </div>
149
- <div class="sidebar-list" id="session-sidebar-list">
150
- <div class="sidebar-empty">Loading sessions\u2026</div>
151
- </div>
152
- </aside>`}function n(e){return`
153
- (function () {
154
- const SIDEBAR_CURRENT = ${JSON.stringify(e)};
155
- const sidebar = document.getElementById('session-sidebar');
156
- const backdrop = document.getElementById('session-sidebar-backdrop');
157
- const list = document.getElementById('session-sidebar-list');
158
- const toggleBtn = document.getElementById('session-sidebar-toggle');
159
- const closeBtn = document.getElementById('session-sidebar-close');
160
-
161
- function isMobile() {
162
- return window.innerWidth <= 768;
163
- }
164
-
165
- function openSidebar() {
166
- if (isMobile()) {
167
- sidebar.classList.add('open');
168
- backdrop.classList.add('open');
169
- } else {
170
- sidebar.classList.remove('collapsed');
171
- try { localStorage.setItem('tmux-web:session-sidebar', 'open'); } catch {}
172
- }
173
- }
174
-
175
- function closeSidebar() {
176
- if (isMobile()) {
177
- sidebar.classList.remove('open');
178
- backdrop.classList.remove('open');
179
- } else {
180
- sidebar.classList.add('collapsed');
181
- try { localStorage.setItem('tmux-web:session-sidebar', 'collapsed'); } catch {}
182
- }
183
- }
184
-
185
- function toggleSidebar() {
186
- if (isMobile()) {
187
- sidebar.classList.contains('open') ? closeSidebar() : openSidebar();
188
- } else {
189
- sidebar.classList.contains('collapsed') ? openSidebar() : closeSidebar();
190
- }
191
- }
192
-
193
- function renderSessions(sessions) {
194
- list.innerHTML = '';
195
- if (!sessions || !sessions.length) {
196
- list.innerHTML = '<div class="sidebar-empty">No tmux sessions</div>';
197
- return;
198
- }
199
- sessions.forEach((session) => {
200
- const row = document.createElement('a');
201
- row.className = 'sidebar-row' +
202
- (session.name === SIDEBAR_CURRENT ? ' current' : '') +
203
- (session.attached ? ' attached' : '');
204
- row.href = '/s/' + encodeURIComponent(session.name);
205
- row.title = session.name + ' \xB7 ' + session.windows + ' window' + (session.windows === 1 ? '' : 's');
206
-
207
- const dot = document.createElement('span');
208
- dot.className = 'sidebar-row-dot';
209
-
210
- const name = document.createElement('span');
211
- name.className = 'sidebar-row-name';
212
- name.textContent = session.name;
213
-
214
- row.appendChild(dot);
215
- row.appendChild(name);
216
- list.appendChild(row);
217
- });
218
- }
219
-
220
- function renderSidebar() {
221
- const cfg = window.__TMUX_WEB_TERMINAL__;
222
- const data = cfg && cfg.sidebarSessions ? cfg.sidebarSessions : { pinned: [], recent: [] };
223
- const sessions = (data.recent || []).concat(data.pinned ? data.pinned.map((p) => ({
224
- name: p.sessionName,
225
- windows: p.windows ?? 0,
226
- attached: p.attached ?? false,
227
- })) : []);
228
- const seen = new Set();
229
- const unique = [];
230
- sessions.forEach((s) => { if (!seen.has(s.name)) { seen.add(s.name); unique.push(s); } });
231
- unique.sort((a, b) => {
232
- if (a.name === SIDEBAR_CURRENT) return -1;
233
- if (b.name === SIDEBAR_CURRENT) return 1;
234
- return a.name.localeCompare(b.name);
235
- });
236
- renderSessions(unique);
237
- }
238
-
239
- if (toggleBtn) toggleBtn.addEventListener('click', toggleSidebar);
240
- if (closeBtn) closeBtn.addEventListener('click', closeSidebar);
241
- if (backdrop) backdrop.addEventListener('click', closeSidebar);
242
-
243
- // Restore desktop collapsed state.
244
- try {
245
- const saved = localStorage.getItem('tmux-web:session-sidebar');
246
- if (saved === 'collapsed' && !isMobile()) sidebar.classList.add('collapsed');
247
- } catch {}
248
-
249
- renderSidebar();
250
- })();
251
- `}function o(){return`<button type="button" id="session-sidebar-toggle" class="header-icon-btn" title="Toggle sessions sidebar" aria-label="Toggle sessions sidebar">
252
- <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/></svg>
253
- </button>`}export{s as sessionSidebarCSS,i as sessionSidebarHTML,n as sessionSidebarScript,o as sessionSidebarToggleButtonHTML};