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