mbeditor 0.1.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.
Files changed (94) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +127 -0
  3. data/app/assets/javascripts/mbeditor/application.js +19 -0
  4. data/app/assets/javascripts/mbeditor/components/CodeReviewPanel.js +202 -0
  5. data/app/assets/javascripts/mbeditor/components/CollapsibleSection.js +71 -0
  6. data/app/assets/javascripts/mbeditor/components/CombinedDiffViewer.js +139 -0
  7. data/app/assets/javascripts/mbeditor/components/CommitGraph.js +65 -0
  8. data/app/assets/javascripts/mbeditor/components/DiffViewer.js +142 -0
  9. data/app/assets/javascripts/mbeditor/components/EditorPanel.js +363 -0
  10. data/app/assets/javascripts/mbeditor/components/FileHistoryPanel.js +112 -0
  11. data/app/assets/javascripts/mbeditor/components/FileTree.js +304 -0
  12. data/app/assets/javascripts/mbeditor/components/GitPanel.js +416 -0
  13. data/app/assets/javascripts/mbeditor/components/MbeditorApp.js +2335 -0
  14. data/app/assets/javascripts/mbeditor/components/QuickOpenDialog.js +118 -0
  15. data/app/assets/javascripts/mbeditor/components/ShortcutHelp.js +186 -0
  16. data/app/assets/javascripts/mbeditor/components/TabBar.js +123 -0
  17. data/app/assets/javascripts/mbeditor/editor_plugins.js +282 -0
  18. data/app/assets/javascripts/mbeditor/editor_store.js +53 -0
  19. data/app/assets/javascripts/mbeditor/file_service.js +77 -0
  20. data/app/assets/javascripts/mbeditor/git_service.js +104 -0
  21. data/app/assets/javascripts/mbeditor/search_service.js +53 -0
  22. data/app/assets/javascripts/mbeditor/tab_manager.js +461 -0
  23. data/app/assets/stylesheets/mbeditor/application.css +705 -0
  24. data/app/assets/stylesheets/mbeditor/editor.css +1264 -0
  25. data/app/controllers/mbeditor/application_controller.rb +10 -0
  26. data/app/controllers/mbeditor/editors_controller.rb +695 -0
  27. data/app/controllers/mbeditor/git_controller.rb +188 -0
  28. data/app/services/mbeditor/git_blame_service.rb +98 -0
  29. data/app/services/mbeditor/git_commit_graph_service.rb +60 -0
  30. data/app/services/mbeditor/git_diff_service.rb +71 -0
  31. data/app/services/mbeditor/git_file_history_service.rb +42 -0
  32. data/app/services/mbeditor/git_service.rb +82 -0
  33. data/app/services/mbeditor/redmine_service.rb +86 -0
  34. data/app/views/layouts/mbeditor/application.html.erb +71 -0
  35. data/app/views/mbeditor/editors/index.html.erb +1 -0
  36. data/config/environments/development.rb +53 -0
  37. data/config/initializers/assets.rb +9 -0
  38. data/config/routes.rb +37 -0
  39. data/lib/mbeditor/configuration.rb +16 -0
  40. data/lib/mbeditor/engine.rb +28 -0
  41. data/lib/mbeditor/version.rb +3 -0
  42. data/lib/mbeditor.rb +19 -0
  43. data/mbeditor.gemspec +30 -0
  44. data/public/min-maps/vs/base/worker/workerMain.js.map +1 -0
  45. data/public/monaco-editor/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  46. data/public/monaco-editor/vs/base/worker/workerMain.js +31 -0
  47. data/public/monaco-editor/vs/basic-languages/cameligo/cameligo.js +10 -0
  48. data/public/monaco-editor/vs/basic-languages/css/css.js +12 -0
  49. data/public/monaco-editor/vs/basic-languages/dart/dart.js +10 -0
  50. data/public/monaco-editor/vs/basic-languages/flow9/flow9.js +10 -0
  51. data/public/monaco-editor/vs/basic-languages/go/go.js +10 -0
  52. data/public/monaco-editor/vs/basic-languages/handlebars/handlebars.js +440 -0
  53. data/public/monaco-editor/vs/basic-languages/javascript/javascript.js +10 -0
  54. data/public/monaco-editor/vs/basic-languages/markdown/markdown.js +10 -0
  55. data/public/monaco-editor/vs/basic-languages/msdax/msdax.js +10 -0
  56. data/public/monaco-editor/vs/basic-languages/postiats/postiats.js +10 -0
  57. data/public/monaco-editor/vs/basic-languages/pug/pug.js +412 -0
  58. data/public/monaco-editor/vs/basic-languages/restructuredtext/restructuredtext.js +10 -0
  59. data/public/monaco-editor/vs/basic-languages/ruby/ruby.js +10 -0
  60. data/public/monaco-editor/vs/basic-languages/sb/sb.js +10 -0
  61. data/public/monaco-editor/vs/basic-languages/typespec/typespec.js +10 -0
  62. data/public/monaco-editor/vs/basic-languages/yaml/yaml.js +10 -0
  63. data/public/monaco-editor/vs/editor/editor.main.css +8 -0
  64. data/public/monaco-editor/vs/editor/editor.main.js +797 -0
  65. data/public/monaco-editor/vs/language/typescript/tsMode.js +20 -0
  66. data/public/monaco-editor/vs/language/typescript/tsWorker.js +51328 -0
  67. data/public/monaco-editor/vs/loader.js +10 -0
  68. data/public/monaco-editor/vs/nls.messages.de.js +20 -0
  69. data/public/monaco-editor/vs/nls.messages.es.js +20 -0
  70. data/public/monaco-editor/vs/nls.messages.fr.js +18 -0
  71. data/public/monaco-editor/vs/nls.messages.it.js +18 -0
  72. data/public/monaco-editor/vs/nls.messages.ja.js +20 -0
  73. data/public/monaco-editor/vs/nls.messages.ko.js +18 -0
  74. data/public/monaco-editor/vs/nls.messages.ru.js +20 -0
  75. data/public/monaco-editor/vs/nls.messages.zh-cn.js +20 -0
  76. data/public/monaco-editor/vs/nls.messages.zh-tw.js +18 -0
  77. data/public/monaco_worker.js +5 -0
  78. data/vendor/assets/javascripts/axios.min.js +2 -0
  79. data/vendor/assets/javascripts/lodash.min.js +140 -0
  80. data/vendor/assets/javascripts/marked.min.js +6 -0
  81. data/vendor/assets/javascripts/minisearch.min.js +2044 -0
  82. data/vendor/assets/javascripts/prettier-plugin-babel.js +16 -0
  83. data/vendor/assets/javascripts/prettier-plugin-estree.js +35 -0
  84. data/vendor/assets/javascripts/prettier-plugin-html.js +19 -0
  85. data/vendor/assets/javascripts/prettier-plugin-markdown.js +59 -0
  86. data/vendor/assets/javascripts/prettier-plugin-postcss.js +52 -0
  87. data/vendor/assets/javascripts/prettier-standalone.js +37 -0
  88. data/vendor/assets/javascripts/react-dom.min.js +267 -0
  89. data/vendor/assets/javascripts/react.min.js +31 -0
  90. data/vendor/assets/stylesheets/fontawesome.min.css +9 -0
  91. data/vendor/assets/webfonts/fa-brands-400.woff2 +0 -0
  92. data/vendor/assets/webfonts/fa-regular-400.woff2 +0 -0
  93. data/vendor/assets/webfonts/fa-solid-900.woff2 +0 -0
  94. metadata +173 -0
