@profoundlogic/coderflow-server 0.2.1

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 (202) hide show
  1. package/LICENSE.txt +322 -0
  2. package/README.md +158 -0
  3. package/dist/LICENSE.txt +322 -0
  4. package/dist/README.md +158 -0
  5. package/dist/base-image/Dockerfile +184 -0
  6. package/dist/base-image/agent-wrapper.sh +143 -0
  7. package/dist/base-image/apply-local-state.sh +357 -0
  8. package/dist/base-image/coder-git-credential-helper +307 -0
  9. package/dist/base-image/entrypoint.sh +942 -0
  10. package/dist/base-image/ssh_config_template +41 -0
  11. package/dist/base-image/start-code-server.sh +76 -0
  12. package/dist/base-image/sync-repos.sh +170 -0
  13. package/dist/base-image/vscode-extensions.txt +10 -0
  14. package/dist/base-image/vscode-settings.json +41 -0
  15. package/dist/coder-server.js +2 -0
  16. package/dist/config/cli-models.json +45 -0
  17. package/dist/config/imported-skills.schema.json +83 -0
  18. package/dist/config/skill-catalog.json +18 -0
  19. package/dist/config/skill-catalog.schema.json +140 -0
  20. package/dist/config.js +1 -0
  21. package/dist/examples/oidc.json.example +11 -0
  22. package/dist/lib/agent-keepalive.js +1 -0
  23. package/dist/lib/api-keys.js +1 -0
  24. package/dist/lib/apiKeys.js +1 -0
  25. package/dist/lib/auto-judge.js +1 -0
  26. package/dist/lib/basic-auth.js +1 -0
  27. package/dist/lib/build-history.js +1 -0
  28. package/dist/lib/build-output-service.js +1 -0
  29. package/dist/lib/build-scheduler.js +1 -0
  30. package/dist/lib/build-service.js +1 -0
  31. package/dist/lib/claude-oauth-refresh.js +1 -0
  32. package/dist/lib/cli/build.js +1 -0
  33. package/dist/lib/cli/config-command.js +1 -0
  34. package/dist/lib/cli/config.js +1 -0
  35. package/dist/lib/cli/create-user.js +1 -0
  36. package/dist/lib/cli/init.js +1 -0
  37. package/dist/lib/cli/jira.js +1 -0
  38. package/dist/lib/cli/license.js +1 -0
  39. package/dist/lib/cli/server-manager.js +1 -0
  40. package/dist/lib/container-tokens.js +1 -0
  41. package/dist/lib/data-dir.js +1 -0
  42. package/dist/lib/deployment-history.js +1 -0
  43. package/dist/lib/deployment-service.js +1 -0
  44. package/dist/lib/docker-utils.js +1 -0
  45. package/dist/lib/email.js +1 -0
  46. package/dist/lib/emailTemplates.js +1 -0
  47. package/dist/lib/entitlement.js +1 -0
  48. package/dist/lib/fetch-utils.js +1 -0
  49. package/dist/lib/git-provider-service.js +1 -0
  50. package/dist/lib/git-provider-setup/assets/coderflow_github_app.png +0 -0
  51. package/dist/lib/git-provider-setup/github-setup-handler.js +1 -0
  52. package/dist/lib/git-provider-setup/index.js +1 -0
  53. package/dist/lib/git-provider-setup/setup-factory.js +1 -0
  54. package/dist/lib/git-provider-setup/setup-interface.js +1 -0
  55. package/dist/lib/git-providers/azure-devops-provider.js +1 -0
  56. package/dist/lib/git-providers/github-app-provider.js +1 -0
  57. package/dist/lib/git-providers/index.js +1 -0
  58. package/dist/lib/git-providers/provider-factory.js +1 -0
  59. package/dist/lib/git-providers/provider-interface.js +1 -0
  60. package/dist/lib/jira-client.js +1 -0
  61. package/dist/lib/logger.js +1 -0
  62. package/dist/lib/model-fetcher.js +1 -0
  63. package/dist/lib/notifications.js +1 -0
  64. package/dist/lib/oidc-auth.js +1 -0
  65. package/dist/lib/oidc-device-flow.js +1 -0
  66. package/dist/lib/passwordTokens.js +1 -0
  67. package/dist/lib/pin-cascade.js +1 -0
  68. package/dist/lib/provider-accounts.js +1 -0
  69. package/dist/lib/provider-oauth.js +1 -0
  70. package/dist/lib/provider-profile.js +1 -0
  71. package/dist/lib/provider-token-refresh.js +1 -0
  72. package/dist/lib/roles.js +1 -0
  73. package/dist/lib/secrets.js +1 -0
  74. package/dist/lib/state-capture.js +1 -0
  75. package/dist/lib/static-files.js +1 -0
  76. package/dist/lib/task-name-generator.js +1 -0
  77. package/dist/lib/users.js +1 -0
  78. package/dist/middleware/requireAuth.js +1 -0
  79. package/dist/middleware/requireInit.js +1 -0
  80. package/dist/middleware/requirePermission.js +1 -0
  81. package/dist/package-lock.json +4151 -0
  82. package/dist/package.json +50 -0
  83. package/dist/routes/apiKeys.js +1 -0
  84. package/dist/routes/auth-oidc.js +1 -0
  85. package/dist/routes/auth.js +1 -0
  86. package/dist/routes/build.js +1 -0
  87. package/dist/routes/containers.js +1 -0
  88. package/dist/routes/deploy-task.js +1 -0
  89. package/dist/routes/environment-management.js +1 -0
  90. package/dist/routes/environments.js +1 -0
  91. package/dist/routes/external-skills.js +1 -0
  92. package/dist/routes/git-credentials.js +1 -0
  93. package/dist/routes/git-provider-setup.js +1 -0
  94. package/dist/routes/health.js +1 -0
  95. package/dist/routes/jira.js +1 -0
  96. package/dist/routes/objective-management.js +1 -0
  97. package/dist/routes/password.js +1 -0
  98. package/dist/routes/prompt.js +1 -0
  99. package/dist/routes/provider-auth.js +1 -0
  100. package/dist/routes/qa.js +1 -0
  101. package/dist/routes/settings.js +1 -0
  102. package/dist/routes/skill-management.js +1 -0
  103. package/dist/routes/skills.js +1 -0
  104. package/dist/routes/tasks.js +2 -0
  105. package/dist/routes/templates.js +1 -0
  106. package/dist/routes/test-task.js +1 -0
  107. package/dist/routes/test.js +1 -0
  108. package/dist/routes/users.js +1 -0
  109. package/dist/routes/visualizations.js +1 -0
  110. package/dist/schemas/template-metadata.schema.json +178 -0
  111. package/dist/scripts/create-user.js +2 -0
  112. package/dist/shipped-skills/environment-instructions/SKILL.md +154 -0
  113. package/dist/shipped-skills/environment-templates/SKILL.md +282 -0
  114. package/dist/shipped-skills/objective-management/SKILL.md +238 -0
  115. package/dist/shipped-skills/skill-editor/SKILL.md +326 -0
  116. package/dist/start.js +2 -0
  117. package/dist/web-ui/public/activity-detail-modal.js +1 -0
  118. package/dist/web-ui/public/activity-feed.js +1 -0
  119. package/dist/web-ui/public/activity-formatters.js +1 -0
  120. package/dist/web-ui/public/agent-event-parser.js +1 -0
  121. package/dist/web-ui/public/app.js +1 -0
  122. package/dist/web-ui/public/approve-dialog.js +1 -0
  123. package/dist/web-ui/public/coderflow-logo-reversed.svg +46 -0
  124. package/dist/web-ui/public/coderflow-logo.svg +46 -0
  125. package/dist/web-ui/public/comments-widget.js +1 -0
  126. package/dist/web-ui/public/docs/.nojekyll +0 -0
  127. package/dist/web-ui/public/docs/README.md +26 -0
  128. package/dist/web-ui/public/docs/_sidebar.md +47 -0
  129. package/dist/web-ui/public/docs/admin/ai-providers.md +132 -0
  130. package/dist/web-ui/public/docs/admin/email-notifications.md +69 -0
  131. package/dist/web-ui/public/docs/admin/environments.md +215 -0
  132. package/dist/web-ui/public/docs/admin/git-providers.md +147 -0
  133. package/dist/web-ui/public/docs/admin/installation.md +313 -0
  134. package/dist/web-ui/public/docs/admin/skills.md +35 -0
  135. package/dist/web-ui/public/docs/admin/sso.md +241 -0
  136. package/dist/web-ui/public/docs/admin/users-and-roles.md +57 -0
  137. package/dist/web-ui/public/docs/code/cli.md +102 -0
  138. package/dist/web-ui/public/docs/code/files-and-editing.md +86 -0
  139. package/dist/web-ui/public/docs/code/terminal-access.md +110 -0
  140. package/dist/web-ui/public/docs/code/vscode-extension.md +58 -0
  141. package/dist/web-ui/public/docs/getting-started/core-concepts.md +129 -0
  142. package/dist/web-ui/public/docs/getting-started/overview.md +46 -0
  143. package/dist/web-ui/public/docs/index.html +151 -0
  144. package/dist/web-ui/public/docs/integrations/custom.md +58 -0
  145. package/dist/web-ui/public/docs/integrations/ibmi/overview.md +58 -0
  146. package/dist/web-ui/public/docs/integrations/overview.md +48 -0
  147. package/dist/web-ui/public/docs/objectives/qa-mode.md +90 -0
  148. package/dist/web-ui/public/docs/objectives/staged-tasks.md +60 -0
  149. package/dist/web-ui/public/docs/objectives/working-with-objectives.md +102 -0
  150. package/dist/web-ui/public/docs/tasks/approval-and-deployment.md +83 -0
  151. package/dist/web-ui/public/docs/tasks/creating-tasks.md +111 -0
  152. package/dist/web-ui/public/docs/tasks/judging.md +114 -0
  153. package/dist/web-ui/public/docs/tasks/providing-feedback.md +41 -0
  154. package/dist/web-ui/public/docs/tasks/task-groups.md +73 -0
  155. package/dist/web-ui/public/docs/tasks/winner-selection.md +75 -0
  156. package/dist/web-ui/public/docs/templates/batch-processing.md +152 -0
  157. package/dist/web-ui/public/docs/templates/task-templates.md +44 -0
  158. package/dist/web-ui/public/docs/templates/template-examples.md +93 -0
  159. package/dist/web-ui/public/docs/testing/profound-automated-testing.md +77 -0
  160. package/dist/web-ui/public/docs/testing/task-visualizations.md +42 -0
  161. package/dist/web-ui/public/docs/testing/testing-menu.md +118 -0
  162. package/dist/web-ui/public/environments.css +3942 -0
  163. package/dist/web-ui/public/environments.html +1791 -0
  164. package/dist/web-ui/public/environments.js +1 -0
  165. package/dist/web-ui/public/favicon-16.png +0 -0
  166. package/dist/web-ui/public/favicon-32.png +0 -0
  167. package/dist/web-ui/public/favicon.ico +0 -0
  168. package/dist/web-ui/public/feedback-widget.css +3133 -0
  169. package/dist/web-ui/public/feedback-widget.js +1 -0
  170. package/dist/web-ui/public/git-history.css +2663 -0
  171. package/dist/web-ui/public/git-history.html +272 -0
  172. package/dist/web-ui/public/git-history.js +1 -0
  173. package/dist/web-ui/public/git-status.js +1 -0
  174. package/dist/web-ui/public/index.html +1459 -0
  175. package/dist/web-ui/public/index.js +1 -0
  176. package/dist/web-ui/public/login.html +346 -0
  177. package/dist/web-ui/public/login.js +1 -0
  178. package/dist/web-ui/public/markdown-editor.js +1 -0
  179. package/dist/web-ui/public/markdown-file-editor.js +1 -0
  180. package/dist/web-ui/public/modal-maximize.js +1 -0
  181. package/dist/web-ui/public/notifications.js +1 -0
  182. package/dist/web-ui/public/server-health.js +1 -0
  183. package/dist/web-ui/public/settings.css +761 -0
  184. package/dist/web-ui/public/settings.html +1044 -0
  185. package/dist/web-ui/public/settings.js +1 -0
  186. package/dist/web-ui/public/setup-password.html +355 -0
  187. package/dist/web-ui/public/setup-password.js +1 -0
  188. package/dist/web-ui/public/skills.css +1949 -0
  189. package/dist/web-ui/public/skills.html +820 -0
  190. package/dist/web-ui/public/skills.js +1 -0
  191. package/dist/web-ui/public/sse-client.js +1 -0
  192. package/dist/web-ui/public/sse-shared-worker.js +1 -0
  193. package/dist/web-ui/public/styles.css +18614 -0
  194. package/dist/web-ui/public/task.html +1779 -0
  195. package/dist/web-ui/public/task.js +1 -0
  196. package/dist/web-ui/public/terminal.html +45 -0
  197. package/dist/web-ui/public/terminal.js +1 -0
  198. package/dist/web-ui/public/theme.js +1 -0
  199. package/dist/web-ui/public/users.html +298 -0
  200. package/dist/web-ui/public/users.js +1 -0
  201. package/dist/web-ui/public/variant-grouping.js +1 -0
  202. package/package.json +63 -0
