@assistkick/create 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/bin/create.d.ts +2 -0
  2. package/dist/bin/create.js +25 -0
  3. package/dist/bin/create.js.map +1 -0
  4. package/dist/src/scaffolder.d.ts +22 -0
  5. package/dist/src/scaffolder.js +120 -0
  6. package/dist/src/scaffolder.js.map +1 -0
  7. package/package.json +24 -0
  8. package/templates/product-system/.env.example +8 -0
  9. package/templates/product-system/CLAUDE.md +45 -0
  10. package/templates/product-system/package.json +32 -0
  11. package/templates/product-system/packages/backend/package.json +37 -0
  12. package/templates/product-system/packages/backend/src/middleware/auth_middleware.test.ts +86 -0
  13. package/templates/product-system/packages/backend/src/middleware/auth_middleware.ts +35 -0
  14. package/templates/product-system/packages/backend/src/routes/auth.ts +463 -0
  15. package/templates/product-system/packages/backend/src/routes/coherence.ts +187 -0
  16. package/templates/product-system/packages/backend/src/routes/graph.ts +67 -0
  17. package/templates/product-system/packages/backend/src/routes/kanban.ts +201 -0
  18. package/templates/product-system/packages/backend/src/routes/pipeline.ts +41 -0
  19. package/templates/product-system/packages/backend/src/routes/projects.ts +122 -0
  20. package/templates/product-system/packages/backend/src/routes/users.ts +97 -0
  21. package/templates/product-system/packages/backend/src/server.ts +159 -0
  22. package/templates/product-system/packages/backend/src/services/auth_service.test.ts +115 -0
  23. package/templates/product-system/packages/backend/src/services/auth_service.ts +82 -0
  24. package/templates/product-system/packages/backend/src/services/coherence-review.ts +339 -0
  25. package/templates/product-system/packages/backend/src/services/email_service.ts +75 -0
  26. package/templates/product-system/packages/backend/src/services/init.ts +80 -0
  27. package/templates/product-system/packages/backend/src/services/invitation_service.test.ts +235 -0
  28. package/templates/product-system/packages/backend/src/services/invitation_service.ts +193 -0
  29. package/templates/product-system/packages/backend/src/services/password_reset_service.test.ts +151 -0
  30. package/templates/product-system/packages/backend/src/services/password_reset_service.ts +135 -0
  31. package/templates/product-system/packages/backend/src/services/project_service.test.ts +215 -0
  32. package/templates/product-system/packages/backend/src/services/project_service.ts +171 -0
  33. package/templates/product-system/packages/backend/src/services/pty_session_manager.test.ts +88 -0
  34. package/templates/product-system/packages/backend/src/services/pty_session_manager.ts +279 -0
  35. package/templates/product-system/packages/backend/src/services/terminal_ws_handler.ts +133 -0
  36. package/templates/product-system/packages/backend/src/services/user_management_service.test.ts +158 -0
  37. package/templates/product-system/packages/backend/src/services/user_management_service.ts +128 -0
  38. package/templates/product-system/packages/backend/tsconfig.json +22 -0
  39. package/templates/product-system/packages/frontend/index.html +13 -0
  40. package/templates/product-system/packages/frontend/package-lock.json +2666 -0
  41. package/templates/product-system/packages/frontend/package.json +30 -0
  42. package/templates/product-system/packages/frontend/public/favicon.svg +16 -0
  43. package/templates/product-system/packages/frontend/src/App.tsx +29 -0
  44. package/templates/product-system/packages/frontend/src/api/client.ts +386 -0
  45. package/templates/product-system/packages/frontend/src/api/client_projects.test.ts +104 -0
  46. package/templates/product-system/packages/frontend/src/api/client_refresh.test.ts +145 -0
  47. package/templates/product-system/packages/frontend/src/components/CoherenceView.tsx +414 -0
  48. package/templates/product-system/packages/frontend/src/components/GraphLegend.tsx +124 -0
  49. package/templates/product-system/packages/frontend/src/components/GraphSettings.tsx +112 -0
  50. package/templates/product-system/packages/frontend/src/components/GraphView.tsx +370 -0
  51. package/templates/product-system/packages/frontend/src/components/InviteUserDialog.tsx +85 -0
  52. package/templates/product-system/packages/frontend/src/components/KanbanView.tsx +470 -0
  53. package/templates/product-system/packages/frontend/src/components/LoginPage.tsx +116 -0
  54. package/templates/product-system/packages/frontend/src/components/ProjectSelector.tsx +187 -0
  55. package/templates/product-system/packages/frontend/src/components/QaIssueSheet.tsx +192 -0
  56. package/templates/product-system/packages/frontend/src/components/SidePanel.tsx +231 -0
  57. package/templates/product-system/packages/frontend/src/components/TerminalView.tsx +200 -0
  58. package/templates/product-system/packages/frontend/src/components/Toolbar.tsx +84 -0
  59. package/templates/product-system/packages/frontend/src/components/UsersView.tsx +249 -0
  60. package/templates/product-system/packages/frontend/src/constants/graph.ts +191 -0
  61. package/templates/product-system/packages/frontend/src/hooks/useAuth.tsx +54 -0
  62. package/templates/product-system/packages/frontend/src/hooks/useGraph.ts +27 -0
  63. package/templates/product-system/packages/frontend/src/hooks/useKanban.ts +21 -0
  64. package/templates/product-system/packages/frontend/src/hooks/useProjects.ts +86 -0
  65. package/templates/product-system/packages/frontend/src/hooks/useTheme.ts +26 -0
  66. package/templates/product-system/packages/frontend/src/hooks/useToast.tsx +62 -0
  67. package/templates/product-system/packages/frontend/src/hooks/use_projects_logic.test.ts +61 -0
  68. package/templates/product-system/packages/frontend/src/main.tsx +12 -0
  69. package/templates/product-system/packages/frontend/src/pages/accept_invitation_page.tsx +167 -0
  70. package/templates/product-system/packages/frontend/src/pages/forgot_password_page.tsx +100 -0
  71. package/templates/product-system/packages/frontend/src/pages/register_page.tsx +137 -0
  72. package/templates/product-system/packages/frontend/src/pages/reset_password_page.tsx +146 -0
  73. package/templates/product-system/packages/frontend/src/routes/ProtectedRoute.tsx +12 -0
  74. package/templates/product-system/packages/frontend/src/routes/accept_invitation.tsx +14 -0
  75. package/templates/product-system/packages/frontend/src/routes/dashboard.tsx +221 -0
  76. package/templates/product-system/packages/frontend/src/routes/forgot_password.tsx +13 -0
  77. package/templates/product-system/packages/frontend/src/routes/login.tsx +14 -0
  78. package/templates/product-system/packages/frontend/src/routes/register.tsx +14 -0
  79. package/templates/product-system/packages/frontend/src/routes/reset_password.tsx +13 -0
  80. package/templates/product-system/packages/frontend/src/styles/index.css +3358 -0
  81. package/templates/product-system/packages/frontend/src/utils/auth_validation.test.ts +51 -0
  82. package/templates/product-system/packages/frontend/src/utils/auth_validation.ts +19 -0
  83. package/templates/product-system/packages/frontend/src/utils/login_validation.test.ts +61 -0
  84. package/templates/product-system/packages/frontend/src/utils/login_validation.ts +24 -0
  85. package/templates/product-system/packages/frontend/src/utils/logout.test.ts +63 -0
  86. package/templates/product-system/packages/frontend/src/utils/node_sizing.test.ts +62 -0
  87. package/templates/product-system/packages/frontend/src/utils/node_sizing.ts +24 -0
  88. package/templates/product-system/packages/frontend/src/utils/task_status.test.ts +53 -0
  89. package/templates/product-system/packages/frontend/src/utils/task_status.ts +14 -0
  90. package/templates/product-system/packages/frontend/tsconfig.json +21 -0
  91. package/templates/product-system/packages/frontend/vite.config.ts +20 -0
  92. package/templates/product-system/packages/shared/.env.example +3 -0
  93. package/templates/product-system/packages/shared/README.md +1 -0
  94. package/templates/product-system/packages/shared/db/migrate.ts +32 -0
  95. package/templates/product-system/packages/shared/db/migrations/0000_dashing_gorgon.sql +128 -0
  96. package/templates/product-system/packages/shared/db/migrations/meta/0000_snapshot.json +819 -0
  97. package/templates/product-system/packages/shared/db/migrations/meta/_journal.json +13 -0
  98. package/templates/product-system/packages/shared/db/schema.ts +137 -0
  99. package/templates/product-system/packages/shared/drizzle.config.js +14 -0
  100. package/templates/product-system/packages/shared/lib/claude-service.ts +215 -0
  101. package/templates/product-system/packages/shared/lib/coherence.ts +278 -0
  102. package/templates/product-system/packages/shared/lib/completeness.ts +30 -0
  103. package/templates/product-system/packages/shared/lib/constants.ts +327 -0
  104. package/templates/product-system/packages/shared/lib/db.ts +81 -0
  105. package/templates/product-system/packages/shared/lib/git_workflow.ts +110 -0
  106. package/templates/product-system/packages/shared/lib/graph.ts +186 -0
  107. package/templates/product-system/packages/shared/lib/kanban.ts +161 -0
  108. package/templates/product-system/packages/shared/lib/markdown.ts +205 -0
  109. package/templates/product-system/packages/shared/lib/pipeline-state-store.ts +124 -0
  110. package/templates/product-system/packages/shared/lib/pipeline.ts +489 -0
  111. package/templates/product-system/packages/shared/lib/prompt_builder.ts +170 -0
  112. package/templates/product-system/packages/shared/lib/relevance_search.ts +159 -0
  113. package/templates/product-system/packages/shared/lib/session.ts +152 -0
  114. package/templates/product-system/packages/shared/lib/validator.ts +117 -0
  115. package/templates/product-system/packages/shared/lib/work_summary_parser.ts +130 -0
  116. package/templates/product-system/packages/shared/package.json +30 -0
  117. package/templates/product-system/packages/shared/scripts/assign-project.ts +52 -0
  118. package/templates/product-system/packages/shared/tools/add_edge.ts +61 -0
  119. package/templates/product-system/packages/shared/tools/add_node.ts +101 -0
  120. package/templates/product-system/packages/shared/tools/end_session.ts +87 -0
  121. package/templates/product-system/packages/shared/tools/get_gaps.ts +87 -0
  122. package/templates/product-system/packages/shared/tools/get_kanban.ts +125 -0
  123. package/templates/product-system/packages/shared/tools/get_node.ts +78 -0
  124. package/templates/product-system/packages/shared/tools/get_status.ts +98 -0
  125. package/templates/product-system/packages/shared/tools/migrate_to_turso.ts +385 -0
  126. package/templates/product-system/packages/shared/tools/move_card.ts +143 -0
  127. package/templates/product-system/packages/shared/tools/rebuild_index.ts +77 -0
  128. package/templates/product-system/packages/shared/tools/remove_edge.ts +59 -0
  129. package/templates/product-system/packages/shared/tools/remove_node.ts +96 -0
  130. package/templates/product-system/packages/shared/tools/resolve_question.ts +75 -0
  131. package/templates/product-system/packages/shared/tools/search_nodes.ts +106 -0
  132. package/templates/product-system/packages/shared/tools/start_session.ts +144 -0
  133. package/templates/product-system/packages/shared/tools/update_node.ts +133 -0
  134. package/templates/product-system/packages/shared/tsconfig.json +24 -0
  135. package/templates/product-system/pnpm-workspace.yaml +2 -0
  136. package/templates/product-system/smoke_test.ts +219 -0
  137. package/templates/product-system/tests/coherence_review.test.ts +562 -0
  138. package/templates/product-system/tests/db_sqlite_fallback.test.ts +75 -0
  139. package/templates/product-system/tests/edge_type_color_coding.test.ts +147 -0
  140. package/templates/product-system/tests/emit-tool-use-events.test.ts +85 -0
  141. package/templates/product-system/tests/feature_kind.test.ts +139 -0
  142. package/templates/product-system/tests/gap_indicators.test.ts +199 -0
  143. package/templates/product-system/tests/graceful_init.test.ts +142 -0
  144. package/templates/product-system/tests/graph_legend.test.ts +314 -0
  145. package/templates/product-system/tests/graph_settings_sheet.test.ts +804 -0
  146. package/templates/product-system/tests/hide_defined_filter.test.ts +205 -0
  147. package/templates/product-system/tests/kanban.test.ts +529 -0
  148. package/templates/product-system/tests/neighborhood_focus.test.ts +132 -0
  149. package/templates/product-system/tests/node_search.test.ts +340 -0
  150. package/templates/product-system/tests/node_sizing.test.ts +170 -0
  151. package/templates/product-system/tests/node_type_toggle_filters.test.ts +285 -0
  152. package/templates/product-system/tests/node_type_visual_encoding.test.ts +103 -0
  153. package/templates/product-system/tests/pipeline-state-store.test.ts +268 -0
  154. package/templates/product-system/tests/pipeline-unit.test.ts +593 -0
  155. package/templates/product-system/tests/pipeline.test.ts +195 -0
  156. package/templates/product-system/tests/pipeline_stats_all_cards.test.ts +193 -0
  157. package/templates/product-system/tests/play_all.test.ts +296 -0
  158. package/templates/product-system/tests/qa_issue_sheet.test.ts +464 -0
  159. package/templates/product-system/tests/relevance_search.test.ts +186 -0
  160. package/templates/product-system/tests/search_reorder.test.ts +88 -0
  161. package/templates/product-system/tests/serve_ui.test.ts +281 -0
  162. package/templates/product-system/tests/serve_ui_drizzle.test.ts +114 -0
  163. package/templates/product-system/tests/session_context_recall.test.ts +135 -0
  164. package/templates/product-system/tests/side_panel.test.ts +345 -0
  165. package/templates/product-system/tests/spec_completeness_label.test.ts +69 -0
  166. package/templates/product-system/tests/url_routing_test.ts +122 -0
  167. package/templates/product-system/tests/user_login.test.ts +150 -0
  168. package/templates/product-system/tests/user_registration.test.ts +205 -0
  169. package/templates/product-system/tests/web_terminal.test.ts +572 -0
  170. package/templates/product-system/tests/work_summary.test.ts +211 -0
  171. package/templates/product-system/tests/zoom_pan.test.ts +43 -0
  172. package/templates/product-system/tsconfig.json +24 -0
  173. package/templates/skills/product-bootstrap/SKILL.md +312 -0
  174. package/templates/skills/product-code-reviewer/SKILL.md +147 -0
  175. package/templates/skills/product-debugger/SKILL.md +206 -0
  176. package/templates/skills/product-debugger/references/agent-browser.md +1156 -0
  177. package/templates/skills/product-developer/SKILL.md +182 -0
  178. package/templates/skills/product-interview/SKILL.md +220 -0