@@ -0,0 +1,705 @@
1
+ /*
2
+ *= require mbeditor/editor
3
+ */
4
+
5
+ /* ── Git & Code Review Styles ───────────────────────────────────────── */
6
+
7
+ /* Status Bar Git Sync */
8
+ .status-bar-git {
9
+ cursor: pointer;
10
+ }
11
+ .status-bar-git:hover {
12
+ background-color: var(--status-hover-bg);
13
+ }
14
+ .status-bar-git .branch-name {
15
+ margin-left: 6px;
16
+ font-weight: 500;
17
+ }
18
+ .git-sync-status {
19
+ margin-left: 6px;
20
+ display: flex;
21
+ gap: 4px;
22
+ opacity: 0.9;
23
+ }
24
+
25
+ /* Diff Viewer */
26
+ .ide-diff-viewer {
27
+ display: flex;
28
+ flex-direction: column;
29
+ height: 100%;
30
+ width: 100%;
31
+ background-color: #1e1e1e;
32
+ }
33
+ .ide-diff-toolbar {
34
+ display: flex;
35
+ justify-content: space-between;
36
+ align-items: center;
37
+ padding: 6px 12px;
38
+ background-color: #252526;
39
+ border-bottom: 1px solid var(--border-color);
40
+ font-size: 13px;
41
+ color: #ccc;
42
+ user-select: none;
43
+ }
44
+ .ide-diff-title {
45
+ display: flex;
46
+ align-items: center;
47
+ gap: 8px;
48
+ min-width: 0;
49
+ }
50
+ .ide-diff-title i {
51
+ color: #569cd6;
52
+ }
53
+ .ide-diff-title-info {
54
+ display: flex;
55
+ flex-direction: column;
56
+ min-width: 0;
57
+ overflow: hidden;
58
+ }
59
+ .ide-diff-title-name {
60
+ color: #d4d4d4;
61
+ font-weight: 600;
62
+ white-space: nowrap;
63
+ overflow: hidden;
64
+ text-overflow: ellipsis;
65
+ }
66
+ .ide-diff-title-dir {
67
+ color: #6e7a85;
68
+ font-size: 11px;
69
+ white-space: nowrap;
70
+ overflow: hidden;
71
+ text-overflow: ellipsis;
72
+ }
73
+ .ide-diff-actions {
74
+ display: flex;
75
+ align-items: center;
76
+ gap: 12px;
77
+ }
78
+ .ide-diff-btn {
79
+ background: transparent;
80
+ border: none;
81
+ color: #ccc;
82
+ cursor: pointer;
83
+ padding: 4px;
84
+ border-radius: 3px;
85
+ }
86
+ .ide-diff-btn:hover {
87
+ background-color: rgba(255,255,255,0.1);
88
+ color: #fff;
89
+ }
90
+ .ide-diff-toggle-label {
91
+ display: flex;
92
+ align-items: center;
93
+ gap: 6px;
94
+ cursor: pointer;
95
+ }
96
+ .ide-diff-editor-container {
97
+ flex: 1;
98
+ min-height: 0;
99
+ }
100
+
101
+ /* Commit Graph */
102
+ .ide-commit-graph {
103
+ padding: 8px 4px;
104
+ color: #ccc;
105
+ overflow-y: auto;
106
+ overflow-x: hidden; /* prevent long commit messages from widening the panel */
107
+ height: 100%;
108
+ background-color: #1e1e1e;
109
+ font-size: 12px;
110
+ }
111
+ /* Each commit is wrapped in a flex-column group. Spacing between groups
112
+ is via margin-bottom so expanding a commit never creates a pixel gap. */
113
+ .commit-group {
114
+ display: flex;
115
+ flex-direction: column;
116
+ }
117
+ .commit-row {
118
+ display: flex;
119
+ min-height: 50px;
120
+ cursor: pointer;
121
+ border-radius: 3px;
122
+ }
123
+ .commit-row:hover {
124
+ background-color: rgba(255,255,255,0.05);
125
+ }
126
+ .commit-graph-col {
127
+ width: 24px;
128
+ min-height: 24px; /* ensure graph lines have room even when only absolute children */
129
+ align-self: stretch;
130
+ position: relative;
131
+ display: flex;
132
+ justify-content: center;
133
+ }
134
+ .commit-line-top, .commit-line-bottom {
135
+ position: absolute;
136
+ left: 50%;
137
+ transform: translateX(-50%);
138
+ width: 2px;
139
+ background-color: #555;
140
+ }
141
+ .commit-line-top { top: -1px; bottom: 50%; }
142
+ .commit-line-bottom { top: 50%; bottom: -1px; }
143
+
144
+ /* Spacer between commit groups — draws the spine line through the visual gap */
145
+ .commit-spacer {
146
+ height: 6px;
147
+ display: flex;
148
+ }
149
+ .commit-spacer .commit-graph-col {
150
+ position: relative;
151
+ width: 24px;
152
+ min-height: 0;
153
+ height: 100%;
154
+ display: flex;
155
+ justify-content: center;
156
+ }
157
+ .commit-line-full {
158
+ position: absolute;
159
+ left: 50%;
160
+ transform: translateX(-50%);
161
+ width: 2px;
162
+ top: -1px;
163
+ bottom: -1px;
164
+ background-color: #555;
165
+ z-index: 1;
166
+ }
167
+
168
+ /* Specific colors MUST come AFTER the base definition for correct overrides */
169
+ .commit-local .commit-line-top,
170
+ .commit-local .commit-line-bottom,
171
+ .commit-local .commit-line-full { background-color: #4CAF50 !important; }
172
+
173
+ .commit-pushed .commit-line-top,
174
+ .commit-pushed .commit-line-bottom,
175
+ .commit-pushed .commit-line-full { background-color: #569cd6 !important; }
176
+ .commit-subfile-row.git-file-item {
177
+ overflow: visible;
178
+ border-radius: 0;
179
+ }
180
+ .commit-dot {
181
+ width: 8px;
182
+ height: 8px;
183
+ border-radius: 50%;
184
+ position: absolute;
185
+ top: 50%;
186
+ left: 50%;
187
+ transform: translate(-50%, -50%);
188
+ z-index: 10;
189
+ }
190
+ .dot-pushed {
191
+ background-color: #569cd6;
192
+ border: 2px solid #569cd6;
193
+ box-shadow: 0 0 0 2px rgba(86,156,214,0.18);
194
+ }
195
+ .dot-local {
196
+ background-color: #4CAF50;
197
+ border: 2px solid #4CAF50;
198
+ box-shadow: 0 0 0 2px rgba(76,175,80,0.18);
199
+ }
200
+ .commit-info-col {
201
+ flex: 1;
202
+ min-width: 0; /* allow text to truncate instead of widening the panel */
203
+ padding: 9px 10px 9px 6px;
204
+ display: flex;
205
+ flex-direction: column;
206
+ justify-content: center;
207
+ overflow: hidden;
208
+ }
209
+ .commit-title {
210
+ color: #d4d4d4;
211
+ font-size: 12px;
212
+ font-weight: 500;
213
+ margin-bottom: 3px;
214
+ white-space: nowrap;
215
+ overflow: hidden;
216
+ text-overflow: ellipsis;
217
+ line-height: 1.4;
218
+ }
219
+ .commit-title-empty {
220
+ opacity: 0.35;
221
+ font-style: italic;
222
+ font-size: 11px;
223
+ }
224
+ .commit-meta {
225
+ font-size: 11px;
226
+ color: #6e7a85;
227
+ white-space: nowrap;
228
+ overflow: hidden;
229
+ text-overflow: ellipsis;
230
+ }
231
+ .commit-meta-author {
232
+ color: #9db0c7;
233
+ }
234
+ .commit-hash {
235
+ color: #d7ba7d;
236
+ font-family: var(--font-mono);
237
+ font-size: 10.5px;
238
+ }
239
+
240
+ /* Wrap all commit rows in a strict column with no gaps so graph lines connect */
241
+ .git-history-graph-wrap { display: flex; flex-direction: column; }
242
+
243
+ /* Sub-file rows shown when a commit is expanded */
244
+ .commit-subfile-row {
245
+ display: flex;
246
+ align-items: center;
247
+ gap: 4px;
248
+ min-height: 24px;
249
+ min-width: 0;
250
+ overflow: hidden;
251
+ padding: 0 6px 0 0;
252
+ transition: background 0.1s;
253
+ cursor: default;
254
+ }
255
+ .commit-subfile-row:hover { background-color: rgba(255,255,255,0.05); }
256
+ .commit-subfile-row:hover .git-action-btn { opacity: 1; }
257
+ .commit-subfile-row .git-file-info {
258
+ padding: 0;
259
+ min-height: 24px;
260
+ justify-content: center;
261
+ }
262
+ .commit-subfile-row .git-file-actions { display: flex; gap: 4px; }
263
+ .commit-subfile-row .git-commit-loading {
264
+ display: flex;
265
+ align-items: center;
266
+ min-height: 24px;
267
+ font-size: 11px;
268
+ color: #666;
269
+ font-style: italic;
270
+ padding: 0 4px;
271
+ }
272
+
273
+ /* ── Inline expandable commit rows (History section in GitPanel) ─────────── */
274
+ .git-commit-row {
275
+ display: flex;
276
+ align-items: center;
277
+ gap: 6px;
278
+ padding: 5px 8px;
279
+ cursor: pointer;
280
+ border-radius: 3px;
281
+ min-width: 0;
282
+ overflow: hidden;
283
+ transition: background 0.1s;
284
+ }
285
+ .git-commit-row:hover { background: #2a2d2e; }
286
+ .git-commit-row.commit-local .commit-dot-small { background: #4caf50; border-color: #4caf50; }
287
+
288
+ .git-commit-expand-icon {
289
+ font-size: 9px;
290
+ color: #666;
291
+ flex-shrink: 0;
292
+ width: 10px;
293
+ text-align: center;
294
+ }
295
+ .commit-dot-small {
296
+ width: 8px;
297
+ height: 8px;
298
+ border-radius: 50%;
299
+ flex-shrink: 0;
300
+ background: #1e1e1e;
301
+ border: 2px solid #569cd6;
302
+ }
303
+ .git-commit-info {
304
+ flex: 1;
305
+ min-width: 0;
306
+ overflow: hidden;
307
+ display: flex;
308
+ flex-direction: column;
309
+ gap: 2px;
310
+ }
311
+ .git-commit-title {
312
+ font-size: 12px;
313
+ color: #d4d4d4;
314
+ white-space: nowrap;
315
+ overflow: hidden;
316
+ text-overflow: ellipsis;
317
+ }
318
+ .git-commit-meta {
319
+ font-size: 10px;
320
+ color: #6e7a85;
321
+ white-space: nowrap;
322
+ overflow: hidden;
323
+ text-overflow: ellipsis;
324
+ }
325
+
326
+ /* Nested file rows under expanded commit */
327
+ .git-commit-subrow {
328
+ display: flex;
329
+ align-items: center;
330
+ gap: 4px;
331
+ padding: 2px 8px 2px 26px;
332
+ min-width: 0;
333
+ overflow: hidden;
334
+ border-radius: 3px;
335
+ transition: background 0.1s;
336
+ }
337
+ .git-commit-subrow:hover { background: #2a2d2e; }
338
+ .git-commit-file-row .git-file-actions { display: flex; gap: 4px; }
339
+ .git-commit-subrow:hover .git-action-btn { opacity: 1; }
340
+ .git-commit-loading {
341
+ font-size: 11px;
342
+ color: #666;
343
+ padding: 4px 8px 4px 26px;
344
+ font-style: italic;
345
+ }
346
+
347
+ .git-action-btn {
348
+ background: transparent;
349
+ border: none;
350
+ color: #888;
351
+ cursor: pointer;
352
+ padding: 4px;
353
+ display: flex;
354
+ align-items: center;
355
+ justify-content: center;
356
+ border-radius: 3px;
357
+ opacity: 0;
358
+ transition: opacity 0.1s, color 0.1s, background-color 0.1s;
359
+ }
360
+ .git-file-item:hover .git-action-btn {
361
+ opacity: 1;
362
+ }
363
+ .git-action-btn:hover {
364
+ color: #fff;
365
+ background-color: rgba(255, 255, 255, 0.15);
366
+ }
367
+ .git-file-actions {
368
+ display: flex;
369
+ gap: 4px;
370
+ }
371
+
372
+ /* File History Panel */
373
+ .ide-file-history {
374
+ position: absolute;
375
+ top: 40px;
376
+ right: 20px;
377
+ width: 400px;
378
+ max-width: calc(100% - 40px);
379
+ max-height: calc(100% - 80px);
380
+ background-color: var(--panel-bg);
381
+ border: 1px solid var(--border-color);
382
+ box-shadow: 0 4px 15px rgba(0,0,0,0.5);
383
+ border-radius: 6px;
384
+ z-index: 1000;
385
+ display: flex;
386
+ flex-direction: column;
387
+ overflow: hidden;
388
+ }
389
+ .ide-file-history-header {
390
+ display: flex;
391
+ justify-content: space-between;
392
+ align-items: center;
393
+ padding: 10px 14px;
394
+ background-color: var(--header-bg);
395
+ border-bottom: 1px solid var(--border-color);
396
+ }
397
+ .ide-file-history-title {
398
+ font-weight: 500;
399
+ color: #d4d4d4;
400
+ display: flex;
401
+ align-items: center;
402
+ gap: 8px;
403
+ }
404
+ .ide-file-history-content {
405
+ flex: 1;
406
+ overflow-y: auto;
407
+ padding: 10px;
408
+ }
409
+
410
+ .ide-commit-detail-panel {
411
+ position: fixed;
412
+ top: 50%;
413
+ left: 50%;
414
+ transform: translate(-50%, -50%);
415
+ width: 560px;
416
+ max-width: calc(100vw - 40px);
417
+ max-height: 70vh;
418
+ background: #1e1f22;
419
+ border: 1px solid #3c3c3c;
420
+ box-shadow: 0 8px 24px rgba(0,0,0,0.6);
421
+ border-radius: 6px;
422
+ z-index: 9001;
423
+ display: flex;
424
+ flex-direction: column;
425
+ overflow: hidden;
426
+ }
427
+ .ide-commit-detail-header {
428
+ display: flex;
429
+ justify-content: space-between;
430
+ align-items: flex-start;
431
+ padding: 12px 14px;
432
+ background: #252628;
433
+ border-bottom: 1px solid #3c3c3c;
434
+ flex-shrink: 0;
435
+ }
436
+ .ide-commit-detail-title {
437
+ font-size: 13px;
438
+ font-weight: 600;
439
+ color: #d4d4d4;
440
+ margin-bottom: 4px;
441
+ }
442
+ .ide-commit-detail-meta {
443
+ font-size: 11px;
444
+ color: #8a9ab0;
445
+ }
446
+
447
+ /* Git Blame Inline Annotations */
448
+ .ide-blame-annotation {
449
+ color: #858585;
450
+ font-size: 11px;
451
+ font-style: italic;
452
+ font-family: var(--font-mono);
453
+ user-select: none;
454
+ opacity: 0.6;
455
+ }
456
+ .ide-blame-annotation-uncommitted {
457
+ color: #4CAF50;
458
+ font-size: 11px;
459
+ font-style: italic;
460
+ font-family: var(--font-mono);
461
+ user-select: none;
462
+ opacity: 0.7;
463
+ }
464
+
465
+ /* Code Review Panel & Redmine */
466
+ .ide-code-review {
467
+ position: absolute;
468
+ top: 40px;
469
+ right: 20px;
470
+ width: 500px;
471
+ max-width: calc(100% - 40px);
472
+ max-height: calc(100% - 80px);
473
+ background-color: var(--panel-bg);
474
+ border: 1px solid var(--border-color);
475
+ box-shadow: 0 4px 15px rgba(0,0,0,0.5);
476
+ border-radius: 6px;
477
+ z-index: 1000;
478
+ display: flex;
479
+ flex-direction: column;
480
+ overflow: hidden;
481
+ }
482
+ .ide-code-review-header {
483
+ display: flex;
484
+ justify-content: space-between;
485
+ align-items: center;
486
+ padding: 10px 14px;
487
+ background-color: var(--header-bg);
488
+ border-bottom: 1px solid var(--border-color);
489
+ }
490
+ .ide-code-review-title {
491
+ font-weight: 500;
492
+ color: #d4d4d4;
493
+ display: flex;
494
+ align-items: center;
495
+ gap: 8px;
496
+ }
497
+ .ide-code-review-content {
498
+ flex: 1;
499
+ overflow-y: auto;
500
+ padding: 10px;
501
+ }
502
+ .review-section {
503
+ margin-bottom: 20px;
504
+ }
505
+ .review-section-title {
506
+ font-size: 13px;
507
+ text-transform: uppercase;
508
+ color: #858585;
509
+ margin-top: 0;
510
+ margin-bottom: 8px;
511
+ font-weight: 600;
512
+ letter-spacing: 0.5px;
513
+ }
514
+ .redmine-card {
515
+ background-color: rgba(255,255,255,0.03);
516
+ border: 1px solid var(--border-color);
517
+ border-left: 3px solid #569cd6;
518
+ border-radius: 4px;
519
+ padding: 12px;
520
+ }
521
+ .redmine-card-header {
522
+ display: flex;
523
+ justify-content: space-between;
524
+ align-items: center;
525
+ margin-bottom: 6px;
526
+ color: #d4d4d4;
527
+ }
528
+ .redmine-badge {
529
+ background-color: #569cd6;
530
+ color: #fff;
531
+ font-size: 10px;
532
+ padding: 2px 6px;
533
+ border-radius: 10px;
534
+ text-transform: uppercase;
535
+ font-weight: bold;
536
+ }
537
+ .redmine-meta {
538
+ font-size: 11px;
539
+ color: #858585;
540
+ margin-bottom: 8px;
541
+ }
542
+ .redmine-desc {
543
+ font-size: 12px;
544
+ color: #ccc;
545
+ line-height: 1.4;
546
+ white-space: pre-wrap;
547
+ word-wrap: break-word;
548
+ }
549
+
550
+ /* ── Git section header with action button ─────────────────────── */
551
+ .git-section-title {
552
+ display: flex;
553
+ align-items: center;
554
+ justify-content: space-between;
555
+ padding: 0 2px 0 0;
556
+ }
557
+ .git-section-title-main {
558
+ flex: 1;
559
+ display: flex;
560
+ align-items: center;
561
+ padding: 6px 8px;
562
+ cursor: pointer;
563
+ font-size: 11px;
564
+ text-transform: uppercase;
565
+ letter-spacing: 0.06em;
566
+ color: #858585;
567
+ font-weight: 600;
568
+ user-select: none;
569
+ }
570
+ .git-section-title-main:hover {
571
+ background: rgba(255,255,255,0.04);
572
+ color: #d4d4d4;
573
+ }
574
+ .git-section-action-btn {
575
+ flex-shrink: 0;
576
+ display: flex;
577
+ align-items: center;
578
+ justify-content: center;
579
+ width: 22px;
580
+ height: 22px;
581
+ margin-right: 4px;
582
+ background: transparent;
583
+ border: none;
584
+ border-radius: 3px;
585
+ color: #858585;
586
+ cursor: pointer;
587
+ font-size: 11px;
588
+ opacity: 0;
589
+ transition: opacity 0.15s, background 0.1s, color 0.1s;
590
+ }
591
+ .git-section:hover .git-section-action-btn {
592
+ opacity: 1;
593
+ }
594
+ .git-section-action-btn:hover {
595
+ background: rgba(255,255,255,0.08);
596
+ color: #569cd6;
597
+ }
598
+
599
+ /* ── CombinedDiffViewer ─────────────────────────────────────────── */
600
+ .combined-diff-viewer {
601
+ display: flex;
602
+ flex-direction: column;
603
+ height: 100%;
604
+ background: #1e1e1e;
605
+ font-family: var(--font-mono, 'Cascadia Code', 'Fira Code', 'Menlo', monospace);
606
+ font-size: 12px;
607
+ }
608
+ .combined-diff-loading-wrap,
609
+ .combined-diff-empty {
610
+ display: flex;
611
+ align-items: center;
612
+ justify-content: center;
613
+ height: 100%;
614
+ color: #858585;
615
+ font-size: 13px;
616
+ gap: 8px;
617
+ }
618
+ .combined-diff-loading-msg {
619
+ color: #858585;
620
+ }
621
+ .combined-diff-toolbar {
622
+ display: flex;
623
+ align-items: center;
624
+ gap: 8px;
625
+ padding: 6px 14px;
626
+ background: #252526;
627
+ border-bottom: 1px solid #3c3c3c;
628
+ flex-shrink: 0;
629
+ font-family: var(--font-ui, -apple-system, BlinkMacSystemFont, sans-serif);
630
+ font-size: 12px;
631
+ }
632
+ .combined-diff-label {
633
+ font-weight: 500;
634
+ color: #d4d4d4;
635
+ flex: 1;
636
+ }
637
+ .combined-diff-file-count {
638
+ color: #858585;
639
+ font-size: 11px;
640
+ }
641
+ .combined-diff-body {
642
+ flex: 1;
643
+ overflow-y: auto;
644
+ overflow-x: hidden;
645
+ }
646
+
647
+ /* Each file segment */
648
+ .cdiff-file-segment {
649
+ border-bottom: 1px solid #2a2a2a;
650
+ }
651
+ .cdiff-file-bar {
652
+ display: flex;
653
+ align-items: center;
654
+ gap: 6px;
655
+ padding: 5px 10px;
656
+ background: #252526;
657
+ cursor: pointer;
658
+ user-select: none;
659
+ position: sticky;
660
+ top: 0;
661
+ z-index: 2;
662
+ border-bottom: 1px solid #3c3c3c;
663
+ }
664
+ .cdiff-file-bar:hover {
665
+ background: #2a2d2e;
666
+ }
667
+ .cdiff-chevron {
668
+ color: #858585;
669
+ font-size: 10px;
670
+ width: 10px;
671
+ flex-shrink: 0;
672
+ }
673
+ .cdiff-file-icon {
674
+ color: #569cd6;
675
+ font-size: 11px;
676
+ flex-shrink: 0;
677
+ }
678
+ .cdiff-file-name {
679
+ color: #d4d4d4;
680
+ font-weight: 500;
681
+ font-size: 12px;
682
+ }
683
+ .cdiff-file-dir {
684
+ color: #858585;
685
+ font-size: 11px;
686
+ margin-left: 4px;
687
+ }
688
+ .cdiff-file-body {
689
+ overflow-x: auto;
690
+ }
691
+
692
+ /* Diff lines */
693
+ .cdiff-line {
694
+ display: block;
695
+ padding: 0 16px;
696
+ line-height: 1.5;
697
+ white-space: pre;
698
+ font-size: 12px;
699
+ }
700
+ .cdiff-add { background: rgba(137,209,133,0.10); color: #89d185; }
701
+ .cdiff-del { background: rgba(244,135,113,0.10); color: #f48771; }
702
+ .cdiff-hunk { background: rgba(86,156,214,0.08); color: #569cd6; font-style: italic; }
703
+ .cdiff-meta { color: #666; font-size: 11px; }
704
+ .cdiff-file-header { color: #9db0c7; }
705
+ .cdiff-ctx { color: #9d9d9d; }