gh-here 3.1.0 → 3.2.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.
package/lib/constants.js CHANGED
@@ -22,13 +22,8 @@ module.exports = {
22
22
  ERROR_MESSAGES: {
23
23
  ACCESS_DENIED: 'Access denied',
24
24
  CANNOT_DOWNLOAD_DIRECTORIES: 'Cannot download directories',
25
- CANNOT_EDIT_BINARY: 'Cannot edit binary files',
26
- COMMIT_MESSAGE_REQUIRED: 'Commit message is required',
27
25
  FILE_NOT_FOUND: 'File not found',
28
26
  FILE_PATH_REQUIRED: 'File path is required',
29
- ITEM_ALREADY_EXISTS: 'Item already exists',
30
- ITEM_NOT_FOUND: 'Item not found',
31
- NO_FILES_SELECTED: 'No files selected',
32
27
  NOT_GIT_REPO: 'Not a git repository'
33
28
  },
34
29
 
package/lib/git.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Git operations module
3
- * Handles git status, commits, diffs, and branch operations
3
+ * Handles git status, diffs, and branch operations (read-only)
4
4
  * @module git
5
5
  */
6
6
 
package/lib/renderers.js CHANGED
@@ -73,18 +73,6 @@ function renderDirectory(currentPath, items, showGitignored = false, gitBranch =
73
73
  ${octicons.download.toSVG({ class: 'quick-icon' })}
74
74
  </a>
75
75
  ` : ''}
76
- ${!item.isDirectory ? `
77
- <button class="quick-btn edit-file-btn" title="Edit file" data-path="${item.path}">
78
- ${octicons.pencil.toSVG({ class: 'quick-icon' })}
79
- </button>
80
- ` : `
81
- <button class="quick-btn rename-btn" title="Rename" data-path="${item.path}" data-name="${item.name}" data-is-directory="${item.isDirectory}">
82
- ${octicons.pencil.toSVG({ class: 'quick-icon' })}
83
- </button>
84
- `}
85
- <button class="quick-btn delete-btn" title="Delete" data-path="${item.path}" data-name="${item.name}" data-is-directory="${item.isDirectory}">
86
- ${octicons.trash.toSVG({ class: 'quick-icon' })}
87
- </button>
88
76
  </div>
89
77
  </td>
90
78
  <td class="col-size">
@@ -101,7 +89,7 @@ function renderDirectory(currentPath, items, showGitignored = false, gitBranch =
101
89
  <html data-theme="dark">
102
90
  <head>
103
91
  <title>gh-here: ${currentPath || 'Root'}</title>
104
- <link rel="stylesheet" href="/static/styles.css?v=3.0.6">
92
+ <link rel="stylesheet" href="/static/css/main.css?v=3.2.0">
105
93
  <script>
106
94
  // Check localStorage and add showGitignored param if needed (before page renders)
107
95
  (function() {
@@ -403,8 +391,8 @@ async function renderFileDiff(filePath, ext, gitInfo, gitRepoRoot, workingDir =
403
391
  <html data-theme="dark">
404
392
  <head>
405
393
  <title>gh-here: ${path.basename(filePath)} (diff)</title>
406
- <link rel="stylesheet" href="/static/styles.css?v=3.0.6">
407
- <link rel="stylesheet" href="/static/highlight.css?v=${Date.now()}">
394
+ <link rel="stylesheet" href="/static/css/main.css?v=3.2.0">
395
+
408
396
  <script>
409
397
  // Check localStorage and add showGitignored param if needed (before page renders)
410
398
  (function() {
@@ -783,8 +771,8 @@ async function renderFile(filePath, content, ext, viewMode = 'rendered', gitStat
783
771
  <html data-theme="dark">
784
772
  <head>
785
773
  <title>gh-here: ${path.basename(filePath)}</title>
786
- <link rel="stylesheet" href="/static/styles.css?v=3.0.6">
787
- <link rel="stylesheet" href="/static/highlight.css?v=${Date.now()}">
774
+ <link rel="stylesheet" href="/static/css/main.css?v=3.2.0">
775
+
788
776
  <script>
789
777
  // Check localStorage and add showGitignored param if needed (before page renders)
790
778
  (function() {
package/lib/server.js CHANGED
@@ -268,7 +268,7 @@ function setupRoutes(app, workingDir, isGitRepo, gitRepoRoot) {
268
268
  }
269
269
  });
270
270
 
271
- // API endpoint to get file content for editing
271
+ // API endpoint to get raw file content (for copy raw feature)
272
272
  app.get('/api/file-content', (req, res) => {
273
273
  try {
274
274
  const currentPath = req.query.path || '';
@@ -279,9 +279,9 @@ function setupRoutes(app, workingDir, isGitRepo, gitRepoRoot) {
279
279
  return res.status(403).send('Access denied');
280
280
  }
281
281
 
282
- // Check if it's a binary file - prevent editing
282
+ // Skip binary files
283
283
  if (isBinaryFile(fullPath)) {
284
- return res.status(400).json({ error: 'Cannot edit binary files' });
284
+ return res.status(400).json({ error: 'Cannot read binary files as text' });
285
285
  }
286
286
 
287
287
  const content = fs.readFileSync(fullPath, 'utf-8');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gh-here",
3
- "version": "3.1.0",
3
+ "version": "3.2.0",
4
4
  "description": "A local GitHub-like file browser for viewing code",
5
5
  "repository": {
6
6
  "type": "git",
package/public/app.js CHANGED
@@ -84,6 +84,7 @@ class Application {
84
84
  this.initializeInlineSearch();
85
85
  this.initializeFocusMode();
86
86
  this.initializeContentSearch();
87
+ this.initializeSymbolOutline();
87
88
  } catch (error) {
88
89
  console.error('Error re-initializing components:', error);
89
90
  }
@@ -0,0 +1,423 @@
1
+ /**
2
+ * Button Styles
3
+ * All button variants and toggle controls
4
+ */
5
+
6
+ /* ========================================
7
+ Base Button
8
+ ======================================== */
9
+
10
+ .btn {
11
+ align-items: center;
12
+ backdrop-filter: blur(10px);
13
+ border: 1px solid;
14
+ border-radius: var(--radius-lg);
15
+ box-shadow: var(--shadow-sm);
16
+ cursor: pointer;
17
+ display: inline-flex;
18
+ font-size: 13px;
19
+ font-weight: 600;
20
+ gap: 8px;
21
+ justify-content: center;
22
+ letter-spacing: -0.01em;
23
+ overflow: hidden;
24
+ padding: 8px 18px;
25
+ position: relative;
26
+ transition: all var(--transition-base);
27
+ }
28
+
29
+ .btn::before {
30
+ background: rgba(255, 255, 255, 0.1);
31
+ border-radius: 50%;
32
+ content: '';
33
+ height: 0;
34
+ left: 50%;
35
+ position: absolute;
36
+ top: 50%;
37
+ transform: translate(-50%, -50%);
38
+ transition: width 0.4s, height 0.4s;
39
+ width: 0;
40
+ }
41
+
42
+ .btn:hover::before {
43
+ height: 300px;
44
+ width: 300px;
45
+ }
46
+
47
+ /* ========================================
48
+ Button Variants
49
+ ======================================== */
50
+
51
+ .btn-primary {
52
+ background: linear-gradient(135deg, var(--bg-elevated) 0%, var(--bg-card) 100%);
53
+ border-color: var(--border-primary);
54
+ color: var(--text-primary);
55
+ }
56
+
57
+ .btn-primary:hover {
58
+ background: linear-gradient(135deg, var(--hover-bg) 0%, var(--bg-elevated) 100%);
59
+ border-color: var(--link-color);
60
+ box-shadow: var(--shadow-md), var(--shadow-glow);
61
+ transform: translateY(-2px);
62
+ }
63
+
64
+ .btn-primary:active {
65
+ box-shadow: var(--shadow-sm);
66
+ transform: translateY(0);
67
+ }
68
+
69
+ .btn-outline {
70
+ background: linear-gradient(135deg, var(--bg-card) 0%, var(--bg-elevated) 100%);
71
+ border-color: var(--border-primary);
72
+ color: var(--text-primary);
73
+ }
74
+
75
+ .btn-outline:hover {
76
+ background: linear-gradient(135deg, var(--hover-bg) 0%, var(--bg-elevated) 100%);
77
+ border-color: var(--link-color);
78
+ box-shadow: var(--shadow-md), var(--shadow-glow);
79
+ transform: translateY(-2px);
80
+ }
81
+
82
+ .btn-success {
83
+ background: linear-gradient(135deg, var(--accent-success) 0%, #10b981 100%);
84
+ border-color: rgba(255, 255, 255, 0.1);
85
+ box-shadow: 0 2px 8px rgba(16, 185, 129, 0.3), 0 0 0 1px rgba(16, 185, 129, 0.1);
86
+ color: #ffffff;
87
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
88
+ }
89
+
90
+ .btn-success:hover {
91
+ background: linear-gradient(135deg, #10b981 0%, #34d399 100%);
92
+ box-shadow: 0 4px 16px rgba(16, 185, 129, 0.4), 0 0 0 1px rgba(16, 185, 129, 0.2), 0 0 20px rgba(16, 185, 129, 0.2);
93
+ transform: translateY(-2px);
94
+ }
95
+
96
+ .btn-success:active {
97
+ box-shadow: 0 2px 8px rgba(16, 185, 129, 0.3);
98
+ transform: translateY(0);
99
+ }
100
+
101
+ .btn-secondary {
102
+ background: var(--bg-primary);
103
+ border-color: var(--border-primary);
104
+ box-shadow: 0 1px 0 rgba(27, 31, 36, 0.04);
105
+ color: var(--text-primary);
106
+ }
107
+
108
+ .btn-secondary:hover {
109
+ background: var(--hover-bg);
110
+ border-color: var(--text-secondary);
111
+ }
112
+
113
+ /* ========================================
114
+ Button Icons
115
+ ======================================== */
116
+
117
+ .btn-icon {
118
+ fill: currentColor;
119
+ height: 14px;
120
+ margin-right: 6px;
121
+ vertical-align: text-bottom;
122
+ width: 14px;
123
+ }
124
+
125
+ .btn-chevron {
126
+ fill: currentColor;
127
+ height: 16px;
128
+ width: 16px;
129
+ }
130
+
131
+ /* ========================================
132
+ Sidebar Button
133
+ ======================================== */
134
+
135
+ .btn-sidebar {
136
+ align-items: center;
137
+ background: var(--bg-primary);
138
+ border: 1px solid var(--border-primary);
139
+ border-radius: 6px;
140
+ color: var(--text-primary);
141
+ cursor: pointer;
142
+ display: flex;
143
+ font-size: 14px;
144
+ height: 28px;
145
+ justify-content: center;
146
+ padding: 5px 12px;
147
+ transition: all 0.15s ease;
148
+ width: 100%;
149
+ }
150
+
151
+ .btn-sidebar:hover {
152
+ background-color: var(--bg-tertiary);
153
+ border-color: var(--text-secondary);
154
+ }
155
+
156
+ /* ========================================
157
+ Toggle Buttons
158
+ ======================================== */
159
+
160
+ .theme-toggle,
161
+ .gitignore-toggle,
162
+ .edit-btn {
163
+ align-items: center;
164
+ backdrop-filter: blur(10px);
165
+ background: linear-gradient(135deg, var(--bg-card) 0%, var(--bg-elevated) 100%);
166
+ border: 1px solid var(--border-subtle);
167
+ border-radius: var(--radius-lg);
168
+ box-shadow: var(--shadow-sm);
169
+ color: var(--text-primary);
170
+ cursor: pointer;
171
+ display: flex;
172
+ font-size: 14px;
173
+ height: 36px;
174
+ justify-content: center;
175
+ margin: 0;
176
+ min-width: 36px;
177
+ overflow: hidden;
178
+ padding: 8px 14px;
179
+ position: relative;
180
+ transition: all var(--transition-base);
181
+ }
182
+
183
+ .theme-toggle:hover,
184
+ .gitignore-toggle:hover,
185
+ .edit-btn:hover {
186
+ background: linear-gradient(135deg, var(--hover-bg) 0%, var(--bg-elevated) 100%);
187
+ border-color: var(--link-color);
188
+ box-shadow: var(--shadow-md), var(--shadow-glow);
189
+ transform: translateY(-2px);
190
+ }
191
+
192
+ .theme-toggle:active,
193
+ .gitignore-toggle:active,
194
+ .edit-btn:active {
195
+ background: linear-gradient(135deg, var(--hover-bg-strong) 0%, var(--hover-bg) 100%);
196
+ box-shadow: var(--shadow-sm);
197
+ transform: translateY(0) scale(0.98);
198
+ }
199
+
200
+ .gitignore-toggle.showing-ignored {
201
+ background: linear-gradient(135deg, rgba(88, 166, 255, 0.12) 0%, rgba(88, 166, 255, 0.08) 100%);
202
+ border-color: var(--link-color);
203
+ box-shadow: 0 0 0 1px rgba(88, 166, 255, 0.2);
204
+ color: var(--link-color);
205
+ }
206
+
207
+ .gitignore-toggle.showing-ignored:hover {
208
+ background: linear-gradient(135deg, rgba(88, 166, 255, 0.18) 0%, rgba(88, 166, 255, 0.12) 100%);
209
+ box-shadow: 0 0 0 1px rgba(88, 166, 255, 0.3), var(--shadow-md);
210
+ }
211
+
212
+ .theme-icon,
213
+ .gitignore-icon,
214
+ .edit-icon {
215
+ fill: currentColor;
216
+ height: 16px;
217
+ width: 16px;
218
+ }
219
+
220
+ /* ========================================
221
+ View Toggle
222
+ ======================================== */
223
+
224
+ .view-toggle {
225
+ background: var(--bg-primary);
226
+ border: 1px solid var(--border-primary);
227
+ border-radius: var(--radius-md);
228
+ box-shadow: var(--shadow-sm);
229
+ display: inline-flex;
230
+ overflow: hidden;
231
+ transition: all var(--transition-base);
232
+ }
233
+
234
+ .view-toggle:hover {
235
+ border-color: var(--border-secondary);
236
+ box-shadow: var(--shadow-md);
237
+ }
238
+
239
+ .view-btn {
240
+ align-items: center;
241
+ background: transparent;
242
+ border: none;
243
+ color: var(--text-secondary);
244
+ cursor: pointer;
245
+ display: inline-flex;
246
+ font-size: 13px;
247
+ font-weight: 500;
248
+ gap: 6px;
249
+ padding: 7px 14px;
250
+ position: relative;
251
+ text-decoration: none;
252
+ transition: all var(--transition-base);
253
+ white-space: nowrap;
254
+ }
255
+
256
+ .view-btn::before {
257
+ background: var(--hover-bg);
258
+ content: '';
259
+ inset: 0;
260
+ opacity: 0;
261
+ position: absolute;
262
+ transition: opacity var(--transition-base);
263
+ }
264
+
265
+ .view-btn:hover {
266
+ color: var(--text-primary);
267
+ }
268
+
269
+ .view-btn:hover::before {
270
+ opacity: 1;
271
+ }
272
+
273
+ .view-btn.active {
274
+ background: linear-gradient(135deg, var(--link-color) 0%, var(--link-hover) 100%);
275
+ box-shadow: 0 2px 4px rgba(88, 166, 255, 0.3);
276
+ color: white;
277
+ }
278
+
279
+ .view-btn.active::before {
280
+ display: none;
281
+ }
282
+
283
+ .view-btn.active:hover {
284
+ background: linear-gradient(135deg, var(--link-hover) 0%, var(--link-color) 100%);
285
+ box-shadow: 0 4px 8px rgba(88, 166, 255, 0.4);
286
+ transform: translateY(-1px);
287
+ }
288
+
289
+ .view-btn + .view-btn {
290
+ border-left: 1px solid var(--border-primary);
291
+ }
292
+
293
+ .view-icon {
294
+ fill: currentColor;
295
+ flex-shrink: 0;
296
+ height: 16px;
297
+ width: 16px;
298
+ }
299
+
300
+ /* ========================================
301
+ Branch Button
302
+ ======================================== */
303
+
304
+ .branch-button {
305
+ align-items: center;
306
+ background: linear-gradient(135deg, var(--bg-elevated) 0%, var(--bg-secondary) 100%);
307
+ border: 1px solid var(--border-primary);
308
+ border-radius: var(--radius-lg);
309
+ box-shadow: var(--shadow-sm);
310
+ color: var(--text-primary);
311
+ cursor: pointer;
312
+ display: inline-flex;
313
+ font-size: 13px;
314
+ font-weight: 600;
315
+ gap: 8px;
316
+ overflow: hidden;
317
+ padding: 8px 16px;
318
+ position: relative;
319
+ transition: all var(--transition-base);
320
+ }
321
+
322
+ .branch-button::before {
323
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);
324
+ content: '';
325
+ height: 100%;
326
+ left: -100%;
327
+ position: absolute;
328
+ top: 0;
329
+ transition: left var(--transition-slow);
330
+ width: 100%;
331
+ }
332
+
333
+ .branch-button:hover::before {
334
+ left: 100%;
335
+ }
336
+
337
+ .branch-button:hover {
338
+ background: linear-gradient(135deg, var(--hover-bg) 0%, var(--bg-elevated) 100%);
339
+ border-color: var(--link-color);
340
+ box-shadow: var(--shadow-md), var(--shadow-glow);
341
+ transform: translateY(-2px);
342
+ }
343
+
344
+ .branch-button:active {
345
+ box-shadow: var(--shadow-sm);
346
+ transform: translateY(0);
347
+ }
348
+
349
+ .branch-count,
350
+ .tag-count {
351
+ align-items: center;
352
+ color: var(--text-secondary);
353
+ display: flex;
354
+ font-size: 14px;
355
+ gap: 6px;
356
+ }
357
+
358
+ .branch-name {
359
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
360
+ font-size: 12px;
361
+ font-weight: 600;
362
+ }
363
+
364
+ /* ========================================
365
+ Quick Action Buttons
366
+ ======================================== */
367
+
368
+ .quick-actions {
369
+ backdrop-filter: blur(8px);
370
+ background: var(--bg-secondary);
371
+ border-radius: var(--radius-sm);
372
+ display: flex;
373
+ gap: 4px;
374
+ opacity: 0;
375
+ padding: 2px;
376
+ position: absolute;
377
+ right: 8px;
378
+ top: 50%;
379
+ transform: translateY(-50%);
380
+ transition: all var(--transition-base);
381
+ z-index: 10;
382
+ }
383
+
384
+ .file-row:hover .quick-actions {
385
+ opacity: 1;
386
+ transform: translateY(-50%) scale(1);
387
+ }
388
+
389
+ .quick-btn {
390
+ align-items: center;
391
+ background: var(--bg-primary);
392
+ border: 1px solid var(--border-primary);
393
+ border-radius: var(--radius-sm);
394
+ box-shadow: var(--shadow-sm);
395
+ color: var(--text-secondary);
396
+ cursor: pointer;
397
+ display: flex;
398
+ height: 28px;
399
+ justify-content: center;
400
+ padding: 5px 7px;
401
+ text-decoration: none;
402
+ transition: all var(--transition-base);
403
+ width: 28px;
404
+ }
405
+
406
+ .quick-btn:hover {
407
+ background: var(--hover-bg);
408
+ border-color: var(--border-secondary);
409
+ box-shadow: var(--shadow-md);
410
+ color: var(--text-primary);
411
+ transform: translateY(-2px) scale(1.05);
412
+ }
413
+
414
+ .quick-btn:active {
415
+ box-shadow: var(--shadow-sm);
416
+ transform: translateY(0) scale(1);
417
+ }
418
+
419
+ .quick-icon {
420
+ fill: currentColor;
421
+ height: 12px;
422
+ width: 12px;
423
+ }
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Form Styles
3
+ * Search inputs, file inputs, and form controls
4
+ */
5
+
6
+ /* ========================================
7
+ Search Container
8
+ ======================================== */
9
+
10
+ .search-container {
11
+ align-items: center;
12
+ display: flex;
13
+ flex-shrink: 1;
14
+ max-width: 100%;
15
+ min-width: 0;
16
+ position: relative;
17
+ }
18
+
19
+ .search-input {
20
+ backdrop-filter: blur(10px);
21
+ background: linear-gradient(135deg, var(--bg-card) 0%, var(--bg-elevated) 100%);
22
+ border: 1.5px solid var(--border-subtle);
23
+ border-radius: var(--radius-lg);
24
+ box-shadow: var(--shadow-sm);
25
+ color: var(--text-primary);
26
+ flex-shrink: 1;
27
+ font-size: 14px;
28
+ font-weight: 500;
29
+ max-width: 280px;
30
+ min-width: 120px;
31
+ padding: 8px 38px 8px 36px;
32
+ transition: all var(--transition-base);
33
+ width: 100%;
34
+ }
35
+
36
+ .search-input:hover {
37
+ background: linear-gradient(135deg, var(--bg-elevated) 0%, var(--bg-card) 100%);
38
+ border-color: var(--border-primary);
39
+ box-shadow: var(--shadow-md);
40
+ transform: translateY(-1px);
41
+ }
42
+
43
+ .search-input:focus {
44
+ background: linear-gradient(135deg, var(--bg-card) 0%, var(--bg-elevated) 100%);
45
+ border-color: var(--link-color);
46
+ box-shadow: 0 0 0 3px rgba(96, 165, 250, 0.2), var(--shadow-md), var(--shadow-glow);
47
+ outline: none;
48
+ transform: translateY(-1px);
49
+ }
50
+
51
+ [data-theme="light"] .search-input:focus {
52
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.15), var(--shadow-md);
53
+ }
54
+
55
+ .search-icon {
56
+ fill: var(--text-secondary);
57
+ height: 16px;
58
+ left: 8px;
59
+ pointer-events: none;
60
+ position: absolute;
61
+ width: 16px;
62
+ }
63
+
64
+ .search-hotkey {
65
+ background: linear-gradient(135deg, var(--bg-elevated) 0%, var(--bg-tertiary) 100%);
66
+ border: 1px solid var(--border-subtle);
67
+ border-radius: var(--radius-sm);
68
+ box-shadow: var(--shadow-xs);
69
+ color: var(--text-secondary);
70
+ font-family: ui-monospace, SFMono-Regular, monospace;
71
+ font-size: 11px;
72
+ font-weight: 600;
73
+ padding: 2px 6px;
74
+ position: absolute;
75
+ right: 12px;
76
+ transition: all var(--transition-base);
77
+ }
78
+
79
+ .search-input:focus ~ .search-hotkey {
80
+ border-color: var(--link-color);
81
+ box-shadow: 0 0 0 1px rgba(96, 165, 250, 0.2);
82
+ color: var(--link-color);
83
+ }
84
+
85
+ /* ========================================
86
+ Sidebar Search
87
+ ======================================== */
88
+
89
+ .sidebar-search {
90
+ flex-shrink: 0;
91
+ width: 100%;
92
+ }
93
+
94
+ .sidebar-search .search-input {
95
+ border-radius: var(--radius-md);
96
+ box-shadow: var(--shadow-inner);
97
+ font-size: 12px;
98
+ height: 32px;
99
+ min-width: 0;
100
+ padding: 6px 32px 6px 30px;
101
+ transition: all var(--transition-base);
102
+ width: 100%;
103
+ }
104
+
105
+ .sidebar-search .search-input:hover {
106
+ background: var(--bg-elevated);
107
+ border-color: var(--border-secondary);
108
+ }
109
+
110
+ .sidebar-search .search-input:focus {
111
+ box-shadow: 0 0 0 3px rgba(88, 166, 255, 0.15), var(--shadow-inner);
112
+ }
113
+
114
+ .sidebar-search .search-hotkey {
115
+ border-radius: var(--radius-sm);
116
+ box-shadow: var(--shadow-sm);
117
+ font-size: 10px;
118
+ font-weight: 500;
119
+ padding: 2px 5px;
120
+ }
121
+
122
+ /* Repo controls search */
123
+ .repo-controls .search-container:not(.sidebar-search) {
124
+ flex: 1;
125
+ max-width: 300px;
126
+ min-width: 150px;
127
+ }
128
+
129
+ .repo-controls .search-container:not(.sidebar-search) .search-input {
130
+ width: 100%;
131
+ }
132
+
133
+ /* ========================================
134
+ New File Input
135
+ ======================================== */
136
+
137
+ .filename-section {
138
+ align-items: center;
139
+ display: flex;
140
+ flex: 1;
141
+ gap: 12px;
142
+ }
143
+
144
+ .filename-label {
145
+ color: var(--text-primary);
146
+ font-size: 14px;
147
+ font-weight: 600;
148
+ white-space: nowrap;
149
+ }
150
+
151
+ .new-filename-input {
152
+ background: var(--bg-primary);
153
+ border: 1px solid var(--border-primary);
154
+ border-radius: 6px;
155
+ color: var(--text-primary);
156
+ flex: 1;
157
+ font-size: 14px;
158
+ outline: none;
159
+ padding: 8px 12px;
160
+ transition: border-color 0.15s ease;
161
+ }
162
+
163
+ .new-filename-input:focus {
164
+ border-color: #0969da;
165
+ box-shadow: 0 0 0 0.2em rgba(9, 105, 218, 0.3);
166
+ }
167
+
168
+ [data-theme="dark"] .new-filename-input:focus {
169
+ border-color: #58a6ff;
170
+ box-shadow: 0 0 0 0.2em rgba(88, 166, 255, 0.3);
171
+ }