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