@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,3942 @@
1
+ /* Environment Management - Modern UI matching index.html */
2
+
3
+ /* ============================================================
4
+ REPOSITORY STATUS (Top Bar)
5
+ ============================================================ */
6
+
7
+ .repo-status-indicator {
8
+ display: flex;
9
+ align-items: center;
10
+ gap: 8px;
11
+ padding: 6px 12px;
12
+ background: var(--color-surface-muted);
13
+ border-radius: var(--radius-medium);
14
+ font-size: 13px;
15
+ color: var(--color-text);
16
+ border: 1px solid var(--color-border);
17
+ }
18
+
19
+ .repo-status-indicator #repo-status-icon {
20
+ font-size: 14px;
21
+ }
22
+
23
+ .repo-status-indicator #repo-status-text {
24
+ font-weight: 500;
25
+ }
26
+
27
+ .repo-branch {
28
+ color: var(--color-text-muted);
29
+ font-size: 12px;
30
+ margin-left: 4px;
31
+ }
32
+
33
+ .repo-branch::before {
34
+ content: '•';
35
+ margin-right: 6px;
36
+ }
37
+
38
+ /* ============================================================
39
+ ENVIRONMENT TABS
40
+ ============================================================ */
41
+
42
+ .env-tabs-container {
43
+ margin-bottom: 8px;
44
+ display: flex;
45
+ align-items: center;
46
+ position: relative;
47
+ gap: 4px;
48
+ }
49
+
50
+ .env-tabs-wrapper {
51
+ flex: 1;
52
+ overflow-x: auto;
53
+ overflow-y: hidden;
54
+ scroll-behavior: smooth;
55
+ scrollbar-width: none; /* Firefox */
56
+ -ms-overflow-style: none; /* IE/Edge */
57
+ position: relative;
58
+ mask-image: linear-gradient(
59
+ to right,
60
+ transparent 0,
61
+ black 0,
62
+ black 100%,
63
+ transparent 100%
64
+ );
65
+ -webkit-mask-image: linear-gradient(
66
+ to right,
67
+ transparent 0,
68
+ black 0,
69
+ black 100%,
70
+ transparent 100%
71
+ );
72
+ transition: mask-image 0.2s ease, -webkit-mask-image 0.2s ease;
73
+ }
74
+
75
+ .env-tabs-wrapper::-webkit-scrollbar {
76
+ display: none; /* Chrome/Safari */
77
+ }
78
+
79
+ /* Fade effect when content overflows on the left */
80
+ .env-tabs-wrapper.fade-left {
81
+ mask-image: linear-gradient(
82
+ to right,
83
+ transparent 0,
84
+ black 24px,
85
+ black 100%,
86
+ transparent 100%
87
+ );
88
+ -webkit-mask-image: linear-gradient(
89
+ to right,
90
+ transparent 0,
91
+ black 24px,
92
+ black 100%,
93
+ transparent 100%
94
+ );
95
+ }
96
+
97
+ /* Fade effect when content overflows on the right */
98
+ .env-tabs-wrapper.fade-right {
99
+ mask-image: linear-gradient(
100
+ to right,
101
+ transparent 0,
102
+ black 0,
103
+ black calc(100% - 24px),
104
+ transparent 100%
105
+ );
106
+ -webkit-mask-image: linear-gradient(
107
+ to right,
108
+ transparent 0,
109
+ black 0,
110
+ black calc(100% - 24px),
111
+ transparent 100%
112
+ );
113
+ }
114
+
115
+ /* Fade effect on both sides */
116
+ .env-tabs-wrapper.fade-left.fade-right {
117
+ mask-image: linear-gradient(
118
+ to right,
119
+ transparent 0,
120
+ black 24px,
121
+ black calc(100% - 24px),
122
+ transparent 100%
123
+ );
124
+ -webkit-mask-image: linear-gradient(
125
+ to right,
126
+ transparent 0,
127
+ black 24px,
128
+ black calc(100% - 24px),
129
+ transparent 100%
130
+ );
131
+ }
132
+
133
+ .env-tabs {
134
+ display: flex;
135
+ gap: 8px;
136
+ min-height: 48px;
137
+ align-items: center;
138
+ padding: 0 4px;
139
+ }
140
+
141
+ /* Scroll buttons */
142
+ .env-tabs-scroll-btn {
143
+ display: none;
144
+ align-items: center;
145
+ justify-content: center;
146
+ width: 36px;
147
+ height: 36px;
148
+ border: 1px solid var(--color-border);
149
+ background: var(--color-surface);
150
+ border-radius: var(--radius-medium);
151
+ color: var(--color-text);
152
+ cursor: pointer;
153
+ transition: all 0.2s ease;
154
+ flex-shrink: 0;
155
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
156
+ }
157
+
158
+ .env-tabs-scroll-btn.visible {
159
+ display: flex;
160
+ }
161
+
162
+ .env-tabs-scroll-btn:hover {
163
+ background: var(--color-accent);
164
+ border-color: var(--color-accent);
165
+ color: white;
166
+ box-shadow: 0 2px 8px rgba(var(--color-accent-rgb, 99, 102, 241), 0.3);
167
+ }
168
+
169
+ .env-tabs-scroll-btn:active {
170
+ transform: scale(0.95);
171
+ }
172
+
173
+ .env-tabs-scroll-btn svg {
174
+ width: 18px;
175
+ height: 18px;
176
+ min-width: 18px;
177
+ min-height: 18px;
178
+ flex-shrink: 0;
179
+ display: block;
180
+ }
181
+
182
+ .env-tab {
183
+ background: none;
184
+ border: none;
185
+ padding: 10px 20px;
186
+ font-size: 14px;
187
+ font-weight: 500;
188
+ color: var(--color-text-muted);
189
+ cursor: pointer;
190
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
191
+ white-space: nowrap;
192
+ position: relative;
193
+ }
194
+
195
+ .env-tab::before {
196
+ content: '';
197
+ position: absolute;
198
+ bottom: 0;
199
+ left: 0;
200
+ right: 0;
201
+ height: 2px;
202
+ background: var(--color-accent);
203
+ transform: scaleX(0);
204
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
205
+ }
206
+
207
+ .env-tab:hover {
208
+ color: var(--color-text);
209
+ }
210
+
211
+ .env-tab:hover::before {
212
+ transform: scaleX(0.5);
213
+ opacity: 0.5;
214
+ }
215
+
216
+ .env-tab.active {
217
+ color: var(--color-accent);
218
+ font-weight: 600;
219
+ }
220
+
221
+ .env-tab.active::before {
222
+ transform: scaleX(1);
223
+ opacity: 1;
224
+ }
225
+
226
+ /* ============================================================
227
+ EMPTY STATE
228
+ ============================================================ */
229
+
230
+ .empty-state-card {
231
+ background: var(--color-surface);
232
+ border-radius: var(--radius-large);
233
+ box-shadow: var(--shadow-card);
234
+ padding: 80px 40px;
235
+ text-align: center;
236
+ }
237
+
238
+ .empty-state-icon {
239
+ font-size: 64px;
240
+ margin-bottom: 20px;
241
+ opacity: 0.5;
242
+ }
243
+
244
+ .empty-state-card h2 {
245
+ font-size: 24px;
246
+ font-weight: 600;
247
+ margin: 0 0 8px 0;
248
+ color: var(--color-text);
249
+ }
250
+
251
+ .empty-state-card p {
252
+ font-size: 15px;
253
+ color: var(--color-text-muted);
254
+ margin: 0;
255
+ }
256
+
257
+ /* ============================================================
258
+ ENVIRONMENT DETAILS
259
+ ============================================================ */
260
+
261
+ .env-details-section {
262
+ display: flex;
263
+ flex-direction: column;
264
+ gap: 20px;
265
+ }
266
+
267
+ /* Status Card */
268
+ /* ============================================================
269
+ ENVIRONMENT HEADER
270
+ ============================================================ */
271
+
272
+ .env-header-card {
273
+ background: var(--color-surface);
274
+ border-radius: var(--radius-large);
275
+ box-shadow: var(--shadow-card);
276
+ padding: 20px 28px;
277
+ margin-bottom: 16px;
278
+ }
279
+
280
+ .env-header-content {
281
+ max-width: 800px;
282
+ }
283
+
284
+ .env-title-row {
285
+ display: flex;
286
+ align-items: center;
287
+ gap: 12px;
288
+ margin-bottom: 8px;
289
+ }
290
+
291
+ .env-title {
292
+ font-size: 28px;
293
+ font-weight: 700;
294
+ margin: 0;
295
+ color: var(--color-text);
296
+ }
297
+
298
+ .env-rename-btn {
299
+ background: none;
300
+ border: none;
301
+ padding: 6px;
302
+ cursor: pointer;
303
+ color: var(--color-text-muted);
304
+ border-radius: var(--radius-small);
305
+ transition: all 0.2s;
306
+ display: flex;
307
+ align-items: center;
308
+ justify-content: center;
309
+ opacity: 0.6;
310
+ }
311
+
312
+ .env-rename-btn:hover {
313
+ color: var(--color-accent);
314
+ background: var(--color-surface-muted);
315
+ opacity: 1;
316
+ }
317
+
318
+ .env-rename-btn svg {
319
+ width: 16px;
320
+ height: 16px;
321
+ }
322
+
323
+ .env-description-display {
324
+ font-size: 15px;
325
+ color: var(--color-text-muted);
326
+ margin: 0;
327
+ line-height: 1.6;
328
+ }
329
+
330
+ /* ============================================================
331
+ CONTENT NAVIGATION
332
+ ============================================================ */
333
+
334
+ .content-nav-container {
335
+ display: flex;
336
+ align-items: center;
337
+ position: relative;
338
+ gap: 4px;
339
+ margin-bottom: 16px;
340
+ }
341
+
342
+ .content-nav {
343
+ display: flex;
344
+ gap: 6px;
345
+ padding: 0;
346
+ flex: 1;
347
+ overflow-x: auto;
348
+ overflow-y: hidden;
349
+ scroll-behavior: smooth;
350
+ scrollbar-width: none;
351
+ -ms-overflow-style: none;
352
+ border-bottom: 1px solid var(--color-border);
353
+ mask-image: linear-gradient(
354
+ to right,
355
+ transparent 0,
356
+ black 0,
357
+ black 100%,
358
+ transparent 100%
359
+ );
360
+ -webkit-mask-image: linear-gradient(
361
+ to right,
362
+ transparent 0,
363
+ black 0,
364
+ black 100%,
365
+ transparent 100%
366
+ );
367
+ transition: mask-image 0.2s ease, -webkit-mask-image 0.2s ease;
368
+ }
369
+
370
+ .content-nav::-webkit-scrollbar {
371
+ display: none;
372
+ }
373
+
374
+ /* Fade effect when content overflows on the left */
375
+ .content-nav.fade-left {
376
+ mask-image: linear-gradient(
377
+ to right,
378
+ transparent 0,
379
+ black 24px,
380
+ black 100%,
381
+ transparent 100%
382
+ );
383
+ -webkit-mask-image: linear-gradient(
384
+ to right,
385
+ transparent 0,
386
+ black 24px,
387
+ black 100%,
388
+ transparent 100%
389
+ );
390
+ }
391
+
392
+ /* Fade effect when content overflows on the right */
393
+ .content-nav.fade-right {
394
+ mask-image: linear-gradient(
395
+ to right,
396
+ transparent 0,
397
+ black 0,
398
+ black calc(100% - 24px),
399
+ transparent 100%
400
+ );
401
+ -webkit-mask-image: linear-gradient(
402
+ to right,
403
+ transparent 0,
404
+ black 0,
405
+ black calc(100% - 24px),
406
+ transparent 100%
407
+ );
408
+ }
409
+
410
+ /* Fade effect on both sides */
411
+ .content-nav.fade-left.fade-right {
412
+ mask-image: linear-gradient(
413
+ to right,
414
+ transparent 0,
415
+ black 24px,
416
+ black calc(100% - 24px),
417
+ transparent 100%
418
+ );
419
+ -webkit-mask-image: linear-gradient(
420
+ to right,
421
+ transparent 0,
422
+ black 24px,
423
+ black calc(100% - 24px),
424
+ transparent 100%
425
+ );
426
+ }
427
+
428
+ /* Content nav scroll buttons */
429
+ .content-nav-scroll-btn {
430
+ display: none;
431
+ align-items: center;
432
+ justify-content: center;
433
+ width: 32px;
434
+ height: 32px;
435
+ border: 1px solid var(--color-border);
436
+ background: var(--color-surface);
437
+ border-radius: var(--radius-medium);
438
+ color: var(--color-text);
439
+ cursor: pointer;
440
+ transition: all 0.2s ease;
441
+ flex-shrink: 0;
442
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
443
+ }
444
+
445
+ .content-nav-scroll-btn.visible {
446
+ display: flex;
447
+ }
448
+
449
+ .content-nav-scroll-btn:hover {
450
+ background: var(--color-accent);
451
+ border-color: var(--color-accent);
452
+ color: white;
453
+ box-shadow: 0 2px 8px rgba(var(--color-accent-rgb, 99, 102, 241), 0.3);
454
+ }
455
+
456
+ .content-nav-scroll-btn:active {
457
+ transform: scale(0.95);
458
+ }
459
+
460
+ .content-nav-scroll-btn svg {
461
+ width: 16px;
462
+ height: 16px;
463
+ min-width: 16px;
464
+ min-height: 16px;
465
+ flex-shrink: 0;
466
+ display: block;
467
+ }
468
+
469
+ .content-tab {
470
+ background: none;
471
+ border: none;
472
+ padding: 12px 12px;
473
+ font-size: 14px;
474
+ font-weight: 500;
475
+ color: var(--color-text-muted);
476
+ cursor: pointer;
477
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
478
+ white-space: nowrap;
479
+ position: relative;
480
+ }
481
+
482
+ .content-tab::after {
483
+ content: '';
484
+ position: absolute;
485
+ bottom: -1px;
486
+ left: 0;
487
+ right: 0;
488
+ height: 3px;
489
+ background: var(--color-accent);
490
+ transform: scaleX(0);
491
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
492
+ }
493
+
494
+ .content-tab:hover {
495
+ color: var(--color-text);
496
+ }
497
+
498
+ .content-tab:hover::after {
499
+ transform: scaleX(0.6);
500
+ opacity: 0.5;
501
+ }
502
+
503
+ .content-tab.active {
504
+ color: var(--color-accent);
505
+ font-weight: 600;
506
+ }
507
+
508
+ .content-tab.active::after {
509
+ transform: scaleX(1);
510
+ opacity: 1;
511
+ }
512
+
513
+ /* ============================================================
514
+ TAB CONTENT
515
+ ============================================================ */
516
+
517
+ .tab-content-wrapper {
518
+ min-height: 400px;
519
+ }
520
+
521
+ .tab-panel {
522
+ display: flex;
523
+ flex-direction: column;
524
+ gap: 20px;
525
+ }
526
+
527
+ /* Content Cards */
528
+ .content-card {
529
+ background: var(--color-surface);
530
+ border-radius: var(--radius-large);
531
+ box-shadow: var(--shadow-card);
532
+ overflow: hidden;
533
+ }
534
+
535
+ .card-header {
536
+ padding: 24px 28px;
537
+ border-bottom: 1px solid var(--color-border);
538
+ display: flex;
539
+ justify-content: space-between;
540
+ align-items: center;
541
+ }
542
+
543
+ .card-header h3,
544
+ .card-header h4 {
545
+ margin: 0;
546
+ font-size: 18px;
547
+ font-weight: 600;
548
+ color: var(--color-text);
549
+ }
550
+
551
+ .card-body {
552
+ padding: 28px;
553
+ }
554
+
555
+ /* Form Elements */
556
+ .form-grid {
557
+ display: grid;
558
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
559
+ gap: 20px;
560
+ }
561
+
562
+ .form-group {
563
+ display: flex;
564
+ flex-direction: column;
565
+ gap: 8px;
566
+ }
567
+
568
+ .form-group label {
569
+ font-size: 13px;
570
+ font-weight: 500;
571
+ color: var(--color-text);
572
+ }
573
+
574
+ /* Single column form layout */
575
+ .form-single-column {
576
+ display: flex;
577
+ flex-direction: column;
578
+ gap: 16px;
579
+ max-width: 800px;
580
+ }
581
+
582
+ .form-row {
583
+ display: grid;
584
+ grid-template-columns: 180px 1fr;
585
+ gap: 16px;
586
+ align-items: center;
587
+ }
588
+
589
+ .form-row label {
590
+ font-size: 13px;
591
+ font-weight: 500;
592
+ color: var(--color-text);
593
+ text-align: left;
594
+ }
595
+
596
+ .form-row .form-input,
597
+ .form-row .form-textarea {
598
+ margin: 0;
599
+ }
600
+
601
+ .form-input,
602
+ .form-textarea {
603
+ width: 100%;
604
+ padding: 10px 14px;
605
+ border: 1px solid var(--color-border);
606
+ border-radius: var(--radius-small);
607
+ font-size: 14px;
608
+ font-family: inherit;
609
+ transition: all 0.2s;
610
+ background: var(--color-surface);
611
+ color: var(--color-text);
612
+ }
613
+
614
+ .form-input:hover,
615
+ .form-textarea:hover {
616
+ border-color: var(--color-accent);
617
+ }
618
+
619
+ .form-input:focus,
620
+ .form-textarea:focus {
621
+ outline: none;
622
+ border-color: var(--color-accent);
623
+ box-shadow: 0 0 0 3px rgba(63, 114, 255, 0.1);
624
+ }
625
+
626
+ .form-textarea {
627
+ resize: vertical;
628
+ min-height: 80px;
629
+ }
630
+
631
+ .code-font {
632
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
633
+ font-size: 13px;
634
+ }
635
+
636
+ .form-hint {
637
+ grid-column: 2;
638
+ font-size: 11px;
639
+ color: var(--color-text-muted);
640
+ margin-top: -8px;
641
+ }
642
+
643
+ .form-hint code {
644
+ background: var(--color-surface-elevated);
645
+ padding: 1px 4px;
646
+ border-radius: 3px;
647
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
648
+ font-size: 10px;
649
+ }
650
+
651
+ /* Toggle Switch */
652
+ .toggle-switch {
653
+ display: inline-flex;
654
+ align-items: center;
655
+ gap: 12px;
656
+ cursor: pointer;
657
+ user-select: none;
658
+ }
659
+
660
+ .toggle-switch input[type="checkbox"] {
661
+ position: absolute;
662
+ opacity: 0;
663
+ width: 0;
664
+ height: 0;
665
+ }
666
+
667
+ .toggle-slider {
668
+ position: relative;
669
+ width: 48px;
670
+ height: 24px;
671
+ background: var(--color-border);
672
+ border-radius: 12px;
673
+ transition: all 0.3s;
674
+ }
675
+
676
+ .toggle-slider::after {
677
+ content: '';
678
+ position: absolute;
679
+ top: 2px;
680
+ left: 2px;
681
+ width: 20px;
682
+ height: 20px;
683
+ background: white;
684
+ border-radius: 50%;
685
+ transition: all 0.3s;
686
+ }
687
+
688
+ .toggle-switch input:checked ~ .toggle-slider {
689
+ background: var(--color-accent);
690
+ }
691
+
692
+ .toggle-switch input:checked ~ .toggle-slider::after {
693
+ transform: translateX(24px);
694
+ }
695
+
696
+ .toggle-label {
697
+ font-size: 14px;
698
+ font-weight: 500;
699
+ color: var(--color-text);
700
+ }
701
+
702
+ /* Stats Grid */
703
+ .stats-grid {
704
+ display: grid;
705
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
706
+ gap: 16px;
707
+ margin-bottom: 20px;
708
+ }
709
+
710
+ .stat-card {
711
+ background: linear-gradient(135deg, var(--color-surface) 0%, var(--color-surface-muted) 100%);
712
+ border-radius: var(--radius-medium);
713
+ padding: 24px;
714
+ display: flex;
715
+ align-items: center;
716
+ gap: 16px;
717
+ border: 1px solid var(--color-border);
718
+ transition: all 0.2s;
719
+ }
720
+
721
+ .stat-card.clickable {
722
+ cursor: pointer;
723
+ }
724
+
725
+ .stat-card.clickable:hover {
726
+ transform: translateY(-2px);
727
+ box-shadow: 0 8px 24px rgba(15, 23, 42, 0.08);
728
+ border-color: var(--color-accent);
729
+ }
730
+
731
+ .stat-icon {
732
+ font-size: 32px;
733
+ opacity: 0.8;
734
+ }
735
+
736
+ .stat-icon-svg svg {
737
+ stroke: #3b82f6;
738
+ }
739
+
740
+ .stat-card:hover .stat-icon-svg svg {
741
+ stroke: #2563eb;
742
+ }
743
+
744
+ .stat-content {
745
+ flex: 1;
746
+ text-align: center;
747
+ }
748
+
749
+ .stat-value {
750
+ font-size: 28px;
751
+ font-weight: 700;
752
+ color: var(--color-text);
753
+ line-height: 1;
754
+ margin-bottom: 4px;
755
+ }
756
+
757
+ .stat-label {
758
+ font-size: 13px;
759
+ color: var(--color-text-muted);
760
+ font-weight: 500;
761
+ }
762
+
763
+ /* Action Buttons */
764
+ .action-buttons {
765
+ display: flex;
766
+ gap: 12px;
767
+ flex-wrap: wrap;
768
+ }
769
+
770
+ /* ============================================================
771
+ LIST CONTAINERS (Repos, Tests, Templates, History)
772
+ ============================================================ */
773
+
774
+ .list-container {
775
+ display: flex;
776
+ flex-direction: column;
777
+ gap: 12px;
778
+ }
779
+
780
+ .list-item {
781
+ background: var(--color-surface-muted);
782
+ border: 1px solid var(--color-border);
783
+ border-radius: var(--radius-medium);
784
+ padding: 20px;
785
+ transition: all 0.2s;
786
+ }
787
+
788
+ .list-item:hover {
789
+ border-color: var(--color-accent);
790
+ box-shadow: 0 4px 12px rgba(15, 23, 42, 0.06);
791
+ }
792
+
793
+ .list-item-header {
794
+ display: flex;
795
+ justify-content: space-between;
796
+ align-items: flex-start;
797
+ margin-bottom: 12px;
798
+ }
799
+
800
+ .list-item-title {
801
+ font-weight: 600;
802
+ font-size: 15px;
803
+ color: var(--color-text);
804
+ display: flex;
805
+ align-items: center;
806
+ gap: 8px;
807
+ }
808
+
809
+ .list-item-actions {
810
+ display: flex;
811
+ gap: 8px;
812
+ }
813
+
814
+ .list-item-meta {
815
+ font-size: 13px;
816
+ color: var(--color-text-muted);
817
+ line-height: 1.6;
818
+ }
819
+
820
+ .list-item-description {
821
+ font-size: 14px;
822
+ color: var(--color-text-muted);
823
+ margin-bottom: 8px;
824
+ }
825
+
826
+ /* Code Elements */
827
+ code {
828
+ background: #f6f8fa;
829
+ padding: 2px 6px;
830
+ border-radius: 3px;
831
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
832
+ font-size: 12px;
833
+ color: #e36209;
834
+ }
835
+
836
+ /* ============================================================
837
+ CODE EDITOR
838
+ ============================================================ */
839
+
840
+ .code-editor {
841
+ width: 100%;
842
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
843
+ font-size: 13px;
844
+ line-height: 1.6;
845
+ padding: 16px;
846
+ border: 1px solid var(--color-border);
847
+ border-radius: var(--radius-medium);
848
+ background: #f6f8fa;
849
+ color: var(--color-text);
850
+ resize: vertical;
851
+ transition: all 0.2s;
852
+ }
853
+
854
+ .code-editor:focus {
855
+ outline: none;
856
+ border-color: var(--color-accent);
857
+ box-shadow: 0 0 0 3px rgba(63, 114, 255, 0.1);
858
+ }
859
+
860
+ .editor-footer {
861
+ margin-top: 8px;
862
+ font-size: 12px;
863
+ color: var(--color-text-muted);
864
+ text-align: right;
865
+ }
866
+
867
+ .markdown-preview-container {
868
+ padding: 20px;
869
+ border: 1px solid var(--color-border);
870
+ border-radius: var(--radius-medium);
871
+ background: var(--color-surface);
872
+ max-height: 600px;
873
+ overflow-y: auto;
874
+ }
875
+
876
+ /* ============================================================
877
+ FILES TAB
878
+ ============================================================ */
879
+
880
+ .files-card {
881
+ padding: 0;
882
+ }
883
+
884
+ .files-layout {
885
+ display: grid;
886
+ grid-template-columns: 200px 1fr;
887
+ min-height: 500px;
888
+ }
889
+
890
+ .files-sidebar {
891
+ background: var(--color-surface-muted);
892
+ border-right: 1px solid var(--color-border);
893
+ padding: 16px 0;
894
+ display: flex;
895
+ flex-direction: column;
896
+ gap: 2px;
897
+ }
898
+
899
+ .file-tab {
900
+ background: none;
901
+ border: none;
902
+ padding: 12px 20px;
903
+ text-align: left;
904
+ font-size: 14px;
905
+ cursor: pointer;
906
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
907
+ display: flex;
908
+ align-items: center;
909
+ gap: 10px;
910
+ color: var(--color-text-muted);
911
+ position: relative;
912
+ }
913
+
914
+ .file-tab::before {
915
+ content: '';
916
+ position: absolute;
917
+ left: 0;
918
+ top: 0;
919
+ bottom: 0;
920
+ width: 3px;
921
+ background: var(--color-accent);
922
+ transform: scaleY(0);
923
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
924
+ }
925
+
926
+ .file-tab:hover {
927
+ color: var(--color-text);
928
+ }
929
+
930
+ .file-tab:hover::before {
931
+ transform: scaleY(0.5);
932
+ opacity: 0.5;
933
+ }
934
+
935
+ .file-tab.active {
936
+ color: var(--color-accent);
937
+ font-weight: 600;
938
+ }
939
+
940
+ .file-tab.active::before {
941
+ transform: scaleY(1);
942
+ opacity: 1;
943
+ }
944
+
945
+ .file-icon {
946
+ font-size: 16px;
947
+ }
948
+
949
+ #new-repo-tab .repo-icon,
950
+ #new-test-tab .test-icon,
951
+ #new-template-tab .template-icon,
952
+ #new-deploy-profile-tab .deploy-add-icon {
953
+ filter: grayscale(1) opacity(0.6);
954
+ }
955
+
956
+ .deploy-add-icon {
957
+ font-size: 16px;
958
+ }
959
+
960
+ .files-content {
961
+ padding: 24px 28px;
962
+ display: flex;
963
+ flex-direction: column;
964
+ gap: 16px;
965
+ }
966
+
967
+ .file-header {
968
+ display: flex;
969
+ justify-content: space-between;
970
+ align-items: center;
971
+ }
972
+
973
+ .file-header h4 {
974
+ margin: 0;
975
+ font-size: 16px;
976
+ font-weight: 600;
977
+ color: var(--color-text);
978
+ }
979
+
980
+ /* ============================================================
981
+ REPOS TAB
982
+ ============================================================ */
983
+
984
+ .repos-card {
985
+ padding: 0;
986
+ }
987
+
988
+ .repos-layout {
989
+ display: grid;
990
+ grid-template-columns: 220px 1fr;
991
+ min-height: 500px;
992
+ }
993
+
994
+ .repos-sidebar {
995
+ background: var(--color-surface-muted);
996
+ border-right: 1px solid var(--color-border);
997
+ padding: 16px 0;
998
+ display: flex;
999
+ flex-direction: column;
1000
+ gap: 2px;
1001
+ }
1002
+
1003
+ .repo-tab {
1004
+ background: none;
1005
+ border: none;
1006
+ padding: 12px 20px;
1007
+ text-align: left;
1008
+ font-size: 14px;
1009
+ cursor: pointer;
1010
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
1011
+ display: flex;
1012
+ align-items: center;
1013
+ gap: 10px;
1014
+ color: var(--color-text-muted);
1015
+ position: relative;
1016
+ }
1017
+
1018
+ .repo-tab::before {
1019
+ content: '';
1020
+ position: absolute;
1021
+ left: 0;
1022
+ top: 0;
1023
+ bottom: 0;
1024
+ width: 3px;
1025
+ background: var(--color-accent);
1026
+ transform: scaleY(0);
1027
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
1028
+ }
1029
+
1030
+ .repo-tab:hover {
1031
+ color: var(--color-text);
1032
+ }
1033
+
1034
+ .repo-tab:hover::before {
1035
+ transform: scaleY(0.5);
1036
+ opacity: 0.5;
1037
+ }
1038
+
1039
+ .repo-tab.active {
1040
+ color: var(--color-accent);
1041
+ font-weight: 600;
1042
+ }
1043
+
1044
+ .repo-tab.active::before {
1045
+ transform: scaleY(1);
1046
+ opacity: 1;
1047
+ }
1048
+
1049
+ .repo-icon {
1050
+ font-size: 16px;
1051
+ }
1052
+
1053
+ .repos-content {
1054
+ padding: 24px 28px;
1055
+ display: flex;
1056
+ flex-direction: column;
1057
+ gap: 16px;
1058
+ }
1059
+
1060
+ .repo-header {
1061
+ display: flex;
1062
+ justify-content: space-between;
1063
+ align-items: center;
1064
+ }
1065
+
1066
+ .repo-header h4 {
1067
+ margin: 0;
1068
+ font-size: 16px;
1069
+ font-weight: 600;
1070
+ color: var(--color-text);
1071
+ }
1072
+
1073
+ .repo-actions {
1074
+ display: flex;
1075
+ gap: 8px;
1076
+ }
1077
+
1078
+ /* ============================================================
1079
+ TESTS TAB
1080
+ ============================================================ */
1081
+
1082
+ .tests-card {
1083
+ padding: 0;
1084
+ }
1085
+
1086
+ .tests-layout {
1087
+ display: grid;
1088
+ grid-template-columns: 220px 1fr;
1089
+ min-height: 500px;
1090
+ }
1091
+
1092
+ .tests-sidebar {
1093
+ background: var(--color-surface-muted);
1094
+ border-right: 1px solid var(--color-border);
1095
+ padding: 16px 0;
1096
+ display: flex;
1097
+ flex-direction: column;
1098
+ gap: 2px;
1099
+ }
1100
+
1101
+ .test-tab {
1102
+ background: none;
1103
+ border: none;
1104
+ padding: 12px 20px;
1105
+ text-align: left;
1106
+ font-size: 14px;
1107
+ cursor: pointer;
1108
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
1109
+ display: flex;
1110
+ align-items: center;
1111
+ gap: 10px;
1112
+ color: var(--color-text-muted);
1113
+ position: relative;
1114
+ }
1115
+
1116
+ .test-tab::before {
1117
+ content: '';
1118
+ position: absolute;
1119
+ left: 0;
1120
+ top: 0;
1121
+ bottom: 0;
1122
+ width: 3px;
1123
+ background: var(--color-accent);
1124
+ transform: scaleY(0);
1125
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
1126
+ }
1127
+
1128
+ .test-tab:hover {
1129
+ color: var(--color-text);
1130
+ }
1131
+
1132
+ .test-tab:hover::before {
1133
+ transform: scaleY(0.5);
1134
+ opacity: 0.5;
1135
+ }
1136
+
1137
+ .test-tab.active {
1138
+ color: var(--color-accent);
1139
+ font-weight: 600;
1140
+ }
1141
+
1142
+ .test-tab.active::before {
1143
+ transform: scaleY(1);
1144
+ opacity: 1;
1145
+ }
1146
+
1147
+ .test-icon {
1148
+ font-size: 16px;
1149
+ }
1150
+
1151
+ .tests-content {
1152
+ padding: 24px 28px;
1153
+ display: flex;
1154
+ flex-direction: column;
1155
+ gap: 16px;
1156
+ }
1157
+
1158
+ .test-header {
1159
+ display: flex;
1160
+ justify-content: space-between;
1161
+ align-items: center;
1162
+ }
1163
+
1164
+ .test-header h4 {
1165
+ margin: 0;
1166
+ font-size: 16px;
1167
+ font-weight: 600;
1168
+ color: var(--color-text);
1169
+ }
1170
+
1171
+ .test-actions {
1172
+ display: flex;
1173
+ gap: 8px;
1174
+ }
1175
+
1176
+ /* ============================================================
1177
+ TEMPLATES TAB
1178
+ ============================================================ */
1179
+
1180
+ .templates-card {
1181
+ padding: 0;
1182
+ }
1183
+
1184
+ .templates-layout {
1185
+ display: grid;
1186
+ grid-template-columns: 220px 1fr;
1187
+ min-height: 500px;
1188
+ }
1189
+
1190
+ .templates-sidebar {
1191
+ background: var(--color-surface-muted);
1192
+ border-right: 1px solid var(--color-border);
1193
+ padding: 16px 0;
1194
+ display: flex;
1195
+ flex-direction: column;
1196
+ gap: 2px;
1197
+ }
1198
+
1199
+ .template-tab {
1200
+ background: none;
1201
+ border: none;
1202
+ padding: 12px 20px;
1203
+ text-align: left;
1204
+ font-size: 14px;
1205
+ cursor: pointer;
1206
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
1207
+ display: flex;
1208
+ align-items: center;
1209
+ gap: 10px;
1210
+ color: var(--color-text-muted);
1211
+ position: relative;
1212
+ }
1213
+
1214
+ .template-tab::before {
1215
+ content: '';
1216
+ position: absolute;
1217
+ left: 0;
1218
+ top: 0;
1219
+ bottom: 0;
1220
+ width: 3px;
1221
+ background: var(--color-accent);
1222
+ transform: scaleY(0);
1223
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
1224
+ }
1225
+
1226
+ .template-tab:hover {
1227
+ color: var(--color-text);
1228
+ }
1229
+
1230
+ .template-tab:hover::before {
1231
+ transform: scaleY(0.5);
1232
+ opacity: 0.5;
1233
+ }
1234
+
1235
+ .template-tab.active {
1236
+ color: var(--color-accent);
1237
+ font-weight: 600;
1238
+ }
1239
+
1240
+ .template-tab.active::before {
1241
+ transform: scaleY(1);
1242
+ opacity: 1;
1243
+ }
1244
+
1245
+ .template-icon {
1246
+ font-size: 16px;
1247
+ }
1248
+
1249
+ .templates-content {
1250
+ padding: 24px 28px;
1251
+ display: flex;
1252
+ flex-direction: column;
1253
+ gap: 16px;
1254
+ }
1255
+
1256
+ .template-header {
1257
+ display: flex;
1258
+ justify-content: space-between;
1259
+ align-items: center;
1260
+ }
1261
+
1262
+ .template-header h4 {
1263
+ margin: 0;
1264
+ font-size: 16px;
1265
+ font-weight: 600;
1266
+ color: var(--color-text);
1267
+ }
1268
+
1269
+ .template-actions {
1270
+ display: flex;
1271
+ gap: 8px;
1272
+ }
1273
+
1274
+ /* ============================================================
1275
+ DEPLOY TAB
1276
+ ============================================================ */
1277
+
1278
+ .deploy-card {
1279
+ padding: 0;
1280
+ }
1281
+
1282
+ .deploy-layout {
1283
+ display: grid;
1284
+ grid-template-columns: 220px 1fr;
1285
+ min-height: 500px;
1286
+ }
1287
+
1288
+ .deploy-sidebar {
1289
+ background: var(--color-surface-muted);
1290
+ border-right: 1px solid var(--color-border);
1291
+ padding: 16px 0;
1292
+ display: flex;
1293
+ flex-direction: column;
1294
+ gap: 2px;
1295
+ }
1296
+
1297
+ .deploy-profile-tab {
1298
+ background: none;
1299
+ border: none;
1300
+ padding: 12px 20px;
1301
+ text-align: left;
1302
+ font-size: 14px;
1303
+ cursor: pointer;
1304
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
1305
+ display: flex;
1306
+ align-items: center;
1307
+ gap: 10px;
1308
+ color: var(--color-text-muted);
1309
+ position: relative;
1310
+ }
1311
+
1312
+ .deploy-profile-tab::before {
1313
+ content: '';
1314
+ position: absolute;
1315
+ left: 0;
1316
+ top: 0;
1317
+ bottom: 0;
1318
+ width: 3px;
1319
+ background: var(--color-accent);
1320
+ transform: scaleY(0);
1321
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
1322
+ }
1323
+
1324
+ .deploy-profile-tab:hover {
1325
+ color: var(--color-text);
1326
+ }
1327
+
1328
+ .deploy-profile-tab:hover::before {
1329
+ transform: scaleY(0.5);
1330
+ opacity: 0.5;
1331
+ }
1332
+
1333
+ .deploy-profile-tab.active {
1334
+ color: var(--color-accent);
1335
+ font-weight: 600;
1336
+ }
1337
+
1338
+ .deploy-profile-tab.active::before {
1339
+ transform: scaleY(1);
1340
+ opacity: 1;
1341
+ }
1342
+
1343
+ .deploy-profile-tab.missing-script {
1344
+ color: var(--color-warning);
1345
+ }
1346
+
1347
+ .deploy-profile-tab.missing-script::after {
1348
+ content: '⚠';
1349
+ margin-left: auto;
1350
+ font-size: 12px;
1351
+ }
1352
+
1353
+ .deploy-profile-icon {
1354
+ width: 16px;
1355
+ height: 16px;
1356
+ stroke: #3b82f6;
1357
+ flex-shrink: 0;
1358
+ }
1359
+
1360
+ .deploy-profile-tab:hover .deploy-profile-icon {
1361
+ stroke: #2563eb;
1362
+ }
1363
+
1364
+ .deploy-profile-tab.active .deploy-profile-icon {
1365
+ stroke: #2563eb;
1366
+ }
1367
+
1368
+ .deploy-content {
1369
+ padding: 24px 28px;
1370
+ display: flex;
1371
+ flex-direction: column;
1372
+ gap: 16px;
1373
+ }
1374
+
1375
+ .deploy-header {
1376
+ display: flex;
1377
+ justify-content: space-between;
1378
+ align-items: center;
1379
+ }
1380
+
1381
+ .deploy-header h4 {
1382
+ margin: 0;
1383
+ font-size: 16px;
1384
+ font-weight: 600;
1385
+ color: var(--color-text);
1386
+ }
1387
+
1388
+ .deploy-actions {
1389
+ display: flex;
1390
+ gap: 8px;
1391
+ }
1392
+
1393
+ .deploy-section {
1394
+ border: 1px solid var(--color-border);
1395
+ border-radius: var(--radius-small);
1396
+ background: var(--color-surface);
1397
+ overflow: hidden;
1398
+ }
1399
+
1400
+ .deploy-section + .deploy-section {
1401
+ margin-top: 16px;
1402
+ }
1403
+
1404
+ .profile-editor .deploy-section + .deploy-section {
1405
+ margin-top: 0;
1406
+ }
1407
+
1408
+ .deploy-section-header {
1409
+ display: flex;
1410
+ justify-content: space-between;
1411
+ align-items: center;
1412
+ gap: 12px;
1413
+ padding: 12px 16px;
1414
+ background: var(--color-surface-muted);
1415
+ border-bottom: 1px solid var(--color-border);
1416
+ }
1417
+
1418
+ .deploy-section-toggle {
1419
+ background: none;
1420
+ border: none;
1421
+ color: var(--color-text);
1422
+ font-size: 14px;
1423
+ font-weight: 600;
1424
+ display: inline-flex;
1425
+ align-items: center;
1426
+ gap: 10px;
1427
+ cursor: pointer;
1428
+ padding: 0;
1429
+ }
1430
+
1431
+ .deploy-section-toggle::after {
1432
+ content: '▾';
1433
+ font-size: 14px;
1434
+ color: var(--color-text-muted);
1435
+ transition: transform 0.2s ease;
1436
+ }
1437
+
1438
+ .deploy-section-toggle[aria-expanded="false"]::after {
1439
+ transform: rotate(-90deg);
1440
+ }
1441
+
1442
+ .deploy-section-title {
1443
+ display: inline-flex;
1444
+ align-items: center;
1445
+ gap: 8px;
1446
+ }
1447
+
1448
+ .deploy-section-count {
1449
+ font-size: 12px;
1450
+ font-weight: 600;
1451
+ padding: 2px 8px;
1452
+ border-radius: 999px;
1453
+ background: var(--color-surface);
1454
+ color: var(--color-text-muted);
1455
+ border: 1px solid var(--color-border);
1456
+ }
1457
+
1458
+ .deploy-section-body {
1459
+ padding: 16px;
1460
+ display: flex;
1461
+ flex-direction: column;
1462
+ gap: 16px;
1463
+ }
1464
+
1465
+ .deploy-profile-info {
1466
+ background: var(--color-surface-muted);
1467
+ border-radius: var(--radius-small);
1468
+ padding: 16px;
1469
+ margin-bottom: 16px;
1470
+ }
1471
+
1472
+ .deploy-profile-info-row {
1473
+ display: flex;
1474
+ gap: 12px;
1475
+ margin-bottom: 8px;
1476
+ }
1477
+
1478
+ .deploy-profile-info-row:last-child {
1479
+ margin-bottom: 0;
1480
+ }
1481
+
1482
+ .deploy-profile-info-label {
1483
+ font-weight: 500;
1484
+ color: var(--color-text-muted);
1485
+ min-width: 100px;
1486
+ }
1487
+
1488
+ .deploy-profile-info-value {
1489
+ color: var(--color-text);
1490
+ }
1491
+
1492
+ .deploy-profile-help {
1493
+ font-size: 12px;
1494
+ color: var(--color-text-muted);
1495
+ margin-top: 8px;
1496
+ padding: 12px;
1497
+ background: var(--color-surface-muted);
1498
+ border-radius: var(--radius-small);
1499
+ border-left: 3px solid var(--color-accent);
1500
+ }
1501
+
1502
+ .deployment-progress {
1503
+ border: 1px solid var(--color-border);
1504
+ border-radius: var(--radius-small);
1505
+ background: var(--color-surface-muted);
1506
+ padding: 16px;
1507
+ }
1508
+
1509
+ .deployment-progress-header {
1510
+ display: flex;
1511
+ justify-content: space-between;
1512
+ align-items: center;
1513
+ margin-bottom: 10px;
1514
+ }
1515
+
1516
+ .deployment-progress-header h4 {
1517
+ margin: 0;
1518
+ font-size: 14px;
1519
+ font-weight: 600;
1520
+ }
1521
+
1522
+ .deployment-progress-status {
1523
+ display: flex;
1524
+ align-items: center;
1525
+ gap: 10px;
1526
+ font-size: 12px;
1527
+ color: var(--color-text-muted);
1528
+ margin-bottom: 12px;
1529
+ }
1530
+
1531
+ .deployment-status-badge {
1532
+ padding: 2px 8px;
1533
+ border-radius: 999px;
1534
+ font-size: 11px;
1535
+ font-weight: 600;
1536
+ text-transform: uppercase;
1537
+ letter-spacing: 0.04em;
1538
+ }
1539
+
1540
+ .deployment-status-badge.running {
1541
+ background: #e8f4ff;
1542
+ color: #0b61a4;
1543
+ }
1544
+
1545
+ .deployment-status-badge.completed {
1546
+ background: #e6f4ea;
1547
+ color: #1a7f37;
1548
+ }
1549
+
1550
+ .deployment-status-badge.failed {
1551
+ background: #fdecea;
1552
+ color: #b42318;
1553
+ }
1554
+
1555
+ .deployment-status-badge.cancelled {
1556
+ background: #f2f2f2;
1557
+ color: #5f6b7a;
1558
+ }
1559
+
1560
+ .deployment-output-container {
1561
+ background: #0f172a;
1562
+ border-radius: var(--radius-small);
1563
+ padding: 12px;
1564
+ max-height: 240px;
1565
+ overflow: auto;
1566
+ border: 1px solid #1e293b;
1567
+ }
1568
+
1569
+ #deployment-output {
1570
+ color: #e2e8f0;
1571
+ font-size: 12px;
1572
+ line-height: 1.4;
1573
+ margin: 0;
1574
+ white-space: pre-wrap;
1575
+ }
1576
+
1577
+ .deploy-history-section .deploy-section-body {
1578
+ padding-top: 0;
1579
+ }
1580
+
1581
+ .deployment-history-item {
1582
+ border: 1px solid var(--color-border);
1583
+ border-radius: var(--radius-small);
1584
+ padding: 12px;
1585
+ background: var(--color-surface);
1586
+ margin-bottom: 10px;
1587
+ }
1588
+
1589
+ .deployment-history-header {
1590
+ display: flex;
1591
+ justify-content: space-between;
1592
+ align-items: center;
1593
+ gap: 12px;
1594
+ }
1595
+
1596
+ .deployment-history-title {
1597
+ font-size: 13px;
1598
+ font-weight: 600;
1599
+ color: var(--color-text);
1600
+ }
1601
+
1602
+ .deployment-history-meta {
1603
+ font-size: 12px;
1604
+ color: var(--color-text-muted);
1605
+ margin-top: 6px;
1606
+ display: flex;
1607
+ gap: 12px;
1608
+ flex-wrap: wrap;
1609
+ }
1610
+
1611
+ .deployment-history-output {
1612
+ background: var(--color-surface-muted);
1613
+ border-radius: var(--radius-small);
1614
+ padding: 10px;
1615
+ margin-top: 10px;
1616
+ font-size: 12px;
1617
+ white-space: pre-wrap;
1618
+ max-height: 180px;
1619
+ overflow: auto;
1620
+ }
1621
+
1622
+ .deployment-param-row {
1623
+ margin-bottom: 12px;
1624
+ }
1625
+
1626
+ .deployment-param-label {
1627
+ display: flex;
1628
+ justify-content: space-between;
1629
+ align-items: baseline;
1630
+ font-size: 13px;
1631
+ font-weight: 600;
1632
+ margin-bottom: 6px;
1633
+ }
1634
+
1635
+ .deployment-param-description {
1636
+ font-size: 12px;
1637
+ color: var(--color-text-muted);
1638
+ margin-top: 4px;
1639
+ }
1640
+
1641
+ .deployment-param-row .param-required {
1642
+ font-size: 11px;
1643
+ color: var(--color-warning, #f59e0b);
1644
+ margin-left: 8px;
1645
+ }
1646
+
1647
+ /* Alerts */
1648
+ .alert {
1649
+ display: flex;
1650
+ gap: 12px;
1651
+ padding: 14px 16px;
1652
+ border-radius: var(--radius-small);
1653
+ font-size: 13px;
1654
+ margin-bottom: 16px;
1655
+ }
1656
+
1657
+ .alert-warning {
1658
+ background: #fff3cd;
1659
+ border: 1px solid #ffc107;
1660
+ color: #856404;
1661
+ }
1662
+
1663
+ .alert-icon {
1664
+ font-size: 20px;
1665
+ flex-shrink: 0;
1666
+ }
1667
+
1668
+ .alert strong {
1669
+ display: block;
1670
+ margin-bottom: 4px;
1671
+ font-weight: 600;
1672
+ }
1673
+
1674
+ .alert p {
1675
+ margin: 0;
1676
+ }
1677
+
1678
+ /* ============================================================
1679
+ SUBSECTIONS
1680
+ ============================================================ */
1681
+
1682
+ .subsection {
1683
+ margin-top: 28px;
1684
+ padding-top: 28px;
1685
+ border-top: 1px solid var(--color-border);
1686
+ }
1687
+
1688
+ .subsection-header {
1689
+ display: flex;
1690
+ justify-content: space-between;
1691
+ align-items: center;
1692
+ margin-bottom: 16px;
1693
+ }
1694
+
1695
+ .subsection-header h4 {
1696
+ margin: 0;
1697
+ font-size: 16px;
1698
+ font-weight: 600;
1699
+ color: var(--color-text);
1700
+ }
1701
+
1702
+ .subsection-actions {
1703
+ display: inline-flex;
1704
+ gap: 8px;
1705
+ align-items: center;
1706
+ }
1707
+
1708
+ .config-list {
1709
+ display: flex;
1710
+ flex-direction: column;
1711
+ gap: 12px;
1712
+ }
1713
+
1714
+ .config-item {
1715
+ display: flex;
1716
+ gap: 12px;
1717
+ align-items: center;
1718
+ padding: 12px;
1719
+ background: var(--color-surface-muted);
1720
+ border-radius: var(--radius-small);
1721
+ border: 1px solid var(--color-border);
1722
+ }
1723
+
1724
+ .config-item input {
1725
+ flex: 1;
1726
+ min-width: 0;
1727
+ }
1728
+
1729
+ .config-item button {
1730
+ flex-shrink: 0;
1731
+ }
1732
+
1733
+ .primary-url-toggle {
1734
+ display: inline-flex;
1735
+ align-items: center;
1736
+ gap: 6px;
1737
+ font-size: 12px;
1738
+ color: var(--color-text-muted);
1739
+ padding: 4px 8px;
1740
+ border-radius: 999px;
1741
+ background: var(--color-bg-secondary);
1742
+ border: 1px solid var(--color-border);
1743
+ flex-shrink: 0;
1744
+ cursor: pointer;
1745
+ }
1746
+
1747
+ .primary-url-toggle input {
1748
+ margin: 0;
1749
+ }
1750
+
1751
+ .primary-url-toggle.is-primary {
1752
+ color: var(--color-text);
1753
+ background: rgba(76, 129, 255, 0.12);
1754
+ border-color: rgba(76, 129, 255, 0.35);
1755
+ }
1756
+
1757
+ /* ============================================================
1758
+ COMMIT MODAL
1759
+ ============================================================ */
1760
+
1761
+ .commit-author {
1762
+ padding: 12px 16px;
1763
+ background: var(--color-surface-muted);
1764
+ border-radius: var(--radius-small);
1765
+ font-size: 13px;
1766
+ color: var(--color-text-muted);
1767
+ margin-bottom: 20px;
1768
+ }
1769
+
1770
+ .commit-author strong {
1771
+ color: var(--color-text);
1772
+ font-weight: 600;
1773
+ }
1774
+
1775
+ .modified-files-list {
1776
+ list-style: none;
1777
+ padding: 0;
1778
+ margin: 0;
1779
+ max-height: 200px;
1780
+ overflow-y: auto;
1781
+ }
1782
+
1783
+ .modified-files-list li {
1784
+ padding: 8px 12px;
1785
+ background: var(--color-surface-muted);
1786
+ border-radius: var(--radius-small);
1787
+ font-size: 13px;
1788
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
1789
+ color: var(--color-text);
1790
+ margin-bottom: 6px;
1791
+ }
1792
+
1793
+ .modified-files-list li::before {
1794
+ content: '●';
1795
+ color: var(--color-warning);
1796
+ margin-right: 8px;
1797
+ }
1798
+
1799
+ .checkbox-group {
1800
+ display: flex;
1801
+ flex-direction: column;
1802
+ gap: 12px;
1803
+ margin-top: 20px;
1804
+ }
1805
+
1806
+ .checkbox-label {
1807
+ display: flex;
1808
+ align-items: center;
1809
+ gap: 10px;
1810
+ cursor: pointer;
1811
+ user-select: none;
1812
+ font-size: 14px;
1813
+ color: var(--color-text);
1814
+ }
1815
+
1816
+ .checkbox-label input[type="checkbox"] {
1817
+ width: 18px;
1818
+ height: 18px;
1819
+ cursor: pointer;
1820
+ }
1821
+
1822
+ /* ============================================================
1823
+ UTILITIES
1824
+ ============================================================ */
1825
+
1826
+ .text-muted {
1827
+ color: var(--color-text-muted);
1828
+ }
1829
+
1830
+ .loading {
1831
+ display: flex;
1832
+ align-items: center;
1833
+ justify-content: center;
1834
+ padding: 60px;
1835
+ color: var(--color-text-muted);
1836
+ font-size: 14px;
1837
+ }
1838
+
1839
+ /* ============================================================
1840
+ RESPONSIVE
1841
+ ============================================================ */
1842
+
1843
+ @media (max-width: 768px) {
1844
+ .status-row {
1845
+ flex-direction: column;
1846
+ gap: 16px;
1847
+ }
1848
+
1849
+ .status-actions {
1850
+ margin-left: 0;
1851
+ width: 100%;
1852
+ }
1853
+
1854
+ .status-actions button {
1855
+ flex: 1;
1856
+ }
1857
+
1858
+ .content-nav {
1859
+ gap: 4px;
1860
+ }
1861
+
1862
+ .content-tab {
1863
+ padding: 10px 16px;
1864
+ font-size: 13px;
1865
+ }
1866
+
1867
+ .form-grid {
1868
+ grid-template-columns: 1fr;
1869
+ }
1870
+
1871
+ .stats-grid {
1872
+ grid-template-columns: 1fr;
1873
+ }
1874
+
1875
+ .files-layout {
1876
+ grid-template-columns: 1fr;
1877
+ }
1878
+
1879
+ .files-sidebar {
1880
+ border-right: none;
1881
+ border-bottom: 1px solid var(--color-border);
1882
+ flex-direction: row;
1883
+ overflow-x: auto;
1884
+ padding: 12px;
1885
+ gap: 4px;
1886
+ }
1887
+
1888
+ .file-tab {
1889
+ white-space: nowrap;
1890
+ }
1891
+
1892
+ .file-tab::before {
1893
+ left: 0;
1894
+ right: 0;
1895
+ top: auto;
1896
+ bottom: 0;
1897
+ width: auto;
1898
+ height: 3px;
1899
+ transform: scaleX(0);
1900
+ }
1901
+
1902
+ .file-tab:hover::before {
1903
+ transform: scaleX(0.5);
1904
+ }
1905
+
1906
+ .file-tab.active::before {
1907
+ transform: scaleX(1);
1908
+ }
1909
+
1910
+ .templates-layout {
1911
+ grid-template-columns: 1fr;
1912
+ }
1913
+
1914
+ .templates-sidebar {
1915
+ border-right: none;
1916
+ border-bottom: 1px solid var(--color-border);
1917
+ flex-direction: row;
1918
+ overflow-x: auto;
1919
+ padding: 12px;
1920
+ gap: 4px;
1921
+ }
1922
+
1923
+ .template-tab {
1924
+ white-space: nowrap;
1925
+ }
1926
+
1927
+ .template-tab::before {
1928
+ left: 0;
1929
+ right: 0;
1930
+ top: auto;
1931
+ bottom: 0;
1932
+ width: auto;
1933
+ height: 3px;
1934
+ transform: scaleX(0);
1935
+ }
1936
+
1937
+ .template-tab:hover::before {
1938
+ transform: scaleX(0.5);
1939
+ }
1940
+
1941
+ .template-tab.active::before {
1942
+ transform: scaleX(1);
1943
+ }
1944
+
1945
+ .repos-layout {
1946
+ grid-template-columns: 1fr;
1947
+ }
1948
+
1949
+ .repos-sidebar {
1950
+ border-right: none;
1951
+ border-bottom: 1px solid var(--color-border);
1952
+ flex-direction: row;
1953
+ overflow-x: auto;
1954
+ padding: 12px;
1955
+ gap: 4px;
1956
+ }
1957
+
1958
+ .repo-tab {
1959
+ white-space: nowrap;
1960
+ }
1961
+
1962
+ .repo-tab::before {
1963
+ left: 0;
1964
+ right: 0;
1965
+ top: auto;
1966
+ bottom: 0;
1967
+ width: auto;
1968
+ height: 3px;
1969
+ transform: scaleX(0);
1970
+ }
1971
+
1972
+ .repo-tab:hover::before {
1973
+ transform: scaleX(0.5);
1974
+ }
1975
+
1976
+ .repo-tab.active::before {
1977
+ transform: scaleX(1);
1978
+ }
1979
+
1980
+ .tests-layout {
1981
+ grid-template-columns: 1fr;
1982
+ }
1983
+
1984
+ .tests-sidebar {
1985
+ border-right: none;
1986
+ border-bottom: 1px solid var(--color-border);
1987
+ flex-direction: row;
1988
+ overflow-x: auto;
1989
+ padding: 12px;
1990
+ gap: 4px;
1991
+ }
1992
+
1993
+ .test-tab {
1994
+ white-space: nowrap;
1995
+ }
1996
+
1997
+ .test-tab::before {
1998
+ left: 0;
1999
+ right: 0;
2000
+ top: auto;
2001
+ bottom: 0;
2002
+ width: auto;
2003
+ height: 3px;
2004
+ transform: scaleX(0);
2005
+ }
2006
+
2007
+ .test-tab:hover::before {
2008
+ transform: scaleX(0.5);
2009
+ }
2010
+
2011
+ .test-tab.active::before {
2012
+ transform: scaleX(1);
2013
+ }
2014
+
2015
+ .deploy-layout {
2016
+ grid-template-columns: 1fr;
2017
+ }
2018
+
2019
+ .deploy-sidebar {
2020
+ border-right: none;
2021
+ border-bottom: 1px solid var(--color-border);
2022
+ flex-direction: row;
2023
+ overflow-x: auto;
2024
+ padding: 12px;
2025
+ gap: 4px;
2026
+ }
2027
+
2028
+ .deploy-profile-tab {
2029
+ white-space: nowrap;
2030
+ }
2031
+
2032
+ .deploy-profile-tab::before {
2033
+ left: 0;
2034
+ right: 0;
2035
+ top: auto;
2036
+ bottom: 0;
2037
+ width: auto;
2038
+ height: 3px;
2039
+ transform: scaleX(0);
2040
+ }
2041
+
2042
+ .deploy-profile-tab:hover::before {
2043
+ transform: scaleX(0.5);
2044
+ }
2045
+
2046
+ .deploy-profile-tab.active::before {
2047
+ transform: scaleX(1);
2048
+ }
2049
+ }
2050
+
2051
+ /* Smooth animations */
2052
+ @keyframes fadeIn {
2053
+ from {
2054
+ opacity: 0;
2055
+ transform: translateY(10px);
2056
+ }
2057
+ to {
2058
+ opacity: 1;
2059
+ transform: translateY(0);
2060
+ }
2061
+ }
2062
+
2063
+ .tab-panel {
2064
+ animation: fadeIn 0.3s ease;
2065
+ }
2066
+
2067
+ /* ============================================================
2068
+ DROPDOWN MENU
2069
+ ============================================================ */
2070
+
2071
+ .dropdown-container {
2072
+ position: relative;
2073
+ display: inline-block;
2074
+ }
2075
+
2076
+ .dropdown-menu {
2077
+ position: absolute;
2078
+ top: calc(100% + 4px);
2079
+ right: 0;
2080
+ min-width: 200px;
2081
+ background: var(--color-surface);
2082
+ border: 1px solid var(--color-border);
2083
+ border-radius: var(--radius-medium);
2084
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
2085
+ z-index: 1000;
2086
+ padding: 4px 0;
2087
+ }
2088
+
2089
+ .dropdown-item {
2090
+ width: 100%;
2091
+ padding: 8px 16px;
2092
+ text-align: left;
2093
+ background: none;
2094
+ border: none;
2095
+ color: var(--color-text);
2096
+ font-size: 13px;
2097
+ cursor: pointer;
2098
+ display: flex;
2099
+ align-items: center;
2100
+ justify-content: flex-start;
2101
+ gap: 8px;
2102
+ transition: background-color 0.15s ease;
2103
+ }
2104
+
2105
+ .dropdown-item:hover:not(:disabled) {
2106
+ background: var(--color-surface-muted);
2107
+ }
2108
+
2109
+ .dropdown-item:disabled {
2110
+ opacity: 0.5;
2111
+ cursor: not-allowed;
2112
+ }
2113
+
2114
+ .dropdown-item span {
2115
+ font-size: 14px;
2116
+ }
2117
+
2118
+ .dropdown-divider {
2119
+ height: 1px;
2120
+ background: var(--color-border);
2121
+ margin: 4px 0;
2122
+ }
2123
+
2124
+ /* ============================================================
2125
+ BUILD SECRETS LIST
2126
+ ============================================================ */
2127
+
2128
+ .build-secrets-list {
2129
+ display: flex;
2130
+ flex-direction: column;
2131
+ gap: 10px;
2132
+ }
2133
+
2134
+ .build-secret-item {
2135
+ display: flex;
2136
+ align-items: center;
2137
+ justify-content: space-between;
2138
+ padding: 14px 16px;
2139
+ background: var(--color-surface-muted);
2140
+ border: 1px solid var(--color-border);
2141
+ border-radius: var(--radius-medium);
2142
+ transition: all 0.2s;
2143
+ }
2144
+
2145
+ .build-secret-item:hover {
2146
+ border-color: var(--color-accent);
2147
+ }
2148
+
2149
+ .build-secret-info {
2150
+ flex: 1;
2151
+ display: flex;
2152
+ flex-direction: column;
2153
+ gap: 4px;
2154
+ min-width: 0;
2155
+ }
2156
+
2157
+ .build-secret-id {
2158
+ font-weight: 600;
2159
+ font-size: 14px;
2160
+ color: var(--color-text);
2161
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
2162
+ }
2163
+
2164
+ .build-secret-path {
2165
+ font-size: 13px;
2166
+ color: var(--color-text-muted);
2167
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
2168
+ word-break: break-all;
2169
+ }
2170
+
2171
+ .build-secret-path-status {
2172
+ display: inline-flex;
2173
+ align-items: center;
2174
+ gap: 4px;
2175
+ font-size: 12px;
2176
+ margin-top: 2px;
2177
+ }
2178
+
2179
+ .build-secret-path-status.warning {
2180
+ color: var(--color-warning);
2181
+ }
2182
+
2183
+ .build-secret-actions {
2184
+ display: flex;
2185
+ gap: 8px;
2186
+ flex-shrink: 0;
2187
+ }
2188
+
2189
+ .path-validation {
2190
+ display: flex;
2191
+ align-items: center;
2192
+ gap: 6px;
2193
+ padding: 8px 12px;
2194
+ margin-top: 8px;
2195
+ border-radius: var(--radius-small);
2196
+ font-size: 13px;
2197
+ }
2198
+
2199
+ .path-validation.exists {
2200
+ background: #d1f7d6;
2201
+ color: #1e7e34;
2202
+ border: 1px solid #b7ebb5;
2203
+ }
2204
+
2205
+ .path-validation.not-exists {
2206
+ background: #fff3cd;
2207
+ color: #856404;
2208
+ border: 1px solid #ffc107;
2209
+ }
2210
+
2211
+ #build-secret-path-status {
2212
+ font-size: 16px;
2213
+ }
2214
+
2215
+ #build-secret-path-message {
2216
+ flex: 1;
2217
+ }
2218
+
2219
+ /* ============================================================
2220
+ BASE IMAGE BUILD HISTORY (Compact)
2221
+ ============================================================ */
2222
+
2223
+ .build-history-compact-list {
2224
+ display: flex;
2225
+ flex-direction: column;
2226
+ gap: 6px;
2227
+ }
2228
+
2229
+ .build-history-row {
2230
+ display: grid;
2231
+ grid-template-columns: 24px 1fr auto auto;
2232
+ align-items: center;
2233
+ gap: 12px;
2234
+ padding: 8px 12px;
2235
+ background: var(--color-surface-muted);
2236
+ border-radius: var(--radius-small);
2237
+ font-size: 13px;
2238
+ }
2239
+
2240
+ .build-history-row.success {
2241
+ border-left: 3px solid var(--color-success, #22c55e);
2242
+ }
2243
+
2244
+ .build-history-row.failed {
2245
+ border-left: 3px solid var(--color-error, #ef4444);
2246
+ }
2247
+
2248
+ .build-history-row .build-status-icon {
2249
+ font-size: 14px;
2250
+ }
2251
+
2252
+ .build-history-row .build-date {
2253
+ color: var(--color-text);
2254
+ }
2255
+
2256
+ .build-history-row .build-duration {
2257
+ color: var(--color-text-muted);
2258
+ font-family: var(--font-mono);
2259
+ font-size: 12px;
2260
+ }
2261
+
2262
+ .build-history-row .build-triggered-by {
2263
+ color: var(--color-text-muted);
2264
+ font-size: 12px;
2265
+ }
2266
+
2267
+ /* Medium modal size for base image build */
2268
+ .modal-content.modal-medium {
2269
+ max-width: 550px;
2270
+ }
2271
+
2272
+ /* Wide modal size for repo modal with provider selection */
2273
+ .modal-content.modal-content-wide {
2274
+ max-width: 600px;
2275
+ }
2276
+
2277
+ /* Form section divider */
2278
+ .form-section-divider {
2279
+ margin-top: 24px;
2280
+ padding-top: 20px;
2281
+ border-top: 1px solid var(--color-border);
2282
+ }
2283
+
2284
+ .form-section-divider h4 {
2285
+ margin: 0 0 4px 0;
2286
+ font-size: 14px;
2287
+ font-weight: 600;
2288
+ color: var(--color-text);
2289
+ }
2290
+
2291
+ .form-section-divider p {
2292
+ margin: 0 0 16px 0;
2293
+ font-size: 13px;
2294
+ }
2295
+
2296
+ /* ============================================================
2297
+ EMAIL SETTINGS
2298
+ ============================================================ */
2299
+
2300
+ .email-test-result {
2301
+ margin-top: 12px;
2302
+ padding: 10px 14px;
2303
+ border-radius: var(--radius-medium);
2304
+ font-size: 13px;
2305
+ background: var(--color-surface-muted);
2306
+ border: 1px solid var(--color-border);
2307
+ }
2308
+
2309
+ .email-test-result.success {
2310
+ background: var(--color-success-bg, rgba(34, 197, 94, 0.1));
2311
+ border-color: var(--color-success, #22c55e);
2312
+ color: var(--color-success, #22c55e);
2313
+ }
2314
+
2315
+ .email-test-result.error {
2316
+ background: var(--color-error-bg, rgba(239, 68, 68, 0.1));
2317
+ border-color: var(--color-error, #ef4444);
2318
+ color: var(--color-error, #ef4444);
2319
+ }
2320
+
2321
+ /* SSO Settings Tabs */
2322
+ .sso-tabs {
2323
+ display: flex;
2324
+ gap: 0;
2325
+ border-bottom: 1px solid var(--color-border);
2326
+ margin-bottom: 20px;
2327
+ }
2328
+
2329
+ .sso-tab {
2330
+ padding: 10px 16px;
2331
+ background: none;
2332
+ border: none;
2333
+ font-size: 13px;
2334
+ font-weight: 500;
2335
+ color: var(--color-text-muted);
2336
+ cursor: pointer;
2337
+ position: relative;
2338
+ transition: color 0.2s ease;
2339
+ }
2340
+
2341
+ .sso-tab::after {
2342
+ content: '';
2343
+ position: absolute;
2344
+ bottom: -1px;
2345
+ left: 0;
2346
+ right: 0;
2347
+ height: 2px;
2348
+ background: var(--color-accent);
2349
+ transform: scaleX(0);
2350
+ transition: transform 0.2s ease;
2351
+ }
2352
+
2353
+ .sso-tab:hover {
2354
+ color: var(--color-text);
2355
+ }
2356
+
2357
+ .sso-tab.active {
2358
+ color: var(--color-accent);
2359
+ font-weight: 600;
2360
+ }
2361
+
2362
+ .sso-tab.active::after {
2363
+ transform: scaleX(1);
2364
+ }
2365
+
2366
+ .sso-tab-content {
2367
+ display: none;
2368
+ }
2369
+
2370
+ .sso-tab-content.active {
2371
+ display: block;
2372
+ }
2373
+
2374
+ /* SSO field description (below form-row) */
2375
+ .sso-field-description {
2376
+ margin: -8px 0 16px 0;
2377
+ padding-left: 196px;
2378
+ font-size: 12px;
2379
+ color: var(--color-text-muted);
2380
+ line-height: 1.4;
2381
+ }
2382
+
2383
+ /* SSO Test Result */
2384
+ .sso-test-result {
2385
+ margin-top: 12px;
2386
+ padding: 10px 14px;
2387
+ border-radius: var(--radius-medium);
2388
+ font-size: 13px;
2389
+ background: var(--color-surface-muted);
2390
+ border: 1px solid var(--color-border);
2391
+ }
2392
+
2393
+ .sso-test-result.success {
2394
+ background: var(--color-success-bg, rgba(34, 197, 94, 0.1));
2395
+ border-color: var(--color-success, #22c55e);
2396
+ color: var(--color-success, #22c55e);
2397
+ }
2398
+
2399
+ .sso-test-result.error {
2400
+ background: var(--color-error-bg, rgba(239, 68, 68, 0.1));
2401
+ border-color: var(--color-error, #ef4444);
2402
+ color: var(--color-error, #ef4444);
2403
+ }
2404
+
2405
+ /* ============================================================
2406
+ SECRETS SECTION (Secrets Tab)
2407
+ ============================================================ */
2408
+
2409
+ .card-header-actions {
2410
+ display: flex;
2411
+ align-items: center;
2412
+ gap: 12px;
2413
+ }
2414
+
2415
+ .card-header-actions .filter-label {
2416
+ font-size: 13px;
2417
+ color: var(--color-text-muted);
2418
+ margin-right: -4px;
2419
+ }
2420
+
2421
+ .secrets-filter-dropdown {
2422
+ padding: 6px 12px;
2423
+ font-size: 13px;
2424
+ border: 1px solid var(--color-border);
2425
+ border-radius: var(--radius-medium);
2426
+ background: var(--color-surface);
2427
+ color: var(--color-text);
2428
+ cursor: pointer;
2429
+ min-width: 90px;
2430
+ }
2431
+
2432
+ .secrets-filter-dropdown:hover {
2433
+ border-color: var(--color-border-hover, var(--color-accent));
2434
+ }
2435
+
2436
+ .secrets-filter-dropdown:focus {
2437
+ outline: none;
2438
+ border-color: var(--color-accent);
2439
+ box-shadow: 0 0 0 2px var(--color-accent-muted, rgba(99, 102, 241, 0.2));
2440
+ }
2441
+
2442
+ .secrets-list {
2443
+ display: flex;
2444
+ flex-direction: column;
2445
+ gap: 8px;
2446
+ }
2447
+
2448
+ .secrets-empty {
2449
+ text-align: center;
2450
+ padding: 24px;
2451
+ color: var(--color-text-muted);
2452
+ }
2453
+
2454
+ .secrets-empty p {
2455
+ margin: 0;
2456
+ }
2457
+
2458
+ .secrets-empty p + p {
2459
+ margin-top: 8px;
2460
+ }
2461
+
2462
+ .secret-item {
2463
+ display: grid;
2464
+ grid-template-columns: 1fr auto auto;
2465
+ gap: 12px;
2466
+ align-items: center;
2467
+ padding: 12px 16px;
2468
+ background: var(--color-surface);
2469
+ border: 1px solid var(--color-border);
2470
+ border-radius: var(--radius-medium);
2471
+ transition: all 0.2s;
2472
+ }
2473
+
2474
+ .secret-item:hover {
2475
+ border-color: var(--color-border-hover, var(--color-accent));
2476
+ background: var(--color-surface-muted);
2477
+ }
2478
+
2479
+ .secret-icon {
2480
+ font-size: 18px;
2481
+ color: var(--color-text-muted);
2482
+ }
2483
+
2484
+ .secret-info {
2485
+ display: flex;
2486
+ flex-direction: column;
2487
+ gap: 2px;
2488
+ min-width: 0;
2489
+ }
2490
+
2491
+ .secret-name {
2492
+ font-family: var(--font-mono);
2493
+ font-size: 14px;
2494
+ font-weight: 600;
2495
+ color: var(--color-text);
2496
+ }
2497
+
2498
+ .secret-meta {
2499
+ font-size: 12px;
2500
+ color: var(--color-text-muted);
2501
+ display: flex;
2502
+ align-items: center;
2503
+ gap: 8px;
2504
+ }
2505
+
2506
+ .secret-type-badge {
2507
+ display: inline-flex;
2508
+ align-items: center;
2509
+ gap: 4px;
2510
+ padding: 2px 8px;
2511
+ background: var(--color-surface-muted);
2512
+ border-radius: var(--radius-small);
2513
+ font-size: 11px;
2514
+ font-weight: 500;
2515
+ text-transform: uppercase;
2516
+ }
2517
+
2518
+ .secret-type-badge.file {
2519
+ color: var(--color-info, #3b82f6);
2520
+ background: rgba(59, 130, 246, 0.1);
2521
+ }
2522
+
2523
+ .secret-type-badge.value {
2524
+ color: var(--color-success, #22c55e);
2525
+ background: rgba(34, 197, 94, 0.1);
2526
+ }
2527
+
2528
+ /* Availability badges for secrets (Build/Deploy) */
2529
+ .secret-availability-badges {
2530
+ display: inline-flex;
2531
+ gap: 4px;
2532
+ }
2533
+
2534
+ .availability-badge {
2535
+ display: inline-flex;
2536
+ align-items: center;
2537
+ padding: 2px 6px;
2538
+ border-radius: var(--radius-small);
2539
+ font-size: 10px;
2540
+ font-weight: 500;
2541
+ text-transform: uppercase;
2542
+ }
2543
+
2544
+ .availability-badge.deploy {
2545
+ color: #1565c0;
2546
+ background: #e3f2fd;
2547
+ }
2548
+
2549
+ .availability-badge.build {
2550
+ color: #e65100;
2551
+ background: #fff3e0;
2552
+ }
2553
+
2554
+ .availability-badge.tasks {
2555
+ color: #2e7d32;
2556
+ background: #e8f5e9;
2557
+ }
2558
+
2559
+ /* Dark mode overrides for availability badges */
2560
+ [data-theme="dark"] .availability-badge.deploy {
2561
+ color: #90caf9;
2562
+ background: rgba(144, 202, 249, 0.15);
2563
+ }
2564
+
2565
+ [data-theme="dark"] .availability-badge.build {
2566
+ color: #ffcc80;
2567
+ background: rgba(255, 204, 128, 0.15);
2568
+ }
2569
+
2570
+ [data-theme="dark"] .availability-badge.tasks {
2571
+ color: #a5d6a7;
2572
+ background: rgba(165, 214, 167, 0.15);
2573
+ }
2574
+
2575
+ /* Secret modal - increase height to fit Git PAT fields without scrollbar */
2576
+ #secret-modal .modal-content {
2577
+ max-height: 95vh;
2578
+ }
2579
+
2580
+ /* Git PAT badge styling */
2581
+ .git-pat-badge {
2582
+ display: inline-flex;
2583
+ align-items: center;
2584
+ padding: 2px 6px;
2585
+ border-radius: var(--radius-small);
2586
+ font-size: 10px;
2587
+ font-weight: 500;
2588
+ color: #6a1b9a;
2589
+ background: #f3e5f5;
2590
+ }
2591
+
2592
+ [data-theme="dark"] .git-pat-badge {
2593
+ color: #ce93d8;
2594
+ background: rgba(206, 147, 216, 0.15);
2595
+ }
2596
+
2597
+ .secret-description {
2598
+ color: var(--color-text-muted);
2599
+ font-size: 12px;
2600
+ white-space: nowrap;
2601
+ overflow: hidden;
2602
+ text-overflow: ellipsis;
2603
+ max-width: 300px;
2604
+ }
2605
+
2606
+ .secret-source {
2607
+ font-family: var(--font-mono);
2608
+ font-size: 11px;
2609
+ color: var(--color-text-muted);
2610
+ background: var(--color-surface);
2611
+ padding: 2px 6px;
2612
+ border-radius: var(--radius-small);
2613
+ max-width: 200px;
2614
+ white-space: nowrap;
2615
+ overflow: hidden;
2616
+ text-overflow: ellipsis;
2617
+ }
2618
+
2619
+ .secret-meta-column {
2620
+ min-width: 0;
2621
+ }
2622
+
2623
+ .secret-actions {
2624
+ display: flex;
2625
+ gap: 4px;
2626
+ }
2627
+
2628
+ .secret-edit,
2629
+ .secret-delete {
2630
+ background: none;
2631
+ border: none;
2632
+ padding: 6px 10px;
2633
+ cursor: pointer;
2634
+ color: var(--color-text-muted);
2635
+ border-radius: var(--radius-small);
2636
+ font-size: 14px;
2637
+ transition: all 0.2s;
2638
+ }
2639
+
2640
+ .secret-edit:hover {
2641
+ color: var(--color-accent);
2642
+ background: var(--color-surface);
2643
+ }
2644
+
2645
+ .secret-delete:hover {
2646
+ color: var(--color-error, #ef4444);
2647
+ background: rgba(239, 68, 68, 0.1);
2648
+ }
2649
+
2650
+ /* Radio group styling */
2651
+ .radio-group {
2652
+ display: flex;
2653
+ gap: 16px;
2654
+ }
2655
+
2656
+ .radio-label {
2657
+ display: flex;
2658
+ align-items: center;
2659
+ gap: 8px;
2660
+ cursor: pointer;
2661
+ font-size: 14px;
2662
+ }
2663
+
2664
+ .radio-label input[type="radio"] {
2665
+ width: 16px;
2666
+ height: 16px;
2667
+ cursor: pointer;
2668
+ }
2669
+
2670
+ /* Field validation styling */
2671
+ .field-validation {
2672
+ margin-top: 6px;
2673
+ padding: 8px 12px;
2674
+ border-radius: var(--radius-small);
2675
+ font-size: 13px;
2676
+ display: flex;
2677
+ align-items: center;
2678
+ gap: 8px;
2679
+ }
2680
+
2681
+ .field-validation.valid {
2682
+ background: rgba(34, 197, 94, 0.1);
2683
+ color: var(--color-success, #22c55e);
2684
+ border: 1px solid rgba(34, 197, 94, 0.3);
2685
+ }
2686
+
2687
+ .field-validation.invalid {
2688
+ background: rgba(239, 68, 68, 0.1);
2689
+ color: var(--color-error, #ef4444);
2690
+ border: 1px solid rgba(239, 68, 68, 0.3);
2691
+ }
2692
+
2693
+ .field-validation.warning {
2694
+ background: rgba(245, 158, 11, 0.1);
2695
+ color: var(--color-warning, #f59e0b);
2696
+ border: 1px solid rgba(245, 158, 11, 0.3);
2697
+ }
2698
+
2699
+ /* Form row actions */
2700
+ .form-row-actions {
2701
+ display: flex;
2702
+ gap: 8px;
2703
+ }
2704
+
2705
+ /* Secret meta text */
2706
+ .secret-meta-text {
2707
+ font-size: 12px;
2708
+ color: var(--color-text-muted);
2709
+ }
2710
+
2711
+ .secret-meta-text.warning {
2712
+ color: var(--color-warning, #f59e0b);
2713
+ }
2714
+
2715
+ /* ============================================================
2716
+ PROFILE EDITOR (Deploy Tab)
2717
+ ============================================================ */
2718
+
2719
+ .profile-editor {
2720
+ display: flex;
2721
+ flex-direction: column;
2722
+ gap: 16px;
2723
+ padding-top: 16px;
2724
+ }
2725
+
2726
+ .profile-section {
2727
+ display: flex;
2728
+ flex-direction: column;
2729
+ gap: 12px;
2730
+ }
2731
+
2732
+ .profile-section .section-header {
2733
+ display: flex;
2734
+ flex-direction: row;
2735
+ align-items: center;
2736
+ gap: 12px;
2737
+ margin-bottom: 0;
2738
+ }
2739
+
2740
+ .profile-section .section-header h5 {
2741
+ margin: 0;
2742
+ font-size: 14px;
2743
+ font-weight: 600;
2744
+ color: var(--color-text);
2745
+ }
2746
+
2747
+ .profile-section .script-filename {
2748
+ font-family: var(--font-mono);
2749
+ font-size: 12px;
2750
+ color: var(--color-text-muted);
2751
+ background: var(--color-surface-muted);
2752
+ padding: 2px 8px;
2753
+ border-radius: var(--radius-small);
2754
+ }
2755
+
2756
+ .profile-section .monaco-editor-container {
2757
+ height: 300px;
2758
+ border: 1px solid var(--color-border);
2759
+ border-radius: var(--radius-medium);
2760
+ overflow: hidden;
2761
+ }
2762
+
2763
+ .profile-section .text-muted.small {
2764
+ font-size: 12px;
2765
+ margin: 0;
2766
+ }
2767
+
2768
+ .profile-list {
2769
+ display: flex;
2770
+ flex-direction: column;
2771
+ gap: 8px;
2772
+ }
2773
+
2774
+ .profile-list-empty {
2775
+ padding: 16px;
2776
+ text-align: center;
2777
+ color: var(--color-text-muted);
2778
+ font-size: 13px;
2779
+ background: var(--color-surface);
2780
+ border: 1px dashed var(--color-border);
2781
+ border-radius: var(--radius-medium);
2782
+ }
2783
+
2784
+ /* Profile secret and parameter items */
2785
+ .profile-secret-item,
2786
+ .profile-param-item {
2787
+ display: grid;
2788
+ grid-template-columns: 1fr 1fr auto;
2789
+ gap: 8px;
2790
+ align-items: center;
2791
+ padding: 10px 12px;
2792
+ background: var(--color-surface);
2793
+ border: 1px solid var(--color-border);
2794
+ border-radius: var(--radius-medium);
2795
+ }
2796
+
2797
+ .profile-secret-item:hover,
2798
+ .profile-param-item:hover {
2799
+ border-color: var(--color-border-hover, var(--color-accent));
2800
+ }
2801
+
2802
+ .profile-item-key {
2803
+ font-family: var(--font-mono);
2804
+ font-size: 13px;
2805
+ font-weight: 500;
2806
+ color: var(--color-text);
2807
+ }
2808
+
2809
+ .profile-item-value {
2810
+ font-family: var(--font-mono);
2811
+ font-size: 13px;
2812
+ color: var(--color-text-muted);
2813
+ white-space: nowrap;
2814
+ overflow: hidden;
2815
+ text-overflow: ellipsis;
2816
+ }
2817
+
2818
+ .profile-item-meta {
2819
+ font-size: 12px;
2820
+ color: var(--color-text-muted);
2821
+ display: flex;
2822
+ align-items: center;
2823
+ gap: 6px;
2824
+ }
2825
+
2826
+ .profile-item-actions {
2827
+ display: flex;
2828
+ gap: 4px;
2829
+ }
2830
+
2831
+ .profile-item-edit,
2832
+ .profile-item-delete {
2833
+ background: none;
2834
+ border: none;
2835
+ padding: 4px 8px;
2836
+ cursor: pointer;
2837
+ color: var(--color-text-muted);
2838
+ border-radius: var(--radius-small);
2839
+ font-size: 13px;
2840
+ transition: all 0.2s;
2841
+ }
2842
+
2843
+ .profile-item-edit:hover {
2844
+ color: var(--color-accent);
2845
+ background: var(--color-surface-muted);
2846
+ }
2847
+
2848
+ .profile-item-delete:hover {
2849
+ color: var(--color-error, #ef4444);
2850
+ background: rgba(239, 68, 68, 0.1);
2851
+ }
2852
+
2853
+ /* Profile secret items specific */
2854
+ .profile-secret-item {
2855
+ grid-template-columns: auto 1fr auto auto;
2856
+ }
2857
+
2858
+ .profile-secret-item .secret-expose-type {
2859
+ display: inline-flex;
2860
+ align-items: center;
2861
+ gap: 4px;
2862
+ padding: 2px 6px;
2863
+ font-size: 10px;
2864
+ font-weight: 500;
2865
+ text-transform: uppercase;
2866
+ border-radius: var(--radius-small);
2867
+ }
2868
+
2869
+ .profile-secret-item .secret-expose-type.env_var {
2870
+ color: var(--color-success, #22c55e);
2871
+ background: rgba(34, 197, 94, 0.1);
2872
+ }
2873
+
2874
+ .profile-secret-item .secret-expose-type.file {
2875
+ color: var(--color-info, #3b82f6);
2876
+ background: rgba(59, 130, 246, 0.1);
2877
+ }
2878
+
2879
+ /* Profile param items specific */
2880
+ .profile-param-item {
2881
+ grid-template-columns: auto 1fr auto auto auto;
2882
+ }
2883
+
2884
+ .profile-param-item .param-type-badge {
2885
+ display: inline-flex;
2886
+ align-items: center;
2887
+ padding: 2px 6px;
2888
+ font-size: 10px;
2889
+ font-weight: 500;
2890
+ text-transform: uppercase;
2891
+ border-radius: var(--radius-small);
2892
+ color: var(--color-text-muted);
2893
+ background: var(--color-surface-muted);
2894
+ }
2895
+
2896
+ .profile-param-item .param-required {
2897
+ font-size: 11px;
2898
+ color: var(--color-warning, #f59e0b);
2899
+ }
2900
+
2901
+ /* Validation warnings in profile */
2902
+ .profile-validation-warning {
2903
+ display: flex;
2904
+ align-items: center;
2905
+ gap: 8px;
2906
+ padding: 10px 14px;
2907
+ background: rgba(245, 158, 11, 0.1);
2908
+ border: 1px solid rgba(245, 158, 11, 0.3);
2909
+ border-radius: var(--radius-medium);
2910
+ color: var(--color-warning, #f59e0b);
2911
+ font-size: 13px;
2912
+ }
2913
+
2914
+ .profile-validation-warning .warning-icon {
2915
+ font-size: 16px;
2916
+ }
2917
+
2918
+ /* Profile secret warning state (secret not found in environment) */
2919
+ .profile-secret-item.warning {
2920
+ border-color: var(--color-warning, #f59e0b);
2921
+ background: rgba(245, 158, 11, 0.05);
2922
+ }
2923
+
2924
+ /* ============================================================
2925
+ Parameter Options Editor (for list type parameters)
2926
+ ============================================================ */
2927
+ .options-editor {
2928
+ width: 100%;
2929
+ }
2930
+
2931
+ .options-list {
2932
+ display: flex;
2933
+ flex-direction: column;
2934
+ gap: 12px;
2935
+ margin-bottom: 12px;
2936
+ }
2937
+
2938
+ .options-empty {
2939
+ padding: 16px;
2940
+ text-align: center;
2941
+ background: var(--color-surface-muted);
2942
+ border-radius: var(--radius-small);
2943
+ font-size: 13px;
2944
+ }
2945
+
2946
+ .option-item {
2947
+ display: flex;
2948
+ flex-direction: column;
2949
+ gap: 8px;
2950
+ padding: 12px;
2951
+ background: var(--color-surface-muted);
2952
+ border-radius: var(--radius-small);
2953
+ border: 1px solid var(--color-border);
2954
+ }
2955
+
2956
+ .option-row {
2957
+ display: flex;
2958
+ gap: 8px;
2959
+ align-items: center;
2960
+ }
2961
+
2962
+ .option-row .option-value-input {
2963
+ flex: 1;
2964
+ min-width: 120px;
2965
+ }
2966
+
2967
+ .option-row .option-label-input {
2968
+ flex: 1;
2969
+ min-width: 120px;
2970
+ }
2971
+
2972
+ .option-item .option-desc-input {
2973
+ width: 100%;
2974
+ font-size: 12px;
2975
+ }
2976
+
2977
+ /* Danger icon button for removing options */
2978
+ .btn-icon {
2979
+ display: inline-flex;
2980
+ align-items: center;
2981
+ justify-content: center;
2982
+ width: 32px;
2983
+ height: 32px;
2984
+ padding: 0;
2985
+ border: none;
2986
+ border-radius: var(--radius-small);
2987
+ background: transparent;
2988
+ cursor: pointer;
2989
+ transition: all 0.15s ease;
2990
+ }
2991
+
2992
+ .btn-icon:hover {
2993
+ background: var(--color-surface-muted);
2994
+ }
2995
+
2996
+ .btn-icon[disabled] {
2997
+ opacity: 0.4;
2998
+ cursor: not-allowed;
2999
+ background: transparent;
3000
+ }
3001
+
3002
+ .btn-danger-icon {
3003
+ color: var(--color-text-muted);
3004
+ }
3005
+
3006
+ .btn-danger-icon:hover {
3007
+ color: var(--color-error, #ef4444);
3008
+ background: rgba(239, 68, 68, 0.1);
3009
+ }
3010
+
3011
+ /* Medium modal size for parameter modal */
3012
+ .modal-content.modal-medium {
3013
+ max-width: 600px;
3014
+ }
3015
+
3016
+ /* ============================================================
3017
+ SKILLS (OVERVIEW + MODAL)
3018
+ ============================================================ */
3019
+
3020
+ .skills-chip-grid {
3021
+ display: flex;
3022
+ flex-wrap: wrap;
3023
+ gap: 10px;
3024
+ margin-top: 0;
3025
+ }
3026
+
3027
+ .skills-chip-grid-inline {
3028
+ flex: 1 1 auto;
3029
+ flex-wrap: wrap;
3030
+ padding-bottom: 2px;
3031
+ }
3032
+
3033
+ .skills-chip-grid-inline.skills-chip-grid-empty {
3034
+ flex-wrap: wrap;
3035
+ overflow-x: visible;
3036
+ }
3037
+
3038
+ .skills-form-controls {
3039
+ display: flex;
3040
+ flex-direction: column;
3041
+ gap: 6px;
3042
+ }
3043
+
3044
+ .skills-form-row {
3045
+ display: flex;
3046
+ flex-wrap: wrap;
3047
+ align-items: center;
3048
+ gap: 10px;
3049
+ }
3050
+
3051
+ .skills-empty {
3052
+ color: var(--color-text-muted);
3053
+ font-size: 12px;
3054
+ white-space: nowrap;
3055
+ margin-right: auto;
3056
+ }
3057
+
3058
+ .skills-add-btn {
3059
+ display: inline-flex;
3060
+ align-items: center;
3061
+ justify-content: center;
3062
+ width: 30px;
3063
+ height: 30px;
3064
+ border-radius: 10px;
3065
+ border: 1px solid var(--color-border);
3066
+ background: var(--color-surface-muted);
3067
+ color: var(--color-text);
3068
+ cursor: pointer;
3069
+ transition: all 0.2s ease;
3070
+ flex: 0 0 auto;
3071
+ }
3072
+
3073
+ .skills-add-btn svg {
3074
+ display: block;
3075
+ width: 16px;
3076
+ height: 16px;
3077
+ min-width: 16px;
3078
+ flex-shrink: 0;
3079
+ stroke: currentColor;
3080
+ }
3081
+
3082
+ .skills-add-btn:hover {
3083
+ border-color: var(--color-accent);
3084
+ color: var(--color-accent);
3085
+ background: rgba(0, 0, 0, 0.03);
3086
+ }
3087
+
3088
+ .skill-chip {
3089
+ display: inline-flex;
3090
+ align-items: center;
3091
+ gap: 8px;
3092
+ padding: 6px 10px;
3093
+ border-radius: 999px;
3094
+ background: var(--color-surface-muted);
3095
+ border: 1px solid var(--color-border);
3096
+ font-size: 12px;
3097
+ color: var(--color-text);
3098
+ }
3099
+
3100
+ .skill-chip-name {
3101
+ font-weight: 600;
3102
+ }
3103
+
3104
+ .skill-chip-id {
3105
+ color: var(--color-text-muted);
3106
+ font-size: 11px;
3107
+ }
3108
+
3109
+ .skill-chip-remove {
3110
+ border: none;
3111
+ background: transparent;
3112
+ color: var(--color-text-muted);
3113
+ cursor: pointer;
3114
+ font-size: 14px;
3115
+ line-height: 1;
3116
+ padding: 2px 4px;
3117
+ border-radius: 999px;
3118
+ }
3119
+
3120
+ .skill-chip-remove:hover {
3121
+ color: var(--color-accent);
3122
+ background: rgba(0, 0, 0, 0.05);
3123
+ }
3124
+
3125
+ .skills-modal-layout {
3126
+ display: grid;
3127
+ grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
3128
+ gap: 20px;
3129
+ margin-top: 16px;
3130
+ }
3131
+
3132
+ .skills-modal-panel {
3133
+ background: var(--color-surface);
3134
+ border: 1px solid var(--color-border);
3135
+ border-radius: var(--radius-medium);
3136
+ padding: 16px;
3137
+ display: flex;
3138
+ flex-direction: column;
3139
+ min-height: 320px;
3140
+ }
3141
+
3142
+ .skills-modal-search {
3143
+ display: flex;
3144
+ flex-direction: column;
3145
+ gap: 8px;
3146
+ margin-bottom: 12px;
3147
+ }
3148
+
3149
+ .skills-modal-search-input {
3150
+ position: relative;
3151
+ display: flex;
3152
+ align-items: center;
3153
+ }
3154
+
3155
+ .skills-modal-search-icon {
3156
+ position: absolute;
3157
+ left: 10px;
3158
+ color: var(--color-text-muted);
3159
+ }
3160
+
3161
+ .skills-modal-search-input input {
3162
+ padding-left: 32px;
3163
+ }
3164
+
3165
+ .skills-modal-search-clear {
3166
+ position: absolute;
3167
+ right: 8px;
3168
+ background: transparent;
3169
+ border: none;
3170
+ font-size: 16px;
3171
+ color: var(--color-text-muted);
3172
+ cursor: pointer;
3173
+ }
3174
+
3175
+ .skills-modal-search-meta {
3176
+ font-size: 12px;
3177
+ color: var(--color-text-muted);
3178
+ }
3179
+
3180
+ .skills-modal-loading {
3181
+ display: flex;
3182
+ align-items: center;
3183
+ gap: 8px;
3184
+ padding: 16px;
3185
+ color: var(--color-text-muted);
3186
+ font-size: 13px;
3187
+ }
3188
+
3189
+ .skills-modal-list {
3190
+ display: flex;
3191
+ flex-direction: column;
3192
+ gap: 8px;
3193
+ overflow-y: auto;
3194
+ padding-right: 4px;
3195
+ }
3196
+
3197
+ .skills-modal-item {
3198
+ border: 1px solid var(--color-border);
3199
+ border-radius: var(--radius-medium);
3200
+ padding: 10px 12px;
3201
+ background: var(--color-surface-muted);
3202
+ transition: border-color 0.2s ease, background 0.2s ease;
3203
+ }
3204
+
3205
+ .skills-modal-item.selected {
3206
+ border-color: var(--color-accent);
3207
+ background: rgba(0, 0, 0, 0.04);
3208
+ }
3209
+
3210
+ .skills-modal-item label {
3211
+ display: grid;
3212
+ grid-template-columns: auto 1fr;
3213
+ gap: 10px;
3214
+ align-items: start;
3215
+ cursor: pointer;
3216
+ }
3217
+
3218
+ .skills-modal-item input[type="checkbox"] {
3219
+ margin-top: 2px;
3220
+ }
3221
+
3222
+ .skills-modal-item-name {
3223
+ font-weight: 600;
3224
+ font-size: 14px;
3225
+ color: var(--color-text);
3226
+ }
3227
+
3228
+ .skills-modal-item-id {
3229
+ font-size: 11px;
3230
+ color: var(--color-text-muted);
3231
+ margin-left: 6px;
3232
+ }
3233
+
3234
+ .skills-modal-item-desc {
3235
+ display: block;
3236
+ font-size: 12px;
3237
+ color: var(--color-text-muted);
3238
+ margin-top: 4px;
3239
+ }
3240
+
3241
+ .skills-modal-selected-header {
3242
+ display: flex;
3243
+ align-items: center;
3244
+ justify-content: space-between;
3245
+ margin-bottom: 12px;
3246
+ }
3247
+
3248
+ .skills-modal-selected-count {
3249
+ font-size: 12px;
3250
+ padding: 4px 8px;
3251
+ border-radius: 999px;
3252
+ background: var(--color-surface-muted);
3253
+ border: 1px solid var(--color-border);
3254
+ color: var(--color-text-muted);
3255
+ }
3256
+
3257
+ .skills-modal-selected-list {
3258
+ display: flex;
3259
+ flex-wrap: wrap;
3260
+ gap: 8px;
3261
+ }
3262
+
3263
+ .skills-modal-selected .skill-chip {
3264
+ background: var(--color-surface-muted);
3265
+ }
3266
+
3267
+ .skills-modal-manage-link {
3268
+ display: inline-flex;
3269
+ align-items: center;
3270
+ gap: 6px;
3271
+ margin-right: auto;
3272
+ color: var(--color-text-muted);
3273
+ font-size: 13px;
3274
+ text-decoration: none;
3275
+ transition: color 0.15s ease;
3276
+ }
3277
+
3278
+ .skills-modal-manage-link:hover {
3279
+ color: var(--color-primary);
3280
+ }
3281
+
3282
+ .skills-modal-manage-link svg {
3283
+ opacity: 0.7;
3284
+ }
3285
+
3286
+ .skills-modal-manage-link:hover svg {
3287
+ opacity: 1;
3288
+ }
3289
+
3290
+ @media (max-width: 960px) {
3291
+ .skills-modal-layout {
3292
+ grid-template-columns: 1fr;
3293
+ }
3294
+ }
3295
+
3296
+ /* ============================================================
3297
+ Settings List (for Git Providers Settings modal)
3298
+ ============================================================ */
3299
+
3300
+ .settings-list {
3301
+ display: flex;
3302
+ flex-direction: column;
3303
+ gap: 8px;
3304
+ }
3305
+
3306
+ .settings-list-item {
3307
+ display: flex;
3308
+ align-items: center;
3309
+ justify-content: space-between;
3310
+ padding: 12px 16px;
3311
+ background: var(--color-surface-secondary);
3312
+ border: 1px solid var(--color-border);
3313
+ border-radius: var(--radius-small);
3314
+ }
3315
+
3316
+ .settings-list-info {
3317
+ display: flex;
3318
+ flex-direction: column;
3319
+ gap: 4px;
3320
+ }
3321
+
3322
+ .settings-list-name {
3323
+ font-weight: 500;
3324
+ font-family: var(--font-family-mono);
3325
+ color: var(--color-text-primary);
3326
+ }
3327
+
3328
+ .settings-list-meta {
3329
+ display: flex;
3330
+ align-items: center;
3331
+ gap: 8px;
3332
+ font-size: 12px;
3333
+ color: var(--color-text-muted);
3334
+ }
3335
+
3336
+ .settings-list-badge {
3337
+ display: inline-flex;
3338
+ align-items: center;
3339
+ padding: 2px 8px;
3340
+ background: var(--color-surface-muted);
3341
+ border-radius: 9999px;
3342
+ font-size: 11px;
3343
+ font-weight: 500;
3344
+ text-transform: uppercase;
3345
+ }
3346
+
3347
+ .settings-list-detail {
3348
+ color: var(--color-text-muted);
3349
+ }
3350
+
3351
+ .settings-list-actions {
3352
+ display: flex;
3353
+ align-items: center;
3354
+ gap: 8px;
3355
+ }
3356
+
3357
+ .list-header {
3358
+ display: flex;
3359
+ justify-content: flex-end;
3360
+ margin-bottom: 16px;
3361
+ }
3362
+
3363
+ /* Token Expiry Settings */
3364
+ .token-expiry-controls {
3365
+ display: flex;
3366
+ align-items: center;
3367
+ gap: 8px;
3368
+ }
3369
+
3370
+ .token-expiry-suffix {
3371
+ font-size: 14px;
3372
+ color: var(--color-text-muted);
3373
+ }
3374
+
3375
+ /* Providers Section Header */
3376
+ .providers-section-header {
3377
+ display: flex;
3378
+ align-items: center;
3379
+ justify-content: space-between;
3380
+ margin-top: 20px;
3381
+ padding-top: 16px;
3382
+ margin-bottom: 16px;
3383
+ border-top: 1px solid var(--color-border);
3384
+ }
3385
+
3386
+ .providers-section-header h4 {
3387
+ margin: 0;
3388
+ font-size: 14px;
3389
+ font-weight: 600;
3390
+ color: var(--color-text);
3391
+ }
3392
+
3393
+ /* ============================================================
3394
+ Repository Access (Environment Tab)
3395
+ ============================================================ */
3396
+
3397
+ .section-description {
3398
+ margin-bottom: 20px;
3399
+ color: var(--color-text-muted);
3400
+ }
3401
+
3402
+ .repo-checkbox-list {
3403
+ display: flex;
3404
+ flex-direction: column;
3405
+ gap: 8px;
3406
+ max-height: 400px;
3407
+ overflow-y: auto;
3408
+ padding: 8px;
3409
+ background: var(--color-surface-secondary);
3410
+ border: 1px solid var(--color-border);
3411
+ border-radius: var(--radius-small);
3412
+ }
3413
+
3414
+ .repo-checkbox-item {
3415
+ display: flex;
3416
+ flex-direction: column;
3417
+ padding: 8px 12px;
3418
+ background: var(--color-surface);
3419
+ border: 1px solid var(--color-border);
3420
+ border-radius: var(--radius-small);
3421
+ cursor: pointer;
3422
+ transition: all 0.15s ease;
3423
+ }
3424
+
3425
+ .repo-checkbox-item:hover {
3426
+ background: var(--color-surface-muted);
3427
+ }
3428
+
3429
+ .repo-checkbox-item input[type="checkbox"] {
3430
+ margin-right: 8px;
3431
+ }
3432
+
3433
+ .repo-checkbox-name {
3434
+ font-family: var(--font-family-mono);
3435
+ font-weight: 500;
3436
+ }
3437
+
3438
+ .repo-checkbox-desc {
3439
+ font-size: 12px;
3440
+ color: var(--color-text-muted);
3441
+ margin-left: 24px;
3442
+ margin-top: 4px;
3443
+ }
3444
+
3445
+ .spinner-small {
3446
+ width: 16px;
3447
+ height: 16px;
3448
+ border: 2px solid var(--color-border);
3449
+ border-top-color: var(--color-primary);
3450
+ border-radius: 50%;
3451
+ animation: spin 0.8s linear infinite;
3452
+ }
3453
+
3454
+ .form-section {
3455
+ display: flex;
3456
+ flex-direction: column;
3457
+ gap: 20px;
3458
+ }
3459
+
3460
+ .form-actions {
3461
+ display: flex;
3462
+ justify-content: flex-start;
3463
+ padding-top: 16px;
3464
+ border-top: 1px solid var(--color-border);
3465
+ margin-top: 8px;
3466
+ }
3467
+
3468
+ /* Modal description text */
3469
+ .modal-description {
3470
+ margin-bottom: 20px;
3471
+ color: var(--color-text-muted);
3472
+ line-height: 1.5;
3473
+ }
3474
+
3475
+ /* ============================================================
3476
+ BUILD TAB - DOCKER CONFIGURATION
3477
+ ============================================================ */
3478
+
3479
+ .docker-config-section {
3480
+ background: var(--color-surface-muted);
3481
+ border-radius: var(--radius-medium);
3482
+ padding: 20px;
3483
+ }
3484
+
3485
+ .input-with-hint {
3486
+ display: flex;
3487
+ flex-direction: column;
3488
+ gap: 4px;
3489
+ }
3490
+
3491
+ .empty-list-message {
3492
+ padding: 24px;
3493
+ text-align: center;
3494
+ background: var(--color-surface-muted);
3495
+ border-radius: var(--radius-medium);
3496
+ border: 1px dashed var(--color-border);
3497
+ }
3498
+
3499
+ .empty-list-message p {
3500
+ margin: 0;
3501
+ }
3502
+
3503
+ /* Custom Build Commands List */
3504
+ #docker-commands-list .command-item {
3505
+ display: flex;
3506
+ align-items: flex-start;
3507
+ gap: 12px;
3508
+ padding: 12px 16px;
3509
+ background: var(--color-surface);
3510
+ border: 1px solid var(--color-border);
3511
+ border-radius: var(--radius-medium);
3512
+ margin-bottom: 8px;
3513
+ }
3514
+
3515
+ #docker-commands-list .command-item:last-child {
3516
+ margin-bottom: 0;
3517
+ }
3518
+
3519
+ .command-order {
3520
+ display: flex;
3521
+ flex-direction: column;
3522
+ gap: 4px;
3523
+ padding-top: 8px;
3524
+ }
3525
+
3526
+ .command-order button {
3527
+ background: none;
3528
+ border: none;
3529
+ padding: 2px;
3530
+ cursor: pointer;
3531
+ color: var(--color-text-muted);
3532
+ border-radius: var(--radius-small);
3533
+ transition: all 0.2s;
3534
+ }
3535
+
3536
+ .command-order button:hover {
3537
+ color: var(--color-text);
3538
+ background: var(--color-surface-muted);
3539
+ }
3540
+
3541
+ .command-order button:disabled {
3542
+ opacity: 0.3;
3543
+ cursor: not-allowed;
3544
+ }
3545
+
3546
+ .command-content {
3547
+ flex: 1;
3548
+ display: flex;
3549
+ flex-direction: column;
3550
+ gap: 8px;
3551
+ }
3552
+
3553
+ .command-content input,
3554
+ .command-content select {
3555
+ font-size: 13px;
3556
+ }
3557
+
3558
+ .command-timing {
3559
+ display: flex;
3560
+ align-items: center;
3561
+ gap: 8px;
3562
+ font-size: 12px;
3563
+ color: var(--color-text-muted);
3564
+ }
3565
+
3566
+ .command-timing select {
3567
+ padding: 4px 8px;
3568
+ font-size: 12px;
3569
+ background: var(--color-surface-muted);
3570
+ border: 1px solid var(--color-border);
3571
+ border-radius: var(--radius-small);
3572
+ color: var(--color-text);
3573
+ }
3574
+
3575
+ .command-actions {
3576
+ display: flex;
3577
+ align-items: flex-start;
3578
+ padding-top: 6px;
3579
+ }
3580
+
3581
+ .command-actions button {
3582
+ background: none;
3583
+ border: none;
3584
+ padding: 6px;
3585
+ cursor: pointer;
3586
+ color: var(--color-text-muted);
3587
+ border-radius: var(--radius-small);
3588
+ transition: all 0.2s;
3589
+ }
3590
+
3591
+ .command-actions button:hover {
3592
+ color: var(--color-danger);
3593
+ background: var(--color-danger-bg, rgba(239, 68, 68, 0.1));
3594
+ }
3595
+
3596
+ /* ============================================================
3597
+ COLLAPSIBLE SECTIONS
3598
+ ============================================================ */
3599
+
3600
+ .collapsible-card {
3601
+ overflow: hidden;
3602
+ }
3603
+
3604
+ .collapsible-header {
3605
+ cursor: pointer;
3606
+ user-select: none;
3607
+ transition: background 0.2s;
3608
+ }
3609
+
3610
+ .collapsible-header:hover {
3611
+ background: var(--color-surface-muted);
3612
+ }
3613
+
3614
+ .collapsible-title {
3615
+ display: flex;
3616
+ align-items: center;
3617
+ gap: 8px;
3618
+ }
3619
+
3620
+ .collapsible-title h3 {
3621
+ margin: 0;
3622
+ }
3623
+
3624
+ .collapse-icon {
3625
+ transition: transform 0.25s ease;
3626
+ }
3627
+
3628
+ .collapsible-card.expanded .collapse-icon {
3629
+ transform: rotate(180deg);
3630
+ }
3631
+
3632
+ .collapsible-body {
3633
+ border-top: 1px solid var(--color-border);
3634
+ padding-top: 20px;
3635
+ }
3636
+
3637
+ .badge {
3638
+ display: inline-flex;
3639
+ align-items: center;
3640
+ padding: 2px 8px;
3641
+ font-size: 11px;
3642
+ font-weight: 500;
3643
+ border-radius: 9999px;
3644
+ text-transform: uppercase;
3645
+ letter-spacing: 0.02em;
3646
+ }
3647
+
3648
+ .badge-muted {
3649
+ background: var(--color-surface-muted);
3650
+ color: var(--color-text-muted);
3651
+ border: 1px solid var(--color-border);
3652
+ }
3653
+
3654
+ /* ============================================================
3655
+ SCRIPTS TABS (setup.sh / cleanup.sh)
3656
+ ============================================================ */
3657
+
3658
+ .scripts-tabs-container {
3659
+ margin-bottom: 16px;
3660
+ }
3661
+
3662
+ .scripts-tabs {
3663
+ display: flex;
3664
+ gap: 0;
3665
+ border-bottom: 1px solid var(--color-border);
3666
+ margin-bottom: 12px;
3667
+ }
3668
+
3669
+ .script-tab {
3670
+ display: flex;
3671
+ align-items: center;
3672
+ gap: 6px;
3673
+ padding: 10px 12px;
3674
+ background: none;
3675
+ border: none;
3676
+ font-size: 13px;
3677
+ font-weight: 500;
3678
+ color: var(--color-text-muted);
3679
+ cursor: pointer;
3680
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
3681
+ position: relative;
3682
+ }
3683
+
3684
+ .script-tab::after {
3685
+ content: '';
3686
+ position: absolute;
3687
+ bottom: -1px;
3688
+ left: 0;
3689
+ right: 0;
3690
+ height: 2px;
3691
+ background: var(--color-accent);
3692
+ transform: scaleX(0);
3693
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
3694
+ }
3695
+
3696
+ .script-tab:hover {
3697
+ color: var(--color-text);
3698
+ }
3699
+
3700
+ .script-tab:hover::after {
3701
+ transform: scaleX(0.6);
3702
+ opacity: 0.5;
3703
+ }
3704
+
3705
+ .script-tab.active {
3706
+ color: var(--color-accent);
3707
+ font-weight: 600;
3708
+ }
3709
+
3710
+ .script-tab.active::after {
3711
+ transform: scaleX(1);
3712
+ opacity: 1;
3713
+ }
3714
+
3715
+ .script-tab svg {
3716
+ opacity: 0.7;
3717
+ }
3718
+
3719
+ .script-tab.active svg {
3720
+ opacity: 1;
3721
+ }
3722
+
3723
+ .script-description {
3724
+ font-size: 13px;
3725
+ color: var(--color-text-muted);
3726
+ margin-bottom: 12px;
3727
+ padding: 8px 12px;
3728
+ background: var(--color-surface-muted);
3729
+ border-radius: var(--radius-small);
3730
+ border-left: 3px solid var(--color-accent);
3731
+ }
3732
+
3733
+ /* ============================================================
3734
+ DOCKERFILE PREVIEW MODAL
3735
+ ============================================================ */
3736
+
3737
+ #dockerfile-preview-content {
3738
+ position: relative;
3739
+ }
3740
+
3741
+ #dockerfile-preview-text {
3742
+ counter-reset: line;
3743
+ }
3744
+
3745
+ #dockerfile-preview-text .line {
3746
+ display: block;
3747
+ }
3748
+
3749
+ #dockerfile-preview-text .line::before {
3750
+ counter-increment: line;
3751
+ content: counter(line);
3752
+ display: inline-block;
3753
+ width: 2em;
3754
+ margin-right: 1em;
3755
+ text-align: right;
3756
+ color: var(--color-text-muted);
3757
+ opacity: 0.5;
3758
+ }
3759
+
3760
+ /* Syntax highlighting for Dockerfile */
3761
+ .dockerfile-keyword {
3762
+ color: var(--color-accent);
3763
+ font-weight: 600;
3764
+ }
3765
+
3766
+ .dockerfile-comment {
3767
+ color: var(--color-text-muted);
3768
+ font-style: italic;
3769
+ }
3770
+
3771
+ .dockerfile-string {
3772
+ color: var(--color-success, #10b981);
3773
+ }
3774
+
3775
+ /* ============================================================
3776
+ RESPONSIVE ADJUSTMENTS FOR BUILD TAB
3777
+ ============================================================ */
3778
+
3779
+ @media (max-width: 768px) {
3780
+ .scripts-tabs {
3781
+ overflow-x: auto;
3782
+ }
3783
+
3784
+ .script-tab {
3785
+ white-space: nowrap;
3786
+ }
3787
+
3788
+ .command-item {
3789
+ flex-direction: column;
3790
+ }
3791
+
3792
+ .command-order {
3793
+ flex-direction: row;
3794
+ padding-top: 0;
3795
+ }
3796
+ }
3797
+
3798
+ /* ============================================================
3799
+ GITHUB APP SETUP WIZARD
3800
+ ============================================================ */
3801
+
3802
+ .wizard-step {
3803
+ animation: fadeIn 0.2s ease-in-out;
3804
+ }
3805
+
3806
+ @keyframes fadeIn {
3807
+ from { opacity: 0; }
3808
+ to { opacity: 1; }
3809
+ }
3810
+
3811
+ .wizard-action-panel {
3812
+ display: flex;
3813
+ flex-direction: column;
3814
+ align-items: center;
3815
+ padding: 32px 24px;
3816
+ background: var(--color-surface-muted);
3817
+ border-radius: var(--radius-medium);
3818
+ margin: 16px 0;
3819
+ }
3820
+
3821
+ .wizard-action-panel .btn-large {
3822
+ padding: 12px 32px;
3823
+ font-size: 15px;
3824
+ }
3825
+
3826
+ .wizard-hint {
3827
+ margin-top: 12px;
3828
+ font-size: 13px;
3829
+ }
3830
+
3831
+ .wizard-success-banner {
3832
+ display: flex;
3833
+ align-items: flex-start;
3834
+ gap: 12px;
3835
+ padding: 16px;
3836
+ background: color-mix(in srgb, var(--color-success) 10%, transparent);
3837
+ border: 1px solid color-mix(in srgb, var(--color-success) 30%, transparent);
3838
+ border-radius: var(--radius-medium);
3839
+ margin-bottom: 16px;
3840
+ }
3841
+
3842
+ .wizard-success-banner .success-icon {
3843
+ display: flex;
3844
+ align-items: center;
3845
+ justify-content: center;
3846
+ width: 24px;
3847
+ height: 24px;
3848
+ background: var(--color-success);
3849
+ color: white;
3850
+ border-radius: 50%;
3851
+ font-size: 14px;
3852
+ font-weight: bold;
3853
+ flex-shrink: 0;
3854
+ }
3855
+
3856
+ .wizard-success-banner strong {
3857
+ display: block;
3858
+ margin-bottom: 4px;
3859
+ }
3860
+
3861
+ .wizard-success-banner p {
3862
+ margin: 0;
3863
+ font-size: 13px;
3864
+ color: var(--color-text-muted);
3865
+ }
3866
+
3867
+ /* Provider Type Selection */
3868
+ .provider-type-options {
3869
+ display: flex;
3870
+ flex-direction: column;
3871
+ gap: 12px;
3872
+ margin-top: 16px;
3873
+ }
3874
+
3875
+ .provider-type-option {
3876
+ display: flex;
3877
+ align-items: center;
3878
+ gap: 16px;
3879
+ padding: 16px 20px;
3880
+ background: var(--color-surface);
3881
+ border: 1px solid var(--color-border);
3882
+ border-radius: var(--radius-medium);
3883
+ cursor: pointer;
3884
+ transition: all 0.15s ease;
3885
+ text-align: left;
3886
+ width: 100%;
3887
+ }
3888
+
3889
+ .provider-type-option:hover {
3890
+ background: var(--color-surface-muted);
3891
+ border-color: var(--color-border-strong);
3892
+ }
3893
+
3894
+ .provider-type-option:active {
3895
+ transform: scale(0.98);
3896
+ }
3897
+
3898
+ .provider-type-icon {
3899
+ display: flex;
3900
+ align-items: center;
3901
+ justify-content: center;
3902
+ width: 40px;
3903
+ height: 40px;
3904
+ background: var(--color-surface-muted);
3905
+ border-radius: var(--radius-medium);
3906
+ color: var(--color-text);
3907
+ }
3908
+
3909
+ .provider-type-icon svg {
3910
+ width: 24px;
3911
+ height: 24px;
3912
+ }
3913
+
3914
+ .provider-type-info {
3915
+ display: flex;
3916
+ flex-direction: column;
3917
+ gap: 2px;
3918
+ }
3919
+
3920
+ .provider-type-info strong {
3921
+ font-size: 14px;
3922
+ color: var(--color-text);
3923
+ }
3924
+
3925
+ .provider-type-desc {
3926
+ font-size: 12px;
3927
+ color: var(--color-text-muted);
3928
+ }
3929
+
3930
+ /* Form section */
3931
+ .form-section {
3932
+ margin-top: 20px;
3933
+ padding-top: 16px;
3934
+ border-top: 1px solid var(--color-border);
3935
+ }
3936
+
3937
+ .form-section-title {
3938
+ margin: 0 0 8px 0;
3939
+ font-size: 13px;
3940
+ font-weight: 600;
3941
+ color: var(--color-text);
3942
+ }