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