@@ -0,0 +1,3358 @@
1
+ /* Graph Visualization Web UI — Styles */
2
+ /* Minimal developer tool aesthetic, dark/light theme support */
3
+
4
+ :root {
5
+ --font-mono: ui-monospace, "SF Mono", "Cascadia Code", "Fira Code", monospace;
6
+ --font-system: system-ui, -apple-system, sans-serif;
7
+ }
8
+
9
+ [data-theme="dark"] {
10
+ --bg-primary: #1a1b1e;
11
+ --bg-secondary: #25262b;
12
+ --bg-tertiary: #2c2e33;
13
+ --border-color: #373a40;
14
+ --text-primary: #c1c2c5;
15
+ --text-secondary: #909296;
16
+ --text-muted: #5c5f66;
17
+ --accent: #4dabf7;
18
+ --completeness-bg: #373a40;
19
+ --completeness-fill: #69db7c;
20
+ --panel-bg: #25262b;
21
+ --panel-shadow: rgba(0, 0, 0, 0.4);
22
+ --tab-active-bg: #2c2e33;
23
+ --tab-hover-bg: #373a40;
24
+ --error-color: #ff6b6b;
25
+ }
26
+
27
+ [data-theme="light"] {
28
+ --bg-primary: #f8f9fa;
29
+ --bg-secondary: #ffffff;
30
+ --bg-tertiary: #f1f3f5;
31
+ --border-color: #dee2e6;
32
+ --text-primary: #212529;
33
+ --text-secondary: #495057;
34
+ --text-muted: #adb5bd;
35
+ --accent: #228be6;
36
+ --completeness-bg: #e9ecef;
37
+ --completeness-fill: #40c057;
38
+ --panel-bg: #ffffff;
39
+ --panel-shadow: rgba(0, 0, 0, 0.15);
40
+ --tab-active-bg: #ffffff;
41
+ --tab-hover-bg: #e9ecef;
42
+ --error-color: #e03131;
43
+ }
44
+
45
+ * {
46
+ margin: 0;
47
+ padding: 0;
48
+ box-sizing: border-box;
49
+ }
50
+
51
+ html, body {
52
+ width: 100%;
53
+ height: 100%;
54
+ overflow: hidden;
55
+ font-family: var(--font-mono);
56
+ font-size: 13px;
57
+ background: var(--bg-primary);
58
+ color: var(--text-primary);
59
+ }
60
+
61
+ /* Toolbar */
62
+ .toolbar {
63
+ display: flex;
64
+ align-items: center;
65
+ gap: 16px;
66
+ height: 44px;
67
+ padding: 0 16px;
68
+ background: var(--bg-secondary);
69
+ border-bottom: 1px solid var(--border-color);
70
+ z-index: 100;
71
+ }
72
+
73
+ .tab-bar {
74
+ display: flex;
75
+ gap: 2px;
76
+ }
77
+
78
+ .tab-btn {
79
+ padding: 6px 16px;
80
+ background: transparent;
81
+ border: none;
82
+ border-radius: 4px;
83
+ color: var(--text-secondary);
84
+ font-family: var(--font-mono);
85
+ font-size: 12px;
86
+ cursor: pointer;
87
+ transition: background 0.15s, color 0.15s;
88
+ }
89
+
90
+ .tab-btn:hover {
91
+ background: var(--tab-hover-bg);
92
+ color: var(--text-primary);
93
+ }
94
+
95
+ .tab-btn.active {
96
+ background: var(--tab-active-bg);
97
+ color: var(--accent);
98
+ }
99
+
100
+ .toolbar-spacer {
101
+ flex: 1;
102
+ }
103
+
104
+ /* Tab bar separator between tabs and project selector */
105
+ .tab-bar-separator {
106
+ width: 1px;
107
+ height: 20px;
108
+ background: var(--border-color);
109
+ margin: 0 4px;
110
+ }
111
+
112
+ /* Project Selector */
113
+ .project-selector {
114
+ position: relative;
115
+ }
116
+
117
+ .project-selector-trigger {
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 6px;
121
+ padding: 5px 10px;
122
+ background: transparent;
123
+ border: 1px solid var(--border-color);
124
+ border-radius: 4px;
125
+ color: var(--text-primary);
126
+ font-family: var(--font-mono);
127
+ font-size: 12px;
128
+ cursor: pointer;
129
+ transition: border-color 0.15s, background 0.15s;
130
+ max-width: 200px;
131
+ }
132
+
133
+ .project-selector-trigger:hover {
134
+ background: var(--tab-hover-bg);
135
+ border-color: var(--accent);
136
+ }
137
+
138
+ .project-selector-label {
139
+ overflow: hidden;
140
+ text-overflow: ellipsis;
141
+ white-space: nowrap;
142
+ }
143
+
144
+ .project-selector-chevron {
145
+ font-size: 10px;
146
+ color: var(--text-muted);
147
+ flex-shrink: 0;
148
+ }
149
+
150
+ .project-selector-dropdown {
151
+ position: absolute;
152
+ top: calc(100% + 4px);
153
+ left: 0;
154
+ min-width: 220px;
155
+ max-width: 300px;
156
+ background: var(--panel-bg);
157
+ border: 1px solid var(--border-color);
158
+ border-radius: 6px;
159
+ box-shadow: 0 4px 12px var(--panel-shadow);
160
+ z-index: 200;
161
+ overflow: hidden;
162
+ }
163
+
164
+ .project-selector-list {
165
+ max-height: 240px;
166
+ overflow-y: auto;
167
+ padding: 4px 0;
168
+ }
169
+
170
+ .project-selector-item {
171
+ display: flex;
172
+ align-items: center;
173
+ padding: 0 4px 0 0;
174
+ }
175
+
176
+ .project-selector-item.active {
177
+ background: var(--tab-active-bg);
178
+ }
179
+
180
+ .project-selector-item:hover {
181
+ background: var(--tab-hover-bg);
182
+ }
183
+
184
+ .project-selector-item-name {
185
+ flex: 1;
186
+ text-align: left;
187
+ padding: 6px 8px;
188
+ background: none;
189
+ border: none;
190
+ color: var(--text-primary);
191
+ font-family: var(--font-mono);
192
+ font-size: 12px;
193
+ cursor: pointer;
194
+ overflow: hidden;
195
+ text-overflow: ellipsis;
196
+ white-space: nowrap;
197
+ }
198
+
199
+ .project-selector-item-actions {
200
+ display: flex;
201
+ gap: 2px;
202
+ opacity: 0;
203
+ transition: opacity 0.15s;
204
+ }
205
+
206
+ .project-selector-item:hover .project-selector-item-actions {
207
+ opacity: 1;
208
+ }
209
+
210
+ .project-selector-action-btn {
211
+ background: none;
212
+ border: none;
213
+ color: var(--text-muted);
214
+ font-size: 12px;
215
+ cursor: pointer;
216
+ padding: 2px 4px;
217
+ border-radius: 3px;
218
+ transition: color 0.15s, background 0.15s;
219
+ }
220
+
221
+ .project-selector-action-btn:hover {
222
+ color: var(--text-primary);
223
+ background: var(--bg-tertiary);
224
+ }
225
+
226
+ .project-selector-archive-btn:hover {
227
+ color: var(--error-color);
228
+ }
229
+
230
+ .project-selector-input {
231
+ flex: 1;
232
+ padding: 5px 8px;
233
+ background: var(--bg-primary);
234
+ border: 1px solid var(--accent);
235
+ border-radius: 3px;
236
+ color: var(--text-primary);
237
+ font-family: var(--font-mono);
238
+ font-size: 12px;
239
+ outline: none;
240
+ margin: 2px 4px;
241
+ }
242
+
243
+ .project-selector-footer {
244
+ border-top: 1px solid var(--border-color);
245
+ padding: 4px;
246
+ }
247
+
248
+ .project-selector-new-btn {
249
+ width: 100%;
250
+ padding: 6px 8px;
251
+ background: none;
252
+ border: none;
253
+ color: var(--accent);
254
+ font-family: var(--font-mono);
255
+ font-size: 12px;
256
+ cursor: pointer;
257
+ text-align: left;
258
+ border-radius: 3px;
259
+ transition: background 0.15s;
260
+ }
261
+
262
+ .project-selector-new-btn:hover {
263
+ background: var(--tab-hover-bg);
264
+ }
265
+
266
+ .project-selector-create-form {
267
+ display: flex;
268
+ gap: 4px;
269
+ align-items: center;
270
+ }
271
+
272
+ .project-selector-create-confirm {
273
+ background: var(--accent);
274
+ border: none;
275
+ color: white;
276
+ font-size: 14px;
277
+ font-weight: bold;
278
+ width: 28px;
279
+ height: 28px;
280
+ border-radius: 3px;
281
+ cursor: pointer;
282
+ display: flex;
283
+ align-items: center;
284
+ justify-content: center;
285
+ flex-shrink: 0;
286
+ }
287
+
288
+ /* Legend search container — search input inside the legend card */
289
+ .legend-search-container {
290
+ position: relative;
291
+ display: flex;
292
+ flex-wrap: wrap;
293
+ align-items: center;
294
+ gap: 6px;
295
+ padding: 8px 10px;
296
+ border-bottom: 1px solid var(--border-color);
297
+ }
298
+
299
+ .legend-search-container .search-input {
300
+ flex: 1;
301
+ min-width: 0;
302
+ }
303
+
304
+ /* Completeness bar */
305
+ .completeness-bar {
306
+ display: flex;
307
+ align-items: center;
308
+ gap: 8px;
309
+ font-size: 11px;
310
+ color: var(--text-secondary);
311
+ }
312
+
313
+ .completeness-track {
314
+ width: 120px;
315
+ height: 6px;
316
+ background: var(--completeness-bg);
317
+ border-radius: 3px;
318
+ overflow: hidden;
319
+ }
320
+
321
+ .completeness-fill {
322
+ height: 100%;
323
+ background: var(--completeness-fill);
324
+ border-radius: 3px;
325
+ transition: width 0.3s ease;
326
+ }
327
+
328
+ /* Theme toggle */
329
+ .theme-toggle {
330
+ background: transparent;
331
+ border: 1px solid var(--border-color);
332
+ border-radius: 4px;
333
+ color: var(--text-secondary);
334
+ font-size: 16px;
335
+ width: 32px;
336
+ height: 32px;
337
+ cursor: pointer;
338
+ display: flex;
339
+ align-items: center;
340
+ justify-content: center;
341
+ transition: border-color 0.15s;
342
+ }
343
+
344
+ .theme-toggle:hover {
345
+ border-color: var(--text-primary);
346
+ color: var(--text-primary);
347
+ }
348
+
349
+ /* Toolbar button */
350
+ .toolbar-btn {
351
+ background: transparent;
352
+ border: 1px solid var(--border-color);
353
+ border-radius: 4px;
354
+ color: var(--text-secondary);
355
+ font-family: var(--font-mono);
356
+ font-size: 11px;
357
+ padding: 4px 10px;
358
+ cursor: pointer;
359
+ transition: border-color 0.15s, color 0.15s;
360
+ }
361
+
362
+ .toolbar-btn:hover {
363
+ border-color: var(--text-primary);
364
+ color: var(--text-primary);
365
+ }
366
+
367
+ .toolbar-btn.active {
368
+ border-color: var(--accent);
369
+ color: var(--accent);
370
+ background: rgba(77, 171, 247, 0.1);
371
+ }
372
+
373
+ .logout-btn {
374
+ margin-left: 4px;
375
+ }
376
+
377
+ /* Graph container */
378
+ #graph-container {
379
+ width: 100%;
380
+ height: calc(100vh - 44px);
381
+ overflow: hidden;
382
+ }
383
+
384
+ #graph-container svg {
385
+ display: block;
386
+ }
387
+
388
+ /* Kanban container */
389
+ #kanban-container {
390
+ display: none;
391
+ width: 100%;
392
+ height: calc(100vh - 44px);
393
+ overflow: auto;
394
+ padding: 12px;
395
+ color: var(--text-secondary);
396
+ font-size: 12px;
397
+ }
398
+
399
+ /* Kanban board */
400
+ .kanban-board {
401
+ display: flex;
402
+ gap: 12px;
403
+ height: 100%;
404
+ min-width: min-content;
405
+ }
406
+
407
+ .kanban-column {
408
+ flex: 1;
409
+ min-width: 220px;
410
+ max-width: 320px;
411
+ display: flex;
412
+ flex-direction: column;
413
+ background: var(--bg-secondary);
414
+ border: 1px solid var(--border-color);
415
+ border-radius: 6px;
416
+ overflow: hidden;
417
+ }
418
+
419
+ .kanban-column-header {
420
+ display: flex;
421
+ align-items: center;
422
+ justify-content: space-between;
423
+ padding: 10px 12px;
424
+ border-bottom: 1px solid var(--border-color);
425
+ background: var(--bg-tertiary);
426
+ }
427
+
428
+ .kanban-column-title {
429
+ font-weight: 600;
430
+ font-size: 12px;
431
+ color: var(--text-primary);
432
+ text-transform: uppercase;
433
+ letter-spacing: 0.5px;
434
+ }
435
+
436
+ .kanban-column-count {
437
+ font-size: 11px;
438
+ color: var(--text-muted);
439
+ background: var(--bg-primary);
440
+ padding: 1px 6px;
441
+ border-radius: 8px;
442
+ }
443
+
444
+ .kanban-column-body {
445
+ flex: 1;
446
+ overflow-y: auto;
447
+ padding: 8px;
448
+ display: flex;
449
+ flex-direction: column;
450
+ gap: 8px;
451
+ min-height: 60px;
452
+ transition: background 0.15s;
453
+ }
454
+
455
+ .kanban-column-body.drop-target {
456
+ background: rgba(77, 171, 247, 0.05);
457
+ border: 1px dashed var(--accent);
458
+ border-radius: 4px;
459
+ margin: 4px;
460
+ padding: 4px;
461
+ }
462
+
463
+ .kanban-column-body.drag-over {
464
+ background: rgba(77, 171, 247, 0.12);
465
+ }
466
+
467
+ /* Kanban cards */
468
+ .kanban-card {
469
+ background: var(--bg-primary);
470
+ border: 1px solid var(--border-color);
471
+ border-radius: 4px;
472
+ padding: 10px;
473
+ cursor: default;
474
+ transition: border-color 0.15s, opacity 0.15s;
475
+ }
476
+
477
+ .kanban-card[draggable="true"] {
478
+ cursor: grab;
479
+ }
480
+
481
+ .kanban-card[draggable="true"]:hover {
482
+ border-color: var(--accent);
483
+ }
484
+
485
+ .kanban-card.dragging {
486
+ opacity: 0.4;
487
+ }
488
+
489
+ .kanban-card.problematic {
490
+ border-left: 3px solid var(--error-color);
491
+ }
492
+
493
+ .kanban-card-header {
494
+ display: flex;
495
+ align-items: center;
496
+ justify-content: space-between;
497
+ margin-bottom: 4px;
498
+ }
499
+
500
+ .kanban-card-id {
501
+ font-size: 10px;
502
+ color: var(--text-muted);
503
+ font-family: var(--font-mono);
504
+ }
505
+
506
+ .kanban-card-kind {
507
+ font-size: 9px;
508
+ font-weight: 600;
509
+ text-transform: uppercase;
510
+ letter-spacing: 0.5px;
511
+ padding: 1px 5px;
512
+ border-radius: 3px;
513
+ font-family: var(--font-sans, sans-serif);
514
+ }
515
+
516
+ .kanban-card-kind.kind-improvement {
517
+ color: #3b82f6;
518
+ background: rgba(59, 130, 246, 0.15);
519
+ }
520
+
521
+ .kanban-card-kind.kind-bugfix {
522
+ color: #f59e0b;
523
+ background: rgba(245, 158, 11, 0.15);
524
+ }
525
+
526
+ .kanban-card-rejections {
527
+ font-size: 10px;
528
+ color: var(--text-muted);
529
+ padding: 1px 5px;
530
+ border-radius: 3px;
531
+ background: var(--bg-tertiary);
532
+ }
533
+
534
+ .kanban-card-rejections.high {
535
+ color: var(--error-color);
536
+ background: rgba(255, 107, 107, 0.1);
537
+ }
538
+
539
+ .kanban-card-name {
540
+ font-size: 12px;
541
+ font-weight: 500;
542
+ color: var(--text-primary);
543
+ margin-bottom: 6px;
544
+ line-height: 1.3;
545
+ }
546
+
547
+ .kanban-card-completeness-row {
548
+ display: flex;
549
+ align-items: center;
550
+ gap: 6px;
551
+ }
552
+
553
+ .kanban-card-completeness {
554
+ flex: 1;
555
+ height: 4px;
556
+ background: var(--completeness-bg);
557
+ border-radius: 2px;
558
+ overflow: hidden;
559
+ }
560
+
561
+ .kanban-card-completeness-fill {
562
+ height: 100%;
563
+ background: var(--completeness-fill);
564
+ border-radius: 2px;
565
+ }
566
+
567
+ .kanban-card-completeness-prefix {
568
+ font-size: 9px;
569
+ color: var(--text-muted);
570
+ text-transform: uppercase;
571
+ letter-spacing: 0.5px;
572
+ flex-shrink: 0;
573
+ }
574
+
575
+ .kanban-card-completeness-label {
576
+ font-size: 10px;
577
+ color: var(--text-muted);
578
+ min-width: 28px;
579
+ text-align: right;
580
+ }
581
+
582
+ /* Rejection notes */
583
+ .kanban-notes-section {
584
+ margin-top: 8px;
585
+ border-top: 1px solid var(--border-color);
586
+ padding-top: 6px;
587
+ }
588
+
589
+ .kanban-notes-label {
590
+ font-size: 10px;
591
+ color: var(--text-muted);
592
+ text-transform: uppercase;
593
+ letter-spacing: 0.3px;
594
+ margin-bottom: 4px;
595
+ }
596
+
597
+ .kanban-note {
598
+ display: flex;
599
+ align-items: flex-start;
600
+ justify-content: space-between;
601
+ padding: 4px 0;
602
+ gap: 6px;
603
+ }
604
+
605
+ .kanban-note-text {
606
+ font-size: 11px;
607
+ color: var(--text-secondary);
608
+ line-height: 1.4;
609
+ flex: 1;
610
+ }
611
+
612
+ .kanban-note-actions {
613
+ display: flex;
614
+ gap: 4px;
615
+ flex-shrink: 0;
616
+ }
617
+
618
+ .kanban-note-action {
619
+ background: transparent;
620
+ border: none;
621
+ color: var(--text-muted);
622
+ font-size: 10px;
623
+ cursor: pointer;
624
+ padding: 1px 4px;
625
+ border-radius: 2px;
626
+ font-family: var(--font-mono);
627
+ }
628
+
629
+ .kanban-note-action:hover {
630
+ background: var(--bg-tertiary);
631
+ color: var(--text-primary);
632
+ }
633
+
634
+ .kanban-note-action.delete:hover {
635
+ color: var(--error-color);
636
+ }
637
+
638
+ /* Note form */
639
+ .kanban-add-note-btn {
640
+ background: transparent;
641
+ border: 1px dashed var(--border-color);
642
+ border-radius: 3px;
643
+ color: var(--text-muted);
644
+ font-size: 11px;
645
+ font-family: var(--font-mono);
646
+ padding: 4px 8px;
647
+ cursor: pointer;
648
+ width: 100%;
649
+ margin-top: 6px;
650
+ transition: border-color 0.15s, color 0.15s;
651
+ }
652
+
653
+ .kanban-add-note-btn:hover {
654
+ border-color: var(--accent);
655
+ color: var(--accent);
656
+ }
657
+
658
+ .kanban-note-form {
659
+ margin-top: 6px;
660
+ }
661
+
662
+ .kanban-note-form.inline {
663
+ margin-top: 4px;
664
+ }
665
+
666
+ .kanban-note-input {
667
+ width: 100%;
668
+ background: var(--bg-tertiary);
669
+ border: 1px solid var(--border-color);
670
+ border-radius: 3px;
671
+ color: var(--text-primary);
672
+ font-family: var(--font-mono);
673
+ font-size: 11px;
674
+ padding: 6px 8px;
675
+ resize: vertical;
676
+ }
677
+
678
+ .kanban-note-input:focus {
679
+ outline: none;
680
+ border-color: var(--accent);
681
+ }
682
+
683
+ .kanban-note-form-btns {
684
+ display: flex;
685
+ gap: 6px;
686
+ margin-top: 4px;
687
+ }
688
+
689
+ .kanban-note-save,
690
+ .kanban-note-cancel {
691
+ background: transparent;
692
+ border: 1px solid var(--border-color);
693
+ border-radius: 3px;
694
+ color: var(--text-secondary);
695
+ font-family: var(--font-mono);
696
+ font-size: 11px;
697
+ padding: 3px 10px;
698
+ cursor: pointer;
699
+ }
700
+
701
+ .kanban-note-save:hover {
702
+ border-color: var(--accent);
703
+ color: var(--accent);
704
+ }
705
+
706
+ .kanban-note-cancel:hover {
707
+ border-color: var(--text-primary);
708
+ color: var(--text-primary);
709
+ }
710
+
711
+ /* QA Issue Sheet */
712
+ .qa-issue-sheet {
713
+ position: fixed;
714
+ top: 44px;
715
+ right: 0;
716
+ width: 420px;
717
+ height: calc(100vh - 44px);
718
+ background: var(--panel-bg);
719
+ border-left: 1px solid var(--border-color);
720
+ box-shadow: -4px 0 16px var(--panel-shadow);
721
+ transform: translateX(100%);
722
+ transition: transform 0.25s ease;
723
+ z-index: 260;
724
+ display: flex;
725
+ flex-direction: column;
726
+ overflow: hidden;
727
+ }
728
+
729
+ .qa-issue-sheet.open {
730
+ transform: translateX(0);
731
+ }
732
+
733
+ .qa-sheet-header {
734
+ display: flex;
735
+ align-items: center;
736
+ justify-content: space-between;
737
+ padding: 12px 16px;
738
+ border-bottom: 1px solid var(--border-color);
739
+ min-height: 48px;
740
+ }
741
+
742
+ .qa-sheet-title {
743
+ font-size: 13px;
744
+ font-weight: 600;
745
+ color: var(--text-primary);
746
+ white-space: nowrap;
747
+ overflow: hidden;
748
+ text-overflow: ellipsis;
749
+ }
750
+
751
+ .qa-sheet-close {
752
+ background: transparent;
753
+ border: none;
754
+ color: var(--text-secondary);
755
+ font-size: 18px;
756
+ cursor: pointer;
757
+ padding: 4px 8px;
758
+ border-radius: 4px;
759
+ flex-shrink: 0;
760
+ }
761
+
762
+ .qa-sheet-close:hover {
763
+ background: var(--tab-hover-bg);
764
+ color: var(--text-primary);
765
+ }
766
+
767
+ .qa-sheet-body {
768
+ padding: 16px;
769
+ overflow-y: auto;
770
+ flex: 1;
771
+ display: flex;
772
+ flex-direction: column;
773
+ gap: 12px;
774
+ }
775
+
776
+ .qa-sheet-subtitle {
777
+ font-size: 11px;
778
+ color: var(--text-muted);
779
+ text-transform: uppercase;
780
+ letter-spacing: 0.3px;
781
+ }
782
+
783
+ .qa-sheet-empty {
784
+ font-size: 12px;
785
+ color: var(--text-muted);
786
+ padding: 16px 0;
787
+ text-align: center;
788
+ }
789
+
790
+ .qa-sheet-notes-list {
791
+ display: flex;
792
+ flex-direction: column;
793
+ gap: 8px;
794
+ }
795
+
796
+ .qa-sheet-note {
797
+ background: var(--bg-tertiary);
798
+ border: 1px solid var(--border-color);
799
+ border-radius: 4px;
800
+ padding: 10px 12px;
801
+ }
802
+
803
+ .qa-sheet-note-text {
804
+ font-size: 12px;
805
+ color: var(--text-primary);
806
+ line-height: 1.5;
807
+ white-space: pre-wrap;
808
+ word-break: break-word;
809
+ }
810
+
811
+ .qa-sheet-note-meta {
812
+ display: flex;
813
+ align-items: center;
814
+ justify-content: space-between;
815
+ margin-top: 8px;
816
+ }
817
+
818
+ .qa-sheet-note-date {
819
+ font-size: 10px;
820
+ color: var(--text-muted);
821
+ }
822
+
823
+ .qa-sheet-note-actions {
824
+ display: flex;
825
+ gap: 6px;
826
+ }
827
+
828
+ .qa-sheet-action-btn {
829
+ background: transparent;
830
+ border: none;
831
+ color: var(--text-muted);
832
+ font-size: 11px;
833
+ font-family: var(--font-mono);
834
+ cursor: pointer;
835
+ padding: 2px 6px;
836
+ border-radius: 3px;
837
+ }
838
+
839
+ .qa-sheet-action-btn:hover {
840
+ background: var(--bg-primary);
841
+ color: var(--text-primary);
842
+ }
843
+
844
+ .qa-sheet-action-btn.delete:hover {
845
+ color: var(--error-color);
846
+ }
847
+
848
+ .qa-sheet-add-form,
849
+ .qa-sheet-edit-form {
850
+ display: flex;
851
+ flex-direction: column;
852
+ gap: 8px;
853
+ }
854
+
855
+ .qa-sheet-add-form {
856
+ margin-top: auto;
857
+ padding-top: 12px;
858
+ border-top: 1px solid var(--border-color);
859
+ }
860
+
861
+ .qa-sheet-textarea {
862
+ width: 100%;
863
+ background: var(--bg-tertiary);
864
+ border: 1px solid var(--border-color);
865
+ border-radius: 4px;
866
+ color: var(--text-primary);
867
+ font-family: var(--font-mono);
868
+ font-size: 12px;
869
+ padding: 10px 12px;
870
+ resize: vertical;
871
+ line-height: 1.5;
872
+ }
873
+
874
+ .qa-sheet-textarea:focus {
875
+ outline: none;
876
+ border-color: var(--accent);
877
+ }
878
+
879
+ .qa-sheet-textarea::placeholder {
880
+ color: var(--text-muted);
881
+ }
882
+
883
+ .qa-sheet-form-btns {
884
+ display: flex;
885
+ gap: 8px;
886
+ }
887
+
888
+ .qa-sheet-add-btn {
889
+ background: transparent;
890
+ border: 1px solid var(--accent);
891
+ border-radius: 4px;
892
+ color: var(--accent);
893
+ font-family: var(--font-mono);
894
+ font-size: 11px;
895
+ padding: 6px 14px;
896
+ cursor: pointer;
897
+ transition: background 0.15s, color 0.15s;
898
+ }
899
+
900
+ .qa-sheet-add-btn:hover {
901
+ background: var(--accent);
902
+ color: #fff;
903
+ }
904
+
905
+ .qa-sheet-cancel-btn {
906
+ background: transparent;
907
+ border: 1px solid var(--border-color);
908
+ border-radius: 4px;
909
+ color: var(--text-secondary);
910
+ font-family: var(--font-mono);
911
+ font-size: 11px;
912
+ padding: 6px 14px;
913
+ cursor: pointer;
914
+ }
915
+
916
+ .qa-sheet-cancel-btn:hover {
917
+ border-color: var(--text-primary);
918
+ color: var(--text-primary);
919
+ }
920
+
921
+ /* Review History section in QA Issue Sheet */
922
+ .qa-sheet-review-history {
923
+ margin-bottom: 16px;
924
+ border-bottom: 1px solid var(--border-color);
925
+ padding-bottom: 12px;
926
+ }
927
+
928
+ .qa-sheet-section-title {
929
+ font-size: 11px;
930
+ font-weight: 600;
931
+ text-transform: uppercase;
932
+ letter-spacing: 0.5px;
933
+ color: var(--text-secondary);
934
+ margin-bottom: 8px;
935
+ }
936
+
937
+ .qa-sheet-review-item {
938
+ background: var(--bg-secondary);
939
+ border-radius: 6px;
940
+ padding: 8px 10px;
941
+ margin-bottom: 6px;
942
+ }
943
+
944
+ .qa-sheet-review-header {
945
+ display: flex;
946
+ align-items: center;
947
+ gap: 8px;
948
+ font-size: 12px;
949
+ }
950
+
951
+ .qa-sheet-review-cycle {
952
+ font-weight: 600;
953
+ color: var(--text-primary);
954
+ }
955
+
956
+ .qa-sheet-review-badge {
957
+ font-size: 10px;
958
+ font-weight: 600;
959
+ padding: 1px 6px;
960
+ border-radius: 3px;
961
+ text-transform: uppercase;
962
+ }
963
+
964
+ .qa-sheet-review-badge.approved {
965
+ background: #16a34a22;
966
+ color: #16a34a;
967
+ }
968
+
969
+ .qa-sheet-review-badge.rejected {
970
+ background: #dc262622;
971
+ color: #dc2626;
972
+ }
973
+
974
+ .qa-sheet-review-time {
975
+ color: var(--text-secondary);
976
+ font-size: 11px;
977
+ margin-left: auto;
978
+ }
979
+
980
+ .qa-sheet-review-reason {
981
+ margin-top: 6px;
982
+ font-size: 12px;
983
+ color: var(--text-secondary);
984
+ white-space: pre-wrap;
985
+ line-height: 1.4;
986
+ max-height: 120px;
987
+ overflow-y: auto;
988
+ }
989
+
990
+ /* Kanban card issues summary button */
991
+ .kanban-issues-btn {
992
+ display: flex;
993
+ align-items: center;
994
+ gap: 4px;
995
+ background: transparent;
996
+ border: 1px solid var(--border-color);
997
+ border-radius: 3px;
998
+ color: var(--text-muted);
999
+ font-size: 10px;
1000
+ font-family: var(--font-mono);
1001
+ padding: 3px 8px;
1002
+ cursor: pointer;
1003
+ width: 100%;
1004
+ margin-top: 6px;
1005
+ transition: border-color 0.15s, color 0.15s;
1006
+ }
1007
+
1008
+ .kanban-issues-btn:hover {
1009
+ border-color: var(--accent);
1010
+ color: var(--accent);
1011
+ }
1012
+
1013
+ .kanban-issues-btn.has-issues {
1014
+ color: var(--text-secondary);
1015
+ border-color: var(--text-muted);
1016
+ }
1017
+
1018
+ /* Settings gear button */
1019
+ .settings-gear-btn {
1020
+ font-size: 16px;
1021
+ line-height: 1;
1022
+ padding: 4px 8px;
1023
+ }
1024
+
1025
+ /* Settings sheet */
1026
+ .settings-sheet {
1027
+ position: fixed;
1028
+ top: 84px;
1029
+ right: 0;
1030
+ width: 280px;
1031
+ background: var(--panel-bg);
1032
+ border-left: 1px solid var(--border-color);
1033
+ box-shadow: -4px 0 16px var(--panel-shadow);
1034
+ transform: translateX(100%);
1035
+ transition: transform 0.25s ease;
1036
+ z-index: 250;
1037
+ display: flex;
1038
+ flex-direction: column;
1039
+ }
1040
+
1041
+ .settings-sheet.open {
1042
+ transform: translateX(0);
1043
+ }
1044
+
1045
+ .settings-header {
1046
+ display: flex;
1047
+ align-items: center;
1048
+ justify-content: space-between;
1049
+ padding: 12px 16px;
1050
+ border-bottom: 1px solid var(--border-color);
1051
+ min-height: 48px;
1052
+ }
1053
+
1054
+ .settings-title {
1055
+ font-size: 13px;
1056
+ font-weight: 600;
1057
+ color: var(--text-primary);
1058
+ text-transform: uppercase;
1059
+ letter-spacing: 0.5px;
1060
+ }
1061
+
1062
+ .settings-close {
1063
+ background: transparent;
1064
+ border: none;
1065
+ color: var(--text-secondary);
1066
+ font-size: 18px;
1067
+ cursor: pointer;
1068
+ padding: 4px 8px;
1069
+ border-radius: 4px;
1070
+ }
1071
+
1072
+ .settings-close:hover {
1073
+ background: var(--tab-hover-bg);
1074
+ color: var(--text-primary);
1075
+ }
1076
+
1077
+ .settings-body {
1078
+ padding: 12px 16px;
1079
+ display: flex;
1080
+ flex-direction: column;
1081
+ gap: 0;
1082
+ }
1083
+
1084
+ .settings-row {
1085
+ display: flex;
1086
+ align-items: center;
1087
+ justify-content: space-between;
1088
+ padding: 10px 0;
1089
+ border-bottom: 1px solid var(--border-color);
1090
+ cursor: pointer;
1091
+ }
1092
+
1093
+ .settings-row:last-child {
1094
+ border-bottom: none;
1095
+ }
1096
+
1097
+ .settings-label {
1098
+ font-size: 12px;
1099
+ color: var(--text-secondary);
1100
+ }
1101
+
1102
+ .settings-toggle {
1103
+ appearance: none;
1104
+ width: 36px;
1105
+ height: 20px;
1106
+ background: var(--bg-tertiary);
1107
+ border: 1px solid var(--border-color);
1108
+ border-radius: 10px;
1109
+ position: relative;
1110
+ cursor: pointer;
1111
+ transition: background 0.15s, border-color 0.15s;
1112
+ flex-shrink: 0;
1113
+ }
1114
+
1115
+ .settings-toggle::after {
1116
+ content: '';
1117
+ position: absolute;
1118
+ top: 2px;
1119
+ left: 2px;
1120
+ width: 14px;
1121
+ height: 14px;
1122
+ background: var(--text-muted);
1123
+ border-radius: 50%;
1124
+ transition: transform 0.15s, background 0.15s;
1125
+ }
1126
+
1127
+ .settings-toggle:checked {
1128
+ background: rgba(77, 171, 247, 0.2);
1129
+ border-color: var(--accent);
1130
+ }
1131
+
1132
+ .settings-toggle:checked::after {
1133
+ transform: translateX(16px);
1134
+ background: var(--accent);
1135
+ }
1136
+
1137
+ /* Side panel */
1138
+ .side-panel {
1139
+ position: fixed;
1140
+ top: 44px;
1141
+ right: 0;
1142
+ width: 420px;
1143
+ height: calc(100vh - 44px);
1144
+ background: var(--panel-bg);
1145
+ border-left: 1px solid var(--border-color);
1146
+ box-shadow: -4px 0 16px var(--panel-shadow);
1147
+ transform: translateX(100%);
1148
+ transition: transform 0.25s ease;
1149
+ z-index: 200;
1150
+ display: flex;
1151
+ flex-direction: column;
1152
+ overflow: hidden;
1153
+ }
1154
+
1155
+ .side-panel.open {
1156
+ transform: translateX(0);
1157
+ }
1158
+
1159
+ .panel-header {
1160
+ display: flex;
1161
+ align-items: center;
1162
+ justify-content: space-between;
1163
+ padding: 12px 16px;
1164
+ border-bottom: 1px solid var(--border-color);
1165
+ min-height: 48px;
1166
+ }
1167
+
1168
+ .panel-title {
1169
+ font-size: 13px;
1170
+ font-weight: 600;
1171
+ color: var(--text-primary);
1172
+ white-space: nowrap;
1173
+ overflow: hidden;
1174
+ text-overflow: ellipsis;
1175
+ }
1176
+
1177
+ .panel-close {
1178
+ background: transparent;
1179
+ border: none;
1180
+ color: var(--text-secondary);
1181
+ font-size: 18px;
1182
+ cursor: pointer;
1183
+ padding: 4px 8px;
1184
+ border-radius: 4px;
1185
+ }
1186
+
1187
+ .panel-close:hover {
1188
+ background: var(--tab-hover-bg);
1189
+ color: var(--text-primary);
1190
+ }
1191
+
1192
+ .panel-body {
1193
+ padding: 16px;
1194
+ overflow-y: auto;
1195
+ flex: 1;
1196
+ font-size: 12px;
1197
+ line-height: 1.6;
1198
+ }
1199
+
1200
+ .panel-body h1 { font-size: 16px; margin: 12px 0 8px; color: var(--text-primary); }
1201
+ .panel-body h2 { font-size: 14px; margin: 12px 0 6px; color: var(--text-primary); }
1202
+ .panel-body h3 { font-size: 13px; margin: 10px 0 4px; color: var(--text-primary); }
1203
+ .panel-body p { margin: 4px 0; color: var(--text-secondary); }
1204
+ .panel-body ul { padding-left: 20px; margin: 4px 0; }
1205
+ .panel-body li { color: var(--text-secondary); margin: 2px 0; }
1206
+ .panel-body code {
1207
+ background: var(--bg-tertiary);
1208
+ padding: 1px 4px;
1209
+ border-radius: 3px;
1210
+ font-size: 11px;
1211
+ }
1212
+ .panel-body blockquote {
1213
+ border-left: 3px solid var(--border-color);
1214
+ padding-left: 12px;
1215
+ color: var(--text-muted);
1216
+ margin: 8px 0;
1217
+ }
1218
+ .panel-body strong { color: var(--text-primary); }
1219
+ .panel-body pre {
1220
+ background: var(--bg-tertiary);
1221
+ padding: 10px 12px;
1222
+ border-radius: 4px;
1223
+ overflow-x: auto;
1224
+ margin: 8px 0;
1225
+ font-size: 11px;
1226
+ }
1227
+ .panel-body pre code {
1228
+ background: transparent;
1229
+ padding: 0;
1230
+ }
1231
+
1232
+ /* Side panel — status section */
1233
+ .panel-status-section {
1234
+ display: flex;
1235
+ align-items: center;
1236
+ gap: 8px;
1237
+ margin-bottom: 12px;
1238
+ padding-bottom: 10px;
1239
+ border-bottom: 1px solid var(--border-color);
1240
+ flex-wrap: wrap;
1241
+ }
1242
+
1243
+ .panel-type-badge {
1244
+ font-size: 10px;
1245
+ color: var(--text-muted);
1246
+ text-transform: uppercase;
1247
+ letter-spacing: 0.5px;
1248
+ background: var(--bg-tertiary);
1249
+ padding: 2px 8px;
1250
+ border-radius: 3px;
1251
+ }
1252
+
1253
+ .panel-status-badge {
1254
+ font-size: 10px;
1255
+ padding: 2px 8px;
1256
+ border-radius: 3px;
1257
+ font-weight: 600;
1258
+ text-transform: capitalize;
1259
+ }
1260
+
1261
+ .panel-status-draft {
1262
+ background: rgba(173, 181, 189, 0.15);
1263
+ color: #adb5bd;
1264
+ }
1265
+
1266
+ .panel-status-partially_defined {
1267
+ background: rgba(255, 212, 59, 0.15);
1268
+ color: #ffd43b;
1269
+ }
1270
+
1271
+ .panel-status-defined {
1272
+ background: rgba(105, 219, 124, 0.15);
1273
+ color: #69db7c;
1274
+ }
1275
+
1276
+ .panel-completeness {
1277
+ font-size: 11px;
1278
+ color: var(--text-secondary);
1279
+ margin-left: auto;
1280
+ }
1281
+
1282
+ /* Side panel — edges section */
1283
+ .panel-edges-section {
1284
+ margin-top: 16px;
1285
+ padding-top: 12px;
1286
+ border-top: 1px solid var(--border-color);
1287
+ }
1288
+
1289
+ .panel-edges-section h3 {
1290
+ font-size: 12px;
1291
+ color: var(--text-primary);
1292
+ margin-bottom: 8px;
1293
+ text-transform: uppercase;
1294
+ letter-spacing: 0.5px;
1295
+ }
1296
+
1297
+ .panel-edge-list {
1298
+ list-style: none;
1299
+ padding: 0;
1300
+ margin: 0;
1301
+ display: flex;
1302
+ flex-direction: column;
1303
+ gap: 4px;
1304
+ }
1305
+
1306
+ .panel-edge-item {
1307
+ display: flex;
1308
+ align-items: center;
1309
+ gap: 6px;
1310
+ padding: 4px 6px;
1311
+ border-radius: 3px;
1312
+ transition: background 0.15s;
1313
+ }
1314
+
1315
+ .panel-edge-item:hover {
1316
+ background: var(--bg-tertiary);
1317
+ }
1318
+
1319
+ .panel-edge-direction {
1320
+ font-size: 11px;
1321
+ color: var(--text-muted);
1322
+ width: 14px;
1323
+ text-align: center;
1324
+ flex-shrink: 0;
1325
+ }
1326
+
1327
+ .panel-edge-relation {
1328
+ font-size: 10px;
1329
+ color: var(--text-muted);
1330
+ min-width: 80px;
1331
+ flex-shrink: 0;
1332
+ }
1333
+
1334
+ .panel-edge-link {
1335
+ font-size: 12px;
1336
+ color: var(--accent);
1337
+ text-decoration: none;
1338
+ cursor: pointer;
1339
+ flex: 1;
1340
+ overflow: hidden;
1341
+ text-overflow: ellipsis;
1342
+ white-space: nowrap;
1343
+ }
1344
+
1345
+ .panel-edge-link:hover {
1346
+ text-decoration: underline;
1347
+ }
1348
+
1349
+ .panel-edge-id {
1350
+ font-size: 10px;
1351
+ color: var(--text-muted);
1352
+ flex-shrink: 0;
1353
+ }
1354
+
1355
+ /* Pipeline play button */
1356
+ /* Copy button */
1357
+ .kanban-copy-btn {
1358
+ display: flex;
1359
+ align-items: center;
1360
+ justify-content: center;
1361
+ width: 20px;
1362
+ height: 20px;
1363
+ border-radius: 3px;
1364
+ border: none;
1365
+ background: transparent;
1366
+ font-size: 12px;
1367
+ cursor: pointer;
1368
+ opacity: 0;
1369
+ transition: opacity 0.15s, background 0.15s;
1370
+ flex-shrink: 0;
1371
+ padding: 0;
1372
+ margin-left: auto;
1373
+ margin-right: 4px;
1374
+ }
1375
+
1376
+ .kanban-card:hover .kanban-copy-btn {
1377
+ opacity: 0.6;
1378
+ }
1379
+
1380
+ .kanban-copy-btn:hover {
1381
+ opacity: 1 !important;
1382
+ background: var(--bg-secondary, #e9ecef);
1383
+ }
1384
+
1385
+ .kanban-copy-btn.copied {
1386
+ opacity: 1 !important;
1387
+ color: #40c057;
1388
+ }
1389
+
1390
+ .kanban-card-header-right {
1391
+ display: flex;
1392
+ align-items: center;
1393
+ gap: 4px;
1394
+ }
1395
+
1396
+ .kanban-play-btn {
1397
+ display: flex;
1398
+ align-items: center;
1399
+ justify-content: center;
1400
+ width: 22px;
1401
+ height: 22px;
1402
+ border-radius: 50%;
1403
+ border: 1px solid #40c057;
1404
+ background: transparent;
1405
+ color: #40c057;
1406
+ font-size: 10px;
1407
+ cursor: pointer;
1408
+ transition: background 0.15s, color 0.15s;
1409
+ flex-shrink: 0;
1410
+ }
1411
+
1412
+ .kanban-play-btn:hover {
1413
+ background: #40c057;
1414
+ color: #fff;
1415
+ }
1416
+
1417
+ /* Column header layout */
1418
+ .kanban-column-header-left {
1419
+ display: flex;
1420
+ align-items: center;
1421
+ gap: 6px;
1422
+ }
1423
+
1424
+ /* Play All button in TODO column header */
1425
+ .kanban-play-all-btn {
1426
+ display: flex;
1427
+ align-items: center;
1428
+ justify-content: center;
1429
+ width: 26px;
1430
+ height: 26px;
1431
+ border-radius: 50%;
1432
+ border: 1px solid #40c057;
1433
+ background: transparent;
1434
+ color: #40c057;
1435
+ font-size: 9px;
1436
+ cursor: pointer;
1437
+ transition: background 0.15s, color 0.15s;
1438
+ flex-shrink: 0;
1439
+ letter-spacing: -2px;
1440
+ padding-left: 2px;
1441
+ }
1442
+
1443
+ .kanban-play-all-btn:hover {
1444
+ background: #40c057;
1445
+ color: #fff;
1446
+ }
1447
+
1448
+ .kanban-play-all-btn.stop {
1449
+ border-color: var(--error-color);
1450
+ color: var(--error-color);
1451
+ font-size: 12px;
1452
+ letter-spacing: normal;
1453
+ padding-left: 0;
1454
+ }
1455
+
1456
+ .kanban-play-all-btn.stop:hover {
1457
+ background: var(--error-color);
1458
+ color: #fff;
1459
+ }
1460
+
1461
+ /* Active card highlight during Play All */
1462
+ .kanban-card.play-all-active {
1463
+ border-left: 3px solid #40c057;
1464
+ box-shadow: 0 0 8px rgba(64, 192, 87, 0.3);
1465
+ }
1466
+
1467
+ /* Play All deadlock notification */
1468
+ .play-all-deadlock {
1469
+ position: fixed;
1470
+ bottom: 20px;
1471
+ right: 20px;
1472
+ max-width: 420px;
1473
+ background: var(--bg-secondary);
1474
+ border: 1px solid var(--error-color);
1475
+ border-radius: 8px;
1476
+ padding: 14px 18px;
1477
+ z-index: 1000;
1478
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
1479
+ font-family: var(--font-mono);
1480
+ font-size: 12px;
1481
+ }
1482
+
1483
+ .play-all-deadlock-title {
1484
+ font-weight: 600;
1485
+ color: var(--error-color);
1486
+ margin-bottom: 8px;
1487
+ }
1488
+
1489
+ .play-all-deadlock-list {
1490
+ list-style: none;
1491
+ padding: 0;
1492
+ margin: 0 0 10px 0;
1493
+ color: var(--text-secondary);
1494
+ }
1495
+
1496
+ .play-all-deadlock-list li {
1497
+ padding: 2px 0;
1498
+ }
1499
+
1500
+ .play-all-deadlock-close {
1501
+ background: transparent;
1502
+ border: 1px solid var(--border-color);
1503
+ border-radius: 4px;
1504
+ color: var(--text-secondary);
1505
+ font-size: 11px;
1506
+ font-family: var(--font-mono);
1507
+ padding: 4px 12px;
1508
+ cursor: pointer;
1509
+ transition: background 0.15s;
1510
+ }
1511
+
1512
+ .play-all-deadlock-close:hover {
1513
+ background: var(--bg-tertiary);
1514
+ }
1515
+
1516
+ /* Toast notifications */
1517
+ .toast-container {
1518
+ position: fixed;
1519
+ bottom: 20px;
1520
+ right: 20px;
1521
+ z-index: 10000;
1522
+ display: flex;
1523
+ flex-direction: column-reverse;
1524
+ gap: 8px;
1525
+ pointer-events: none;
1526
+ }
1527
+
1528
+ .kanban-toast {
1529
+ position: relative;
1530
+ max-width: 480px;
1531
+ pointer-events: auto;
1532
+ background: var(--bg-secondary);
1533
+ border: 1px solid var(--border-color);
1534
+ border-radius: 8px;
1535
+ padding: 12px 36px 12px 16px;
1536
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
1537
+ font-family: var(--font-mono);
1538
+ font-size: 12px;
1539
+ color: var(--text-primary);
1540
+ animation: toast-slide-in 0.2s ease-out;
1541
+ }
1542
+
1543
+ .kanban-toast-error {
1544
+ border-color: var(--error-color);
1545
+ border-left: 4px solid var(--error-color);
1546
+ color: var(--error-color);
1547
+ background: linear-gradient(135deg, var(--bg-secondary) 0%, rgba(255, 107, 107, 0.08) 100%);
1548
+ }
1549
+
1550
+ .kanban-toast-success {
1551
+ border-color: var(--success-color, #4caf50);
1552
+ border-left: 4px solid var(--success-color, #4caf50);
1553
+ color: var(--success-color, #4caf50);
1554
+ background: linear-gradient(135deg, var(--bg-secondary) 0%, rgba(76, 175, 80, 0.08) 100%);
1555
+ }
1556
+
1557
+ .kanban-toast-info {
1558
+ border-color: var(--accent-color, #64b5f6);
1559
+ border-left: 4px solid var(--accent-color, #64b5f6);
1560
+ }
1561
+
1562
+ .kanban-toast-close {
1563
+ position: absolute;
1564
+ top: 8px;
1565
+ right: 8px;
1566
+ background: transparent;
1567
+ border: none;
1568
+ color: var(--text-secondary);
1569
+ font-size: 16px;
1570
+ cursor: pointer;
1571
+ padding: 0 4px;
1572
+ line-height: 1;
1573
+ }
1574
+
1575
+ .kanban-toast-close:hover {
1576
+ color: var(--text-primary);
1577
+ }
1578
+
1579
+ @keyframes toast-slide-in {
1580
+ from { transform: translateY(20px); opacity: 0; }
1581
+ to { transform: translateY(0); opacity: 1; }
1582
+ }
1583
+
1584
+ /* Blocked badge */
1585
+ .kanban-blocked-badge {
1586
+ font-size: 10px;
1587
+ color: var(--error-color);
1588
+ background: rgba(255, 107, 107, 0.1);
1589
+ padding: 1px 6px;
1590
+ border-radius: 3px;
1591
+ font-weight: 600;
1592
+ }
1593
+
1594
+ .kanban-card.dev-blocked {
1595
+ border-left: 3px solid var(--error-color);
1596
+ opacity: 0.8;
1597
+ }
1598
+
1599
+ /* Unblock button */
1600
+ .kanban-unblock-btn {
1601
+ background: transparent;
1602
+ border: 1px dashed var(--error-color);
1603
+ border-radius: 3px;
1604
+ color: var(--error-color);
1605
+ font-size: 10px;
1606
+ font-family: var(--font-mono);
1607
+ padding: 3px 8px;
1608
+ cursor: pointer;
1609
+ width: 100%;
1610
+ margin-top: 6px;
1611
+ transition: background 0.15s, color 0.15s;
1612
+ }
1613
+
1614
+ .kanban-unblock-btn:hover {
1615
+ background: var(--error-color);
1616
+ color: #fff;
1617
+ }
1618
+
1619
+ /* Pipeline status badge */
1620
+ .kanban-pipeline-status {
1621
+ font-size: 10px;
1622
+ padding: 3px 8px;
1623
+ border-radius: 3px;
1624
+ margin-top: 6px;
1625
+ text-align: center;
1626
+ font-family: var(--font-mono);
1627
+ }
1628
+
1629
+ .kanban-pipeline-status.pipeline-active {
1630
+ background: rgba(77, 171, 247, 0.1);
1631
+ color: var(--accent);
1632
+ animation: pipeline-pulse 1.5s ease-in-out infinite;
1633
+ }
1634
+
1635
+ .kanban-pipeline-status.pipeline-completed {
1636
+ background: rgba(64, 192, 87, 0.1);
1637
+ color: #40c057;
1638
+ }
1639
+
1640
+ .kanban-pipeline-status.pipeline-failed {
1641
+ background: rgba(255, 107, 107, 0.1);
1642
+ color: var(--error-color);
1643
+ }
1644
+
1645
+ .kanban-pipeline-status.pipeline-blocked {
1646
+ background: rgba(255, 107, 107, 0.1);
1647
+ color: var(--error-color);
1648
+ }
1649
+
1650
+ .kanban-pipeline-status.pipeline-interrupted {
1651
+ background: rgba(255, 193, 7, 0.1);
1652
+ color: #f59e0b;
1653
+ }
1654
+
1655
+ @keyframes pipeline-pulse {
1656
+ 0%, 100% { opacity: 1; }
1657
+ 50% { opacity: 0.5; }
1658
+ }
1659
+
1660
+ /* Task list accordion */
1661
+ .kanban-task-list {
1662
+ margin-top: 4px;
1663
+ }
1664
+
1665
+ .kanban-task-list-toggle {
1666
+ background: none;
1667
+ border: none;
1668
+ color: var(--text-secondary);
1669
+ font-size: 11px;
1670
+ font-family: var(--font-mono);
1671
+ cursor: pointer;
1672
+ padding: 2px 8px;
1673
+ width: 100%;
1674
+ text-align: left;
1675
+ display: flex;
1676
+ align-items: center;
1677
+ gap: 4px;
1678
+ }
1679
+
1680
+ .kanban-task-list-toggle:hover {
1681
+ color: var(--text-primary);
1682
+ }
1683
+
1684
+ .kanban-task-list-chevron {
1685
+ display: inline-block;
1686
+ font-size: 8px;
1687
+ transition: transform 0.15s ease;
1688
+ }
1689
+
1690
+ .kanban-task-list-chevron.expanded {
1691
+ transform: rotate(90deg);
1692
+ }
1693
+
1694
+ .kanban-task-list-items {
1695
+ padding: 4px 8px 2px 8px;
1696
+ display: flex;
1697
+ flex-direction: column;
1698
+ gap: 2px;
1699
+ }
1700
+
1701
+ .kanban-task-item {
1702
+ display: flex;
1703
+ align-items: center;
1704
+ gap: 6px;
1705
+ font-size: 10px;
1706
+ font-family: var(--font-mono);
1707
+ padding: 1px 0;
1708
+ }
1709
+
1710
+ .kanban-task-icon {
1711
+ flex-shrink: 0;
1712
+ width: 12px;
1713
+ text-align: center;
1714
+ font-size: 10px;
1715
+ }
1716
+
1717
+ .kanban-task-item.task-completed .kanban-task-icon {
1718
+ color: #40c057;
1719
+ }
1720
+
1721
+ .kanban-task-item.task-completed .kanban-task-name {
1722
+ color: var(--text-secondary);
1723
+ text-decoration: line-through;
1724
+ opacity: 0.7;
1725
+ }
1726
+
1727
+ .kanban-task-item.task-in_progress .kanban-task-icon {
1728
+ color: var(--accent);
1729
+ animation: pipeline-pulse 1.5s ease-in-out infinite;
1730
+ }
1731
+
1732
+ .kanban-task-item.task-in_progress .kanban-task-name {
1733
+ color: var(--accent);
1734
+ }
1735
+
1736
+ .kanban-task-item.task-pending .kanban-task-icon {
1737
+ color: var(--text-secondary);
1738
+ opacity: 0.5;
1739
+ }
1740
+
1741
+ .kanban-task-item.task-pending .kanban-task-name {
1742
+ color: var(--text-secondary);
1743
+ }
1744
+
1745
+ /* Side panel task list accordion */
1746
+ .panel-task-list {
1747
+ margin: 8px 0;
1748
+ border: 1px solid var(--border-color);
1749
+ border-radius: 4px;
1750
+ }
1751
+
1752
+ .panel-task-list-toggle {
1753
+ background: none;
1754
+ border: none;
1755
+ color: var(--text-secondary);
1756
+ font-size: 12px;
1757
+ font-family: var(--font-mono);
1758
+ cursor: pointer;
1759
+ padding: 6px 8px;
1760
+ width: 100%;
1761
+ text-align: left;
1762
+ display: flex;
1763
+ align-items: center;
1764
+ gap: 6px;
1765
+ }
1766
+
1767
+ .panel-task-list-toggle:hover {
1768
+ color: var(--text-primary);
1769
+ background: var(--bg-tertiary);
1770
+ }
1771
+
1772
+ .panel-task-list-chevron {
1773
+ display: inline-block;
1774
+ font-size: 9px;
1775
+ transition: transform 0.15s ease;
1776
+ }
1777
+
1778
+ .panel-task-list-chevron.expanded {
1779
+ transform: rotate(90deg);
1780
+ }
1781
+
1782
+ .panel-task-list-items {
1783
+ padding: 4px 8px 6px 8px;
1784
+ display: flex;
1785
+ flex-direction: column;
1786
+ gap: 3px;
1787
+ border-top: 1px solid var(--border-color);
1788
+ }
1789
+
1790
+ /* Tool call activity indicators */
1791
+ .kanban-tool-calls {
1792
+ display: flex;
1793
+ flex-direction: column;
1794
+ gap: 2px;
1795
+ margin-top: 2px;
1796
+ padding: 2px 8px;
1797
+ }
1798
+
1799
+ .kanban-tool-badge {
1800
+ font-size: 11px;
1801
+ padding: 1px 5px;
1802
+ border-radius: 3px;
1803
+ font-family: var(--font-mono);
1804
+ background: rgba(77, 171, 247, 0.15);
1805
+ color: var(--accent-blue, #4dabf7);
1806
+ }
1807
+
1808
+ /* Work Summary (Side Panel) */
1809
+ .panel-work-summary {
1810
+ margin-top: 12px;
1811
+ border-top: 1px solid var(--border-color);
1812
+ padding-top: 8px;
1813
+ }
1814
+
1815
+ .panel-work-summary-toggle {
1816
+ background: none;
1817
+ border: none;
1818
+ color: var(--text-secondary);
1819
+ font-size: 13px;
1820
+ font-family: var(--font-mono);
1821
+ cursor: pointer;
1822
+ padding: 4px 0;
1823
+ width: 100%;
1824
+ text-align: left;
1825
+ }
1826
+
1827
+ .panel-work-summary-toggle:hover {
1828
+ color: var(--text-primary);
1829
+ }
1830
+
1831
+ .panel-work-summary-details {
1832
+ margin-top: 8px;
1833
+ font-size: 12px;
1834
+ color: var(--text-secondary);
1835
+ }
1836
+
1837
+ .panel-work-summary-cycle {
1838
+ margin-bottom: 12px;
1839
+ padding-bottom: 8px;
1840
+ border-bottom: 1px solid var(--border-color);
1841
+ }
1842
+
1843
+ .panel-work-summary-cycle:last-child {
1844
+ border-bottom: none;
1845
+ margin-bottom: 0;
1846
+ }
1847
+
1848
+ .panel-work-summary-cycle-header {
1849
+ font-weight: 600;
1850
+ font-family: var(--font-mono);
1851
+ color: var(--text-primary);
1852
+ margin-bottom: 4px;
1853
+ }
1854
+
1855
+ .panel-work-summary-label {
1856
+ font-weight: 600;
1857
+ color: var(--text-secondary);
1858
+ font-family: var(--font-mono);
1859
+ font-size: 11px;
1860
+ text-transform: uppercase;
1861
+ letter-spacing: 0.3px;
1862
+ }
1863
+
1864
+ .panel-work-summary-files ul,
1865
+ .panel-work-summary-decisions ul {
1866
+ margin: 4px 0 8px 16px;
1867
+ padding: 0;
1868
+ list-style: disc;
1869
+ }
1870
+
1871
+ .panel-work-summary-files li,
1872
+ .panel-work-summary-decisions li {
1873
+ font-family: var(--font-mono);
1874
+ font-size: 11px;
1875
+ line-height: 1.5;
1876
+ word-break: break-all;
1877
+ }
1878
+
1879
+ .panel-work-summary-approach p {
1880
+ margin: 4px 0 8px 0;
1881
+ font-size: 12px;
1882
+ line-height: 1.5;
1883
+ }
1884
+
1885
+ .panel-work-summary-files-created .panel-work-summary-label {
1886
+ color: #4caf50;
1887
+ }
1888
+
1889
+ .panel-work-summary-files-updated .panel-work-summary-label {
1890
+ color: #ff9800;
1891
+ }
1892
+
1893
+ .panel-work-summary-files-deleted .panel-work-summary-label {
1894
+ color: #f44336;
1895
+ }
1896
+
1897
+ /* Graph Legend */
1898
+ .graph-legend {
1899
+ position: fixed;
1900
+ bottom: 16px;
1901
+ left: 16px;
1902
+ background: var(--bg-secondary);
1903
+ border: 1px solid var(--border-color);
1904
+ border-radius: 6px;
1905
+ z-index: 150;
1906
+ max-height: calc(100vh - 116px);
1907
+ overflow-y: auto;
1908
+ min-width: 180px;
1909
+ box-shadow: 0 2px 8px var(--panel-shadow);
1910
+ }
1911
+
1912
+ .legend-header {
1913
+ display: flex;
1914
+ align-items: center;
1915
+ gap: 6px;
1916
+ padding: 8px 12px;
1917
+ color: var(--text-secondary);
1918
+ font-family: var(--font-mono);
1919
+ font-size: 11px;
1920
+ font-weight: 600;
1921
+ text-transform: uppercase;
1922
+ letter-spacing: 0.5px;
1923
+ }
1924
+
1925
+ .legend-body {
1926
+ padding: 0 12px 10px;
1927
+ }
1928
+
1929
+ .legend-edges-toggle {
1930
+ display: flex;
1931
+ align-items: center;
1932
+ gap: 6px;
1933
+ width: 100%;
1934
+ padding: 6px 12px;
1935
+ background: transparent;
1936
+ border: none;
1937
+ border-top: 1px solid var(--border-color);
1938
+ color: var(--text-secondary);
1939
+ font-family: var(--font-mono);
1940
+ font-size: 11px;
1941
+ font-weight: 600;
1942
+ cursor: pointer;
1943
+ text-transform: uppercase;
1944
+ letter-spacing: 0.5px;
1945
+ }
1946
+
1947
+ .legend-edges-toggle:hover {
1948
+ color: var(--text-primary);
1949
+ }
1950
+
1951
+ .legend-toggle-icon {
1952
+ font-size: 9px;
1953
+ }
1954
+
1955
+ .legend-edges-body {
1956
+ padding: 0 12px 10px;
1957
+ }
1958
+
1959
+ .legend-edges-body.collapsed {
1960
+ display: none;
1961
+ }
1962
+
1963
+ .legend-section {
1964
+ margin-top: 8px;
1965
+ }
1966
+
1967
+ .legend-section:first-child {
1968
+ margin-top: 0;
1969
+ }
1970
+
1971
+ .legend-section-title {
1972
+ font-size: 10px;
1973
+ color: var(--text-muted);
1974
+ text-transform: uppercase;
1975
+ letter-spacing: 0.3px;
1976
+ margin-bottom: 4px;
1977
+ }
1978
+
1979
+ .legend-items {
1980
+ display: flex;
1981
+ flex-direction: column;
1982
+ gap: 3px;
1983
+ }
1984
+
1985
+ .legend-item {
1986
+ display: flex;
1987
+ align-items: center;
1988
+ gap: 8px;
1989
+ }
1990
+
1991
+ .legend-type-toggle {
1992
+ cursor: pointer;
1993
+ opacity: 0.4;
1994
+ transition: opacity 0.15s;
1995
+ border-radius: 4px;
1996
+ padding: 2px 4px;
1997
+ margin: -2px -4px;
1998
+ }
1999
+
2000
+ .legend-type-toggle.active {
2001
+ opacity: 1;
2002
+ }
2003
+
2004
+ .legend-type-toggle:hover {
2005
+ background: var(--bg-tertiary);
2006
+ }
2007
+
2008
+ .legend-node-swatch {
2009
+ width: 12px;
2010
+ height: 12px;
2011
+ border-radius: 50%;
2012
+ flex-shrink: 0;
2013
+ }
2014
+
2015
+ .legend-node-svg {
2016
+ flex-shrink: 0;
2017
+ }
2018
+
2019
+ .legend-edge-swatch {
2020
+ width: 20px;
2021
+ height: 3px;
2022
+ border-radius: 1px;
2023
+ flex-shrink: 0;
2024
+ }
2025
+
2026
+ .legend-item-label {
2027
+ font-size: 11px;
2028
+ color: var(--text-secondary);
2029
+ white-space: nowrap;
2030
+ }
2031
+
2032
+ /* Node sizing explanation */
2033
+ .legend-size-explanation {
2034
+ display: flex;
2035
+ align-items: center;
2036
+ gap: 6px;
2037
+ }
2038
+
2039
+ .legend-size-small {
2040
+ width: 8px;
2041
+ height: 8px;
2042
+ border-radius: 50%;
2043
+ background: var(--text-muted);
2044
+ }
2045
+
2046
+ .legend-size-arrow {
2047
+ font-size: 10px;
2048
+ color: var(--text-muted);
2049
+ }
2050
+
2051
+ .legend-size-large {
2052
+ width: 18px;
2053
+ height: 18px;
2054
+ border-radius: 50%;
2055
+ background: var(--text-muted);
2056
+ }
2057
+
2058
+ /* Node border indicators */
2059
+ .legend-border-yellow {
2060
+ background: var(--bg-tertiary) !important;
2061
+ border: 2px solid #ffd43b;
2062
+ }
2063
+
2064
+ .legend-border-red {
2065
+ background: var(--bg-tertiary) !important;
2066
+ border: 2px solid #ff6b6b;
2067
+ }
2068
+
2069
+ /* Gap indicators — pulsing ring for nodes with open questions */
2070
+ .gap-pulse-ring {
2071
+ animation: gap-pulse 2s ease-in-out infinite;
2072
+ }
2073
+
2074
+ @keyframes gap-pulse {
2075
+ 0%, 100% { stroke-opacity: 0.8; stroke-width: 2; }
2076
+ 50% { stroke-opacity: 0.2; stroke-width: 4; }
2077
+ }
2078
+
2079
+ .gap-warning-icon {
2080
+ fill: #ff6b6b;
2081
+ filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.5));
2082
+ }
2083
+
2084
+ /* Legend gap indicator swatches */
2085
+ .legend-gap-pulse {
2086
+ background: var(--bg-tertiary) !important;
2087
+ border: 2px solid #ff6b6b;
2088
+ animation: legend-gap-pulse 2s ease-in-out infinite;
2089
+ box-shadow: 0 0 0 0 rgba(255, 107, 107, 0.4);
2090
+ }
2091
+
2092
+ @keyframes legend-gap-pulse {
2093
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(255, 107, 107, 0.4); }
2094
+ 50% { box-shadow: 0 0 0 3px rgba(255, 107, 107, 0.1); }
2095
+ }
2096
+
2097
+ /* Node search */
2098
+
2099
+ .search-input {
2100
+ flex: 1;
2101
+ min-width: 0;
2102
+ height: 28px;
2103
+ padding: 0 8px;
2104
+ background: var(--bg-tertiary);
2105
+ border: 1px solid var(--border-color);
2106
+ border-radius: 4px;
2107
+ color: var(--text-primary);
2108
+ font-family: var(--font-mono);
2109
+ font-size: 11px;
2110
+ outline: none;
2111
+ transition: border-color 0.15s;
2112
+ }
2113
+
2114
+ .search-input:focus {
2115
+ border-color: var(--accent);
2116
+ }
2117
+
2118
+ .search-input::placeholder {
2119
+ color: var(--text-muted);
2120
+ }
2121
+
2122
+ /* Node type toggle chips */
2123
+ .type-toggle-container {
2124
+ display: flex;
2125
+ flex-wrap: wrap;
2126
+ gap: 4px;
2127
+ padding: 8px 10px;
2128
+ border-bottom: 1px solid var(--border-color);
2129
+ }
2130
+
2131
+ .type-toggle-chip {
2132
+ display: inline-flex;
2133
+ align-items: center;
2134
+ gap: 4px;
2135
+ padding: 2px 8px 2px 4px;
2136
+ background: var(--bg-tertiary);
2137
+ border: 1px solid var(--border-color);
2138
+ border-radius: 12px;
2139
+ color: var(--text-muted);
2140
+ font-family: var(--font-mono);
2141
+ font-size: 10px;
2142
+ cursor: pointer;
2143
+ transition: opacity 0.15s, border-color 0.15s, color 0.15s;
2144
+ opacity: 0.4;
2145
+ }
2146
+
2147
+ .type-toggle-chip.active {
2148
+ opacity: 1;
2149
+ color: var(--text-secondary);
2150
+ border-color: var(--text-muted);
2151
+ }
2152
+
2153
+ .type-toggle-chip:hover {
2154
+ border-color: var(--accent);
2155
+ }
2156
+
2157
+ .type-toggle-icon {
2158
+ flex-shrink: 0;
2159
+ }
2160
+
2161
+ .type-toggle-label {
2162
+ white-space: nowrap;
2163
+ }
2164
+
2165
+ .search-results {
2166
+ display: none;
2167
+ position: absolute;
2168
+ bottom: 100%;
2169
+ left: 0;
2170
+ margin-bottom: 4px;
2171
+ min-width: 300px;
2172
+ max-height: 280px;
2173
+ overflow-y: auto;
2174
+ background: var(--bg-secondary);
2175
+ border: 1px solid var(--border-color);
2176
+ border-radius: 4px;
2177
+ box-shadow: 0 4px 12px var(--panel-shadow);
2178
+ z-index: 300;
2179
+ }
2180
+
2181
+ .search-result-item {
2182
+ display: flex;
2183
+ align-items: center;
2184
+ gap: 8px;
2185
+ padding: 6px 10px;
2186
+ cursor: pointer;
2187
+ transition: background 0.1s;
2188
+ }
2189
+
2190
+ .search-result-item:hover,
2191
+ .search-result-item.highlighted {
2192
+ background: var(--bg-tertiary);
2193
+ }
2194
+
2195
+ .search-result-type {
2196
+ font-size: 9px;
2197
+ color: var(--text-muted);
2198
+ text-transform: uppercase;
2199
+ letter-spacing: 0.3px;
2200
+ background: var(--bg-primary);
2201
+ padding: 1px 6px;
2202
+ border-radius: 3px;
2203
+ flex-shrink: 0;
2204
+ min-width: 40px;
2205
+ text-align: center;
2206
+ }
2207
+
2208
+ .search-result-name {
2209
+ font-size: 12px;
2210
+ color: var(--text-primary);
2211
+ overflow: hidden;
2212
+ text-overflow: ellipsis;
2213
+ white-space: nowrap;
2214
+ }
2215
+
2216
+ /* Coherence Review container */
2217
+ #coherence-container {
2218
+ display: none;
2219
+ width: 100%;
2220
+ height: calc(100vh - 44px);
2221
+ overflow-y: auto;
2222
+ padding: 24px;
2223
+ }
2224
+
2225
+ .coherence-panel {
2226
+ max-width: 800px;
2227
+ margin: 0 auto;
2228
+ }
2229
+
2230
+ .coherence-header {
2231
+ display: flex;
2232
+ align-items: center;
2233
+ justify-content: space-between;
2234
+ margin-bottom: 20px;
2235
+ padding-bottom: 16px;
2236
+ border-bottom: 1px solid var(--border-color);
2237
+ }
2238
+
2239
+ .coherence-header-left {
2240
+ display: flex;
2241
+ flex-direction: column;
2242
+ gap: 4px;
2243
+ }
2244
+
2245
+ .coherence-title {
2246
+ font-size: 16px;
2247
+ font-weight: 600;
2248
+ color: var(--text-primary);
2249
+ }
2250
+
2251
+ .coherence-last-review {
2252
+ font-size: 11px;
2253
+ color: var(--text-muted);
2254
+ }
2255
+
2256
+ .coherence-run-btn {
2257
+ padding: 8px 16px;
2258
+ background: transparent;
2259
+ border: 1px solid var(--accent);
2260
+ border-radius: 4px;
2261
+ color: var(--accent);
2262
+ font-family: var(--font-mono);
2263
+ font-size: 12px;
2264
+ cursor: pointer;
2265
+ transition: background 0.15s, color 0.15s;
2266
+ }
2267
+
2268
+ .coherence-run-btn:hover:not(:disabled) {
2269
+ background: var(--accent);
2270
+ color: #fff;
2271
+ }
2272
+
2273
+ .coherence-run-btn:disabled {
2274
+ opacity: 0.6;
2275
+ cursor: not-allowed;
2276
+ }
2277
+
2278
+ .coherence-run-btn.running {
2279
+ animation: pipeline-pulse 1.5s ease-in-out infinite;
2280
+ }
2281
+
2282
+ .coherence-running-banner {
2283
+ background: rgba(77, 171, 247, 0.08);
2284
+ border: 1px solid rgba(77, 171, 247, 0.2);
2285
+ border-radius: 4px;
2286
+ padding: 12px 16px;
2287
+ margin-bottom: 16px;
2288
+ font-size: 12px;
2289
+ color: var(--accent);
2290
+ animation: pipeline-pulse 1.5s ease-in-out infinite;
2291
+ }
2292
+
2293
+ .coherence-section {
2294
+ margin-bottom: 24px;
2295
+ }
2296
+
2297
+ .coherence-section-title {
2298
+ font-size: 13px;
2299
+ font-weight: 600;
2300
+ color: var(--text-primary);
2301
+ margin-bottom: 12px;
2302
+ text-transform: uppercase;
2303
+ letter-spacing: 0.5px;
2304
+ }
2305
+
2306
+ .coherence-empty {
2307
+ font-size: 12px;
2308
+ color: var(--text-muted);
2309
+ padding: 24px;
2310
+ text-align: center;
2311
+ background: var(--bg-secondary);
2312
+ border: 1px dashed var(--border-color);
2313
+ border-radius: 6px;
2314
+ }
2315
+
2316
+ /* Coherence proposal cards */
2317
+ .coherence-proposal {
2318
+ background: var(--bg-secondary);
2319
+ border: 1px solid var(--border-color);
2320
+ border-radius: 6px;
2321
+ padding: 14px 16px;
2322
+ margin-bottom: 10px;
2323
+ transition: border-color 0.15s;
2324
+ }
2325
+
2326
+ .coherence-proposal:hover {
2327
+ border-color: var(--text-muted);
2328
+ }
2329
+
2330
+ .coherence-proposal.approved {
2331
+ border-left: 3px solid #40c057;
2332
+ opacity: 0.7;
2333
+ }
2334
+
2335
+ .coherence-proposal.dismissed {
2336
+ border-left: 3px solid var(--text-muted);
2337
+ opacity: 0.5;
2338
+ }
2339
+
2340
+ .coherence-proposal-header {
2341
+ display: flex;
2342
+ align-items: center;
2343
+ gap: 8px;
2344
+ margin-bottom: 8px;
2345
+ }
2346
+
2347
+ .coherence-proposal-type {
2348
+ font-size: 10px;
2349
+ font-weight: 600;
2350
+ text-transform: uppercase;
2351
+ letter-spacing: 0.5px;
2352
+ padding: 2px 8px;
2353
+ border-radius: 3px;
2354
+ }
2355
+
2356
+ .coherence-type-add-edge {
2357
+ color: var(--accent);
2358
+ background: rgba(77, 171, 247, 0.12);
2359
+ }
2360
+
2361
+ .coherence-type-add-node {
2362
+ color: #ffd43b;
2363
+ background: rgba(255, 212, 59, 0.12);
2364
+ }
2365
+
2366
+ .coherence-type-remove-edge {
2367
+ color: #ff6b6b;
2368
+ background: rgba(255, 107, 107, 0.12);
2369
+ }
2370
+
2371
+ .coherence-type-deprecate-node {
2372
+ color: #ff6b6b;
2373
+ background: rgba(255, 107, 107, 0.12);
2374
+ }
2375
+
2376
+ .coherence-type-update-desc {
2377
+ color: #51cf66;
2378
+ background: rgba(81, 207, 102, 0.12);
2379
+ }
2380
+
2381
+ /* Legacy type classes */
2382
+ .coherence-type-edge {
2383
+ color: var(--accent);
2384
+ background: rgba(77, 171, 247, 0.12);
2385
+ }
2386
+
2387
+ .coherence-type-node {
2388
+ color: #ffd43b;
2389
+ background: rgba(255, 212, 59, 0.12);
2390
+ }
2391
+
2392
+ .coherence-proposal-status-badge {
2393
+ font-size: 10px;
2394
+ padding: 2px 8px;
2395
+ border-radius: 3px;
2396
+ font-weight: 600;
2397
+ text-transform: capitalize;
2398
+ }
2399
+
2400
+ .coherence-status-approved {
2401
+ color: #40c057;
2402
+ background: rgba(64, 192, 87, 0.12);
2403
+ }
2404
+
2405
+ .coherence-status-dismissed {
2406
+ color: var(--text-muted);
2407
+ background: var(--bg-tertiary);
2408
+ }
2409
+
2410
+ .coherence-proposal-edge {
2411
+ font-size: 12px;
2412
+ margin-bottom: 8px;
2413
+ line-height: 1.5;
2414
+ }
2415
+
2416
+ .coherence-node-ref {
2417
+ color: var(--accent);
2418
+ cursor: pointer;
2419
+ text-decoration: none;
2420
+ }
2421
+
2422
+ .coherence-node-ref:hover {
2423
+ text-decoration: underline;
2424
+ }
2425
+
2426
+ .coherence-edge-arrow {
2427
+ color: var(--text-muted);
2428
+ font-size: 11px;
2429
+ }
2430
+
2431
+ .coherence-proposal-node {
2432
+ display: flex;
2433
+ align-items: center;
2434
+ gap: 8px;
2435
+ margin-bottom: 8px;
2436
+ }
2437
+
2438
+ .coherence-node-type-badge {
2439
+ font-size: 10px;
2440
+ color: var(--text-muted);
2441
+ text-transform: uppercase;
2442
+ letter-spacing: 0.3px;
2443
+ background: var(--bg-tertiary);
2444
+ padding: 2px 8px;
2445
+ border-radius: 3px;
2446
+ }
2447
+
2448
+ .coherence-node-name {
2449
+ font-size: 12px;
2450
+ font-weight: 500;
2451
+ color: var(--text-primary);
2452
+ }
2453
+
2454
+ .coherence-suggested-edges {
2455
+ margin-bottom: 8px;
2456
+ padding-left: 12px;
2457
+ }
2458
+
2459
+ .coherence-suggested-label {
2460
+ font-size: 10px;
2461
+ color: var(--text-muted);
2462
+ text-transform: uppercase;
2463
+ letter-spacing: 0.3px;
2464
+ }
2465
+
2466
+ .coherence-suggested-edge {
2467
+ font-size: 11px;
2468
+ color: var(--text-secondary);
2469
+ padding: 2px 0;
2470
+ }
2471
+
2472
+ .coherence-proposal-reasoning {
2473
+ font-size: 12px;
2474
+ color: var(--text-secondary);
2475
+ line-height: 1.5;
2476
+ margin-bottom: 10px;
2477
+ padding: 8px 10px;
2478
+ background: var(--bg-tertiary);
2479
+ border-radius: 4px;
2480
+ }
2481
+
2482
+ .coherence-proposal-actions {
2483
+ display: flex;
2484
+ gap: 8px;
2485
+ }
2486
+
2487
+ .coherence-approve-btn,
2488
+ .coherence-dismiss-btn {
2489
+ padding: 5px 14px;
2490
+ border-radius: 4px;
2491
+ font-family: var(--font-mono);
2492
+ font-size: 11px;
2493
+ cursor: pointer;
2494
+ transition: background 0.15s, color 0.15s;
2495
+ }
2496
+
2497
+ .coherence-approve-btn {
2498
+ background: transparent;
2499
+ border: 1px solid #40c057;
2500
+ color: #40c057;
2501
+ }
2502
+
2503
+ .coherence-approve-btn:hover:not(:disabled) {
2504
+ background: #40c057;
2505
+ color: #fff;
2506
+ }
2507
+
2508
+ .coherence-approve-btn:disabled {
2509
+ opacity: 0.6;
2510
+ cursor: not-allowed;
2511
+ }
2512
+
2513
+ .coherence-dismiss-btn {
2514
+ background: transparent;
2515
+ border: 1px solid var(--border-color);
2516
+ color: var(--text-secondary);
2517
+ }
2518
+
2519
+ .coherence-dismiss-btn:hover {
2520
+ border-color: var(--text-primary);
2521
+ color: var(--text-primary);
2522
+ }
2523
+
2524
+ .coherence-resolved-toggle {
2525
+ display: flex;
2526
+ align-items: center;
2527
+ gap: 6px;
2528
+ width: 100%;
2529
+ padding: 8px 0;
2530
+ background: transparent;
2531
+ border: none;
2532
+ color: var(--text-secondary);
2533
+ font-family: var(--font-mono);
2534
+ font-size: 12px;
2535
+ font-weight: 600;
2536
+ cursor: pointer;
2537
+ text-transform: uppercase;
2538
+ letter-spacing: 0.5px;
2539
+ margin-bottom: 8px;
2540
+ }
2541
+
2542
+ .coherence-resolved-toggle:hover {
2543
+ color: var(--text-primary);
2544
+ }
2545
+
2546
+ .coherence-toggle-icon {
2547
+ font-size: 9px;
2548
+ }
2549
+
2550
+ .coherence-resolved-list.collapsed {
2551
+ display: none;
2552
+ }
2553
+
2554
+ /* Confidence badges */
2555
+ .coherence-confidence {
2556
+ font-size: 10px;
2557
+ font-weight: 600;
2558
+ padding: 2px 8px;
2559
+ border-radius: 3px;
2560
+ text-transform: capitalize;
2561
+ }
2562
+
2563
+ .coherence-confidence-high {
2564
+ color: #40c057;
2565
+ background: rgba(64, 192, 87, 0.12);
2566
+ }
2567
+
2568
+ .coherence-confidence-medium {
2569
+ color: #fab005;
2570
+ background: rgba(250, 176, 5, 0.12);
2571
+ }
2572
+
2573
+ .coherence-confidence-low {
2574
+ color: var(--text-muted);
2575
+ background: var(--bg-tertiary);
2576
+ }
2577
+
2578
+ /* Conflict warning */
2579
+ .coherence-proposal-conflict {
2580
+ border-color: #ff6b6b;
2581
+ }
2582
+
2583
+ .coherence-conflict-warning {
2584
+ font-size: 11px;
2585
+ color: #ff6b6b;
2586
+ background: rgba(255, 107, 107, 0.08);
2587
+ border: 1px solid rgba(255, 107, 107, 0.2);
2588
+ border-radius: 4px;
2589
+ padding: 6px 10px;
2590
+ margin-bottom: 8px;
2591
+ }
2592
+
2593
+ /* Partial run warning */
2594
+ .coherence-warning-banner {
2595
+ background: rgba(250, 176, 5, 0.08);
2596
+ border: 1px solid rgba(250, 176, 5, 0.2);
2597
+ border-radius: 4px;
2598
+ padding: 10px 16px;
2599
+ margin-bottom: 16px;
2600
+ font-size: 12px;
2601
+ color: #fab005;
2602
+ }
2603
+
2604
+ /* No issues found */
2605
+ .coherence-no-issues {
2606
+ color: #40c057;
2607
+ border-color: rgba(64, 192, 87, 0.3);
2608
+ background: rgba(64, 192, 87, 0.06);
2609
+ }
2610
+
2611
+ /* Removal styling */
2612
+ .coherence-proposal-remove {
2613
+ text-decoration: line-through;
2614
+ opacity: 0.8;
2615
+ }
2616
+
2617
+ .coherence-removal-edge {
2618
+ color: #ff6b6b;
2619
+ }
2620
+
2621
+ /* Affected edges (deprecate_node) */
2622
+ .coherence-affected-edges {
2623
+ margin-bottom: 8px;
2624
+ padding-left: 12px;
2625
+ }
2626
+
2627
+ /* Proposed description preview */
2628
+ .coherence-proposed-desc {
2629
+ margin-bottom: 8px;
2630
+ }
2631
+
2632
+ .coherence-desc-preview {
2633
+ font-size: 11px;
2634
+ color: var(--text-secondary);
2635
+ background: var(--bg-tertiary);
2636
+ border-radius: 4px;
2637
+ padding: 8px 10px;
2638
+ margin-top: 4px;
2639
+ white-space: pre-wrap;
2640
+ max-height: 120px;
2641
+ overflow-y: auto;
2642
+ }
2643
+
2644
+ /* Update description styling */
2645
+ .coherence-proposal-update {
2646
+ margin-bottom: 8px;
2647
+ }
2648
+
2649
+ /* Batch cards */
2650
+ .coherence-batch {
2651
+ background: var(--bg-secondary);
2652
+ border: 1px solid var(--border-color);
2653
+ border-radius: 6px;
2654
+ padding: 14px 16px;
2655
+ margin-bottom: 10px;
2656
+ }
2657
+
2658
+ .coherence-batch-header {
2659
+ display: flex;
2660
+ align-items: center;
2661
+ justify-content: space-between;
2662
+ margin-bottom: 8px;
2663
+ }
2664
+
2665
+ .coherence-batch-info {
2666
+ display: flex;
2667
+ align-items: center;
2668
+ gap: 8px;
2669
+ }
2670
+
2671
+ .coherence-batch-badge {
2672
+ font-size: 10px;
2673
+ font-weight: 600;
2674
+ color: var(--accent);
2675
+ background: rgba(77, 171, 247, 0.12);
2676
+ padding: 2px 8px;
2677
+ border-radius: 3px;
2678
+ }
2679
+
2680
+ .coherence-batch-types {
2681
+ font-size: 11px;
2682
+ color: var(--text-muted);
2683
+ }
2684
+
2685
+ .coherence-batch-actions {
2686
+ display: flex;
2687
+ gap: 8px;
2688
+ }
2689
+
2690
+ .coherence-batch-expand-btn {
2691
+ padding: 4px 10px;
2692
+ background: transparent;
2693
+ border: 1px solid var(--border-color);
2694
+ border-radius: 4px;
2695
+ color: var(--text-secondary);
2696
+ font-family: var(--font-mono);
2697
+ font-size: 10px;
2698
+ cursor: pointer;
2699
+ }
2700
+
2701
+ .coherence-batch-expand-btn:hover {
2702
+ border-color: var(--text-primary);
2703
+ color: var(--text-primary);
2704
+ }
2705
+
2706
+ .coherence-batch-approve-btn {
2707
+ font-size: 11px;
2708
+ }
2709
+
2710
+ .coherence-batch-summary {
2711
+ display: flex;
2712
+ flex-direction: column;
2713
+ gap: 4px;
2714
+ margin-top: 8px;
2715
+ }
2716
+
2717
+ .coherence-batch-summary-item {
2718
+ display: flex;
2719
+ align-items: center;
2720
+ gap: 8px;
2721
+ font-size: 11px;
2722
+ }
2723
+
2724
+ .coherence-batch-summary-text {
2725
+ color: var(--text-secondary);
2726
+ }
2727
+
2728
+ .coherence-batch-items {
2729
+ margin-top: 8px;
2730
+ padding-top: 8px;
2731
+ border-top: 1px solid var(--border-color);
2732
+ }
2733
+
2734
+ .coherence-batch-items .coherence-proposal {
2735
+ margin-left: 8px;
2736
+ }
2737
+
2738
+ .coherence-error {
2739
+ color: var(--error-color);
2740
+ font-size: 13px;
2741
+ padding: 24px;
2742
+ text-align: center;
2743
+ }
2744
+
2745
+ /* Error message */
2746
+ .error-msg {
2747
+ display: flex;
2748
+ align-items: center;
2749
+ justify-content: center;
2750
+ height: 100%;
2751
+ color: var(--error-color);
2752
+ font-size: 14px;
2753
+ }
2754
+
2755
+ /* Terminal View */
2756
+ .terminal-view {
2757
+ flex-direction: column;
2758
+ height: 100%;
2759
+ width: 100%;
2760
+ position: relative;
2761
+ }
2762
+
2763
+ .terminal-container {
2764
+ flex: 1;
2765
+ padding: 4px;
2766
+ background: #1e1e2e;
2767
+ min-height: 0;
2768
+ }
2769
+
2770
+ .terminal-container .xterm {
2771
+ height: 100%;
2772
+ }
2773
+
2774
+ .terminal-error {
2775
+ display: flex;
2776
+ align-items: center;
2777
+ gap: 12px;
2778
+ padding: 8px 16px;
2779
+ background: var(--error-color, #f38ba8);
2780
+ color: #1e1e2e;
2781
+ font-size: 13px;
2782
+ font-family: var(--font-mono);
2783
+ }
2784
+
2785
+ .terminal-reconnect-btn {
2786
+ padding: 4px 12px;
2787
+ border: 1px solid #1e1e2e;
2788
+ border-radius: 4px;
2789
+ background: transparent;
2790
+ color: #1e1e2e;
2791
+ cursor: pointer;
2792
+ font-size: 12px;
2793
+ }
2794
+
2795
+ .terminal-reconnect-btn:hover {
2796
+ background: rgba(0,0,0,0.15);
2797
+ }
2798
+
2799
+ .terminal-status {
2800
+ padding: 8px 16px;
2801
+ color: var(--text-secondary);
2802
+ font-size: 13px;
2803
+ font-family: var(--font-mono);
2804
+ }
2805
+
2806
+ .terminal-overlay {
2807
+ position: absolute;
2808
+ inset: 0;
2809
+ display: flex;
2810
+ align-items: center;
2811
+ justify-content: center;
2812
+ background: rgba(0,0,0,0.6);
2813
+ z-index: 10;
2814
+ }
2815
+
2816
+ .terminal-connect-btn {
2817
+ padding: 12px 24px;
2818
+ border: 1px solid var(--accent);
2819
+ border-radius: 6px;
2820
+ background: var(--accent);
2821
+ color: #fff;
2822
+ font-size: 14px;
2823
+ font-family: var(--font-mono);
2824
+ cursor: pointer;
2825
+ }
2826
+
2827
+ .terminal-connect-btn:hover {
2828
+ opacity: 0.9;
2829
+ }
2830
+
2831
+ /* Login Page */
2832
+ .login-page {
2833
+ display: flex;
2834
+ align-items: center;
2835
+ justify-content: center;
2836
+ width: 100%;
2837
+ height: 100vh;
2838
+ background: var(--bg-primary);
2839
+ }
2840
+
2841
+ .login-card {
2842
+ width: 360px;
2843
+ padding: 32px;
2844
+ background: var(--bg-secondary);
2845
+ border: 1px solid var(--border-color);
2846
+ border-radius: 4px;
2847
+ }
2848
+
2849
+ .login-header {
2850
+ display: flex;
2851
+ align-items: center;
2852
+ justify-content: space-between;
2853
+ margin-bottom: 24px;
2854
+ }
2855
+
2856
+ .login-title {
2857
+ font-family: var(--font-mono);
2858
+ font-size: 16px;
2859
+ color: var(--text-primary);
2860
+ letter-spacing: 0.5px;
2861
+ }
2862
+
2863
+ .login-theme-toggle {
2864
+ background: transparent;
2865
+ border: 1px solid var(--border-color);
2866
+ border-radius: 4px;
2867
+ color: var(--text-secondary);
2868
+ font-size: 14px;
2869
+ width: 28px;
2870
+ height: 28px;
2871
+ cursor: pointer;
2872
+ display: flex;
2873
+ align-items: center;
2874
+ justify-content: center;
2875
+ transition: border-color 0.15s, color 0.15s;
2876
+ }
2877
+
2878
+ .login-theme-toggle:hover {
2879
+ border-color: var(--text-primary);
2880
+ color: var(--text-primary);
2881
+ }
2882
+
2883
+ .login-form {
2884
+ display: flex;
2885
+ flex-direction: column;
2886
+ gap: 8px;
2887
+ }
2888
+
2889
+ .login-label {
2890
+ font-family: var(--font-mono);
2891
+ font-size: 11px;
2892
+ color: var(--text-secondary);
2893
+ margin-top: 4px;
2894
+ }
2895
+
2896
+ .login-input {
2897
+ background: var(--bg-tertiary);
2898
+ border: 1px solid var(--border-color);
2899
+ border-radius: 4px;
2900
+ color: var(--text-primary);
2901
+ font-family: var(--font-mono);
2902
+ font-size: 13px;
2903
+ padding: 8px 10px;
2904
+ outline: none;
2905
+ transition: border-color 0.15s;
2906
+ }
2907
+
2908
+ .login-input:focus {
2909
+ border-color: var(--accent);
2910
+ }
2911
+
2912
+ .login-input::placeholder {
2913
+ color: var(--text-muted);
2914
+ }
2915
+
2916
+ .login-input:disabled {
2917
+ opacity: 0.6;
2918
+ }
2919
+
2920
+ .login-error {
2921
+ font-family: var(--font-mono);
2922
+ font-size: 11px;
2923
+ color: var(--error-color);
2924
+ margin-top: 4px;
2925
+ }
2926
+
2927
+ .login-submit {
2928
+ margin-top: 12px;
2929
+ background: transparent;
2930
+ border: 1px solid var(--accent);
2931
+ border-radius: 4px;
2932
+ color: var(--accent);
2933
+ font-family: var(--font-mono);
2934
+ font-size: 13px;
2935
+ padding: 8px 14px;
2936
+ cursor: pointer;
2937
+ transition: background 0.15s, color 0.15s;
2938
+ }
2939
+
2940
+ .login-submit:hover:not(:disabled) {
2941
+ background: var(--accent);
2942
+ color: #fff;
2943
+ }
2944
+
2945
+ .login-submit:disabled {
2946
+ opacity: 0.5;
2947
+ cursor: not-allowed;
2948
+ }
2949
+
2950
+ /* Auth Pages (Register) */
2951
+ .auth-page {
2952
+ display: flex;
2953
+ align-items: center;
2954
+ justify-content: center;
2955
+ min-height: 100vh;
2956
+ background: var(--bg-primary);
2957
+ padding: 16px;
2958
+ }
2959
+
2960
+ .auth-card {
2961
+ width: 100%;
2962
+ max-width: 380px;
2963
+ background: var(--bg-secondary);
2964
+ border: 1px solid var(--border-color);
2965
+ border-radius: 6px;
2966
+ padding: 32px 28px 24px;
2967
+ }
2968
+
2969
+ .auth-header {
2970
+ margin-bottom: 24px;
2971
+ }
2972
+
2973
+ .auth-title {
2974
+ font-family: var(--font-mono);
2975
+ font-size: 16px;
2976
+ font-weight: 600;
2977
+ color: var(--text-primary);
2978
+ margin-bottom: 4px;
2979
+ }
2980
+
2981
+ .auth-subtitle {
2982
+ font-family: var(--font-mono);
2983
+ font-size: 12px;
2984
+ color: var(--text-muted);
2985
+ }
2986
+
2987
+ .auth-form {
2988
+ display: flex;
2989
+ flex-direction: column;
2990
+ gap: 16px;
2991
+ }
2992
+
2993
+ .auth-field {
2994
+ display: flex;
2995
+ flex-direction: column;
2996
+ gap: 4px;
2997
+ }
2998
+
2999
+ .auth-label {
3000
+ font-family: var(--font-mono);
3001
+ font-size: 11px;
3002
+ font-weight: 600;
3003
+ color: var(--text-secondary);
3004
+ text-transform: uppercase;
3005
+ letter-spacing: 0.3px;
3006
+ }
3007
+
3008
+ .auth-input {
3009
+ width: 100%;
3010
+ height: 36px;
3011
+ padding: 0 10px;
3012
+ background: var(--bg-tertiary);
3013
+ border: 1px solid var(--border-color);
3014
+ border-radius: 4px;
3015
+ color: var(--text-primary);
3016
+ font-family: var(--font-mono);
3017
+ font-size: 13px;
3018
+ outline: none;
3019
+ transition: border-color 0.15s;
3020
+ }
3021
+
3022
+ .auth-input:focus {
3023
+ border-color: var(--accent);
3024
+ }
3025
+
3026
+ .auth-input::placeholder {
3027
+ color: var(--text-muted);
3028
+ }
3029
+
3030
+ .auth-input-error {
3031
+ border-color: var(--error-color);
3032
+ }
3033
+
3034
+ .auth-input-error:focus {
3035
+ border-color: var(--error-color);
3036
+ }
3037
+
3038
+ .auth-field-error {
3039
+ font-family: var(--font-mono);
3040
+ font-size: 11px;
3041
+ color: var(--error-color);
3042
+ }
3043
+
3044
+ .auth-error-banner {
3045
+ font-family: var(--font-mono);
3046
+ font-size: 12px;
3047
+ color: var(--error-color);
3048
+ background: rgba(255, 107, 107, 0.08);
3049
+ border: 1px solid rgba(255, 107, 107, 0.2);
3050
+ border-radius: 4px;
3051
+ padding: 8px 12px;
3052
+ }
3053
+
3054
+ .auth-submit {
3055
+ width: 100%;
3056
+ height: 36px;
3057
+ margin-top: 4px;
3058
+ background: transparent;
3059
+ border: 1px solid var(--accent);
3060
+ border-radius: 4px;
3061
+ color: var(--accent);
3062
+ font-family: var(--font-mono);
3063
+ font-size: 13px;
3064
+ cursor: pointer;
3065
+ transition: background 0.15s, color 0.15s;
3066
+ }
3067
+
3068
+ .auth-submit:hover:not(:disabled) {
3069
+ background: var(--accent);
3070
+ color: #fff;
3071
+ }
3072
+
3073
+ .auth-submit:disabled {
3074
+ opacity: 0.6;
3075
+ cursor: not-allowed;
3076
+ }
3077
+
3078
+ .auth-success-message {
3079
+ text-align: center;
3080
+ padding: 16px 0;
3081
+ color: var(--text-primary);
3082
+ font-family: var(--font-mono);
3083
+ font-size: 13px;
3084
+ line-height: 1.6;
3085
+ }
3086
+
3087
+ .auth-back-link {
3088
+ display: inline-block;
3089
+ margin-top: 12px;
3090
+ color: var(--accent);
3091
+ font-family: var(--font-mono);
3092
+ font-size: 13px;
3093
+ text-decoration: none;
3094
+ }
3095
+
3096
+ .auth-back-link:hover {
3097
+ text-decoration: underline;
3098
+ }
3099
+
3100
+ .auth-theme-toggle {
3101
+ display: block;
3102
+ margin: 16px auto 0;
3103
+ padding: 4px 10px;
3104
+ background: transparent;
3105
+ border: 1px solid var(--border-color);
3106
+ border-radius: 4px;
3107
+ color: var(--text-muted);
3108
+ font-family: var(--font-mono);
3109
+ font-size: 11px;
3110
+ cursor: pointer;
3111
+ transition: border-color 0.15s, color 0.15s;
3112
+ }
3113
+
3114
+ .auth-theme-toggle:hover {
3115
+ border-color: var(--text-secondary);
3116
+ color: var(--text-secondary);
3117
+ }
3118
+
3119
+ /* --- Invite User Dialog --- */
3120
+ .invite-dialog-overlay {
3121
+ position: fixed;
3122
+ inset: 0;
3123
+ background: rgba(0, 0, 0, 0.5);
3124
+ display: flex;
3125
+ align-items: center;
3126
+ justify-content: center;
3127
+ z-index: 1000;
3128
+ }
3129
+
3130
+ .invite-dialog {
3131
+ background: var(--bg-primary);
3132
+ border: 1px solid var(--border-color);
3133
+ border-radius: 12px;
3134
+ padding: 24px;
3135
+ width: 400px;
3136
+ max-width: 90vw;
3137
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
3138
+ }
3139
+
3140
+ .invite-dialog-header {
3141
+ display: flex;
3142
+ justify-content: space-between;
3143
+ align-items: center;
3144
+ margin-bottom: 16px;
3145
+ }
3146
+
3147
+ .invite-dialog-header h2 {
3148
+ margin: 0;
3149
+ font-size: 18px;
3150
+ color: var(--text-primary);
3151
+ }
3152
+
3153
+ .invite-dialog-close {
3154
+ background: none;
3155
+ border: none;
3156
+ font-size: 22px;
3157
+ color: var(--text-secondary);
3158
+ cursor: pointer;
3159
+ padding: 0 4px;
3160
+ line-height: 1;
3161
+ }
3162
+
3163
+ .invite-dialog-close:hover {
3164
+ color: var(--text-primary);
3165
+ }
3166
+
3167
+ .invite-dialog-success {
3168
+ background: var(--bg-secondary);
3169
+ color: var(--accent-green, #4caf50);
3170
+ padding: 10px 14px;
3171
+ border-radius: 6px;
3172
+ margin-bottom: 12px;
3173
+ font-size: 14px;
3174
+ }
3175
+
3176
+ .invite-btn {
3177
+ color: var(--accent-green, #4caf50) !important;
3178
+ }
3179
+
3180
+ /* ── Users View ── */
3181
+
3182
+ .users-view {
3183
+ padding: 24px;
3184
+ max-width: 900px;
3185
+ margin: 0 auto;
3186
+ color: var(--text-primary);
3187
+ }
3188
+
3189
+ .users-view-header {
3190
+ display: flex;
3191
+ justify-content: space-between;
3192
+ align-items: center;
3193
+ margin-bottom: 20px;
3194
+ }
3195
+
3196
+ .users-view-header h2 {
3197
+ font-size: 20px;
3198
+ font-weight: 600;
3199
+ margin: 0;
3200
+ }
3201
+
3202
+ .users-invite-btn {
3203
+ background: var(--accent);
3204
+ color: #fff;
3205
+ border: none;
3206
+ border-radius: 6px;
3207
+ padding: 8px 16px;
3208
+ font-size: 14px;
3209
+ cursor: pointer;
3210
+ font-family: var(--font-mono);
3211
+ }
3212
+
3213
+ .users-invite-btn:hover {
3214
+ opacity: 0.9;
3215
+ }
3216
+
3217
+ .users-error {
3218
+ background: rgba(255, 107, 107, 0.15);
3219
+ color: var(--error-color);
3220
+ padding: 10px 14px;
3221
+ border-radius: 6px;
3222
+ margin-bottom: 16px;
3223
+ font-size: 14px;
3224
+ display: flex;
3225
+ justify-content: space-between;
3226
+ align-items: center;
3227
+ }
3228
+
3229
+ .users-error-dismiss {
3230
+ background: none;
3231
+ border: none;
3232
+ color: var(--error-color);
3233
+ font-size: 18px;
3234
+ cursor: pointer;
3235
+ padding: 0 4px;
3236
+ }
3237
+
3238
+ .users-loading {
3239
+ color: var(--text-secondary);
3240
+ padding: 40px 0;
3241
+ text-align: center;
3242
+ }
3243
+
3244
+ .users-section {
3245
+ margin-bottom: 28px;
3246
+ }
3247
+
3248
+ .users-section h3 {
3249
+ font-size: 15px;
3250
+ font-weight: 600;
3251
+ color: var(--text-secondary);
3252
+ margin-bottom: 10px;
3253
+ }
3254
+
3255
+ .users-table {
3256
+ width: 100%;
3257
+ border-collapse: collapse;
3258
+ font-size: 14px;
3259
+ font-family: var(--font-mono);
3260
+ }
3261
+
3262
+ .users-table th {
3263
+ text-align: left;
3264
+ padding: 8px 12px;
3265
+ border-bottom: 1px solid var(--border-color);
3266
+ color: var(--text-muted);
3267
+ font-weight: 500;
3268
+ font-size: 12px;
3269
+ text-transform: uppercase;
3270
+ letter-spacing: 0.5px;
3271
+ }
3272
+
3273
+ .users-table td {
3274
+ padding: 10px 12px;
3275
+ border-bottom: 1px solid var(--border-color);
3276
+ color: var(--text-primary);
3277
+ }
3278
+
3279
+ .users-table tr:hover {
3280
+ background: var(--bg-tertiary);
3281
+ }
3282
+
3283
+ .users-current-row {
3284
+ background: var(--bg-secondary);
3285
+ }
3286
+
3287
+ .users-past-row {
3288
+ opacity: 0.7;
3289
+ }
3290
+
3291
+ .users-role-badge {
3292
+ display: inline-block;
3293
+ padding: 2px 8px;
3294
+ border-radius: 4px;
3295
+ font-size: 12px;
3296
+ font-weight: 500;
3297
+ }
3298
+
3299
+ .users-role-admin {
3300
+ background: rgba(77, 171, 247, 0.15);
3301
+ color: var(--accent);
3302
+ }
3303
+
3304
+ .users-role-user {
3305
+ background: var(--bg-tertiary);
3306
+ color: var(--text-secondary);
3307
+ }
3308
+
3309
+ .users-you-badge {
3310
+ font-size: 12px;
3311
+ color: var(--text-muted);
3312
+ font-style: italic;
3313
+ }
3314
+
3315
+ .users-status-badge {
3316
+ display: inline-block;
3317
+ padding: 2px 8px;
3318
+ border-radius: 4px;
3319
+ font-size: 12px;
3320
+ font-weight: 500;
3321
+ }
3322
+
3323
+ .users-status-accepted {
3324
+ background: rgba(105, 219, 124, 0.15);
3325
+ color: var(--completeness-fill);
3326
+ }
3327
+
3328
+ .users-status-expired {
3329
+ background: rgba(255, 107, 107, 0.15);
3330
+ color: var(--error-color);
3331
+ }
3332
+
3333
+ .users-delete-btn {
3334
+ background: none;
3335
+ border: 1px solid var(--border-color);
3336
+ color: var(--error-color);
3337
+ border-radius: 4px;
3338
+ padding: 4px 10px;
3339
+ font-size: 12px;
3340
+ cursor: pointer;
3341
+ font-family: var(--font-mono);
3342
+ }
3343
+
3344
+ .users-delete-btn:hover {
3345
+ background: rgba(255, 107, 107, 0.1);
3346
+ border-color: var(--error-color);
3347
+ }
3348
+
3349
+ .users-delete-btn:disabled {
3350
+ opacity: 0.5;
3351
+ cursor: not-allowed;
3352
+ }
3353
+
3354
+ .users-empty {
3355
+ color: var(--text-muted);
3356
+ font-size: 14px;
3357
+ padding: 12px 0;
3358
+ }