@@ -0,0 +1,2663 @@
1
+ .git-history-layout {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 20px;
5
+ }
6
+
7
+ /* ============================================================
8
+ SHADOW VARIABLES for better depth perception
9
+ ============================================================ */
10
+ .git-history-layout {
11
+ --shadow-subtle: 0 1px 3px rgba(0, 0, 0, 0.06);
12
+ --shadow-elevated: 0 4px 12px rgba(0, 0, 0, 0.08), 0 1px 3px rgba(0, 0, 0, 0.04);
13
+ --shadow-floating: 0 8px 24px rgba(0, 0, 0, 0.12), 0 2px 8px rgba(0, 0, 0, 0.06);
14
+ --transition-fast: 0.15s cubic-bezier(0.4, 0, 0.2, 1);
15
+ --transition-normal: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
16
+ --transition-smooth: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
17
+ }
18
+
19
+ :root[data-theme="dark"] .git-history-layout {
20
+ --shadow-subtle: 0 1px 3px rgba(0, 0, 0, 0.2);
21
+ --shadow-elevated: 0 4px 12px rgba(0, 0, 0, 0.3), 0 1px 3px rgba(0, 0, 0, 0.15);
22
+ --shadow-floating: 0 8px 24px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.2);
23
+ }
24
+
25
+ /* ============================================================
26
+ FILE NAVIGATION SIDEBAR - Quick jump to files
27
+ ============================================================ */
28
+ .file-nav-toggle {
29
+ display: none;
30
+ align-items: center;
31
+ gap: 7px;
32
+ padding: 7px 14px;
33
+ background: var(--color-surface-muted);
34
+ border: 1px solid var(--color-border);
35
+ border-radius: 7px;
36
+ color: var(--color-text-muted);
37
+ font-size: 12px;
38
+ font-weight: 500;
39
+ cursor: pointer;
40
+ transition: all var(--transition-fast);
41
+ }
42
+
43
+ .file-nav-toggle:hover {
44
+ background: var(--color-surface);
45
+ border-color: var(--color-accent);
46
+ color: var(--color-accent);
47
+ box-shadow: 0 2px 8px rgba(var(--color-accent-rgb), 0.12);
48
+ }
49
+
50
+ .file-nav-toggle:active {
51
+ transform: scale(0.98);
52
+ }
53
+
54
+ .file-nav-toggle::before {
55
+ content: '';
56
+ width: 14px;
57
+ height: 14px;
58
+ background: currentColor;
59
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath 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'/%3E%3C/svg%3E");
60
+ mask-size: contain;
61
+ mask-repeat: no-repeat;
62
+ }
63
+
64
+ .file-nav-sidebar {
65
+ display: none;
66
+ position: absolute;
67
+ top: 100%;
68
+ right: 0;
69
+ z-index: 100;
70
+ width: 340px;
71
+ max-height: 420px;
72
+ margin-top: 6px;
73
+ background: var(--color-surface);
74
+ border: 1px solid var(--color-border);
75
+ border-radius: var(--radius-medium);
76
+ box-shadow: var(--shadow-floating);
77
+ overflow: hidden;
78
+ opacity: 0;
79
+ transform: translateY(-8px) scale(0.98);
80
+ transition: opacity var(--transition-fast), transform var(--transition-fast);
81
+ }
82
+
83
+ .file-nav-sidebar.open {
84
+ display: block;
85
+ opacity: 1;
86
+ transform: translateY(0) scale(1);
87
+ animation: fileNavSlideIn 0.2s ease forwards;
88
+ }
89
+
90
+ @keyframes fileNavSlideIn {
91
+ from {
92
+ opacity: 0;
93
+ transform: translateY(-8px) scale(0.98);
94
+ }
95
+ to {
96
+ opacity: 1;
97
+ transform: translateY(0) scale(1);
98
+ }
99
+ }
100
+
101
+ .file-nav-header {
102
+ display: flex;
103
+ align-items: center;
104
+ justify-content: space-between;
105
+ padding: 12px 14px;
106
+ border-bottom: 1px solid var(--color-border);
107
+ background: var(--color-surface-muted);
108
+ }
109
+
110
+ .file-nav-header h4 {
111
+ margin: 0;
112
+ font-size: 12px;
113
+ font-weight: 600;
114
+ color: var(--color-text);
115
+ display: flex;
116
+ align-items: center;
117
+ gap: 6px;
118
+ }
119
+
120
+ .file-nav-header h4::before {
121
+ content: '';
122
+ width: 14px;
123
+ height: 14px;
124
+ background: var(--color-accent);
125
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpolyline points='14 2 14 8 20 8'/%3E%3C/svg%3E");
126
+ mask-size: contain;
127
+ mask-repeat: no-repeat;
128
+ }
129
+
130
+ .file-nav-close {
131
+ width: 24px;
132
+ height: 24px;
133
+ display: flex;
134
+ align-items: center;
135
+ justify-content: center;
136
+ background: transparent;
137
+ border: none;
138
+ border-radius: 4px;
139
+ color: var(--color-text-muted);
140
+ cursor: pointer;
141
+ transition: all 0.15s ease;
142
+ }
143
+
144
+ .file-nav-close:hover {
145
+ background: var(--color-surface);
146
+ color: var(--color-text);
147
+ }
148
+
149
+ .file-nav-list {
150
+ list-style: none;
151
+ margin: 0;
152
+ padding: 6px;
153
+ max-height: 340px;
154
+ overflow-y: auto;
155
+ }
156
+
157
+ .file-nav-item {
158
+ display: flex;
159
+ align-items: center;
160
+ gap: 10px;
161
+ padding: 10px 12px;
162
+ border-radius: 7px;
163
+ cursor: pointer;
164
+ transition: all var(--transition-fast);
165
+ border: 1px solid transparent;
166
+ }
167
+
168
+ .file-nav-item:hover {
169
+ background: var(--color-surface-muted);
170
+ border-color: var(--color-border);
171
+ transform: translateX(2px);
172
+ }
173
+
174
+ .file-nav-item:active {
175
+ transform: translateX(2px) scale(0.99);
176
+ }
177
+
178
+ .file-nav-item.active {
179
+ background: rgba(var(--color-accent-rgb), 0.08);
180
+ border-color: rgba(var(--color-accent-rgb), 0.2);
181
+ }
182
+
183
+ .file-nav-icon {
184
+ width: 16px;
185
+ height: 16px;
186
+ flex-shrink: 0;
187
+ border-radius: 3px;
188
+ display: flex;
189
+ align-items: center;
190
+ justify-content: center;
191
+ }
192
+
193
+ .file-nav-icon.added {
194
+ background: rgba(34, 197, 94, 0.15);
195
+ color: var(--color-success);
196
+ }
197
+
198
+ .file-nav-icon.modified {
199
+ background: rgba(251, 191, 36, 0.15);
200
+ color: #f59e0b;
201
+ }
202
+
203
+ .file-nav-icon.deleted {
204
+ background: rgba(239, 68, 68, 0.15);
205
+ color: var(--color-danger);
206
+ }
207
+
208
+ .file-nav-icon svg {
209
+ width: 10px;
210
+ height: 10px;
211
+ }
212
+
213
+ .file-nav-name {
214
+ flex: 1;
215
+ min-width: 0;
216
+ font-family: "JetBrains Mono", "SF Mono", monospace;
217
+ font-size: 11px;
218
+ color: var(--color-text);
219
+ white-space: nowrap;
220
+ overflow: hidden;
221
+ text-overflow: ellipsis;
222
+ }
223
+
224
+ .file-nav-stats {
225
+ display: flex;
226
+ gap: 6px;
227
+ font-family: "JetBrains Mono", "SF Mono", monospace;
228
+ font-size: 10px;
229
+ flex-shrink: 0;
230
+ }
231
+
232
+ .file-nav-stats .add {
233
+ color: var(--color-success);
234
+ }
235
+
236
+ .file-nav-stats .del {
237
+ color: var(--color-danger);
238
+ }
239
+
240
+ /* ============================================================
241
+ CONTROL BAR - Enhanced with icon indicators and better grouping
242
+ ============================================================ */
243
+ .git-history-controls {
244
+ display: flex;
245
+ flex-wrap: wrap;
246
+ gap: 16px;
247
+ padding: 18px 22px;
248
+ border-radius: var(--radius-medium);
249
+ background: var(--color-surface);
250
+ border: 1px solid var(--color-border);
251
+ box-shadow: var(--shadow-elevated);
252
+ align-items: flex-end;
253
+ position: relative;
254
+ }
255
+
256
+ /* Subtle gradient overlay for depth */
257
+ .git-history-controls::before {
258
+ content: '';
259
+ position: absolute;
260
+ inset: 0;
261
+ background: linear-gradient(180deg, rgba(255,255,255,0.5) 0%, transparent 100%);
262
+ pointer-events: none;
263
+ opacity: 0.3;
264
+ }
265
+
266
+ :root[data-theme="dark"] .git-history-controls::before {
267
+ background: linear-gradient(180deg, rgba(255,255,255,0.03) 0%, transparent 100%);
268
+ }
269
+
270
+ .control-group {
271
+ display: flex;
272
+ flex-direction: column;
273
+ gap: 6px;
274
+ min-width: 160px;
275
+ flex: 1 1 160px;
276
+ }
277
+
278
+ .control-group label {
279
+ font-size: 10px;
280
+ font-weight: 600;
281
+ text-transform: uppercase;
282
+ letter-spacing: 0.08em;
283
+ color: var(--color-text-muted);
284
+ display: flex;
285
+ align-items: center;
286
+ gap: 6px;
287
+ }
288
+
289
+ .control-group label::before {
290
+ content: '';
291
+ width: 12px;
292
+ height: 12px;
293
+ background: currentColor;
294
+ opacity: 0.5;
295
+ mask-size: contain;
296
+ mask-repeat: no-repeat;
297
+ flex-shrink: 0;
298
+ }
299
+
300
+ /* Environment icon */
301
+ .control-group:has(#env-select) label::before {
302
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='2' y1='12' x2='22' y2='12'/%3E%3Cpath d='M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z'/%3E%3C/svg%3E");
303
+ }
304
+
305
+ /* Repository icon */
306
+ .control-group:has(#repo-select) label::before {
307
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath 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'/%3E%3C/svg%3E");
308
+ }
309
+
310
+ /* Branch icon */
311
+ .control-group:has(#branch-select) label::before {
312
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='6' y1='3' x2='6' y2='15'/%3E%3Ccircle cx='18' cy='6' r='3'/%3E%3Ccircle cx='6' cy='18' r='3'/%3E%3Cpath d='M18 9a9 9 0 0 1-9 9'/%3E%3C/svg%3E");
313
+ }
314
+
315
+ /* Native select styling (hidden when CustomSelect is active) */
316
+ .control-group select {
317
+ padding: 10px 14px;
318
+ padding-right: 36px;
319
+ border: 1px solid var(--color-border);
320
+ border-radius: var(--radius-small);
321
+ background: var(--color-surface);
322
+ color: var(--color-text);
323
+ font-size: 13px;
324
+ font-weight: 500;
325
+ cursor: pointer;
326
+ transition: all var(--transition-fast);
327
+ appearance: none;
328
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%235a6480' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
329
+ background-repeat: no-repeat;
330
+ background-position: right 12px center;
331
+ background-size: 12px;
332
+ }
333
+
334
+ .control-group select:hover {
335
+ border-color: var(--color-accent);
336
+ background-color: var(--color-surface-muted);
337
+ }
338
+
339
+ .control-group select:focus {
340
+ outline: none;
341
+ border-color: var(--color-accent);
342
+ box-shadow: 0 0 0 3px rgba(var(--color-accent-rgb), 0.15);
343
+ }
344
+
345
+ .control-group select:disabled {
346
+ opacity: 0.4;
347
+ cursor: not-allowed;
348
+ background-color: var(--color-surface-muted);
349
+ }
350
+
351
+ /* ============================================================
352
+ CUSTOM SELECT OVERRIDES - HTML-based dropdown styling
353
+ ============================================================ */
354
+ .control-group .custom-select {
355
+ width: 100%;
356
+ }
357
+
358
+ .control-group .custom-select-trigger {
359
+ padding: 10px 14px;
360
+ border: 1px solid var(--color-border);
361
+ border-radius: var(--radius-small);
362
+ background: var(--color-surface);
363
+ color: var(--color-text);
364
+ font-size: 13px;
365
+ font-weight: 500;
366
+ cursor: pointer;
367
+ transition: all var(--transition-fast);
368
+ display: flex;
369
+ align-items: center;
370
+ justify-content: space-between;
371
+ min-height: 40px;
372
+ }
373
+
374
+ .control-group .custom-select-trigger:hover {
375
+ border-color: var(--color-accent);
376
+ background-color: var(--color-surface-muted);
377
+ }
378
+
379
+ .control-group .custom-select-trigger.open {
380
+ border-color: var(--color-accent);
381
+ box-shadow: 0 0 0 3px rgba(var(--color-accent-rgb), 0.15);
382
+ border-bottom-left-radius: 0;
383
+ border-bottom-right-radius: 0;
384
+ }
385
+
386
+ .control-group .custom-select-trigger.placeholder {
387
+ color: var(--color-text-muted);
388
+ }
389
+
390
+ .control-group .custom-select.disabled .custom-select-trigger {
391
+ opacity: 0.4;
392
+ cursor: not-allowed;
393
+ background-color: var(--color-surface-muted);
394
+ }
395
+
396
+ .control-group .custom-select-arrow {
397
+ font-size: 10px;
398
+ color: var(--color-text-muted);
399
+ transition: transform var(--transition-fast);
400
+ margin-left: 8px;
401
+ }
402
+
403
+ .control-group .custom-select-trigger.open .custom-select-arrow {
404
+ transform: rotate(180deg);
405
+ }
406
+
407
+ .control-group .custom-select-dropdown {
408
+ position: absolute;
409
+ top: 100%;
410
+ left: 0;
411
+ right: 0;
412
+ z-index: 100;
413
+ background: var(--color-surface);
414
+ border: 1px solid var(--color-accent);
415
+ border-top: none;
416
+ border-radius: 0 0 var(--radius-small) var(--radius-small);
417
+ box-shadow: var(--shadow-floating);
418
+ max-height: 280px;
419
+ overflow: hidden;
420
+ display: none;
421
+ }
422
+
423
+ .control-group .custom-select-dropdown.open {
424
+ display: block;
425
+ animation: dropdownSlideIn 0.15s ease-out;
426
+ }
427
+
428
+ @keyframes dropdownSlideIn {
429
+ from {
430
+ opacity: 0;
431
+ transform: translateY(-4px);
432
+ }
433
+ to {
434
+ opacity: 1;
435
+ transform: translateY(0);
436
+ }
437
+ }
438
+
439
+ .control-group .custom-select-search {
440
+ padding: 8px;
441
+ border-bottom: 1px solid var(--color-border);
442
+ background: var(--color-surface-muted);
443
+ position: sticky;
444
+ top: 0;
445
+ z-index: 1;
446
+ }
447
+
448
+ .control-group .custom-select-search-input {
449
+ width: 100%;
450
+ padding: 8px 10px;
451
+ border: 1px solid var(--color-border);
452
+ border-radius: var(--radius-small);
453
+ font-size: 12px;
454
+ background: var(--color-surface);
455
+ color: var(--color-text);
456
+ transition: border-color var(--transition-fast);
457
+ }
458
+
459
+ .control-group .custom-select-search-input:focus {
460
+ outline: none;
461
+ border-color: var(--color-accent);
462
+ }
463
+
464
+ .control-group .custom-select-search-input::placeholder {
465
+ color: var(--color-text-muted);
466
+ }
467
+
468
+ .control-group .custom-select-options {
469
+ max-height: 220px;
470
+ overflow-y: auto;
471
+ }
472
+
473
+ .control-group .custom-select-option {
474
+ padding: 10px 14px;
475
+ cursor: pointer;
476
+ font-size: 13px;
477
+ transition: background var(--transition-fast);
478
+ border-left: 3px solid transparent;
479
+ }
480
+
481
+ .control-group .custom-select-option:hover {
482
+ background: rgba(var(--color-accent-rgb), 0.08);
483
+ border-left-color: var(--color-accent);
484
+ }
485
+
486
+ .control-group .custom-select-option.selected {
487
+ background: rgba(var(--color-accent-rgb), 0.12);
488
+ font-weight: 600;
489
+ color: var(--color-accent);
490
+ border-left-color: var(--color-accent);
491
+ }
492
+
493
+ .control-group .custom-select-option.disabled {
494
+ color: var(--color-text-muted);
495
+ cursor: not-allowed;
496
+ font-style: italic;
497
+ }
498
+
499
+ .control-group .custom-select-option.disabled:hover {
500
+ background: transparent;
501
+ border-left-color: transparent;
502
+ }
503
+
504
+ /* Branch-specific styling - monospace font for branch names */
505
+ .control-group:has(#branch-select) .custom-select-option {
506
+ font-family: "JetBrains Mono", "SF Mono", monospace;
507
+ font-size: 12px;
508
+ }
509
+
510
+ .control-group:has(#branch-select) .custom-select-trigger-text {
511
+ font-family: "JetBrains Mono", "SF Mono", monospace;
512
+ font-size: 12px;
513
+ }
514
+
515
+ .control-group:has(#branch-select) .custom-select-search-input {
516
+ font-family: "JetBrains Mono", "SF Mono", monospace;
517
+ }
518
+
519
+ .search-group {
520
+ flex: 2 1 240px;
521
+ }
522
+
523
+ .search-group label::before {
524
+ display: none;
525
+ }
526
+
527
+ .search-input {
528
+ display: flex;
529
+ align-items: center;
530
+ gap: 10px;
531
+ padding: 10px 14px;
532
+ border-radius: var(--radius-small);
533
+ background: var(--color-surface-muted);
534
+ border: 1px solid var(--color-border);
535
+ transition: all 0.2s ease;
536
+ }
537
+
538
+ .search-input:focus-within {
539
+ border-color: var(--color-accent);
540
+ box-shadow: 0 0 0 3px rgba(var(--color-accent-rgb), 0.15);
541
+ background: var(--color-surface);
542
+ }
543
+
544
+ .search-input::before {
545
+ content: '';
546
+ width: 16px;
547
+ height: 16px;
548
+ background: currentColor;
549
+ opacity: 0.4;
550
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E");
551
+ mask-size: contain;
552
+ mask-repeat: no-repeat;
553
+ flex-shrink: 0;
554
+ transition: opacity 0.2s ease;
555
+ }
556
+
557
+ .search-input:focus-within::before {
558
+ opacity: 0.7;
559
+ }
560
+
561
+ .search-input input {
562
+ border: none;
563
+ outline: none;
564
+ background: transparent;
565
+ flex: 1;
566
+ font-size: 13px;
567
+ color: var(--color-text);
568
+ min-width: 0;
569
+ }
570
+
571
+ .search-input input[type="search"]::-webkit-search-cancel-button {
572
+ -webkit-appearance: none;
573
+ appearance: none;
574
+ }
575
+
576
+ .search-input input[type="search"]::-ms-clear {
577
+ display: none;
578
+ width: 0;
579
+ height: 0;
580
+ }
581
+
582
+ .search-input input:focus-visible {
583
+ outline: none;
584
+ }
585
+
586
+ .search-input input::placeholder {
587
+ color: var(--color-text-muted);
588
+ }
589
+
590
+ #clear-search-btn {
591
+ padding: 4px 8px;
592
+ font-size: 11px;
593
+ opacity: 0.7;
594
+ transition: opacity 0.2s ease;
595
+ }
596
+
597
+ #clear-search-btn:hover {
598
+ opacity: 1;
599
+ }
600
+
601
+ .view-group {
602
+ flex: 0 0 auto;
603
+ min-width: auto;
604
+ }
605
+
606
+ .view-group label::before {
607
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 15V6'/%3E%3Cpath d='M18.5 18a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5Z'/%3E%3Cpath d='M12 12H3'/%3E%3Cpath d='M16 6H3'/%3E%3Cpath d='M12 18H3'/%3E%3C/svg%3E");
608
+ }
609
+
610
+ .segmented-control {
611
+ display: inline-flex;
612
+ border-radius: var(--radius-small);
613
+ border: 1px solid var(--color-border);
614
+ background: var(--color-surface-muted);
615
+ padding: 3px;
616
+ gap: 2px;
617
+ }
618
+
619
+ .segmented-btn {
620
+ border: none;
621
+ background: transparent;
622
+ color: var(--color-text-muted);
623
+ padding: 7px 14px;
624
+ border-radius: 6px;
625
+ font-size: 12px;
626
+ font-weight: 500;
627
+ cursor: pointer;
628
+ transition: all 0.15s ease;
629
+ display: flex;
630
+ align-items: center;
631
+ gap: 6px;
632
+ }
633
+
634
+ .segmented-btn::before {
635
+ content: '';
636
+ width: 14px;
637
+ height: 14px;
638
+ background: currentColor;
639
+ mask-size: contain;
640
+ mask-repeat: no-repeat;
641
+ flex-shrink: 0;
642
+ opacity: 0.7;
643
+ }
644
+
645
+ .segmented-btn[data-view="unified"]::before {
646
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='3' y1='6' x2='21' y2='6'/%3E%3Cline x1='3' y1='12' x2='21' y2='12'/%3E%3Cline x1='3' y1='18' x2='21' y2='18'/%3E%3C/svg%3E");
647
+ }
648
+
649
+ .segmented-btn[data-view="split"]::before {
650
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='3' width='18' height='18' rx='2'/%3E%3Cline x1='12' y1='3' x2='12' y2='21'/%3E%3C/svg%3E");
651
+ }
652
+
653
+ .segmented-btn:hover:not(.active) {
654
+ color: var(--color-text);
655
+ background: rgba(var(--color-accent-rgb), 0.08);
656
+ }
657
+
658
+ .segmented-btn.active {
659
+ background: var(--color-accent);
660
+ color: white;
661
+ box-shadow: 0 2px 8px rgba(var(--color-accent-rgb), 0.25);
662
+ }
663
+
664
+ .segmented-btn.active::before {
665
+ opacity: 1;
666
+ }
667
+
668
+ /* ============================================================
669
+ MAIN BODY LAYOUT - Improved grid with better proportions
670
+ ============================================================ */
671
+ .git-history-body {
672
+ display: grid;
673
+ grid-template-columns: 340px minmax(0, 1fr);
674
+ gap: 20px;
675
+ min-height: 0;
676
+ }
677
+
678
+ .commit-list-panel,
679
+ .commit-detail-panel {
680
+ background: var(--color-surface);
681
+ border: 1px solid var(--color-border);
682
+ border-radius: var(--radius-medium);
683
+ box-shadow: var(--shadow-elevated);
684
+ overflow: hidden;
685
+ transition: box-shadow var(--transition-normal);
686
+ }
687
+
688
+ .commit-list-panel:hover,
689
+ .commit-detail-panel:hover {
690
+ box-shadow: var(--shadow-floating);
691
+ }
692
+
693
+ /* ============================================================
694
+ COMMIT LIST PANEL - Enhanced timeline design
695
+ ============================================================ */
696
+ .commit-list-panel {
697
+ display: flex;
698
+ flex-direction: column;
699
+ min-height: 480px;
700
+ max-height: calc(100vh - 280px);
701
+ }
702
+
703
+ .commit-list-header {
704
+ display: flex;
705
+ justify-content: space-between;
706
+ align-items: center;
707
+ padding: 14px 16px;
708
+ border-bottom: 1px solid var(--color-border);
709
+ gap: 12px;
710
+ background: var(--color-surface);
711
+ position: sticky;
712
+ top: 0;
713
+ z-index: 1;
714
+ }
715
+
716
+ .commit-list-header h2 {
717
+ margin: 0;
718
+ font-size: 13px;
719
+ font-weight: 600;
720
+ display: flex;
721
+ align-items: center;
722
+ gap: 8px;
723
+ color: var(--color-text);
724
+ }
725
+
726
+ .commit-list-header h2::before {
727
+ content: '';
728
+ width: 16px;
729
+ height: 16px;
730
+ background: var(--color-accent);
731
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cline x1='1.05' y1='12' x2='7' y2='12'/%3E%3Cline x1='17.01' y1='12' x2='22.96' y2='12'/%3E%3C/svg%3E");
732
+ mask-size: contain;
733
+ mask-repeat: no-repeat;
734
+ flex-shrink: 0;
735
+ }
736
+
737
+ #commit-count {
738
+ font-size: 11px;
739
+ margin-top: 2px;
740
+ }
741
+
742
+ .pagination-controls {
743
+ display: flex;
744
+ gap: 4px;
745
+ }
746
+
747
+ .pagination-controls button {
748
+ padding: 5px 10px;
749
+ font-size: 11px;
750
+ font-weight: 500;
751
+ border-radius: 6px;
752
+ }
753
+
754
+ .commit-list {
755
+ list-style: none;
756
+ padding: 8px 12px 12px 12px;
757
+ margin: 0;
758
+ display: flex;
759
+ flex-direction: column;
760
+ gap: 4px;
761
+ overflow-y: auto;
762
+ flex: 1;
763
+ scroll-behavior: smooth;
764
+ }
765
+
766
+ /* Custom scrollbar for commit list */
767
+ .commit-list::-webkit-scrollbar {
768
+ width: 5px;
769
+ }
770
+
771
+ .commit-list::-webkit-scrollbar-track {
772
+ background: transparent;
773
+ }
774
+
775
+ .commit-list::-webkit-scrollbar-thumb {
776
+ background: var(--color-border);
777
+ border-radius: 3px;
778
+ }
779
+
780
+ .commit-list::-webkit-scrollbar-thumb:hover {
781
+ background: var(--color-text-muted);
782
+ }
783
+
784
+ /* ============================================================
785
+ COMMIT ITEMS - Refined timeline with better visual hierarchy
786
+ ============================================================ */
787
+ .commit-item {
788
+ position: relative;
789
+ border: 1px solid transparent;
790
+ border-radius: var(--radius-small);
791
+ padding: 14px 16px;
792
+ padding-left: 36px;
793
+ background: transparent;
794
+ cursor: pointer;
795
+ transition: all var(--transition-fast);
796
+ will-change: transform, background-color;
797
+ }
798
+
799
+ /* Timeline connector - refined dot style */
800
+ .commit-item::before {
801
+ content: '';
802
+ position: absolute;
803
+ left: 10px;
804
+ top: 50%;
805
+ transform: translateY(-50%);
806
+ width: 8px;
807
+ height: 8px;
808
+ border-radius: 50%;
809
+ background: var(--color-surface-muted);
810
+ border: 2px solid var(--color-border);
811
+ transition: all var(--transition-fast);
812
+ z-index: 1;
813
+ }
814
+
815
+ /* Vertical timeline line */
816
+ .commit-item::after {
817
+ content: '';
818
+ position: absolute;
819
+ left: 15px;
820
+ top: 0;
821
+ bottom: 0;
822
+ width: 2px;
823
+ background: var(--color-border);
824
+ opacity: 0.4;
825
+ border-radius: 1px;
826
+ }
827
+
828
+ .commit-item:first-child::after {
829
+ top: 50%;
830
+ background: linear-gradient(180deg, transparent 0%, var(--color-border) 30%);
831
+ }
832
+
833
+ .commit-item:last-child::after {
834
+ bottom: 50%;
835
+ background: linear-gradient(180deg, var(--color-border) 70%, transparent 100%);
836
+ }
837
+
838
+ .commit-item:only-child::after {
839
+ display: none;
840
+ }
841
+
842
+ .commit-item:hover {
843
+ background: var(--color-surface-muted);
844
+ border-color: var(--color-border);
845
+ transform: translateX(3px);
846
+ }
847
+
848
+ .commit-item:hover::before {
849
+ background: var(--color-accent);
850
+ border-color: var(--color-accent);
851
+ transform: translateY(-50%) scale(1.15);
852
+ box-shadow: 0 0 0 4px rgba(var(--color-accent-rgb), 0.12);
853
+ }
854
+
855
+ .commit-item.selected {
856
+ background: rgba(var(--color-accent-rgb), 0.06);
857
+ border-color: rgba(var(--color-accent-rgb), 0.25);
858
+ transform: translateX(3px);
859
+ }
860
+
861
+ .commit-item.selected::before {
862
+ background: var(--color-accent);
863
+ border-color: var(--color-accent);
864
+ box-shadow: 0 0 0 5px rgba(var(--color-accent-rgb), 0.15), 0 0 12px rgba(var(--color-accent-rgb), 0.2);
865
+ transform: translateY(-50%) scale(1.25);
866
+ }
867
+
868
+ /* Pulse animation for selected commit */
869
+ .commit-item.selected::before {
870
+ animation: commitPulse 2s ease-in-out infinite;
871
+ }
872
+
873
+ @keyframes commitPulse {
874
+ 0%, 100% {
875
+ box-shadow: 0 0 0 5px rgba(var(--color-accent-rgb), 0.15), 0 0 12px rgba(var(--color-accent-rgb), 0.2);
876
+ }
877
+ 50% {
878
+ box-shadow: 0 0 0 6px rgba(var(--color-accent-rgb), 0.1), 0 0 16px rgba(var(--color-accent-rgb), 0.15);
879
+ }
880
+ }
881
+
882
+ .commit-message {
883
+ font-weight: 500;
884
+ font-size: 13px;
885
+ margin-bottom: 8px;
886
+ color: var(--color-text);
887
+ line-height: 1.45;
888
+ display: -webkit-box;
889
+ -webkit-line-clamp: 2;
890
+ -webkit-box-orient: vertical;
891
+ overflow: hidden;
892
+ transition: color var(--transition-fast);
893
+ }
894
+
895
+ .commit-item:hover .commit-message {
896
+ color: var(--color-text);
897
+ }
898
+
899
+ .commit-item.selected .commit-message {
900
+ font-weight: 600;
901
+ color: var(--color-accent);
902
+ }
903
+
904
+ .commit-meta-row {
905
+ display: flex;
906
+ flex-wrap: wrap;
907
+ align-items: center;
908
+ gap: 8px;
909
+ font-size: 11px;
910
+ color: var(--color-text-muted);
911
+ }
912
+
913
+ .commit-meta-row span:not(.commit-tag) {
914
+ display: flex;
915
+ align-items: center;
916
+ gap: 4px;
917
+ }
918
+
919
+ .commit-meta-row span:not(:last-child):not(.commit-tag)::after {
920
+ content: '';
921
+ width: 2px;
922
+ height: 2px;
923
+ border-radius: 50%;
924
+ background: currentColor;
925
+ margin-left: 4px;
926
+ opacity: 0.4;
927
+ }
928
+
929
+ .commit-tag {
930
+ font-size: 9px;
931
+ text-transform: uppercase;
932
+ letter-spacing: 0.04em;
933
+ font-weight: 600;
934
+ padding: 2px 6px;
935
+ border-radius: 4px;
936
+ background: rgba(139, 92, 246, 0.12);
937
+ color: #7c3aed;
938
+ }
939
+
940
+ :root[data-theme="dark"] .commit-tag {
941
+ background: rgba(139, 92, 246, 0.2);
942
+ color: #a78bfa;
943
+ }
944
+
945
+ /* Author chip with avatar */
946
+ .commit-author-chip {
947
+ display: inline-flex;
948
+ align-items: center;
949
+ gap: 5px;
950
+ }
951
+
952
+ .author-avatar {
953
+ width: 16px;
954
+ height: 16px;
955
+ border-radius: 50%;
956
+ background: var(--avatar-color, var(--color-accent));
957
+ color: white;
958
+ font-size: 8px;
959
+ font-weight: 600;
960
+ display: flex;
961
+ align-items: center;
962
+ justify-content: center;
963
+ flex-shrink: 0;
964
+ }
965
+
966
+ .commit-short-hash {
967
+ font-family: "JetBrains Mono", "SF Mono", monospace;
968
+ font-size: 10px;
969
+ background: var(--color-surface-muted);
970
+ padding: 3px 7px;
971
+ border-radius: 5px;
972
+ letter-spacing: 0.03em;
973
+ border: 1px solid transparent;
974
+ transition: all var(--transition-fast);
975
+ }
976
+
977
+ .commit-item:hover .commit-short-hash {
978
+ background: rgba(var(--color-accent-rgb), 0.1);
979
+ border-color: rgba(var(--color-accent-rgb), 0.2);
980
+ color: var(--color-accent);
981
+ }
982
+
983
+ .commit-item.selected .commit-short-hash {
984
+ background: rgba(var(--color-accent-rgb), 0.12);
985
+ border-color: rgba(var(--color-accent-rgb), 0.25);
986
+ color: var(--color-accent);
987
+ font-weight: 600;
988
+ }
989
+
990
+ .commit-time {
991
+ opacity: 0.8;
992
+ }
993
+
994
+ /* Commit type indicators */
995
+ .commit-type-indicator {
996
+ display: inline-flex;
997
+ align-items: center;
998
+ gap: 4px;
999
+ font-size: 9px;
1000
+ text-transform: uppercase;
1001
+ letter-spacing: 0.04em;
1002
+ font-weight: 600;
1003
+ padding: 2px 6px;
1004
+ border-radius: 4px;
1005
+ }
1006
+
1007
+ .commit-type-indicator.feat {
1008
+ background: rgba(34, 197, 94, 0.12);
1009
+ color: var(--color-success);
1010
+ }
1011
+
1012
+ .commit-type-indicator.fix {
1013
+ background: rgba(239, 68, 68, 0.12);
1014
+ color: var(--color-danger);
1015
+ }
1016
+
1017
+ .commit-type-indicator.refactor {
1018
+ background: rgba(59, 130, 246, 0.12);
1019
+ color: #3b82f6;
1020
+ }
1021
+
1022
+ .commit-type-indicator.docs {
1023
+ background: rgba(168, 85, 247, 0.12);
1024
+ color: #a855f7;
1025
+ }
1026
+
1027
+ .commit-type-indicator.chore {
1028
+ background: rgba(107, 114, 128, 0.12);
1029
+ color: var(--color-text-muted);
1030
+ }
1031
+
1032
+ .commit-type-indicator.test {
1033
+ background: rgba(251, 191, 36, 0.12);
1034
+ color: #f59e0b;
1035
+ }
1036
+
1037
+ /* Empty state in commit list */
1038
+ .commit-list-empty {
1039
+ display: flex;
1040
+ flex-direction: column;
1041
+ align-items: center;
1042
+ justify-content: center;
1043
+ padding: 32px 16px;
1044
+ text-align: center;
1045
+ color: var(--color-text-muted);
1046
+ }
1047
+
1048
+ .commit-list-empty .empty-state-icon {
1049
+ width: 40px;
1050
+ height: 40px;
1051
+ margin-bottom: 10px;
1052
+ opacity: 0.4;
1053
+ }
1054
+
1055
+ .commit-list-empty p {
1056
+ margin: 0;
1057
+ font-size: 12px;
1058
+ }
1059
+
1060
+ /* Commit item entrance animation - subtle */
1061
+ @keyframes commitSlideIn {
1062
+ from {
1063
+ opacity: 0;
1064
+ transform: translateY(4px);
1065
+ }
1066
+ to {
1067
+ opacity: 1;
1068
+ transform: translateY(0);
1069
+ }
1070
+ }
1071
+
1072
+ .commit-item {
1073
+ animation: commitSlideIn 0.2s ease forwards;
1074
+ opacity: 0;
1075
+ }
1076
+
1077
+ /* Loading skeleton styles */
1078
+ .commit-item-skeleton {
1079
+ pointer-events: none;
1080
+ animation: none;
1081
+ opacity: 1;
1082
+ }
1083
+
1084
+ .commit-item-skeleton::before,
1085
+ .commit-item-skeleton::after {
1086
+ display: none;
1087
+ }
1088
+
1089
+ .skeleton-message {
1090
+ height: 16px;
1091
+ width: 85%;
1092
+ margin-bottom: 12px;
1093
+ }
1094
+
1095
+ .skeleton-meta {
1096
+ display: flex;
1097
+ align-items: center;
1098
+ gap: 8px;
1099
+ }
1100
+
1101
+ .skeleton-avatar {
1102
+ width: 18px;
1103
+ height: 18px;
1104
+ border-radius: 50%;
1105
+ }
1106
+
1107
+ .skeleton-text {
1108
+ height: 12px;
1109
+ width: 80px;
1110
+ }
1111
+
1112
+ .skeleton-text-short {
1113
+ height: 12px;
1114
+ width: 50px;
1115
+ }
1116
+
1117
+ /* ============================================================
1118
+ COMMIT DETAIL PANEL - Better header and improved organization
1119
+ ============================================================ */
1120
+ .commit-detail-panel {
1121
+ padding: 0;
1122
+ overflow: hidden;
1123
+ display: flex;
1124
+ flex-direction: column;
1125
+ }
1126
+
1127
+ .commit-detail {
1128
+ display: flex;
1129
+ flex-direction: column;
1130
+ gap: 0;
1131
+ padding: 0;
1132
+ flex: 1;
1133
+ overflow: hidden;
1134
+ }
1135
+
1136
+ .commit-detail-header {
1137
+ display: flex;
1138
+ justify-content: space-between;
1139
+ gap: 16px;
1140
+ flex-wrap: wrap;
1141
+ padding: 18px 20px;
1142
+ background: var(--color-surface);
1143
+ border-bottom: 1px solid var(--color-border);
1144
+ }
1145
+
1146
+ .commit-title {
1147
+ flex: 1;
1148
+ min-width: 0;
1149
+ }
1150
+
1151
+ .commit-title h2 {
1152
+ margin: 0 0 10px 0;
1153
+ font-size: 16px;
1154
+ font-weight: 600;
1155
+ line-height: 1.45;
1156
+ color: var(--color-text);
1157
+ }
1158
+
1159
+ .commit-meta {
1160
+ display: flex;
1161
+ flex-wrap: wrap;
1162
+ align-items: center;
1163
+ gap: 12px;
1164
+ font-size: 12px;
1165
+ color: var(--color-text-muted);
1166
+ }
1167
+
1168
+ .commit-meta span {
1169
+ display: flex;
1170
+ align-items: center;
1171
+ gap: 6px;
1172
+ }
1173
+
1174
+ /* Author avatar placeholder */
1175
+ #commit-author::before {
1176
+ content: '';
1177
+ width: 18px;
1178
+ height: 18px;
1179
+ background: linear-gradient(135deg, var(--color-accent) 0%, #8b5cf6 100%);
1180
+ border-radius: 50%;
1181
+ flex-shrink: 0;
1182
+ }
1183
+
1184
+ #commit-date::before {
1185
+ content: '';
1186
+ width: 13px;
1187
+ height: 13px;
1188
+ background: currentColor;
1189
+ opacity: 0.5;
1190
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpolyline points='12 6 12 12 16 14'/%3E%3C/svg%3E");
1191
+ mask-size: contain;
1192
+ mask-repeat: no-repeat;
1193
+ flex-shrink: 0;
1194
+ }
1195
+
1196
+ #commit-hash {
1197
+ font-family: "JetBrains Mono", "SF Mono", monospace;
1198
+ font-size: 11px;
1199
+ background: var(--color-surface-muted);
1200
+ padding: 4px 8px;
1201
+ border-radius: 4px;
1202
+ border: 1px solid var(--color-border);
1203
+ letter-spacing: 0.02em;
1204
+ }
1205
+
1206
+ .meta-separator {
1207
+ display: none;
1208
+ }
1209
+
1210
+ .commit-actions {
1211
+ display: flex;
1212
+ gap: 8px;
1213
+ align-items: flex-start;
1214
+ flex-shrink: 0;
1215
+ }
1216
+
1217
+ .commit-actions button {
1218
+ padding: 9px 16px;
1219
+ font-size: 12px;
1220
+ font-weight: 500;
1221
+ border-radius: 7px;
1222
+ transition: all var(--transition-fast);
1223
+ display: flex;
1224
+ align-items: center;
1225
+ gap: 7px;
1226
+ position: relative;
1227
+ overflow: hidden;
1228
+ }
1229
+
1230
+ .commit-actions button::before {
1231
+ content: '';
1232
+ width: 14px;
1233
+ height: 14px;
1234
+ background: currentColor;
1235
+ mask-size: contain;
1236
+ mask-repeat: no-repeat;
1237
+ flex-shrink: 0;
1238
+ transition: transform var(--transition-fast);
1239
+ }
1240
+
1241
+ .commit-actions button:hover::before {
1242
+ transform: scale(1.1);
1243
+ }
1244
+
1245
+ .commit-actions button:active {
1246
+ transform: scale(0.98);
1247
+ }
1248
+
1249
+ #copy-hash-btn {
1250
+ background: var(--color-surface-muted);
1251
+ border: 1px solid var(--color-border);
1252
+ color: var(--color-text);
1253
+ }
1254
+
1255
+ #copy-hash-btn::before {
1256
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='9' y='9' width='13' height='13' rx='2' ry='2'/%3E%3Cpath d='M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1'/%3E%3C/svg%3E");
1257
+ }
1258
+
1259
+ #copy-hash-btn:hover {
1260
+ background: var(--color-surface);
1261
+ border-color: var(--color-accent);
1262
+ color: var(--color-accent);
1263
+ box-shadow: 0 2px 8px rgba(var(--color-accent-rgb), 0.15);
1264
+ }
1265
+
1266
+ /* Success state after copying */
1267
+ #copy-hash-btn.copied {
1268
+ background: rgba(46, 182, 125, 0.1);
1269
+ border-color: var(--color-success);
1270
+ color: var(--color-success);
1271
+ }
1272
+
1273
+ #revert-btn {
1274
+ background: rgba(229, 83, 104, 0.06);
1275
+ border: 1px solid rgba(229, 83, 104, 0.2);
1276
+ color: var(--color-danger);
1277
+ }
1278
+
1279
+ #revert-btn::before {
1280
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8'/%3E%3Cpath d='M3 3v5h5'/%3E%3C/svg%3E");
1281
+ }
1282
+
1283
+ #revert-btn:hover {
1284
+ background: var(--color-danger);
1285
+ border-color: var(--color-danger);
1286
+ color: white;
1287
+ box-shadow: 0 2px 10px rgba(229, 83, 104, 0.3);
1288
+ }
1289
+
1290
+ #revert-btn:hover::before {
1291
+ animation: revertSpin 0.4s ease;
1292
+ }
1293
+
1294
+ @keyframes revertSpin {
1295
+ 0% { transform: rotate(0deg); }
1296
+ 100% { transform: rotate(-360deg); }
1297
+ }
1298
+
1299
+ /* ============================================================
1300
+ DIFF SUBHEADER - Stats and controls
1301
+ ============================================================ */
1302
+ .commit-detail-subheader {
1303
+ display: flex;
1304
+ flex-wrap: wrap;
1305
+ gap: 12px;
1306
+ align-items: center;
1307
+ justify-content: space-between;
1308
+ padding: 10px 20px;
1309
+ background: var(--color-surface-muted);
1310
+ border-bottom: 1px solid var(--color-border);
1311
+ position: relative;
1312
+ }
1313
+
1314
+ .file-nav-container {
1315
+ position: relative;
1316
+ }
1317
+
1318
+ .merge-controls {
1319
+ display: flex;
1320
+ align-items: center;
1321
+ gap: 8px;
1322
+ font-size: 12px;
1323
+ color: var(--color-text-muted);
1324
+ }
1325
+
1326
+ .merge-controls label {
1327
+ font-weight: 500;
1328
+ }
1329
+
1330
+ .merge-controls select {
1331
+ padding: 5px 10px;
1332
+ border-radius: 5px;
1333
+ border: 1px solid var(--color-border);
1334
+ background: var(--color-surface);
1335
+ color: var(--color-text);
1336
+ font-size: 12px;
1337
+ cursor: pointer;
1338
+ }
1339
+
1340
+ .diff-stats {
1341
+ font-size: 12px;
1342
+ color: var(--color-text-muted);
1343
+ display: flex;
1344
+ align-items: center;
1345
+ gap: 8px;
1346
+ font-weight: 500;
1347
+ }
1348
+
1349
+ .diff-stats::before {
1350
+ content: '';
1351
+ width: 14px;
1352
+ height: 14px;
1353
+ background: currentColor;
1354
+ opacity: 0.5;
1355
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z'/%3E%3Cpolyline points='14 2 14 8 20 8'/%3E%3Cline x1='16' y1='13' x2='8' y2='13'/%3E%3Cline x1='16' y1='17' x2='8' y2='17'/%3E%3Cpolyline points='10 9 9 9 8 9'/%3E%3C/svg%3E");
1356
+ mask-size: contain;
1357
+ mask-repeat: no-repeat;
1358
+ flex-shrink: 0;
1359
+ }
1360
+
1361
+ .diff-stat-files {
1362
+ color: var(--color-text);
1363
+ }
1364
+
1365
+ .diff-stat-separator {
1366
+ opacity: 0.4;
1367
+ }
1368
+
1369
+ .diff-stat-add {
1370
+ color: var(--color-success);
1371
+ font-family: "JetBrains Mono", "SF Mono", monospace;
1372
+ font-size: 11px;
1373
+ }
1374
+
1375
+ .diff-stat-del {
1376
+ color: var(--color-danger);
1377
+ font-family: "JetBrains Mono", "SF Mono", monospace;
1378
+ font-size: 11px;
1379
+ }
1380
+
1381
+ .diff-actions {
1382
+ display: flex;
1383
+ gap: 6px;
1384
+ align-items: center;
1385
+ }
1386
+
1387
+ .diff-actions button {
1388
+ padding: 5px 10px;
1389
+ font-size: 11px;
1390
+ font-weight: 500;
1391
+ border-radius: 5px;
1392
+ }
1393
+
1394
+ .diff-actions .file-nav-toggle {
1395
+ display: flex;
1396
+ }
1397
+
1398
+ /* ============================================================
1399
+ DIFF CONTAINER - File cards and content
1400
+ ============================================================ */
1401
+ .commit-diff {
1402
+ display: flex;
1403
+ flex-direction: column;
1404
+ gap: 12px;
1405
+ padding: 16px 20px;
1406
+ overflow-y: auto;
1407
+ flex: 1;
1408
+ }
1409
+
1410
+ /* Custom scrollbar for diff area */
1411
+ .commit-diff::-webkit-scrollbar {
1412
+ width: 6px;
1413
+ }
1414
+
1415
+ .commit-diff::-webkit-scrollbar-track {
1416
+ background: transparent;
1417
+ }
1418
+
1419
+ .commit-diff::-webkit-scrollbar-thumb {
1420
+ background: var(--color-border);
1421
+ border-radius: 3px;
1422
+ }
1423
+
1424
+ .commit-diff::-webkit-scrollbar-thumb:hover {
1425
+ background: var(--color-text-muted);
1426
+ }
1427
+
1428
+ /* File diff card styling - refined */
1429
+ .file-diff {
1430
+ border: 1px solid var(--color-border);
1431
+ border-radius: var(--radius-medium);
1432
+ background: var(--color-surface);
1433
+ overflow: hidden;
1434
+ transition: all var(--transition-normal);
1435
+ scroll-margin-top: 20px;
1436
+ box-shadow: var(--shadow-subtle);
1437
+ }
1438
+
1439
+ .file-diff:hover {
1440
+ border-color: rgba(var(--color-accent-rgb), 0.35);
1441
+ box-shadow: var(--shadow-elevated);
1442
+ }
1443
+
1444
+ .file-diff:target,
1445
+ .file-diff.highlighted {
1446
+ border-color: var(--color-accent);
1447
+ box-shadow: 0 0 0 3px rgba(var(--color-accent-rgb), 0.2), var(--shadow-elevated);
1448
+ animation: fileHighlight 0.6s ease;
1449
+ }
1450
+
1451
+ @keyframes fileHighlight {
1452
+ 0% {
1453
+ box-shadow: 0 0 0 8px rgba(var(--color-accent-rgb), 0.35);
1454
+ transform: scale(1.005);
1455
+ }
1456
+ 100% {
1457
+ box-shadow: 0 0 0 3px rgba(var(--color-accent-rgb), 0.2), var(--shadow-elevated);
1458
+ transform: scale(1);
1459
+ }
1460
+ }
1461
+
1462
+ /* File status badge */
1463
+ .file-status-badge {
1464
+ display: inline-flex;
1465
+ align-items: center;
1466
+ justify-content: center;
1467
+ width: 20px;
1468
+ height: 20px;
1469
+ border-radius: 5px;
1470
+ font-size: 10px;
1471
+ font-weight: 700;
1472
+ flex-shrink: 0;
1473
+ transition: transform var(--transition-fast);
1474
+ }
1475
+
1476
+ .file-diff-header:hover .file-status-badge {
1477
+ transform: scale(1.1);
1478
+ }
1479
+
1480
+ .file-status-badge.added {
1481
+ background: linear-gradient(135deg, rgba(34, 197, 94, 0.2) 0%, rgba(34, 197, 94, 0.1) 100%);
1482
+ color: var(--color-success);
1483
+ border: 1px solid rgba(34, 197, 94, 0.25);
1484
+ }
1485
+
1486
+ .file-status-badge.modified {
1487
+ background: linear-gradient(135deg, rgba(251, 191, 36, 0.2) 0%, rgba(251, 191, 36, 0.1) 100%);
1488
+ color: #f59e0b;
1489
+ border: 1px solid rgba(251, 191, 36, 0.25);
1490
+ }
1491
+
1492
+ .file-status-badge.deleted {
1493
+ background: linear-gradient(135deg, rgba(239, 68, 68, 0.2) 0%, rgba(239, 68, 68, 0.1) 100%);
1494
+ color: var(--color-danger);
1495
+ border: 1px solid rgba(239, 68, 68, 0.25);
1496
+ }
1497
+
1498
+ .file-status-badge.renamed {
1499
+ background: linear-gradient(135deg, rgba(139, 92, 246, 0.2) 0%, rgba(139, 92, 246, 0.1) 100%);
1500
+ color: #8b5cf6;
1501
+ border: 1px solid rgba(139, 92, 246, 0.25);
1502
+ }
1503
+
1504
+ .file-diff-header {
1505
+ display: flex;
1506
+ justify-content: space-between;
1507
+ align-items: center;
1508
+ padding: 14px 18px;
1509
+ background: var(--color-surface-muted);
1510
+ border-bottom: 1px solid var(--color-border);
1511
+ cursor: pointer;
1512
+ user-select: none;
1513
+ transition: all var(--transition-fast);
1514
+ gap: 14px;
1515
+ position: sticky;
1516
+ top: 0;
1517
+ z-index: 5;
1518
+ }
1519
+
1520
+ .file-diff-header::before {
1521
+ content: '';
1522
+ position: absolute;
1523
+ left: 0;
1524
+ top: 0;
1525
+ bottom: 0;
1526
+ width: 3px;
1527
+ background: transparent;
1528
+ transition: background var(--transition-fast);
1529
+ }
1530
+
1531
+ .file-diff-header:hover {
1532
+ background: rgba(var(--color-accent-rgb), 0.05);
1533
+ }
1534
+
1535
+ .file-diff-header:hover::before {
1536
+ background: var(--color-accent);
1537
+ }
1538
+
1539
+ .file-diff-header:active {
1540
+ background: rgba(var(--color-accent-rgb), 0.08);
1541
+ }
1542
+
1543
+ .file-diff-title {
1544
+ display: flex;
1545
+ align-items: center;
1546
+ gap: 10px;
1547
+ min-width: 0;
1548
+ flex: 1;
1549
+ }
1550
+
1551
+ .file-diff-name {
1552
+ font-family: "JetBrains Mono", "SF Mono", monospace;
1553
+ font-size: 12px;
1554
+ font-weight: 500;
1555
+ color: var(--color-text);
1556
+ white-space: nowrap;
1557
+ overflow: hidden;
1558
+ text-overflow: ellipsis;
1559
+ }
1560
+
1561
+ .file-diff-stat {
1562
+ font-size: 11px;
1563
+ color: var(--color-text-muted);
1564
+ display: inline-flex;
1565
+ gap: 8px;
1566
+ align-items: center;
1567
+ flex-shrink: 0;
1568
+ font-family: "JetBrains Mono", "SF Mono", monospace;
1569
+ }
1570
+
1571
+ .file-diff-stat .diff-add {
1572
+ color: var(--color-success);
1573
+ font-weight: 600;
1574
+ }
1575
+
1576
+ .file-diff-stat .diff-del {
1577
+ color: var(--color-danger);
1578
+ font-weight: 600;
1579
+ }
1580
+
1581
+ .file-diff-toggle-btn {
1582
+ width: 28px;
1583
+ height: 28px;
1584
+ display: flex;
1585
+ align-items: center;
1586
+ justify-content: center;
1587
+ border-radius: 7px;
1588
+ background: var(--color-surface);
1589
+ border: 1px solid var(--color-border);
1590
+ color: var(--color-text-muted);
1591
+ font-size: 11px;
1592
+ cursor: pointer;
1593
+ transition: all var(--transition-fast);
1594
+ flex-shrink: 0;
1595
+ padding: 0;
1596
+ }
1597
+
1598
+ .file-diff-toggle-btn:hover {
1599
+ background: var(--color-accent);
1600
+ border-color: var(--color-accent);
1601
+ color: white;
1602
+ transform: scale(1.08);
1603
+ box-shadow: 0 2px 8px rgba(var(--color-accent-rgb), 0.25);
1604
+ }
1605
+
1606
+ .file-diff-toggle-btn:active {
1607
+ transform: scale(0.95);
1608
+ }
1609
+
1610
+ .file-diff-toggle-btn::before {
1611
+ content: '';
1612
+ width: 12px;
1613
+ height: 12px;
1614
+ background: currentColor;
1615
+ mask-size: contain;
1616
+ mask-repeat: no-repeat;
1617
+ transition: transform var(--transition-normal);
1618
+ }
1619
+
1620
+ .file-diff-toggle-btn[data-collapsed="false"]::before {
1621
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
1622
+ }
1623
+
1624
+ .file-diff-toggle-btn[data-collapsed="true"]::before {
1625
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'/%3E%3C/svg%3E");
1626
+ }
1627
+
1628
+ /* Rotate animation when state changes */
1629
+ .file-diff-toggle-btn[data-collapsed="true"]::before {
1630
+ transform: rotate(0deg);
1631
+ }
1632
+
1633
+ .file-diff-toggle-btn[data-collapsed="false"]::before {
1634
+ transform: rotate(0deg);
1635
+ }
1636
+
1637
+ .file-diff-content {
1638
+ max-height: 600px;
1639
+ overflow-y: auto;
1640
+ transition: max-height 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease;
1641
+ }
1642
+
1643
+ .file-diff-content.collapsed {
1644
+ max-height: 0;
1645
+ overflow: hidden;
1646
+ opacity: 0;
1647
+ }
1648
+
1649
+ /* Scroll shadow indicator for diff content */
1650
+ .file-diff-content::before {
1651
+ content: '';
1652
+ position: sticky;
1653
+ top: 0;
1654
+ display: block;
1655
+ height: 0;
1656
+ box-shadow: 0 4px 8px -4px rgba(0, 0, 0, 0.1);
1657
+ z-index: 4;
1658
+ pointer-events: none;
1659
+ }
1660
+
1661
+ /* Diff hunk styling - refined */
1662
+ .diff-hunk {
1663
+ font-family: "JetBrains Mono", "SF Mono", monospace;
1664
+ font-size: 12px;
1665
+ }
1666
+
1667
+ .diff-hunk-header {
1668
+ background: rgba(var(--color-accent-rgb), 0.04);
1669
+ color: var(--color-text-muted);
1670
+ padding: 6px 14px;
1671
+ font-size: 11px;
1672
+ border-top: 1px solid var(--color-border);
1673
+ font-style: normal;
1674
+ opacity: 0.8;
1675
+ }
1676
+
1677
+ .diff-hunk:first-child .diff-hunk-header {
1678
+ border-top: none;
1679
+ }
1680
+
1681
+ /* ============================================================
1682
+ BRANCH PILL - Hero area indicator
1683
+ ============================================================ */
1684
+ .git-branch-pill {
1685
+ display: inline-flex;
1686
+ align-items: center;
1687
+ gap: 6px;
1688
+ padding: 6px 12px;
1689
+ border-radius: 6px;
1690
+ background: rgba(var(--color-accent-rgb), 0.1);
1691
+ color: var(--color-accent);
1692
+ font-size: 12px;
1693
+ font-weight: 500;
1694
+ border: 1px solid rgba(var(--color-accent-rgb), 0.2);
1695
+ }
1696
+
1697
+ .git-branch-pill::before {
1698
+ content: '';
1699
+ width: 12px;
1700
+ height: 12px;
1701
+ background: currentColor;
1702
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='6' y1='3' x2='6' y2='15'/%3E%3Ccircle cx='18' cy='6' r='3'/%3E%3Ccircle cx='6' cy='18' r='3'/%3E%3Cpath d='M18 9a9 9 0 0 1-9 9'/%3E%3C/svg%3E");
1703
+ mask-size: contain;
1704
+ mask-repeat: no-repeat;
1705
+ flex-shrink: 0;
1706
+ }
1707
+
1708
+ #repo-branch-name {
1709
+ font-family: "JetBrains Mono", "SF Mono", monospace;
1710
+ }
1711
+
1712
+ .branch-label {
1713
+ display: none;
1714
+ }
1715
+
1716
+ /* ============================================================
1717
+ SPLIT DIFF VIEW - Side-by-side comparison
1718
+ ============================================================ */
1719
+ .split-diff-table {
1720
+ display: flex;
1721
+ flex-direction: column;
1722
+ gap: 0;
1723
+ }
1724
+
1725
+ .split-diff-row {
1726
+ display: grid;
1727
+ grid-template-columns: 1fr 1fr;
1728
+ border-bottom: 1px solid rgba(0, 0, 0, 0.04);
1729
+ }
1730
+
1731
+ :root[data-theme="dark"] .split-diff-row {
1732
+ border-bottom-color: rgba(255, 255, 255, 0.04);
1733
+ }
1734
+
1735
+ .split-diff-row:last-child {
1736
+ border-bottom: none;
1737
+ }
1738
+
1739
+ .split-diff-cell {
1740
+ display: flex;
1741
+ font-family: "JetBrains Mono", "SF Mono", monospace;
1742
+ font-size: 12px;
1743
+ line-height: 1.55;
1744
+ border-right: 1px solid var(--color-border);
1745
+ }
1746
+
1747
+ .split-diff-cell:last-child {
1748
+ border-right: none;
1749
+ }
1750
+
1751
+ .split-line-num {
1752
+ min-width: 48px;
1753
+ padding: 3px 8px;
1754
+ text-align: right;
1755
+ user-select: none;
1756
+ background: var(--color-surface-muted);
1757
+ color: var(--color-text-muted);
1758
+ border-right: 1px solid var(--color-border);
1759
+ font-size: 10px;
1760
+ opacity: 0.8;
1761
+ }
1762
+
1763
+ .split-line-content {
1764
+ flex: 1;
1765
+ padding: 3px 12px;
1766
+ white-space: pre-wrap;
1767
+ word-break: break-all;
1768
+ }
1769
+
1770
+ .split-add {
1771
+ background: rgba(34, 197, 94, 0.08);
1772
+ border-left: 2px solid rgba(34, 197, 94, 0.4);
1773
+ }
1774
+
1775
+ .split-add .split-line-num {
1776
+ background: rgba(34, 197, 94, 0.15);
1777
+ color: var(--color-success);
1778
+ opacity: 1;
1779
+ }
1780
+
1781
+ .split-add .split-line-content {
1782
+ color: #166534;
1783
+ }
1784
+
1785
+ :root[data-theme="dark"] .split-add .split-line-content {
1786
+ color: #4ade80;
1787
+ }
1788
+
1789
+ .split-remove {
1790
+ background: rgba(239, 68, 68, 0.08);
1791
+ border-left: 2px solid rgba(239, 68, 68, 0.4);
1792
+ }
1793
+
1794
+ .split-remove .split-line-num {
1795
+ background: rgba(239, 68, 68, 0.15);
1796
+ color: var(--color-danger);
1797
+ opacity: 1;
1798
+ }
1799
+
1800
+ .split-remove .split-line-content {
1801
+ color: #991b1b;
1802
+ }
1803
+
1804
+ :root[data-theme="dark"] .split-remove .split-line-content {
1805
+ color: #f87171;
1806
+ }
1807
+
1808
+ /* Hover effect on split diff cells */
1809
+ .split-diff-cell:hover:not(.split-empty) {
1810
+ filter: brightness(0.97);
1811
+ }
1812
+
1813
+ :root[data-theme="dark"] .split-diff-cell:hover:not(.split-empty) {
1814
+ filter: brightness(1.1);
1815
+ }
1816
+
1817
+ .split-context .split-line-content {
1818
+ color: var(--color-text-muted);
1819
+ }
1820
+
1821
+ .split-empty {
1822
+ background: var(--color-surface-muted);
1823
+ opacity: 0.5;
1824
+ }
1825
+
1826
+ .split-meta {
1827
+ color: var(--color-text-muted);
1828
+ font-style: italic;
1829
+ font-size: 10px;
1830
+ }
1831
+
1832
+ /* ============================================================
1833
+ UNIFIED DIFF VIEW - Enhanced line styling
1834
+ ============================================================ */
1835
+ .git-history-layout .diff-line {
1836
+ display: flex;
1837
+ font-family: "JetBrains Mono", "SF Mono", monospace;
1838
+ font-size: 12px;
1839
+ line-height: 1.55;
1840
+ }
1841
+
1842
+ .git-history-layout .diff-line-num {
1843
+ min-width: 48px;
1844
+ padding: 3px 8px;
1845
+ text-align: right;
1846
+ user-select: none;
1847
+ background: var(--color-surface-muted);
1848
+ color: var(--color-text-muted);
1849
+ border-right: 1px solid var(--color-border);
1850
+ font-size: 10px;
1851
+ opacity: 0.8;
1852
+ }
1853
+
1854
+ .git-history-layout .diff-line-content {
1855
+ flex: 1;
1856
+ padding: 3px 12px;
1857
+ white-space: pre-wrap;
1858
+ word-break: break-all;
1859
+ }
1860
+
1861
+ .git-history-layout .diff-line.diff-add {
1862
+ background: rgba(34, 197, 94, 0.08);
1863
+ border-left: 3px solid rgba(34, 197, 94, 0.4);
1864
+ }
1865
+
1866
+ .git-history-layout .diff-line.diff-add .diff-line-num {
1867
+ background: rgba(34, 197, 94, 0.15);
1868
+ color: var(--color-success);
1869
+ opacity: 1;
1870
+ }
1871
+
1872
+ .git-history-layout .diff-line.diff-add .diff-line-content {
1873
+ color: #166534;
1874
+ }
1875
+
1876
+ :root[data-theme="dark"] .git-history-layout .diff-line.diff-add .diff-line-content {
1877
+ color: #4ade80;
1878
+ }
1879
+
1880
+ .git-history-layout .diff-line.diff-remove {
1881
+ background: rgba(239, 68, 68, 0.08);
1882
+ border-left: 3px solid rgba(239, 68, 68, 0.4);
1883
+ }
1884
+
1885
+ .git-history-layout .diff-line.diff-remove .diff-line-num {
1886
+ background: rgba(239, 68, 68, 0.15);
1887
+ color: var(--color-danger);
1888
+ opacity: 1;
1889
+ }
1890
+
1891
+ .git-history-layout .diff-line.diff-remove .diff-line-content {
1892
+ color: #991b1b;
1893
+ }
1894
+
1895
+ :root[data-theme="dark"] .git-history-layout .diff-line.diff-remove .diff-line-content {
1896
+ color: #f87171;
1897
+ }
1898
+
1899
+ /* Hover effect on diff lines */
1900
+ .git-history-layout .diff-line:hover {
1901
+ filter: brightness(0.97);
1902
+ }
1903
+
1904
+ :root[data-theme="dark"] .git-history-layout .diff-line:hover {
1905
+ filter: brightness(1.1);
1906
+ }
1907
+
1908
+ .git-history-layout .diff-line.diff-context .diff-line-content {
1909
+ color: var(--color-text-muted);
1910
+ }
1911
+
1912
+ .git-history-layout .diff-line.diff-meta .diff-line-content {
1913
+ color: var(--color-text-muted);
1914
+ font-style: italic;
1915
+ font-size: 11px;
1916
+ }
1917
+
1918
+ /* Word-level diff highlighting */
1919
+ .diff-word-add {
1920
+ background: rgba(34, 197, 94, 0.25);
1921
+ border-radius: 2px;
1922
+ padding: 0 1px;
1923
+ }
1924
+
1925
+ .diff-word-remove {
1926
+ background: rgba(239, 68, 68, 0.25);
1927
+ border-radius: 2px;
1928
+ padding: 0 1px;
1929
+ }
1930
+
1931
+ /* Diff prefix (+/-) styling */
1932
+ .git-history-layout .diff-prefix {
1933
+ user-select: none;
1934
+ margin-right: 6px;
1935
+ font-weight: 600;
1936
+ opacity: 0.7;
1937
+ }
1938
+
1939
+ /* ============================================================
1940
+ EMPTY STATE - Placeholder and loading states
1941
+ ============================================================ */
1942
+ .empty-state-card {
1943
+ display: flex;
1944
+ flex-direction: column;
1945
+ align-items: center;
1946
+ justify-content: center;
1947
+ padding: 56px 28px;
1948
+ text-align: center;
1949
+ color: var(--color-text-muted);
1950
+ min-height: 320px;
1951
+ animation: fadeInUp 0.5s ease;
1952
+ background: linear-gradient(180deg, transparent 0%, rgba(var(--color-accent-rgb), 0.02) 100%);
1953
+ }
1954
+
1955
+ @keyframes fadeInUp {
1956
+ from {
1957
+ opacity: 0;
1958
+ transform: translateY(12px);
1959
+ }
1960
+ to {
1961
+ opacity: 1;
1962
+ transform: translateY(0);
1963
+ }
1964
+ }
1965
+
1966
+ .empty-state-icon {
1967
+ width: 72px;
1968
+ height: 72px;
1969
+ border-radius: 50%;
1970
+ background: linear-gradient(145deg, var(--color-surface) 0%, var(--color-surface-muted) 100%);
1971
+ display: flex;
1972
+ align-items: center;
1973
+ justify-content: center;
1974
+ font-size: 26px;
1975
+ margin-bottom: 24px;
1976
+ color: var(--color-accent);
1977
+ border: 1px solid var(--color-border);
1978
+ box-shadow: 0 4px 16px rgba(var(--color-accent-rgb), 0.08), inset 0 1px 0 rgba(255,255,255,0.5);
1979
+ animation: iconFloat 4s ease-in-out infinite;
1980
+ position: relative;
1981
+ }
1982
+
1983
+ .empty-state-icon::after {
1984
+ content: '';
1985
+ position: absolute;
1986
+ inset: -4px;
1987
+ border-radius: 50%;
1988
+ border: 2px dashed var(--color-border);
1989
+ opacity: 0.4;
1990
+ animation: iconSpin 20s linear infinite;
1991
+ }
1992
+
1993
+ @keyframes iconSpin {
1994
+ from { transform: rotate(0deg); }
1995
+ to { transform: rotate(360deg); }
1996
+ }
1997
+
1998
+ @keyframes iconFloat {
1999
+ 0%, 100% {
2000
+ transform: translateY(0);
2001
+ }
2002
+ 50% {
2003
+ transform: translateY(-6px);
2004
+ }
2005
+ }
2006
+
2007
+ .empty-state-icon svg {
2008
+ opacity: 0.8;
2009
+ }
2010
+
2011
+ .empty-state-card h2 {
2012
+ margin: 0 0 10px 0;
2013
+ font-size: 18px;
2014
+ font-weight: 600;
2015
+ color: var(--color-text);
2016
+ }
2017
+
2018
+ .empty-state-card p {
2019
+ margin: 0;
2020
+ font-size: 13px;
2021
+ max-width: 300px;
2022
+ line-height: 1.65;
2023
+ opacity: 0.85;
2024
+ }
2025
+
2026
+ /* Keyboard hints */
2027
+ .keyboard-hints {
2028
+ display: flex;
2029
+ flex-wrap: wrap;
2030
+ justify-content: center;
2031
+ gap: 20px;
2032
+ margin-top: 28px;
2033
+ padding-top: 24px;
2034
+ border-top: 1px solid var(--color-border);
2035
+ font-size: 11px;
2036
+ color: var(--color-text-muted);
2037
+ }
2038
+
2039
+ .keyboard-hints .hint {
2040
+ display: flex;
2041
+ align-items: center;
2042
+ gap: 8px;
2043
+ opacity: 0.75;
2044
+ transition: all var(--transition-fast);
2045
+ padding: 6px 10px;
2046
+ border-radius: 6px;
2047
+ }
2048
+
2049
+ .keyboard-hints .hint:hover {
2050
+ opacity: 1;
2051
+ background: var(--color-surface-muted);
2052
+ }
2053
+
2054
+ kbd {
2055
+ display: inline-flex;
2056
+ align-items: center;
2057
+ justify-content: center;
2058
+ min-width: 24px;
2059
+ height: 24px;
2060
+ padding: 0 7px;
2061
+ background: linear-gradient(180deg, var(--color-surface) 0%, var(--color-surface-muted) 100%);
2062
+ border: 1px solid var(--color-border);
2063
+ border-radius: 6px;
2064
+ font-family: "JetBrains Mono", "SF Mono", monospace;
2065
+ font-size: 10px;
2066
+ font-weight: 600;
2067
+ color: var(--color-text);
2068
+ box-shadow: 0 2px 0 var(--color-border), 0 2px 4px rgba(0, 0, 0, 0.06);
2069
+ transition: all var(--transition-fast);
2070
+ }
2071
+
2072
+ kbd:hover {
2073
+ transform: translateY(-2px);
2074
+ box-shadow: 0 4px 0 var(--color-border), 0 4px 8px rgba(0, 0, 0, 0.1);
2075
+ background: linear-gradient(180deg, var(--color-surface) 0%, var(--color-surface) 100%);
2076
+ border-color: var(--color-accent);
2077
+ color: var(--color-accent);
2078
+ }
2079
+
2080
+ /* Add a subtle key press animation */
2081
+ kbd:active {
2082
+ transform: translateY(1px);
2083
+ box-shadow: 0 0 0 var(--color-border);
2084
+ }
2085
+
2086
+ /* Loading state */
2087
+ .commit-item.loading {
2088
+ pointer-events: none;
2089
+ opacity: 0.7;
2090
+ }
2091
+
2092
+ /* Keyboard navigation focus styles */
2093
+ .commit-item:focus {
2094
+ outline: none;
2095
+ border-color: var(--color-accent);
2096
+ box-shadow: 0 0 0 3px rgba(var(--color-accent-rgb), 0.2);
2097
+ background: rgba(var(--color-accent-rgb), 0.04);
2098
+ }
2099
+
2100
+ .commit-item:focus::before {
2101
+ background: var(--color-accent);
2102
+ box-shadow: 0 0 0 4px rgba(var(--color-accent-rgb), 0.15);
2103
+ }
2104
+
2105
+ /* Focus visible for keyboard-only navigation */
2106
+ .commit-item:focus-visible {
2107
+ outline: 2px solid var(--color-accent);
2108
+ outline-offset: 2px;
2109
+ }
2110
+
2111
+ /* Global focus-visible styles for accessibility */
2112
+ .git-history-layout button:focus-visible,
2113
+ .git-history-layout select:focus-visible,
2114
+ .git-history-layout input:focus-visible {
2115
+ outline: 2px solid var(--color-accent);
2116
+ outline-offset: 2px;
2117
+ }
2118
+
2119
+ .git-history-layout .search-input input:focus-visible {
2120
+ outline: none;
2121
+ }
2122
+
2123
+ /* Skip to content pattern */
2124
+ .git-history-layout [tabindex="-1"]:focus {
2125
+ outline: none;
2126
+ }
2127
+
2128
+ /* Animation for loading */
2129
+ @keyframes shimmer {
2130
+ 0% {
2131
+ background-position: -300px 0;
2132
+ }
2133
+ 100% {
2134
+ background-position: 300px 0;
2135
+ }
2136
+ }
2137
+
2138
+ .skeleton {
2139
+ background: linear-gradient(
2140
+ 90deg,
2141
+ var(--color-surface-muted) 0%,
2142
+ rgba(var(--color-accent-rgb), 0.05) 25%,
2143
+ var(--color-surface) 50%,
2144
+ rgba(var(--color-accent-rgb), 0.05) 75%,
2145
+ var(--color-surface-muted) 100%
2146
+ );
2147
+ background-size: 600px 100%;
2148
+ animation: shimmer 1.8s ease-in-out infinite;
2149
+ border-radius: var(--radius-small);
2150
+ }
2151
+
2152
+ /* Loading skeleton pulse effect */
2153
+ .commit-item-skeleton {
2154
+ opacity: 0.7;
2155
+ animation: skeletonPulse 1.5s ease-in-out infinite;
2156
+ }
2157
+
2158
+ @keyframes skeletonPulse {
2159
+ 0%, 100% { opacity: 0.5; }
2160
+ 50% { opacity: 0.8; }
2161
+ }
2162
+
2163
+ /* ============================================================
2164
+ RESPONSIVE DESIGN - Improved breakpoints and mobile layout
2165
+ ============================================================ */
2166
+ @media (max-width: 1100px) {
2167
+ .git-history-body {
2168
+ grid-template-columns: 300px minmax(0, 1fr);
2169
+ gap: 16px;
2170
+ }
2171
+ }
2172
+
2173
+ @media (max-width: 960px) {
2174
+ .git-history-body {
2175
+ grid-template-columns: 1fr;
2176
+ gap: 16px;
2177
+ }
2178
+
2179
+ .commit-list-panel {
2180
+ max-height: 360px;
2181
+ min-height: auto;
2182
+ }
2183
+
2184
+ .commit-detail-panel {
2185
+ min-height: 400px;
2186
+ }
2187
+
2188
+ .commit-diff {
2189
+ padding: 14px;
2190
+ }
2191
+
2192
+ .split-diff-row {
2193
+ grid-template-columns: 1fr;
2194
+ }
2195
+
2196
+ .split-diff-cell:first-child {
2197
+ border-bottom: 1px solid var(--color-border);
2198
+ border-right: none;
2199
+ }
2200
+ }
2201
+
2202
+ @media (max-width: 720px) {
2203
+ .git-history-layout {
2204
+ gap: 14px;
2205
+ }
2206
+
2207
+ .git-history-controls {
2208
+ padding: 14px;
2209
+ gap: 10px;
2210
+ }
2211
+
2212
+ .control-group {
2213
+ min-width: calc(50% - 5px);
2214
+ flex: 1 1 calc(50% - 5px);
2215
+ }
2216
+
2217
+ .search-group {
2218
+ flex: 1 1 100%;
2219
+ order: 3;
2220
+ }
2221
+
2222
+ .view-group {
2223
+ flex: 1 1 100%;
2224
+ order: 4;
2225
+ }
2226
+
2227
+ .control-group label {
2228
+ font-size: 9px;
2229
+ }
2230
+ }
2231
+
2232
+ @media (max-width: 540px) {
2233
+ .git-history-controls {
2234
+ padding: 12px;
2235
+ gap: 8px;
2236
+ }
2237
+
2238
+ .control-group {
2239
+ min-width: 100%;
2240
+ flex: 1 1 100%;
2241
+ }
2242
+
2243
+ .control-group select {
2244
+ padding: 10px 12px;
2245
+ font-size: 14px;
2246
+ }
2247
+
2248
+ .search-input {
2249
+ padding: 10px 12px;
2250
+ }
2251
+
2252
+ .commit-list-header {
2253
+ padding: 12px 14px;
2254
+ flex-wrap: wrap;
2255
+ }
2256
+
2257
+ .commit-list-header h2 {
2258
+ font-size: 12px;
2259
+ }
2260
+
2261
+ .commit-list {
2262
+ padding: 6px 10px 10px 10px;
2263
+ gap: 2px;
2264
+ }
2265
+
2266
+ .commit-item {
2267
+ padding: 12px 12px 12px 26px;
2268
+ }
2269
+
2270
+ .commit-item::before {
2271
+ left: 8px;
2272
+ }
2273
+
2274
+ .commit-item::after {
2275
+ left: 12px;
2276
+ }
2277
+
2278
+ .commit-item:hover {
2279
+ transform: none;
2280
+ }
2281
+
2282
+ .commit-message {
2283
+ font-size: 13px;
2284
+ -webkit-line-clamp: 3;
2285
+ }
2286
+
2287
+ .commit-meta-row {
2288
+ font-size: 11px;
2289
+ gap: 6px;
2290
+ flex-wrap: wrap;
2291
+ }
2292
+
2293
+ .commit-type-indicator {
2294
+ font-size: 8px;
2295
+ padding: 2px 5px;
2296
+ }
2297
+
2298
+ .commit-detail-header {
2299
+ flex-direction: column;
2300
+ align-items: stretch;
2301
+ padding: 14px;
2302
+ gap: 12px;
2303
+ }
2304
+
2305
+ .commit-title h2 {
2306
+ font-size: 15px;
2307
+ line-height: 1.4;
2308
+ }
2309
+
2310
+ .commit-meta {
2311
+ flex-direction: column;
2312
+ align-items: flex-start;
2313
+ gap: 8px;
2314
+ font-size: 11px;
2315
+ }
2316
+
2317
+ .commit-actions {
2318
+ width: 100%;
2319
+ display: grid;
2320
+ grid-template-columns: 1fr 1fr;
2321
+ gap: 8px;
2322
+ }
2323
+
2324
+ .commit-actions button {
2325
+ justify-content: center;
2326
+ padding: 10px 12px;
2327
+ }
2328
+
2329
+ .commit-detail-subheader {
2330
+ padding: 10px 14px;
2331
+ flex-direction: column;
2332
+ align-items: stretch;
2333
+ gap: 10px;
2334
+ }
2335
+
2336
+ .diff-stats {
2337
+ justify-content: flex-start;
2338
+ font-size: 11px;
2339
+ }
2340
+
2341
+ .diff-actions {
2342
+ justify-content: space-between;
2343
+ width: 100%;
2344
+ }
2345
+
2346
+ .diff-actions .file-nav-toggle {
2347
+ flex: 1;
2348
+ justify-content: center;
2349
+ }
2350
+
2351
+ .file-nav-sidebar {
2352
+ width: calc(100vw - 40px);
2353
+ max-width: 320px;
2354
+ right: -14px;
2355
+ }
2356
+
2357
+ .commit-diff {
2358
+ padding: 10px;
2359
+ gap: 10px;
2360
+ }
2361
+
2362
+ .file-diff-header {
2363
+ padding: 10px 12px;
2364
+ }
2365
+
2366
+ .file-status-badge {
2367
+ width: 20px;
2368
+ height: 20px;
2369
+ font-size: 11px;
2370
+ }
2371
+
2372
+ .file-diff-name {
2373
+ font-size: 11px;
2374
+ }
2375
+
2376
+ .file-diff-stat {
2377
+ font-size: 10px;
2378
+ }
2379
+
2380
+ .file-diff-toggle-btn {
2381
+ width: 28px;
2382
+ height: 28px;
2383
+ }
2384
+
2385
+ .split-line-num {
2386
+ min-width: 36px;
2387
+ padding: 3px 5px;
2388
+ font-size: 9px;
2389
+ }
2390
+
2391
+ .split-line-content {
2392
+ padding: 3px 8px;
2393
+ font-size: 10px;
2394
+ }
2395
+
2396
+ .diff-hunk-header {
2397
+ padding: 6px 10px;
2398
+ font-size: 10px;
2399
+ }
2400
+
2401
+ .git-history-layout .diff-line {
2402
+ font-size: 11px;
2403
+ }
2404
+
2405
+ .git-history-layout .diff-line-num {
2406
+ min-width: 40px;
2407
+ font-size: 9px;
2408
+ }
2409
+
2410
+ .git-history-layout .diff-line-content {
2411
+ padding: 3px 8px;
2412
+ }
2413
+
2414
+ .keyboard-hints {
2415
+ display: none;
2416
+ }
2417
+
2418
+ .empty-state-card {
2419
+ padding: 32px 20px;
2420
+ min-height: 220px;
2421
+ }
2422
+
2423
+ .empty-state-icon {
2424
+ width: 52px;
2425
+ height: 52px;
2426
+ }
2427
+
2428
+ .empty-state-card h2 {
2429
+ font-size: 15px;
2430
+ }
2431
+ }
2432
+
2433
+ /* ============================================================
2434
+ SOURCE INDICATOR - Shows when data is from remote provider
2435
+ ============================================================ */
2436
+ .source-indicator {
2437
+ display: inline-flex;
2438
+ align-items: center;
2439
+ gap: 5px;
2440
+ padding: 4px 10px;
2441
+ background: linear-gradient(135deg, rgba(139, 92, 246, 0.15), rgba(99, 102, 241, 0.12));
2442
+ border: 1px solid rgba(139, 92, 246, 0.3);
2443
+ border-radius: 6px;
2444
+ font-size: 11px;
2445
+ font-weight: 500;
2446
+ color: #7c3aed;
2447
+ margin-left: 8px;
2448
+ cursor: help;
2449
+ transition: all var(--transition-fast);
2450
+ }
2451
+
2452
+ .source-indicator:hover {
2453
+ background: linear-gradient(135deg, rgba(139, 92, 246, 0.2), rgba(99, 102, 241, 0.15));
2454
+ border-color: rgba(139, 92, 246, 0.4);
2455
+ box-shadow: 0 2px 8px rgba(139, 92, 246, 0.15);
2456
+ }
2457
+
2458
+ .source-indicator .source-icon {
2459
+ width: 14px;
2460
+ height: 14px;
2461
+ flex-shrink: 0;
2462
+ }
2463
+
2464
+ :root[data-theme="dark"] .source-indicator {
2465
+ background: linear-gradient(135deg, rgba(139, 92, 246, 0.2), rgba(99, 102, 241, 0.15));
2466
+ border-color: rgba(139, 92, 246, 0.35);
2467
+ color: #a78bfa;
2468
+ }
2469
+
2470
+ :root[data-theme="dark"] .source-indicator:hover {
2471
+ background: linear-gradient(135deg, rgba(139, 92, 246, 0.25), rgba(99, 102, 241, 0.2));
2472
+ border-color: rgba(139, 92, 246, 0.5);
2473
+ }
2474
+
2475
+ /* Disabled revert button styling */
2476
+ .commit-actions button:disabled {
2477
+ opacity: 0.5;
2478
+ cursor: not-allowed;
2479
+ pointer-events: auto; /* Allow hover for tooltip */
2480
+ }
2481
+
2482
+ .commit-actions button:disabled:hover {
2483
+ background: var(--color-surface-muted);
2484
+ color: var(--color-text-muted);
2485
+ box-shadow: none;
2486
+ transform: none;
2487
+ }
2488
+
2489
+ /* ============================================================
2490
+ MAXIMIZE/RESTORE DIFF PANEL
2491
+ ============================================================ */
2492
+ .maximize-btn {
2493
+ display: flex;
2494
+ align-items: center;
2495
+ gap: 6px;
2496
+ padding: 6px 12px;
2497
+ font-size: 11px;
2498
+ font-weight: 500;
2499
+ border-radius: 6px;
2500
+ background: var(--color-surface-muted);
2501
+ border: 1px solid var(--color-border);
2502
+ color: var(--color-text-muted);
2503
+ transition: all var(--transition-fast);
2504
+ }
2505
+
2506
+ .maximize-btn:hover {
2507
+ background: var(--color-surface);
2508
+ border-color: var(--color-accent);
2509
+ color: var(--color-accent);
2510
+ box-shadow: 0 2px 8px rgba(var(--color-accent-rgb), 0.12);
2511
+ }
2512
+
2513
+ .maximize-btn .maximize-icon,
2514
+ .maximize-btn .restore-icon {
2515
+ flex-shrink: 0;
2516
+ }
2517
+
2518
+ /* Maximized state */
2519
+ .git-history-body.maximized {
2520
+ position: fixed;
2521
+ inset: 0;
2522
+ z-index: 1000;
2523
+ background: var(--color-background);
2524
+ padding: 0;
2525
+ display: flex;
2526
+ overflow: hidden;
2527
+ }
2528
+
2529
+ .git-history-body.maximized .commit-list-panel {
2530
+ display: none;
2531
+ }
2532
+
2533
+ .git-history-body.maximized .commit-detail-panel {
2534
+ position: relative;
2535
+ width: 100%;
2536
+ height: 100vh;
2537
+ max-height: 100vh;
2538
+ border-radius: 0;
2539
+ border: none;
2540
+ box-shadow: none;
2541
+ display: flex;
2542
+ flex-direction: column;
2543
+ }
2544
+
2545
+ .git-history-body.maximized .commit-detail {
2546
+ display: flex;
2547
+ flex-direction: column;
2548
+ flex: 1;
2549
+ min-height: 0;
2550
+ overflow: hidden;
2551
+ }
2552
+
2553
+ .git-history-body.maximized .commit-diff {
2554
+ flex: 1;
2555
+ min-height: 0;
2556
+ max-height: none;
2557
+ overflow-y: auto;
2558
+ }
2559
+
2560
+ /* In maximized mode, file-diff elements shouldn't shrink */
2561
+ .git-history-body.maximized .file-diff {
2562
+ flex-shrink: 0;
2563
+ }
2564
+
2565
+ /* In maximized mode, file-diff-content expands fully (no max-height constraint) */
2566
+ /* The outer commit-diff container handles scrolling */
2567
+ .git-history-body.maximized .file-diff-content {
2568
+ max-height: none;
2569
+ overflow-y: visible;
2570
+ }
2571
+
2572
+ .git-history-body.maximized .file-diff-content.collapsed {
2573
+ max-height: 0;
2574
+ overflow: hidden;
2575
+ }
2576
+
2577
+ /* Update button appearance when maximized */
2578
+ .git-history-body.maximized .maximize-btn {
2579
+ background: rgba(var(--color-accent-rgb), 0.1);
2580
+ border-color: rgba(var(--color-accent-rgb), 0.3);
2581
+ color: var(--color-accent);
2582
+ }
2583
+
2584
+ .git-history-body.maximized .maximize-btn:hover {
2585
+ background: rgba(var(--color-accent-rgb), 0.15);
2586
+ box-shadow: 0 2px 8px rgba(var(--color-accent-rgb), 0.2);
2587
+ }
2588
+
2589
+ .git-history-body.maximized .maximize-btn .maximize-icon {
2590
+ display: none;
2591
+ }
2592
+
2593
+ .git-history-body.maximized .maximize-btn .restore-icon {
2594
+ display: block;
2595
+ }
2596
+
2597
+ .git-history-body.maximized .maximize-btn .maximize-text {
2598
+ display: none;
2599
+ }
2600
+
2601
+ .git-history-body.maximized .maximize-btn::after {
2602
+ content: 'Restore';
2603
+ }
2604
+
2605
+ /* Hide maximize button text on small screens */
2606
+ @media (max-width: 720px) {
2607
+ .maximize-btn .maximize-text {
2608
+ display: none;
2609
+ }
2610
+
2611
+ .git-history-body.maximized .maximize-btn::after {
2612
+ display: none;
2613
+ }
2614
+ }
2615
+
2616
+ /* Ensure proper stacking when maximized */
2617
+ body:has(.git-history-body.maximized) {
2618
+ overflow: hidden;
2619
+ }
2620
+
2621
+ /* Animation for maximize/restore */
2622
+ .git-history-body {
2623
+ transition: none;
2624
+ }
2625
+
2626
+ .git-history-body.maximized .commit-detail-panel {
2627
+ animation: maximizeIn 0.2s ease-out;
2628
+ }
2629
+
2630
+ @keyframes maximizeIn {
2631
+ from {
2632
+ opacity: 0.8;
2633
+ transform: scale(0.98);
2634
+ }
2635
+ to {
2636
+ opacity: 1;
2637
+ transform: scale(1);
2638
+ }
2639
+ }
2640
+
2641
+ /* Print styles */
2642
+ @media print {
2643
+ .git-history-controls,
2644
+ .commit-actions,
2645
+ .diff-actions,
2646
+ .pagination-controls,
2647
+ .source-indicator {
2648
+ display: none;
2649
+ }
2650
+
2651
+ .commit-list-panel {
2652
+ page-break-after: always;
2653
+ }
2654
+
2655
+ .file-diff-content {
2656
+ max-height: none;
2657
+ }
2658
+
2659
+ .file-diff-content.collapsed {
2660
+ max-height: none;
2661
+ overflow: visible;
2662
+ }
2663
+ }