@pennyfarthing/core 11.3.7 → 11.4.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 (405) hide show
  1. package/README.md +1 -1
  2. package/package.json +17 -16
  3. package/packages/core/dist/public/css/react.css +1 -1
  4. package/packages/core/dist/public/js/react/react.js +24 -24
  5. package/packages/core/src/public/App.tsx +356 -0
  6. package/packages/core/src/public/components/AgentLoadDialog.tsx +202 -0
  7. package/packages/core/src/public/components/AgentPopup.tsx +308 -0
  8. package/packages/core/src/public/components/ApprovalModal/ApprovalModal.css +35 -0
  9. package/packages/core/src/public/components/ApprovalModal/index.tsx +632 -0
  10. package/packages/core/src/public/components/BikeRackIndex.tsx +53 -0
  11. package/packages/core/src/public/components/BikeRackWorkspace.tsx +217 -0
  12. package/packages/core/src/public/components/CommandPalette.tsx +554 -0
  13. package/packages/core/src/public/components/ConfirmDialog.tsx +168 -0
  14. package/packages/core/src/public/components/ContextIndicator/ContextIndicator.css +85 -0
  15. package/packages/core/src/public/components/ContextIndicator/index.tsx +330 -0
  16. package/packages/core/src/public/components/ContextSparkline.tsx +56 -0
  17. package/packages/core/src/public/components/ControlBar.tsx +636 -0
  18. package/packages/core/src/public/components/DeadCodeDialog.tsx +169 -0
  19. package/packages/core/src/public/components/DiffViewer.tsx +585 -0
  20. package/packages/core/src/public/components/DockviewWorkspace.tsx +749 -0
  21. package/packages/core/src/public/components/Editor.tsx +630 -0
  22. package/packages/core/src/public/components/ErrorBoundary.tsx +67 -0
  23. package/packages/core/src/public/components/FileTree.tsx +379 -0
  24. package/packages/core/src/public/components/FontPicker/FontPicker.css +276 -0
  25. package/packages/core/src/public/components/FontPicker/index.tsx +430 -0
  26. package/packages/core/src/public/components/FullFileTree.tsx +237 -0
  27. package/packages/core/src/public/components/HealthGauge.tsx +181 -0
  28. package/packages/core/src/public/components/Message.tsx +225 -0
  29. package/packages/core/src/public/components/MessageList.tsx +98 -0
  30. package/packages/core/src/public/components/MessageView.tsx +400 -0
  31. package/packages/core/src/public/components/ModeSwitch/ModeSwitch.css +165 -0
  32. package/packages/core/src/public/components/ModeSwitch/index.tsx +372 -0
  33. package/packages/core/src/public/components/PersonaHeader.tsx +242 -0
  34. package/packages/core/src/public/components/ProjectInfoBar.tsx +45 -0
  35. package/packages/core/src/public/components/QuickActions.tsx +267 -0
  36. package/packages/core/src/public/components/SpanTimeline.tsx +352 -0
  37. package/packages/core/src/public/components/StandalonePanel.tsx +82 -0
  38. package/packages/core/src/public/components/StatsStrip.tsx +162 -0
  39. package/packages/core/src/public/components/StreamingContent.tsx +77 -0
  40. package/packages/core/src/public/components/SubagentSpan.tsx +180 -0
  41. package/packages/core/src/public/components/TandemPortrait.tsx +72 -0
  42. package/packages/core/src/public/components/ThemePalette/ThemePalette.css +179 -0
  43. package/packages/core/src/public/components/ThemePalette/index.tsx +326 -0
  44. package/packages/core/src/public/components/ToolCallBlock.tsx +252 -0
  45. package/packages/core/src/public/components/ToolStack.tsx +209 -0
  46. package/packages/core/src/public/components/ToolStatus.tsx +57 -0
  47. package/packages/core/src/public/components/dialogs/CodeMarkersDialog.tsx +169 -0
  48. package/packages/core/src/public/components/dialogs/ComplexityDialog.tsx +163 -0
  49. package/packages/core/src/public/components/dialogs/DependenciesDialog.tsx +120 -0
  50. package/packages/core/src/public/components/dialogs/HotspotsDialog.tsx +451 -0
  51. package/packages/core/src/public/components/dialogs/ToolDialog.tsx +43 -0
  52. package/packages/core/src/public/components/panel-registry.ts +13 -0
  53. package/packages/core/src/public/components/panels/ACPanel.tsx +93 -0
  54. package/packages/core/src/public/components/panels/AcceptanceCriteriaPanel.tsx +104 -0
  55. package/packages/core/src/public/components/panels/AuditLogPanel.tsx +489 -0
  56. package/packages/core/src/public/components/panels/BackgroundPanel.tsx +115 -0
  57. package/packages/core/src/public/components/panels/BikeLanePanel.tsx +214 -0
  58. package/packages/core/src/public/components/panels/DebugPanel.tsx +344 -0
  59. package/packages/core/src/public/components/panels/DiffView.tsx +109 -0
  60. package/packages/core/src/public/components/panels/DiffsPanel.tsx +56 -0
  61. package/packages/core/src/public/components/panels/GitPanel.tsx +260 -0
  62. package/packages/core/src/public/components/panels/HotspotsPanel.tsx +365 -0
  63. package/packages/core/src/public/components/panels/MessageFeed.tsx +39 -0
  64. package/packages/core/src/public/components/panels/MessagePanel.tsx +497 -0
  65. package/packages/core/src/public/components/panels/ProgressPanel.tsx +189 -0
  66. package/packages/core/src/public/components/panels/SettingsPanel.tsx +361 -0
  67. package/packages/core/src/public/components/panels/SprintPanel.tsx +723 -0
  68. package/packages/core/src/public/components/panels/TandemPanel.tsx +104 -0
  69. package/packages/core/src/public/components/panels/TaskTracker.tsx +48 -0
  70. package/packages/core/src/public/components/panels/TeamPanel.tsx +64 -0
  71. package/packages/core/src/public/components/panels/TeamRoster.tsx +67 -0
  72. package/packages/core/src/public/components/panels/TodoPanel.tsx +142 -0
  73. package/packages/core/src/public/components/panels/WorkflowPanel.tsx +224 -0
  74. package/packages/core/src/public/components/panels/index.ts +24 -0
  75. package/packages/core/src/public/components/ui/alert-dialog.tsx +139 -0
  76. package/packages/core/src/public/components/ui/badge.tsx +36 -0
  77. package/packages/core/src/public/components/ui/button.tsx +57 -0
  78. package/packages/core/src/public/components/ui/checkbox.tsx +28 -0
  79. package/packages/core/src/public/components/ui/collapsible.tsx +9 -0
  80. package/packages/core/src/public/components/ui/command.tsx +151 -0
  81. package/packages/core/src/public/components/ui/dialog.tsx +120 -0
  82. package/packages/core/src/public/components/ui/popover.tsx +31 -0
  83. package/packages/core/src/public/components/ui/progress.tsx +28 -0
  84. package/packages/core/src/public/components/ui/scroll-area.tsx +46 -0
  85. package/packages/core/src/public/components/ui/select.tsx +157 -0
  86. package/packages/core/src/public/components/ui/separator.tsx +29 -0
  87. package/packages/core/src/public/components/ui/skeleton.tsx +15 -0
  88. package/packages/core/src/public/components/ui/switch.tsx +27 -0
  89. package/packages/core/src/public/components/ui/toggle-group.tsx +59 -0
  90. package/packages/core/src/public/components/ui/toggle.tsx +43 -0
  91. package/packages/core/src/public/components/ui/tooltip.tsx +30 -0
  92. package/packages/core/src/public/contexts/ClaudeContext.tsx +311 -0
  93. package/packages/core/src/public/contexts/MessageQueueContext.tsx +143 -0
  94. package/packages/core/src/public/css/theme-browser.css +550 -0
  95. package/packages/core/src/public/css/theme-system.css +630 -0
  96. package/packages/core/src/public/hooks/index.ts +49 -0
  97. package/packages/core/src/public/hooks/useAgentLoad.ts +105 -0
  98. package/packages/core/src/public/hooks/useBackgroundTasks.ts +131 -0
  99. package/packages/core/src/public/hooks/useClaude.ts +234 -0
  100. package/packages/core/src/public/hooks/useCodeMarkers.ts +101 -0
  101. package/packages/core/src/public/hooks/useColorScheme.ts +42 -0
  102. package/packages/core/src/public/hooks/useCommandHistory.ts +99 -0
  103. package/packages/core/src/public/hooks/useComplexity.ts +80 -0
  104. package/packages/core/src/public/hooks/useDeadCode.ts +99 -0
  105. package/packages/core/src/public/hooks/useDependencies.ts +82 -0
  106. package/packages/core/src/public/hooks/useDiffs.ts +143 -0
  107. package/packages/core/src/public/hooks/useFileBrowser.ts +73 -0
  108. package/packages/core/src/public/hooks/useFocusPanel.ts +137 -0
  109. package/packages/core/src/public/hooks/useGitStatus.ts +233 -0
  110. package/packages/core/src/public/hooks/useHealthScore.ts +71 -0
  111. package/packages/core/src/public/hooks/useHotspots.ts +123 -0
  112. package/packages/core/src/public/hooks/useLayoutPersistence.ts +141 -0
  113. package/packages/core/src/public/hooks/useMarkdownParser.ts +36 -0
  114. package/packages/core/src/public/hooks/useMarkerActions.ts +234 -0
  115. package/packages/core/src/public/hooks/useMessageQueue.ts +380 -0
  116. package/packages/core/src/public/hooks/useMessageStream.ts +131 -0
  117. package/packages/core/src/public/hooks/usePersona.ts +112 -0
  118. package/packages/core/src/public/hooks/usePlanModeExit.ts +105 -0
  119. package/packages/core/src/public/hooks/useResponsiveLayout.ts +173 -0
  120. package/packages/core/src/public/hooks/useSprint.ts +157 -0
  121. package/packages/core/src/public/hooks/useStatsStrip.ts +204 -0
  122. package/packages/core/src/public/hooks/useStory.ts +135 -0
  123. package/packages/core/src/public/hooks/useSubagentHelper.ts +64 -0
  124. package/packages/core/src/public/hooks/useSyntaxHighlighter.ts +52 -0
  125. package/packages/core/src/public/hooks/useTabCompletion.ts +124 -0
  126. package/packages/core/src/public/hooks/useTandemObservations.ts +165 -0
  127. package/packages/core/src/public/hooks/useTeamMembers.ts +273 -0
  128. package/packages/core/src/public/hooks/useTodos.ts +93 -0
  129. package/packages/core/src/public/hooks/useUserAvatar.ts +54 -0
  130. package/packages/core/src/public/images/cyclist-dark.png +0 -0
  131. package/packages/core/src/public/images/cyclist-light.png +0 -0
  132. package/packages/core/src/public/index.html +14 -0
  133. package/packages/core/src/public/index.tsx +10 -0
  134. package/packages/core/src/public/lib/utils.ts +6 -0
  135. package/packages/core/src/public/styles/dockview-theme.css +376 -0
  136. package/packages/core/src/public/styles/tailwind.css +4454 -0
  137. package/packages/core/src/public/types/message.ts +51 -0
  138. package/packages/core/src/public/utils/avatar-service.ts +73 -0
  139. package/packages/core/src/public/utils/color-presets.ts +940 -0
  140. package/packages/core/src/public/utils/font-presets.ts +362 -0
  141. package/packages/core/src/public/utils/formatDuration.ts +14 -0
  142. package/packages/core/src/public/utils/markdown.ts +249 -0
  143. package/packages/core/src/public/utils/messageFilters.ts +128 -0
  144. package/packages/core/src/public/utils/slash-commands.ts +341 -0
  145. package/packages/core/src/public/utils/subagent-display.ts +146 -0
  146. package/packages/core/src/public/utils/syntax.ts +219 -0
  147. package/packages/core/src/public/utils/toolIntentSummarizer.ts +199 -0
  148. package/packages/core/src/public/utils/toolStackGrouper.ts +106 -0
  149. package/packages/core/src/public/utils/toolTypeColors.ts +45 -0
  150. package/pennyfarthing-dist/pf/__pycache__/__init__.cpython-314.pyc +0 -0
  151. package/pennyfarthing-dist/pf/__pycache__/cli.cpython-314.pyc +0 -0
  152. package/pennyfarthing-dist/pf/__pycache__/context.cpython-314.pyc +0 -0
  153. package/pennyfarthing-dist/pf/bc/__pycache__/__init__.cpython-314.pyc +0 -0
  154. package/pennyfarthing-dist/pf/bc/__pycache__/cli.cpython-314.pyc +0 -0
  155. package/pennyfarthing-dist/pf/bc/__pycache__/focus.cpython-314.pyc +0 -0
  156. package/pennyfarthing-dist/pf/bc/__pycache__/split.cpython-314.pyc +0 -0
  157. package/pennyfarthing-dist/pf/bc/cli.py +0 -1
  158. package/pennyfarthing-dist/pf/bc/focus.py +0 -1
  159. package/pennyfarthing-dist/pf/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
  160. package/pennyfarthing-dist/pf/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  161. package/pennyfarthing-dist/pf/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  162. package/pennyfarthing-dist/pf/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  163. package/pennyfarthing-dist/pf/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  164. package/pennyfarthing-dist/pf/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
  165. package/pennyfarthing-dist/pf/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  166. package/pennyfarthing-dist/pf/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
  167. package/pennyfarthing-dist/pf/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
  168. package/pennyfarthing-dist/pf/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  169. package/pennyfarthing-dist/pf/bikerack/base_panel.py +0 -1
  170. package/pennyfarthing-dist/pf/bikerack/events.py +1 -7
  171. package/pennyfarthing-dist/pf/bikerack/git_panel.py +273 -10
  172. package/pennyfarthing-dist/pf/bikerack/portrait_resolver.py +21 -0
  173. package/pennyfarthing-dist/pf/bikerack/sprint_panel.py +58 -1
  174. package/pennyfarthing-dist/pf/bikerack/tui.py +5 -20
  175. package/pennyfarthing-dist/pf/bmad/__pycache__/__init__.cpython-314.pyc +0 -0
  176. package/pennyfarthing-dist/pf/bmad/__pycache__/cli.cpython-314.pyc +0 -0
  177. package/pennyfarthing-dist/pf/bmad/__pycache__/parser.cpython-314.pyc +0 -0
  178. package/pennyfarthing-dist/pf/bmad/parser.py +15 -9
  179. package/pennyfarthing-dist/pf/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  180. package/pennyfarthing-dist/pf/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  181. package/pennyfarthing-dist/pf/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  182. package/pennyfarthing-dist/pf/common/__pycache__/__init__.cpython-314.pyc +0 -0
  183. package/pennyfarthing-dist/pf/common/__pycache__/config.cpython-314.pyc +0 -0
  184. package/pennyfarthing-dist/pf/common/__pycache__/output.cpython-314.pyc +0 -0
  185. package/pennyfarthing-dist/pf/common/__pycache__/pr_config.cpython-314.pyc +0 -0
  186. package/pennyfarthing-dist/pf/common/__pycache__/themes.cpython-314.pyc +0 -0
  187. package/pennyfarthing-dist/pf/common/pr_config.py +27 -2
  188. package/pennyfarthing-dist/pf/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  189. package/pennyfarthing-dist/pf/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  190. package/pennyfarthing-dist/pf/complexity/__pycache__/models.cpython-314.pyc +0 -0
  191. package/pennyfarthing-dist/pf/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
  192. package/pennyfarthing-dist/pf/consultation/__pycache__/cli.cpython-314.pyc +0 -0
  193. package/pennyfarthing-dist/pf/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  194. package/pennyfarthing-dist/pf/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  195. package/pennyfarthing-dist/pf/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  196. package/pennyfarthing-dist/pf/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  197. package/pennyfarthing-dist/pf/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  198. package/pennyfarthing-dist/pf/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  199. package/pennyfarthing-dist/pf/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  200. package/pennyfarthing-dist/pf/epic/__pycache__/__init__.cpython-314.pyc +0 -0
  201. package/pennyfarthing-dist/pf/epic/__pycache__/cli.cpython-314.pyc +0 -0
  202. package/pennyfarthing-dist/pf/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
  203. package/pennyfarthing-dist/pf/git_group/__pycache__/cli.cpython-314.pyc +0 -0
  204. package/pennyfarthing-dist/pf/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
  205. package/pennyfarthing-dist/pf/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  206. package/pennyfarthing-dist/pf/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  207. package/pennyfarthing-dist/pf/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  208. package/pennyfarthing-dist/pf/handoff/__pycache__/phase_check.cpython-314.pyc +0 -0
  209. package/pennyfarthing-dist/pf/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  210. package/pennyfarthing-dist/pf/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  211. package/pennyfarthing-dist/pf/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  212. package/pennyfarthing-dist/pf/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  213. package/pennyfarthing-dist/pf/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  214. package/pennyfarthing-dist/pf/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  215. package/pennyfarthing-dist/pf/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  216. package/pennyfarthing-dist/pf/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
  217. package/pennyfarthing-dist/pf/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
  218. package/pennyfarthing-dist/pf/hooks/__pycache__/cli.cpython-314.pyc +0 -0
  219. package/pennyfarthing-dist/pf/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
  220. package/pennyfarthing-dist/pf/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
  221. package/pennyfarthing-dist/pf/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
  222. package/pennyfarthing-dist/pf/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
  223. package/pennyfarthing-dist/pf/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
  224. package/pennyfarthing-dist/pf/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
  225. package/pennyfarthing-dist/pf/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
  226. package/pennyfarthing-dist/pf/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
  227. package/pennyfarthing-dist/pf/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
  228. package/pennyfarthing-dist/pf/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
  229. package/pennyfarthing-dist/pf/hooks/cyclist-pretooluse-hook.sh +0 -0
  230. package/pennyfarthing-dist/pf/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  231. package/pennyfarthing-dist/pf/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  232. package/pennyfarthing-dist/pf/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  233. package/pennyfarthing-dist/pf/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  234. package/pennyfarthing-dist/pf/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  235. package/pennyfarthing-dist/pf/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  236. package/pennyfarthing-dist/pf/jira/__pycache__/claim.cpython-314.pyc +0 -0
  237. package/pennyfarthing-dist/pf/jira/__pycache__/cli.cpython-314.pyc +0 -0
  238. package/pennyfarthing-dist/pf/jira/__pycache__/client.cpython-314.pyc +0 -0
  239. package/pennyfarthing-dist/pf/jira/__pycache__/create.cpython-314.pyc +0 -0
  240. package/pennyfarthing-dist/pf/jira/__pycache__/epic.cpython-314.pyc +0 -0
  241. package/pennyfarthing-dist/pf/jira/__pycache__/operations.cpython-314.pyc +0 -0
  242. package/pennyfarthing-dist/pf/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  243. package/pennyfarthing-dist/pf/jira/__pycache__/story.cpython-314.pyc +0 -0
  244. package/pennyfarthing-dist/pf/jira/__pycache__/sync.cpython-314.pyc +0 -0
  245. package/pennyfarthing-dist/pf/launch/__pycache__/__init__.cpython-314.pyc +0 -0
  246. package/pennyfarthing-dist/pf/launch/__pycache__/cli.cpython-314.pyc +0 -0
  247. package/pennyfarthing-dist/pf/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  248. package/pennyfarthing-dist/pf/prime/__pycache__/cli.cpython-314.pyc +0 -0
  249. package/pennyfarthing-dist/pf/prime/__pycache__/loader.cpython-314.pyc +0 -0
  250. package/pennyfarthing-dist/pf/prime/__pycache__/models.cpython-314.pyc +0 -0
  251. package/pennyfarthing-dist/pf/prime/__pycache__/persona.cpython-314.pyc +0 -0
  252. package/pennyfarthing-dist/pf/prime/__pycache__/session.cpython-314.pyc +0 -0
  253. package/pennyfarthing-dist/pf/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  254. package/pennyfarthing-dist/pf/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  255. package/pennyfarthing-dist/pf/session/__pycache__/__init__.cpython-314.pyc +0 -0
  256. package/pennyfarthing-dist/pf/session/__pycache__/cli.cpython-314.pyc +0 -0
  257. package/pennyfarthing-dist/pf/settings/__pycache__/__init__.cpython-314.pyc +0 -0
  258. package/pennyfarthing-dist/pf/settings/__pycache__/cli.cpython-314.pyc +0 -0
  259. package/pennyfarthing-dist/pf/settings/__pycache__/settings.cpython-314.pyc +0 -0
  260. package/pennyfarthing-dist/pf/settings/settings.py +44 -8
  261. package/pennyfarthing-dist/pf/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  262. package/pennyfarthing-dist/pf/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  263. package/pennyfarthing-dist/pf/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  264. package/pennyfarthing-dist/pf/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  265. package/pennyfarthing-dist/pf/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  266. package/pennyfarthing-dist/pf/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
  267. package/pennyfarthing-dist/pf/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  268. package/pennyfarthing-dist/pf/sprint/__pycache__/status.cpython-314.pyc +0 -0
  269. package/pennyfarthing-dist/pf/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  270. package/pennyfarthing-dist/pf/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  271. package/pennyfarthing-dist/pf/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  272. package/pennyfarthing-dist/pf/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  273. package/pennyfarthing-dist/pf/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  274. package/pennyfarthing-dist/pf/sprint/__pycache__/work.cpython-314.pyc +0 -0
  275. package/pennyfarthing-dist/pf/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  276. package/pennyfarthing-dist/pf/sprint/story_finish.py +14 -2
  277. package/pennyfarthing-dist/pf/sprint/validator.py +7 -7
  278. package/pennyfarthing-dist/pf/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  279. package/pennyfarthing-dist/pf/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  280. package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  281. package/pennyfarthing-dist/pf/tests/test_sprint_validator.py +44 -0
  282. package/pennyfarthing-dist/pf/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  283. package/pennyfarthing-dist/pf/theme/__pycache__/cli.cpython-314.pyc +0 -0
  284. package/pennyfarthing-dist/pf/validate/__pycache__/__init__.cpython-314.pyc +0 -0
  285. package/pennyfarthing-dist/pf/validate/__pycache__/cli.cpython-314.pyc +0 -0
  286. package/pennyfarthing-dist/pf/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
  287. package/pennyfarthing-dist/pf/workflow/__pycache__/cli.cpython-314.pyc +0 -0
  288. package/pennyfarthing-dist/pf/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
  289. package/pennyfarthing-dist/pf/workflow/__pycache__/scale.cpython-314.pyc +0 -0
  290. package/pennyfarthing-dist/pf/workflow/__pycache__/state.cpython-314.pyc +0 -0
  291. package/pennyfarthing-dist/scripts/core/agent-session.sh +0 -0
  292. package/pennyfarthing-dist/scripts/core/check-context.sh +0 -0
  293. package/pennyfarthing-dist/scripts/core/dialogue-manager.sh +0 -0
  294. package/pennyfarthing-dist/scripts/core/pf.sh +0 -0
  295. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +0 -0
  296. package/pennyfarthing-dist/scripts/core/prime.sh +0 -0
  297. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -0
  298. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -0
  299. package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -0
  300. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +0 -0
  301. package/pennyfarthing-dist/scripts/git/release.sh +0 -0
  302. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -0
  303. package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -0
  304. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +0 -0
  305. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
  306. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
  307. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  308. package/pennyfarthing-dist/scripts/hooks/dispatcher-template.sh +0 -0
  309. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -0
  310. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -0
  311. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -0
  312. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
  313. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -0
  314. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -0
  315. package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -0
  316. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -0
  317. package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -0
  318. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
  319. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -0
  320. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -0
  321. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -0
  322. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -0
  323. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -0
  324. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -0
  325. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -0
  326. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -0
  327. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -0
  328. package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -0
  329. package/pennyfarthing-dist/scripts/lib/common.sh +0 -0
  330. package/pennyfarthing-dist/scripts/lib/env.sh +0 -0
  331. package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -0
  332. package/pennyfarthing-dist/scripts/lib/find-root.sh +1 -1
  333. package/pennyfarthing-dist/scripts/lib/logging.sh +0 -0
  334. package/pennyfarthing-dist/scripts/lib/retry.sh +0 -0
  335. package/pennyfarthing-dist/scripts/lib/run-pf.sh +0 -0
  336. package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -0
  337. package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -0
  338. package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -0
  339. package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -0
  340. package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -0
  341. package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -0
  342. package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -0
  343. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -0
  344. package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -0
  345. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -0
  346. package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -1
  347. package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -0
  348. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -0
  349. package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -0
  350. package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -0
  351. package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -0
  352. package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -0
  353. package/pennyfarthing-dist/scripts/misc/statusline.sh +0 -0
  354. package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -0
  355. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +0 -0
  356. package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +13 -13
  357. package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +0 -0
  358. package/pennyfarthing-dist/scripts/portraits/generate-tandem-portraits.sh +0 -0
  359. package/pennyfarthing-dist/scripts/story/create-story.sh +0 -0
  360. package/pennyfarthing-dist/scripts/story/size-story.sh +0 -0
  361. package/pennyfarthing-dist/scripts/story/story-template.sh +0 -0
  362. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
  363. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -0
  364. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -0
  365. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +0 -0
  366. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -0
  367. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -0
  368. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -0
  369. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -0
  370. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
  371. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -0
  372. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
  373. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
  374. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
  375. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -0
  376. package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -0
  377. package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -0
  378. package/pennyfarthing-dist/scripts/workflow/check.py +4 -6
  379. package/pennyfarthing-dist/scripts/workflow/check.sh +0 -0
  380. package/pennyfarthing-dist/scripts/workflow/complete-step.py +2 -2
  381. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +0 -0
  382. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -0
  383. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -0
  384. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -0
  385. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -0
  386. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -0
  387. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -0
  388. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -0
  389. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -0
  390. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -0
  391. package/pennyfarthing-dist/skills/pf-story/scripts/create-story.sh +0 -0
  392. package/pennyfarthing-dist/skills/pf-story/scripts/size-story.sh +0 -0
  393. package/pennyfarthing-dist/skills/pf-story/scripts/story-template.sh +0 -0
  394. package/pennyfarthing-dist/skills/skill-registry.yaml +19 -0
  395. package/pennyfarthing-dist/workflows/release/steps/step-10-publish.md +41 -9
  396. package/pennyfarthing-dist/workflows/tdd-tandem.yaml +15 -2
  397. package/packages/core/dist/workflow/__test_context_watch__/.session/.tandem-turn-counter +0 -1
  398. package/packages/core/dist/workflow/__test_context_watch__/.session/95-6-session.md +0 -3
  399. package/packages/core/dist/workflow/__test_context_watch__/.session/95-6-tandem-architect.md +0 -6
  400. package/packages/core/dist/workflow/__test_file_watch__/.session/95-4-tandem-architect.md +0 -6
  401. package/packages/core/dist/workflow/__test_file_watch__/workdir/trigger.ts +0 -1
  402. package/packages/core/dist/workflow/__test_tool_watch__/.session/95-5-tandem-architect.md +0 -6
  403. package/packages/core/dist/workflow/__test_tool_watch__/.session/95-5-tandem-toolcalls.jsonl +0 -1
  404. package/pennyfarthing-dist/pf/bikerack/changed_panel.py +0 -201
  405. package/scripts/README.md +0 -41
@@ -0,0 +1,4454 @@
1
+ /* Tailwind CSS for Cyclist React components */
2
+
3
+ @import "tailwindcss";
4
+ @config "../../../tailwind.config.js";
5
+ /* Config path resolves to packages/core/tailwind.config.js */
6
+
7
+ /* =============================================================================
8
+ Docking Workspace Styles
9
+ ============================================================================= */
10
+
11
+ /* Screen reader only — visually hidden but accessible */
12
+ .visually-hidden {
13
+ position: absolute;
14
+ width: 1px;
15
+ height: 1px;
16
+ padding: 0;
17
+ margin: -1px;
18
+ overflow: hidden;
19
+ clip: rect(0, 0, 0, 0);
20
+ white-space: nowrap;
21
+ border: 0;
22
+ }
23
+
24
+ .cyclist-app {
25
+ position: absolute;
26
+ top: 0;
27
+ left: 0;
28
+ right: 0;
29
+ bottom: 0;
30
+ display: flex;
31
+ flex-direction: column;
32
+ background: var(--bg-primary, #1e1e1e);
33
+ color: var(--text-primary, #d4d4d4);
34
+ font-family: var(--font-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);
35
+ font-size: var(--font-size-ui, 1rem);
36
+ }
37
+
38
+ /* Main element needs to fill the flex container */
39
+ .cyclist-app > main {
40
+ display: flex;
41
+ flex: 1;
42
+ min-height: 0;
43
+ }
44
+
45
+ .docking-workspace {
46
+ display: flex;
47
+ flex: 1;
48
+ overflow: hidden;
49
+ }
50
+
51
+ /* Sidebar styling */
52
+ .sidebar {
53
+ position: relative;
54
+ display: flex;
55
+ flex-direction: column;
56
+ background: var(--bg-secondary, #252526);
57
+ border-color: var(--border-color, #3c3c3c);
58
+ overflow: hidden;
59
+ transition: width 0.2s ease;
60
+ height: 100%;
61
+ min-height: 0;
62
+ }
63
+
64
+ .sidebar-left {
65
+ border-right: 1px solid var(--border-color, #3c3c3c);
66
+ }
67
+
68
+ .sidebar-right {
69
+ border-left: 1px solid var(--border-color, #3c3c3c);
70
+ }
71
+
72
+ .sidebar[data-collapsed="true"] {
73
+ /* Use min-width for toggle visibility instead of 0 */
74
+ width: 32px !important;
75
+ min-width: 32px;
76
+ }
77
+
78
+ /* Hide content but keep toggle visible when collapsed */
79
+ .sidebar[data-collapsed="true"] .tablist,
80
+ .sidebar[data-collapsed="true"] .panel {
81
+ display: none;
82
+ }
83
+
84
+ /* Style collapse toggle when collapsed - make it fill the narrow strip */
85
+ .sidebar[data-collapsed="true"] .collapse-toggle {
86
+ position: absolute;
87
+ top: 50%;
88
+ transform: translateY(-50%);
89
+ bottom: auto;
90
+ padding: 8px 4px;
91
+ }
92
+
93
+ /* Tablist styling */
94
+ .tablist {
95
+ display: flex;
96
+ flex-wrap: wrap;
97
+ gap: 2px;
98
+ padding: 4px;
99
+ background: var(--bg-tertiary, #2d2d2d);
100
+ border-bottom: 1px solid var(--border-color, #3c3c3c);
101
+ }
102
+
103
+ .tab {
104
+ display: flex;
105
+ align-items: center;
106
+ gap: 4px;
107
+ padding: 4px 8px;
108
+ background: transparent;
109
+ border: none;
110
+ color: var(--text-secondary, #8b8b8b);
111
+ cursor: pointer;
112
+ font-size: 0.75rem;
113
+ text-transform: uppercase;
114
+ letter-spacing: 0.05em;
115
+ transition: all 0.15s ease;
116
+ }
117
+
118
+ .tab:hover {
119
+ color: var(--text-primary, #d4d4d4);
120
+ background: var(--bg-hover, #3c3c3c);
121
+ }
122
+
123
+ .tab.active {
124
+ color: var(--accent-color, #007acc);
125
+ background: var(--bg-active, #37373d);
126
+ }
127
+
128
+ .tab.dragging {
129
+ opacity: 0.5;
130
+ }
131
+
132
+ /* Drag handle */
133
+ .drag-handle {
134
+ opacity: 0.4;
135
+ font-size: 0.6rem;
136
+ cursor: grab;
137
+ }
138
+
139
+ .drag-handle:hover {
140
+ opacity: 0.8;
141
+ }
142
+
143
+ .drag-handle.dragging {
144
+ cursor: grabbing;
145
+ }
146
+
147
+ /* Tab drop targets */
148
+ .tab-drop-target {
149
+ width: 4px;
150
+ height: 24px;
151
+ margin: 0 -2px;
152
+ transition: background 0.15s ease;
153
+ }
154
+
155
+ .tab-drop-target.tab-insertion-indicator {
156
+ background: var(--accent-color, #007acc);
157
+ }
158
+
159
+ /* Panel content */
160
+ .panel {
161
+ flex: 1;
162
+ min-height: 0; /* Allow flex child to shrink below content size */
163
+ overflow: auto;
164
+ padding: 8px;
165
+ }
166
+
167
+ /* Message panel needs special flex handling - no padding, full height */
168
+ .panel.panel-message {
169
+ display: flex;
170
+ flex-direction: column;
171
+ padding: 0;
172
+ overflow: hidden;
173
+ }
174
+
175
+ .panel[hidden] {
176
+ display: none;
177
+ }
178
+
179
+ .panel-content {
180
+ height: 100%;
181
+ overflow: auto;
182
+ }
183
+
184
+ /* Center region */
185
+ .center-region {
186
+ flex: 1;
187
+ display: flex;
188
+ flex-direction: column;
189
+ background: var(--bg-primary, #1e1e1e);
190
+ overflow: hidden;
191
+ height: 100%;
192
+ min-height: 0;
193
+ }
194
+
195
+ .center-region.drop-zone-rejected {
196
+ background: rgba(255, 0, 0, 0.1);
197
+ }
198
+
199
+ /* Drop zone active state */
200
+ .drop-zone-active {
201
+ background: rgba(0, 122, 204, 0.1) !important;
202
+ }
203
+
204
+ /* Resize handles */
205
+ .resize-handle {
206
+ width: 4px;
207
+ background: transparent;
208
+ cursor: col-resize;
209
+ transition: background 0.15s ease;
210
+ }
211
+
212
+ .resize-handle:hover {
213
+ background: var(--accent-color, #007acc);
214
+ }
215
+
216
+ /* Collapse toggle buttons */
217
+ .collapse-toggle {
218
+ position: absolute;
219
+ bottom: 8px;
220
+ padding: 4px 8px;
221
+ background: var(--bg-tertiary, #2d2d2d);
222
+ border: 1px solid var(--border-color, #3c3c3c);
223
+ border-radius: 4px;
224
+ color: var(--text-secondary, #8b8b8b);
225
+ cursor: pointer;
226
+ font-size: 0.75rem;
227
+ transition: all 0.15s ease;
228
+ }
229
+
230
+ .sidebar-left .collapse-toggle {
231
+ right: 8px;
232
+ }
233
+
234
+ .sidebar-right .collapse-toggle {
235
+ left: 8px;
236
+ }
237
+
238
+ .collapse-toggle:hover {
239
+ color: var(--text-primary, #d4d4d4);
240
+ background: var(--bg-hover, #3c3c3c);
241
+ }
242
+
243
+ /* Drag ghost */
244
+ .drag-ghost {
245
+ padding: 4px 8px;
246
+ background: var(--bg-tertiary, #2d2d2d);
247
+ border: 1px solid var(--accent-color, #007acc);
248
+ border-radius: 4px;
249
+ color: var(--text-primary, #d4d4d4);
250
+ font-size: 0.75rem;
251
+ pointer-events: none;
252
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
253
+ }
254
+
255
+ /* Placeholder panels */
256
+ .sprint-placeholder,
257
+ .progress-placeholder,
258
+ .background-placeholder,
259
+ .git-placeholder,
260
+ .settings-placeholder,
261
+ .debug-placeholder {
262
+ display: flex;
263
+ align-items: center;
264
+ justify-content: center;
265
+ height: 100%;
266
+ color: var(--text-secondary, #8b8b8b);
267
+ font-size: 0.875rem;
268
+ }
269
+
270
+ /* =============================================================================
271
+ PersonaHeader Component Styles
272
+ ============================================================================= */
273
+
274
+ .persona-header {
275
+ display: flex;
276
+ align-items: center;
277
+ gap: 12px;
278
+ padding: 8px 12px;
279
+ background: var(--bg-secondary, #252526);
280
+ border-bottom: 1px solid var(--border-color, #3c3c3c);
281
+ flex-shrink: 0;
282
+ position: relative;
283
+ overflow: visible;
284
+ min-width: 0;
285
+ }
286
+
287
+ .persona-header.empty {
288
+ display: none;
289
+ }
290
+
291
+ .persona-header.clickable {
292
+ cursor: pointer;
293
+ border-radius: 6px;
294
+ transition: background 0.15s;
295
+ }
296
+
297
+ .persona-header.clickable:hover {
298
+ background: var(--hover-color, rgba(255, 255, 255, 0.05));
299
+ }
300
+
301
+ .persona-header.clickable:focus-visible {
302
+ outline: 2px solid var(--accent-color, #007acc);
303
+ outline-offset: 2px;
304
+ }
305
+
306
+ /* Portrait group: portrait + tandem positioned together */
307
+ .persona-portrait-group {
308
+ container-type: inline-size;
309
+ container-name: portrait-group;
310
+ display: flex;
311
+ flex-direction: column;
312
+ align-items: flex-start;
313
+ gap: 8px;
314
+ flex-shrink: 0;
315
+ width: 100px;
316
+ }
317
+
318
+ /* Container query: hide backseat portrait when panel is narrow */
319
+ @container portrait-group (max-width: 180px) {
320
+ .persona-tandem-portrait {
321
+ display: none;
322
+ }
323
+ }
324
+
325
+ .persona-portrait {
326
+ width: 100px;
327
+ height: 100px;
328
+ border-radius: 50%;
329
+ overflow: hidden;
330
+ flex-shrink: 0;
331
+ min-width: 48px;
332
+ min-height: 48px;
333
+ aspect-ratio: 1;
334
+ background: var(--bg-tertiary, #2d2d2d);
335
+ display: flex;
336
+ align-items: center;
337
+ justify-content: center;
338
+ transition: width 0.2s ease, height 0.2s ease;
339
+ }
340
+
341
+ .persona-portrait .portrait-image {
342
+ width: 100%;
343
+ height: 100%;
344
+ object-fit: cover;
345
+ }
346
+
347
+ .persona-portrait .portrait-fallback {
348
+ font-size: 1.5rem;
349
+ }
350
+
351
+ /* Role badge inline in name row */
352
+ .persona-name-row .persona-role.badge {
353
+ padding: 1px 6px;
354
+ color: #fff;
355
+ font-size: 0.6rem;
356
+ border-radius: 8px;
357
+ text-transform: uppercase;
358
+ font-weight: 600;
359
+ white-space: nowrap;
360
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
361
+ flex-shrink: 0;
362
+ }
363
+
364
+ .persona-info {
365
+ display: flex;
366
+ flex-direction: column;
367
+ gap: 2px;
368
+ flex: 1;
369
+ min-width: 0;
370
+ width: 0;
371
+ overflow: hidden;
372
+ }
373
+
374
+ .persona-branding {
375
+ height: 80px;
376
+ width: auto;
377
+ flex-shrink: 0;
378
+ opacity: 0.5;
379
+ pointer-events: none;
380
+ transition: height 0.2s ease;
381
+ }
382
+
383
+ /* Compact mode: collapsed header */
384
+ .persona-header.compact .persona-portrait {
385
+ width: 40px;
386
+ height: 40px;
387
+ }
388
+
389
+ .persona-header.compact .persona-portrait .portrait-fallback {
390
+ font-size: 1.2rem;
391
+ }
392
+
393
+ .persona-header.compact .persona-tandem-portrait {
394
+ display: none;
395
+ }
396
+
397
+ .persona-header.compact .persona-branding {
398
+ height: 32px;
399
+ }
400
+
401
+ /* Tandem portrait: backseat agent below primary (Story 96-1) */
402
+ .persona-tandem-portrait {
403
+ width: 48px;
404
+ height: 48px;
405
+ border-radius: 50%;
406
+ opacity: 0.55;
407
+ transition: opacity 300ms ease-in-out;
408
+ position: relative;
409
+ overflow: hidden;
410
+ }
411
+
412
+ .persona-tandem-portrait .tandem-portrait-image {
413
+ width: 100%;
414
+ height: 100%;
415
+ object-fit: cover;
416
+ }
417
+
418
+ .persona-tandem-portrait .tandem-portrait-fallback {
419
+ font-size: 1.2rem;
420
+ }
421
+
422
+ .tandem-role-badge {
423
+ position: absolute;
424
+ bottom: -2px;
425
+ right: -2px;
426
+ font-size: 9px;
427
+ font-weight: 700;
428
+ line-height: 16px;
429
+ padding: 0 4px;
430
+ border-radius: 8px;
431
+ background: var(--accent-color, #007acc);
432
+ color: #fff;
433
+ }
434
+
435
+ .persona-header.compact .persona-catchphrase {
436
+ display: none;
437
+ }
438
+
439
+ /* Collapse toggle button */
440
+ .persona-collapse-toggle {
441
+ position: absolute;
442
+ bottom: 2px;
443
+ right: 8px;
444
+ background: none;
445
+ border: none;
446
+ color: var(--text-secondary, #8b8b8b);
447
+ font-size: 0.6rem;
448
+ cursor: pointer;
449
+ padding: 0 4px;
450
+ opacity: 0;
451
+ transition: opacity 0.15s;
452
+ }
453
+
454
+ .persona-header:hover .persona-collapse-toggle {
455
+ opacity: 1;
456
+ }
457
+
458
+ .persona-collapse-toggle:hover {
459
+ color: var(--text-primary, #d4d4d4);
460
+ }
461
+
462
+ .persona-name-row {
463
+ display: flex;
464
+ align-items: center;
465
+ gap: 8px;
466
+ flex-wrap: nowrap;
467
+ overflow: hidden;
468
+ }
469
+
470
+ .persona-character {
471
+ font-weight: 600;
472
+ color: var(--text-primary, #d4d4d4);
473
+ font-size: 0.95rem;
474
+ overflow: hidden;
475
+ text-overflow: ellipsis;
476
+ white-space: nowrap;
477
+ }
478
+
479
+ .persona-theme {
480
+ color: var(--text-secondary, #8b8b8b);
481
+ font-size: 0.8rem;
482
+ overflow: hidden;
483
+ text-overflow: ellipsis;
484
+ white-space: nowrap;
485
+ }
486
+
487
+ .persona-catchphrase {
488
+ color: var(--text-secondary, #8b8b8b);
489
+ font-size: 0.75rem;
490
+ font-style: italic;
491
+ overflow: hidden;
492
+ text-overflow: ellipsis;
493
+ white-space: nowrap;
494
+ max-width: 100%;
495
+ }
496
+
497
+ /* =============================================================================
498
+ ProjectInfoBar Component Styles (Story 110-6)
499
+ ============================================================================= */
500
+
501
+ .project-info-bar {
502
+ display: flex;
503
+ align-items: center;
504
+ gap: 8px;
505
+ padding: 2px 12px;
506
+ background: var(--bg-primary, #1e1e1e);
507
+ border-bottom: 1px solid var(--border-color, #3c3c3c);
508
+ flex-shrink: 0;
509
+ min-height: 0;
510
+ font-size: 0.75rem;
511
+ color: var(--text-secondary, #8b8b8b);
512
+ }
513
+
514
+ .project-info-bar:empty {
515
+ display: none;
516
+ }
517
+
518
+ .project-info-dir {
519
+ overflow: hidden;
520
+ text-overflow: ellipsis;
521
+ white-space: nowrap;
522
+ font-family: var(--font-mono, monospace);
523
+ }
524
+
525
+ /* Message panel */
526
+ .message-panel {
527
+ display: flex;
528
+ flex-direction: column;
529
+ height: 100%;
530
+ flex: 1;
531
+ }
532
+
533
+ .message-panel-content {
534
+ flex: 1;
535
+ overflow: hidden; /* scroll handled by .message-list inside */
536
+ min-height: 0;
537
+ }
538
+
539
+ .message-panel-resize-handle {
540
+ height: 4px;
541
+ flex-shrink: 0;
542
+ cursor: row-resize;
543
+ background: var(--border-color, #3c3c3c);
544
+ transition: background 0.15s ease;
545
+ }
546
+
547
+ .message-panel-resize-handle:hover {
548
+ background: var(--accent-color, #007acc);
549
+ }
550
+
551
+ .message-panel-editor {
552
+ flex-shrink: 0;
553
+ background: var(--bg-secondary, #252526);
554
+ overflow: visible;
555
+ display: flex;
556
+ flex-direction: column;
557
+ min-height: 120px;
558
+ }
559
+
560
+ /* Message View - the conversation area */
561
+ .message-view {
562
+ display: flex;
563
+ flex-direction: column;
564
+ height: 100%;
565
+ width: 100%;
566
+ position: relative;
567
+ }
568
+
569
+ /* Message List - scrollable message container */
570
+ .message-list {
571
+ flex: 1;
572
+ min-height: 0;
573
+ overflow-y: auto;
574
+ overflow-x: hidden;
575
+ display: flex;
576
+ flex-direction: column;
577
+ gap: 0;
578
+ padding: 1rem 1.5rem;
579
+ }
580
+
581
+ /* Individual messages — Tufte: no bubbles, no backgrounds */
582
+ .message {
583
+ display: flex;
584
+ gap: 0.75rem;
585
+ padding: 0.25rem 0;
586
+ line-height: 1.5;
587
+ }
588
+
589
+ .message-avatar {
590
+ flex-shrink: 0;
591
+ width: 2rem;
592
+ height: 2rem;
593
+ display: flex;
594
+ align-items: center;
595
+ justify-content: center;
596
+ font-size: 1.25rem;
597
+ }
598
+
599
+ .message-content {
600
+ flex: 1;
601
+ min-width: 0;
602
+ overflow-wrap: break-word;
603
+ }
604
+
605
+ .message-content p {
606
+ margin: 0 0 0.5rem 0;
607
+ }
608
+
609
+ .message-content p:last-child {
610
+ margin-bottom: 0;
611
+ }
612
+
613
+ .message-content pre {
614
+ background: var(--bg-primary, #1e1e1e);
615
+ padding: 0.75rem;
616
+ border-radius: 4px;
617
+ overflow-x: auto;
618
+ margin: 0.5rem 0;
619
+ }
620
+
621
+ .message-content code {
622
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
623
+ font-size: var(--font-size-code, 0.875em);
624
+ }
625
+
626
+ .message-content pre code {
627
+ background: none;
628
+ padding: 0;
629
+ }
630
+
631
+ .message-content :not(pre) > code {
632
+ background: var(--bg-tertiary, #2d2d2d);
633
+ padding: 0.125rem 0.375rem;
634
+ border-radius: 3px;
635
+ }
636
+
637
+ .message-content .table-wrapper {
638
+ margin: 0.5rem 0;
639
+ overflow-x: auto;
640
+ border-radius: 4px;
641
+ border: 1px solid var(--border-primary, #333);
642
+ }
643
+
644
+ .message-content table {
645
+ border-collapse: collapse;
646
+ width: 100%;
647
+ font-size: 0.85em;
648
+ }
649
+
650
+ .message-content thead th {
651
+ font-size: 0.75rem;
652
+ font-weight: 600;
653
+ text-transform: uppercase;
654
+ letter-spacing: 0.03em;
655
+ color: var(--text-secondary, #8b8b8b);
656
+ padding: 0.4rem 0.75rem;
657
+ text-align: left;
658
+ background: var(--bg-primary, #1e1e1e);
659
+ border-bottom: 1px solid var(--border-primary, #333);
660
+ white-space: nowrap;
661
+ }
662
+
663
+ .message-content tbody td {
664
+ padding: 0.35rem 0.75rem;
665
+ color: var(--text-primary, #d4d4d4);
666
+ border-bottom: 1px solid var(--border-primary, #333);
667
+ }
668
+
669
+ .message-content tbody tr:last-child td {
670
+ border-bottom: none;
671
+ }
672
+
673
+ .message-content tbody tr:hover {
674
+ background: var(--bg-secondary, #252526);
675
+ }
676
+
677
+ .message-content th.sortable-th {
678
+ cursor: pointer;
679
+ user-select: none;
680
+ }
681
+
682
+ .message-content th.sortable-th:hover {
683
+ color: var(--text-primary, #d4d4d4);
684
+ }
685
+
686
+ .message-content .sort-indicator {
687
+ font-size: 0.65em;
688
+ opacity: 0.7;
689
+ }
690
+
691
+ /* User messages — blockquote left border */
692
+ .message-user {
693
+ border-left: 2px solid var(--text-secondary, #8b8b8b);
694
+ padding-left: 0.75rem;
695
+ color: var(--text-primary, #d4d4d4);
696
+ }
697
+
698
+ .message-user .message-content pre,
699
+ .message-user .message-content :not(pre) > code {
700
+ background: var(--bg-tertiary, #2d2d2d);
701
+ }
702
+
703
+ .message-attachment-indicator {
704
+ display: inline-flex;
705
+ align-items: center;
706
+ gap: 0.25rem;
707
+ margin-top: 0.5rem;
708
+ padding: 0.125rem 0.5rem;
709
+ background: rgba(0, 0, 0, 0.2);
710
+ border-radius: 4px;
711
+ font-size: 0.75rem;
712
+ opacity: 0.8;
713
+ }
714
+
715
+ /* Agent messages — no background, no constraints */
716
+ .message-agent {
717
+ color: var(--text-primary, #d4d4d4);
718
+ }
719
+
720
+ /* Turn-based grouping — Tufte spacing */
721
+ .turn-group {
722
+ padding-top: 1rem;
723
+ }
724
+
725
+ .turn-group:first-child {
726
+ padding-top: 0;
727
+ }
728
+
729
+ .turn-group + .turn-group {
730
+ border-top: 1px solid var(--border-color, #3c3c3c);
731
+ }
732
+
733
+ /* Turn label — speaker + timestamp + optional role badge */
734
+ .turn-label {
735
+ display: flex;
736
+ align-items: center;
737
+ flex-wrap: wrap;
738
+ gap: 0.5rem;
739
+ padding: 0.25rem 0;
740
+ margin-bottom: 0.25rem;
741
+ padding-left: 2.75rem; /* align with message content: avatar 2rem + gap 0.75rem */
742
+ }
743
+
744
+ .turn-speaker {
745
+ font-size: 0.75rem;
746
+ font-weight: 600;
747
+ color: var(--text-secondary, #8b8b8b);
748
+ text-transform: uppercase;
749
+ letter-spacing: 0.05em;
750
+ }
751
+
752
+ .turn-timestamp {
753
+ font-size: 0.6875rem;
754
+ color: var(--text-muted, #666);
755
+ margin-left: auto;
756
+ }
757
+
758
+ /* Role badge in turn label — flush right under timestamp */
759
+ .turn-role-badge {
760
+ font-size: 0.5625rem;
761
+ padding: 0px 5px;
762
+ color: #fff;
763
+ border-radius: 3px;
764
+ font-weight: 700;
765
+ letter-spacing: 0.05em;
766
+ line-height: 1.4;
767
+ }
768
+
769
+ /* Context cleared divider bar */
770
+ .context-cleared-bar {
771
+ display: flex;
772
+ align-items: center;
773
+ gap: 0.75rem;
774
+ padding: 0.5rem 0;
775
+ }
776
+
777
+ .context-cleared-line {
778
+ flex: 1;
779
+ background-color: var(--text-muted, #666);
780
+ opacity: 0.4;
781
+ }
782
+
783
+ .context-cleared-label {
784
+ font-size: 0.6875rem;
785
+ font-weight: 600;
786
+ color: var(--text-muted, #666);
787
+ text-transform: uppercase;
788
+ letter-spacing: 0.08em;
789
+ white-space: nowrap;
790
+ }
791
+
792
+ .context-cleared-time {
793
+ font-size: 0.625rem;
794
+ color: var(--text-muted, #666);
795
+ opacity: 0.7;
796
+ white-space: nowrap;
797
+ }
798
+
799
+ /* User turn: left-aligned like agent turns */
800
+
801
+ /* Hide avatar on continuation messages (same speaker, not first in turn) */
802
+ .message.continuation .message-avatar {
803
+ visibility: hidden;
804
+ }
805
+
806
+ /* Same-turn messages: tight spacing */
807
+ .message.continuation {
808
+ padding-top: 0;
809
+ }
810
+
811
+ /* Hook/System message styling (AC3: Story 75-5) */
812
+ .message-hook,
813
+ .message-system {
814
+ background: none;
815
+ border-left: 2px dashed var(--border-color, #3c3c3c);
816
+ padding-left: 0.75rem;
817
+ color: var(--text-secondary, #8b8b8b);
818
+ font-size: 0.85rem;
819
+ }
820
+
821
+ .message-hook .message-avatar,
822
+ .message-system .message-avatar {
823
+ color: var(--text-secondary, #8b8b8b);
824
+ }
825
+
826
+ .hook-feedback {
827
+ background: var(--bg-secondary, #252526);
828
+ border-left: 3px solid var(--warning-color, #cca700);
829
+ padding-left: 0.75rem;
830
+ }
831
+
832
+ .message-tool_use,
833
+ .message-tool_result {
834
+ background: none;
835
+ border: none;
836
+ color: var(--text-secondary, #8b8b8b);
837
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
838
+ font-size: var(--font-size-code, 0.85rem);
839
+ }
840
+
841
+ .tool-name {
842
+ font-weight: 600;
843
+ color: var(--accent-color, #007acc);
844
+ margin-bottom: 0.25rem;
845
+ }
846
+
847
+ /* =============================================================================
848
+ Avatar Portraits
849
+ ============================================================================= */
850
+
851
+ .avatar-portrait {
852
+ width: 100%;
853
+ height: 100%;
854
+ border-radius: 50%;
855
+ object-fit: cover;
856
+ }
857
+
858
+ .avatar-emoji {
859
+ font-size: 1.25rem;
860
+ }
861
+
862
+ /* Thinking/streaming indicator - portrait throbs */
863
+ @keyframes avatar-throb {
864
+ 0%, 100% {
865
+ transform: scale(1);
866
+ box-shadow: 0 0 0 0 var(--accent-color, #007acc);
867
+ }
868
+ 50% {
869
+ transform: scale(1.08);
870
+ box-shadow: 0 0 8px 2px var(--accent-color, #007acc);
871
+ }
872
+ }
873
+
874
+ .avatar-thinking {
875
+ animation: avatar-throb 1.2s ease-in-out infinite;
876
+ }
877
+
878
+ /* Backseat thinking indicator - subtler throb for tandem portrait */
879
+ @keyframes tandem-throb {
880
+ 0%, 100% {
881
+ transform: scale(1);
882
+ box-shadow: 0 0 0 0 var(--accent-color, #007acc);
883
+ }
884
+ 50% {
885
+ transform: scale(1.04);
886
+ box-shadow: 0 0 6px 1px var(--accent-color, #007acc);
887
+ }
888
+ }
889
+
890
+ .avatar-tandem-thinking {
891
+ animation: tandem-throb 1.8s ease-in-out infinite;
892
+ }
893
+
894
+ /* Observation pulse - one-shot on primary portrait when backseat observation injected */
895
+ @keyframes observation-pulse {
896
+ 0% {
897
+ box-shadow: 0 0 12px 4px var(--accent-color, #007acc);
898
+ }
899
+ 100% {
900
+ box-shadow: 0 0 0 0 var(--accent-color, #007acc);
901
+ }
902
+ }
903
+
904
+ .avatar-observation-pulse {
905
+ animation: observation-pulse 600ms ease-out 1;
906
+ }
907
+
908
+ @media (prefers-reduced-motion: reduce) {
909
+ .avatar-thinking {
910
+ animation: none;
911
+ opacity: 0.85;
912
+ border: 2px solid var(--accent-color, #007acc);
913
+ }
914
+ .avatar-tandem-thinking {
915
+ animation: none;
916
+ opacity: 0.85;
917
+ border: 2px solid var(--accent-color, #007acc);
918
+ }
919
+ .avatar-observation-pulse {
920
+ animation: none;
921
+ opacity: 0.9;
922
+ border: 2px solid var(--accent-color, #007acc);
923
+ }
924
+ }
925
+
926
+ .message-avatar.avatar-fallback::after {
927
+ content: '🤖';
928
+ font-size: 1.25rem;
929
+ }
930
+
931
+ /* =============================================================================
932
+ Subagent Span Styles — Tufte: indented left-border, no box
933
+ ============================================================================= */
934
+
935
+ .subagent-span {
936
+ margin: 0.5rem 0;
937
+ margin-left: 2.75rem; /* align with message content */
938
+ border: none;
939
+ border-left: 2px solid var(--accent-color, #007acc);
940
+ border-radius: 0;
941
+ background: none;
942
+ padding-left: 0.5rem;
943
+ }
944
+
945
+ .subagent-header {
946
+ display: flex;
947
+ align-items: center;
948
+ gap: 0.5rem;
949
+ padding: 0.25rem 0;
950
+ cursor: pointer;
951
+ background: none;
952
+ border-radius: 0;
953
+ font-size: 0.8rem;
954
+ transition: background-color 0.15s ease;
955
+ }
956
+
957
+ .subagent-header:hover {
958
+ background-color: var(--bg-secondary, #252526);
959
+ }
960
+
961
+ .subagent-toggle {
962
+ color: var(--text-secondary, #8b8b8b);
963
+ font-size: 0.625rem;
964
+ width: 0.875rem;
965
+ display: flex;
966
+ align-items: center;
967
+ justify-content: center;
968
+ }
969
+
970
+ .subagent-helper-name {
971
+ font-weight: 600;
972
+ color: var(--text-primary, #d4d4d4);
973
+ }
974
+
975
+ .subagent-friendly-message {
976
+ color: var(--text-secondary, #8b8b8b);
977
+ overflow: hidden;
978
+ text-overflow: ellipsis;
979
+ white-space: nowrap;
980
+ flex: 1;
981
+ min-width: 0;
982
+ }
983
+
984
+ .subagent-type-badge {
985
+ font-size: 0.625rem;
986
+ padding: 0 4px;
987
+ flex-shrink: 0;
988
+ }
989
+
990
+ .subagent-count {
991
+ color: var(--text-muted, #666);
992
+ font-size: 0.6875rem;
993
+ font-family: var(--font-mono, monospace);
994
+ margin-left: auto;
995
+ flex-shrink: 0;
996
+ }
997
+
998
+ .subagent-content {
999
+ padding: 0.25rem 0;
1000
+ }
1001
+
1002
+ /* Subagent prompt — truncated single line, no avatar */
1003
+ .message-subagent-prompt {
1004
+ background: none;
1005
+ border-left: none;
1006
+ color: var(--text-muted, #666);
1007
+ font-size: 0.75rem;
1008
+ padding: 0.125rem 0;
1009
+ }
1010
+
1011
+ .message-subagent-prompt .message-content {
1012
+ font-style: italic;
1013
+ overflow: hidden;
1014
+ text-overflow: ellipsis;
1015
+ white-space: nowrap;
1016
+ }
1017
+
1018
+ /* Tool calls inside subagent: no extra indent (already indented by parent) */
1019
+ .subagent-content .tool-call-block {
1020
+ margin-left: 0;
1021
+ }
1022
+
1023
+ .subagent-content .message {
1024
+ padding: 0.125rem 0;
1025
+ }
1026
+
1027
+ /* =============================================================================
1028
+ QuickActions Component Styles
1029
+ ============================================================================= */
1030
+
1031
+ .quick-actions {
1032
+ display: flex;
1033
+ flex-direction: column;
1034
+ gap: 8px;
1035
+ padding: 12px 16px;
1036
+ margin: 8px 0;
1037
+ background: var(--bg-secondary, #252526);
1038
+ border-radius: 8px;
1039
+ border: 1px solid var(--border-color, #3c3c3c);
1040
+ position: relative;
1041
+ z-index: 10;
1042
+ pointer-events: auto;
1043
+ }
1044
+
1045
+ .quick-actions-content {
1046
+ color: var(--text-secondary, #8b8b8b);
1047
+ font-size: 0.875rem;
1048
+ margin-bottom: 4px;
1049
+ }
1050
+
1051
+ .quick-actions-buttons {
1052
+ display: flex;
1053
+ flex-wrap: wrap;
1054
+ gap: 8px;
1055
+ }
1056
+
1057
+ .quick-action-btn {
1058
+ padding: 8px 16px;
1059
+ background: var(--accent-color, #007acc);
1060
+ border: 1px solid var(--accent-color, #007acc);
1061
+ border-radius: 6px;
1062
+ color: #fff;
1063
+ font-size: 0.875rem;
1064
+ font-weight: 500;
1065
+ cursor: pointer;
1066
+ transition: all 0.15s ease;
1067
+ }
1068
+
1069
+ .quick-action-btn:hover:not(:disabled) {
1070
+ background: var(--accent-hover, #0098ff);
1071
+ border-color: var(--accent-hover, #0098ff);
1072
+ filter: brightness(1.1);
1073
+ }
1074
+
1075
+ .quick-action-btn:disabled {
1076
+ opacity: 0.5;
1077
+ cursor: not-allowed;
1078
+ }
1079
+
1080
+ .quick-actions-input {
1081
+ display: flex;
1082
+ gap: 8px;
1083
+ }
1084
+
1085
+ .quick-actions-input input {
1086
+ flex: 1;
1087
+ padding: 8px 12px;
1088
+ background: var(--bg-primary, #1e1e1e);
1089
+ border: 1px solid var(--border-color, #3c3c3c);
1090
+ border-radius: 6px;
1091
+ color: var(--text-primary, #d4d4d4);
1092
+ font-size: 0.875rem;
1093
+ }
1094
+
1095
+ .quick-actions-input input:focus {
1096
+ outline: none;
1097
+ border-color: var(--accent-color, #007acc);
1098
+ }
1099
+
1100
+ .auto-invoke-status {
1101
+ color: var(--text-secondary, #8b8b8b);
1102
+ font-size: 0.875rem;
1103
+ font-style: italic;
1104
+ }
1105
+
1106
+ /* Scroll to bottom button */
1107
+ .scroll-to-bottom-button {
1108
+ position: absolute;
1109
+ bottom: 1rem;
1110
+ right: 1rem;
1111
+ padding: 0.5rem 0.75rem;
1112
+ background: var(--accent-color, #007acc);
1113
+ border: none;
1114
+ border-radius: 4px;
1115
+ color: #fff;
1116
+ cursor: pointer;
1117
+ font-size: 0.875rem;
1118
+ transition: all 0.2s ease;
1119
+ z-index: 10;
1120
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
1121
+ }
1122
+
1123
+ .scroll-to-bottom-button:hover {
1124
+ background: var(--accent-color-hover, #0098ff);
1125
+ }
1126
+
1127
+ /* Empty state */
1128
+ .message-view-empty {
1129
+ display: flex;
1130
+ align-items: center;
1131
+ justify-content: center;
1132
+ flex: 1;
1133
+ color: var(--text-secondary, #8b8b8b);
1134
+ font-size: 0.875rem;
1135
+ text-align: center;
1136
+ padding: 2rem;
1137
+ }
1138
+
1139
+ .message-panel.error {
1140
+ color: var(--error-color, #f14c4c);
1141
+ }
1142
+
1143
+ .streaming-indicator {
1144
+ padding: 8px 1rem;
1145
+ text-align: left;
1146
+ color: var(--accent-color, #007acc);
1147
+ font-style: italic;
1148
+ font-size: 0.875rem;
1149
+ }
1150
+
1151
+
1152
+ /* =============================================================================
1153
+ Editor Component Styles
1154
+ ============================================================================= */
1155
+
1156
+ /* Editor with controls layout */
1157
+ .editor-with-controls {
1158
+ display: flex;
1159
+ gap: 8px;
1160
+ align-items: stretch;
1161
+ height: 100%;
1162
+ }
1163
+
1164
+ .editor-area {
1165
+ flex: 1;
1166
+ min-width: 0; /* Prevent overflow */
1167
+ display: flex;
1168
+ flex-direction: column;
1169
+ }
1170
+
1171
+ .editor-container {
1172
+ display: flex;
1173
+ flex-direction: column;
1174
+ padding: 8px;
1175
+ min-width: 0; /* Prevent overflow */
1176
+ flex: 1;
1177
+ }
1178
+
1179
+ .mode-toolbar {
1180
+ display: flex;
1181
+ gap: 4px;
1182
+ margin-bottom: 8px;
1183
+ }
1184
+
1185
+ .mode-button {
1186
+ padding: 4px 12px;
1187
+ background: var(--bg-tertiary, #2d2d2d);
1188
+ border: 1px solid var(--border-color, #3c3c3c);
1189
+ border-radius: 4px;
1190
+ color: var(--text-secondary, #8b8b8b);
1191
+ font-size: 0.75rem;
1192
+ cursor: pointer;
1193
+ transition: all 0.15s ease;
1194
+ }
1195
+
1196
+ .mode-button:hover {
1197
+ color: var(--text-primary, #d4d4d4);
1198
+ background: var(--bg-hover, #3c3c3c);
1199
+ }
1200
+
1201
+ .mode-button.active {
1202
+ color: var(--accent-color, #007acc);
1203
+ border-color: var(--accent-color, #007acc);
1204
+ background: var(--bg-active, #37373d);
1205
+ }
1206
+
1207
+ .editor-wrapper {
1208
+ position: relative;
1209
+ min-width: 0; /* Prevent overflow */
1210
+ flex: 1;
1211
+ display: flex;
1212
+ flex-direction: column;
1213
+ }
1214
+
1215
+ .editor-textarea {
1216
+ width: 100%;
1217
+ min-height: 60px;
1218
+ flex: 1;
1219
+ padding: 8px;
1220
+ background: var(--bg-primary, #1e1e1e);
1221
+ border: 1px solid var(--border-color, #3c3c3c);
1222
+ border-radius: 4px;
1223
+ color: var(--text-primary, #d4d4d4);
1224
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
1225
+ font-size: 0.875rem;
1226
+ line-height: 1.4;
1227
+ resize: none;
1228
+ box-sizing: border-box;
1229
+ }
1230
+
1231
+ .editor-textarea:focus {
1232
+ outline: none;
1233
+ border-color: var(--accent-color, #007acc);
1234
+ }
1235
+
1236
+ .editor-textarea::placeholder {
1237
+ color: var(--text-secondary, #8b8b8b);
1238
+ }
1239
+
1240
+ /* Completion popup */
1241
+ .completion-popup {
1242
+ position: absolute;
1243
+ bottom: 100%;
1244
+ left: 0;
1245
+ right: 0;
1246
+ max-height: 200px;
1247
+ overflow-y: auto;
1248
+ background: var(--bg-secondary, #252526);
1249
+ border: 1px solid var(--border-color, #3c3c3c);
1250
+ border-radius: 4px;
1251
+ margin-bottom: 4px;
1252
+ box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.3);
1253
+ z-index: 100;
1254
+ }
1255
+
1256
+ .completion-item {
1257
+ display: flex;
1258
+ justify-content: space-between;
1259
+ padding: 6px 10px;
1260
+ cursor: pointer;
1261
+ transition: background 0.1s ease;
1262
+ }
1263
+
1264
+ .completion-item:hover,
1265
+ .completion-item.selected {
1266
+ background: var(--bg-hover, #3c3c3c);
1267
+ }
1268
+
1269
+ .completion-name {
1270
+ color: var(--accent-color, #007acc);
1271
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
1272
+ font-size: 0.8rem;
1273
+ }
1274
+
1275
+ .completion-desc {
1276
+ color: var(--text-secondary, #8b8b8b);
1277
+ font-size: 0.75rem;
1278
+ margin-left: 12px;
1279
+ }
1280
+
1281
+ /* Queue indicator */
1282
+ .queue-indicator {
1283
+ display: flex;
1284
+ align-items: center;
1285
+ justify-content: space-between;
1286
+ padding: 4px 8px;
1287
+ background: var(--bg-tertiary, #2d2d2d);
1288
+ border-radius: 4px;
1289
+ margin-top: 8px;
1290
+ font-size: 0.75rem;
1291
+ }
1292
+
1293
+ .queue-count {
1294
+ color: var(--text-secondary, #8b8b8b);
1295
+ }
1296
+
1297
+ .queue-clear {
1298
+ padding: 2px 8px;
1299
+ background: transparent;
1300
+ border: 1px solid var(--border-color, #3c3c3c);
1301
+ border-radius: 3px;
1302
+ color: var(--text-secondary, #8b8b8b);
1303
+ cursor: pointer;
1304
+ font-size: 0.7rem;
1305
+ }
1306
+
1307
+ .queue-clear:hover {
1308
+ color: var(--text-primary, #d4d4d4);
1309
+ border-color: var(--text-secondary, #8b8b8b);
1310
+ }
1311
+
1312
+ /* Image preview */
1313
+ .image-preview {
1314
+ display: flex;
1315
+ flex-wrap: wrap;
1316
+ gap: 8px;
1317
+ margin-bottom: 8px;
1318
+ }
1319
+
1320
+ .image-preview-item {
1321
+ position: relative;
1322
+ width: 60px;
1323
+ height: 60px;
1324
+ border-radius: 4px;
1325
+ overflow: hidden;
1326
+ border: 1px solid var(--border-color, #3c3c3c);
1327
+ }
1328
+
1329
+ .image-preview-item img {
1330
+ width: 100%;
1331
+ height: 100%;
1332
+ object-fit: cover;
1333
+ }
1334
+
1335
+ .image-remove {
1336
+ position: absolute;
1337
+ top: 2px;
1338
+ right: 2px;
1339
+ width: 16px;
1340
+ height: 16px;
1341
+ background: rgba(0, 0, 0, 0.7);
1342
+ border: none;
1343
+ border-radius: 50%;
1344
+ color: white;
1345
+ font-size: 10px;
1346
+ cursor: pointer;
1347
+ display: flex;
1348
+ align-items: center;
1349
+ justify-content: center;
1350
+ }
1351
+
1352
+ /* =============================================================================
1353
+ ControlBar Component Styles
1354
+ ============================================================================= */
1355
+
1356
+ .control-bar {
1357
+ display: flex;
1358
+ flex-direction: column;
1359
+ gap: 4px;
1360
+ padding: 8px;
1361
+ flex-shrink: 0;
1362
+ align-self: flex-end;
1363
+ }
1364
+
1365
+ .btn-stop {
1366
+ display: flex;
1367
+ align-items: center;
1368
+ gap: 6px;
1369
+ padding: 8px 16px;
1370
+ background: var(--error-color, #f14c4c);
1371
+ border: none;
1372
+ border-radius: 4px;
1373
+ color: #fff;
1374
+ font-size: 0.8rem;
1375
+ font-weight: 500;
1376
+ cursor: pointer;
1377
+ transition: all 0.15s ease;
1378
+ white-space: nowrap;
1379
+ }
1380
+
1381
+ .btn-stop:hover:not(:disabled) {
1382
+ background: #ff6b6b;
1383
+ }
1384
+
1385
+ .btn-stop:disabled {
1386
+ opacity: 0.4;
1387
+ cursor: not-allowed;
1388
+ background: var(--bg-tertiary, #2d2d2d);
1389
+ color: var(--text-secondary, #8b8b8b);
1390
+ }
1391
+
1392
+ .btn-stop.stopping {
1393
+ background: var(--warning-color, #cca700);
1394
+ }
1395
+
1396
+ .btn-stop.throbbing {
1397
+ animation: throb 1.5s ease-in-out infinite;
1398
+ }
1399
+
1400
+ @keyframes throb {
1401
+ 0%, 100% {
1402
+ transform: scale(1);
1403
+ box-shadow: 0 0 0 0 rgba(241, 76, 76, 0.4);
1404
+ }
1405
+ 50% {
1406
+ transform: scale(1.02);
1407
+ box-shadow: 0 0 0 6px rgba(241, 76, 76, 0);
1408
+ }
1409
+ }
1410
+
1411
+ .btn-stop .icon {
1412
+ font-size: 0.9rem;
1413
+ }
1414
+
1415
+ .btn-stop .spinner {
1416
+ width: 12px;
1417
+ height: 12px;
1418
+ border: 2px solid rgba(255, 255, 255, 0.3);
1419
+ border-top-color: #fff;
1420
+ border-radius: 50%;
1421
+ animation: spin 0.8s linear infinite;
1422
+ }
1423
+
1424
+ @keyframes spin {
1425
+ to { transform: rotate(360deg); }
1426
+ }
1427
+
1428
+ .btn-reset {
1429
+ display: flex;
1430
+ align-items: center;
1431
+ justify-content: center;
1432
+ padding: 8px 16px;
1433
+ background: var(--bg-tertiary, #2d2d2d);
1434
+ border: 1px solid var(--border-color, #3c3c3c);
1435
+ border-radius: 4px;
1436
+ color: var(--text-secondary, #8b8b8b);
1437
+ font-size: 0.8rem;
1438
+ cursor: pointer;
1439
+ transition: all 0.15s ease;
1440
+ white-space: nowrap;
1441
+ }
1442
+
1443
+ .btn-reset:hover {
1444
+ color: var(--text-primary, #d4d4d4);
1445
+ background: var(--bg-hover, #3c3c3c);
1446
+ border-color: var(--text-secondary, #8b8b8b);
1447
+ }
1448
+
1449
+ /* =============================================================================
1450
+ Sidebar Panel Styles
1451
+ ============================================================================= */
1452
+
1453
+ /* Sprint panel */
1454
+ .sprint-panel {
1455
+ padding: 8px;
1456
+ }
1457
+
1458
+ .sprint-panel .story-header {
1459
+ display: flex;
1460
+ align-items: center;
1461
+ gap: 8px;
1462
+ margin-bottom: 8px;
1463
+ }
1464
+
1465
+ .sprint-panel .story-id {
1466
+ color: var(--accent-color, #007acc);
1467
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
1468
+ font-size: 0.8rem;
1469
+ }
1470
+
1471
+ .sprint-panel .story-status {
1472
+ padding: 2px 6px;
1473
+ background: var(--bg-tertiary, #2d2d2d);
1474
+ border-radius: 3px;
1475
+ font-size: 0.7rem;
1476
+ text-transform: uppercase;
1477
+ }
1478
+
1479
+ .sprint-panel .story-title {
1480
+ font-size: 0.875rem;
1481
+ font-weight: 500;
1482
+ margin: 0 0 8px 0;
1483
+ }
1484
+
1485
+ .sprint-panel .story-phase,
1486
+ .sprint-panel .story-workflow,
1487
+ .sprint-panel .story-points,
1488
+ .sprint-panel .story-epic {
1489
+ font-size: 0.75rem;
1490
+ color: var(--text-secondary, #8b8b8b);
1491
+ margin-bottom: 4px;
1492
+ }
1493
+
1494
+ .sprint-panel .hint {
1495
+ font-size: 0.75rem;
1496
+ color: var(--text-secondary, #8b8b8b);
1497
+ margin-top: 8px;
1498
+ }
1499
+
1500
+ /* Enhanced Sprint Panel (MSSCI-14189) */
1501
+ .enhanced-sprint-panel {
1502
+ padding: 12px;
1503
+ font-size: 0.8rem;
1504
+ }
1505
+
1506
+ .enhanced-sprint-panel section {
1507
+ margin-bottom: 16px;
1508
+ }
1509
+
1510
+ .enhanced-sprint-panel section:last-child {
1511
+ margin-bottom: 0;
1512
+ }
1513
+
1514
+ .enhanced-sprint-panel h2 {
1515
+ font-size: 0.7rem;
1516
+ font-weight: 600;
1517
+ text-transform: uppercase;
1518
+ letter-spacing: 0.05em;
1519
+ color: var(--text-secondary, #8b8b8b);
1520
+ margin: 0 0 8px 0;
1521
+ padding-bottom: 4px;
1522
+ border-bottom: 1px solid var(--border-color, #3c3c3c);
1523
+ }
1524
+
1525
+ /* Current Story Section */
1526
+ .enhanced-sprint-panel [data-section="current-story"] .story-id {
1527
+ color: var(--accent-color, #007acc);
1528
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
1529
+ font-size: 0.75rem;
1530
+ margin-right: 8px;
1531
+ }
1532
+
1533
+ .enhanced-sprint-panel [data-section="current-story"] .story-title {
1534
+ font-weight: 500;
1535
+ display: block;
1536
+ margin: 4px 0;
1537
+ }
1538
+
1539
+ .enhanced-sprint-panel [data-section="current-story"] .story-status {
1540
+ display: inline-block;
1541
+ padding: 2px 6px;
1542
+ background: var(--accent-color, #007acc);
1543
+ color: #fff;
1544
+ border-radius: 3px;
1545
+ font-size: 0.65rem;
1546
+ text-transform: uppercase;
1547
+ margin-right: 6px;
1548
+ }
1549
+
1550
+ .enhanced-sprint-panel [data-section="current-story"] .story-points {
1551
+ font-size: 0.7rem;
1552
+ color: var(--text-secondary, #8b8b8b);
1553
+ }
1554
+
1555
+ .enhanced-sprint-panel .next-up-label {
1556
+ font-size: 0.7rem;
1557
+ color: var(--text-secondary, #8b8b8b);
1558
+ font-style: italic;
1559
+ margin-right: 6px;
1560
+ }
1561
+
1562
+ /* Epic Group */
1563
+ .enhanced-sprint-panel .epic-group {
1564
+ border: 1px solid var(--border-color, #3c3c3c);
1565
+ border-radius: 4px;
1566
+ margin-bottom: 8px;
1567
+ overflow: hidden;
1568
+ }
1569
+
1570
+ .enhanced-sprint-panel .epic-group:last-child {
1571
+ margin-bottom: 0;
1572
+ }
1573
+
1574
+ .enhanced-sprint-panel .epic-group.epic-completed {
1575
+ opacity: 0.7;
1576
+ }
1577
+
1578
+ /* Completed Epics Section */
1579
+ .enhanced-sprint-panel [data-section="completed-epics"] .epic-group {
1580
+ opacity: 0.5;
1581
+ border-color: var(--border-color, #3c3c3c);
1582
+ }
1583
+
1584
+ .enhanced-sprint-panel [data-section="completed-epics"] .epic-group:hover {
1585
+ opacity: 0.7;
1586
+ }
1587
+
1588
+ /* Epic Header */
1589
+ .enhanced-sprint-panel .epic-header {
1590
+ display: flex;
1591
+ align-items: center;
1592
+ gap: 8px;
1593
+ padding: 8px;
1594
+ background: var(--bg-tertiary, #2d2d2d);
1595
+ }
1596
+
1597
+ .enhanced-sprint-panel .epic-toggle {
1598
+ background: none;
1599
+ border: none;
1600
+ color: var(--text-secondary, #8b8b8b);
1601
+ cursor: pointer;
1602
+ padding: 0;
1603
+ font-size: 0.7rem;
1604
+ width: 16px;
1605
+ flex-shrink: 0;
1606
+ }
1607
+
1608
+ .enhanced-sprint-panel .epic-toggle:hover {
1609
+ color: var(--text-primary, #d4d4d4);
1610
+ }
1611
+
1612
+ .enhanced-sprint-panel .epic-toggle:focus-visible {
1613
+ outline: 2px solid var(--accent-color, #007acc);
1614
+ outline-offset: 2px;
1615
+ border-radius: 2px;
1616
+ }
1617
+
1618
+ .enhanced-sprint-panel .epic-title {
1619
+ font-weight: 500;
1620
+ flex: 1;
1621
+ min-width: 0;
1622
+ overflow: hidden;
1623
+ text-overflow: ellipsis;
1624
+ white-space: nowrap;
1625
+ }
1626
+
1627
+ .enhanced-sprint-panel .epic-jira {
1628
+ font-size: 0.65rem;
1629
+ color: var(--text-secondary, #8b8b8b);
1630
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
1631
+ }
1632
+
1633
+ /* Epic Progress Bar */
1634
+ .enhanced-sprint-panel .epic-progress {
1635
+ width: 60px;
1636
+ height: 4px;
1637
+ background: var(--bg-secondary, #252526);
1638
+ border-radius: 2px;
1639
+ overflow: hidden;
1640
+ flex-shrink: 0;
1641
+ }
1642
+
1643
+ .enhanced-sprint-panel .epic-progress .progress-bar {
1644
+ height: 100%;
1645
+ background: var(--accent-color, #007acc);
1646
+ border-radius: 2px;
1647
+ transition: width 0.2s ease;
1648
+ }
1649
+
1650
+ .enhanced-sprint-panel .epic-progress-label {
1651
+ font-size: 0.65rem;
1652
+ color: var(--text-secondary, #8b8b8b);
1653
+ min-width: 50px;
1654
+ text-align: right;
1655
+ }
1656
+
1657
+ /* Archive Button */
1658
+ .enhanced-sprint-panel .archive-button {
1659
+ padding: 2px 8px;
1660
+ background: transparent;
1661
+ border: 1px solid var(--border-color, #3c3c3c);
1662
+ border-radius: 3px;
1663
+ color: var(--text-secondary, #8b8b8b);
1664
+ font-size: 0.65rem;
1665
+ cursor: pointer;
1666
+ transition: all 0.15s ease;
1667
+ }
1668
+
1669
+ .enhanced-sprint-panel .archive-button:hover:not(:disabled) {
1670
+ background: var(--bg-hover, #3c3c3c);
1671
+ color: var(--text-primary, #d4d4d4);
1672
+ border-color: var(--text-secondary, #8b8b8b);
1673
+ }
1674
+
1675
+ .enhanced-sprint-panel .archive-button:disabled {
1676
+ opacity: 0.5;
1677
+ cursor: not-allowed;
1678
+ }
1679
+
1680
+ /* Story Items */
1681
+ .enhanced-sprint-panel .epic-stories {
1682
+ border-top: 1px solid var(--border-color, #3c3c3c);
1683
+ }
1684
+
1685
+ .enhanced-sprint-panel .story-item {
1686
+ display: flex;
1687
+ align-items: center;
1688
+ gap: 8px;
1689
+ padding: 6px 8px 6px 28px;
1690
+ border-bottom: 1px solid var(--border-color, #3c3c3c);
1691
+ transition: background 0.1s ease;
1692
+ }
1693
+
1694
+ .enhanced-sprint-panel .story-item:last-child {
1695
+ border-bottom: none;
1696
+ }
1697
+
1698
+ .enhanced-sprint-panel .story-item:hover {
1699
+ background: var(--bg-hover, rgba(255, 255, 255, 0.03));
1700
+ }
1701
+
1702
+ .enhanced-sprint-panel .story-item .story-info {
1703
+ flex: 1;
1704
+ min-width: 0;
1705
+ display: flex;
1706
+ flex-direction: column;
1707
+ gap: 1px;
1708
+ }
1709
+
1710
+ .enhanced-sprint-panel .story-item .story-title {
1711
+ overflow: hidden;
1712
+ text-overflow: ellipsis;
1713
+ white-space: nowrap;
1714
+ font-size: 0.75rem;
1715
+ }
1716
+
1717
+ .enhanced-sprint-panel .story-item .story-meta {
1718
+ display: flex;
1719
+ align-items: center;
1720
+ gap: 6px;
1721
+ }
1722
+
1723
+ .enhanced-sprint-panel .story-item .story-assignee {
1724
+ font-size: 0.625rem;
1725
+ color: var(--text-tertiary, #6b6b6b);
1726
+ font-style: italic;
1727
+ }
1728
+
1729
+ .enhanced-sprint-panel .story-item .story-workflow-badge {
1730
+ font-size: 0.5625rem;
1731
+ text-transform: uppercase;
1732
+ letter-spacing: 0.05em;
1733
+ color: var(--text-secondary, #8b8b8b);
1734
+ background: var(--bg-tertiary, #2d2d2d);
1735
+ padding: 0 4px;
1736
+ border-radius: 2px;
1737
+ }
1738
+
1739
+ .enhanced-sprint-panel .story-item .story-completed-date {
1740
+ font-size: 0.625rem;
1741
+ font-variant-numeric: tabular-nums;
1742
+ font-family: var(--font-mono, monospace);
1743
+ color: var(--text-tertiary, #6b6b6b);
1744
+ }
1745
+
1746
+ .enhanced-sprint-panel .story-item .priority-label {
1747
+ font-size: 0.6rem;
1748
+ font-weight: 500;
1749
+ color: var(--text-tertiary, #6b6b6b);
1750
+ flex-shrink: 0;
1751
+ opacity: 0.7;
1752
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
1753
+ }
1754
+
1755
+ .enhanced-sprint-panel .story-item .story-points {
1756
+ font-size: 0.65rem;
1757
+ color: var(--text-secondary, #8b8b8b);
1758
+ background: var(--bg-tertiary, #2d2d2d);
1759
+ padding: 1px 5px;
1760
+ border-radius: 3px;
1761
+ flex-shrink: 0;
1762
+ }
1763
+
1764
+ /* Story Status Colors via data-status attribute */
1765
+ .enhanced-sprint-panel .story-item[data-status="backlog"] {
1766
+ border-left: 3px solid var(--text-secondary, #8b8b8b);
1767
+ }
1768
+
1769
+ .enhanced-sprint-panel .story-item[data-status="in_progress"] {
1770
+ border-left: 3px solid var(--accent-color, #007acc);
1771
+ background: rgba(0, 122, 204, 0.05);
1772
+ }
1773
+
1774
+ .enhanced-sprint-panel .story-item[data-status="done"] {
1775
+ border-left: 3px solid var(--success-color, #4ec9b0);
1776
+ }
1777
+
1778
+ .enhanced-sprint-panel .story-item[data-status="cancelled"] {
1779
+ border-left: 3px solid var(--error-color, #f14c4c);
1780
+ opacity: 0.6;
1781
+ text-decoration: line-through;
1782
+ }
1783
+
1784
+ /* Copy ID Button — show on hover, feedback on click */
1785
+ .enhanced-sprint-panel .copy-id-button {
1786
+ opacity: 0;
1787
+ background: none;
1788
+ border: none;
1789
+ color: var(--text-secondary, #8b8b8b);
1790
+ cursor: pointer;
1791
+ padding: 2px;
1792
+ line-height: 1;
1793
+ flex-shrink: 0;
1794
+ transition: opacity 0.15s, color 0.15s;
1795
+ }
1796
+
1797
+ .enhanced-sprint-panel .story-item:hover .copy-id-button,
1798
+ .enhanced-sprint-panel .epic-header:hover .copy-id-button {
1799
+ opacity: 1;
1800
+ }
1801
+
1802
+ .enhanced-sprint-panel .copy-id-button:hover {
1803
+ color: var(--text-primary, #d4d4d4);
1804
+ }
1805
+
1806
+ .enhanced-sprint-panel .copy-id-button.copied {
1807
+ opacity: 1;
1808
+ color: var(--success-color, #4ec9b0);
1809
+ }
1810
+
1811
+ /* Future Initiatives Section */
1812
+ .enhanced-sprint-panel .future-epic {
1813
+ display: flex;
1814
+ align-items: center;
1815
+ gap: 8px;
1816
+ padding: 8px;
1817
+ border: 1px solid var(--border-color, #3c3c3c);
1818
+ border-radius: 4px;
1819
+ margin-bottom: 6px;
1820
+ }
1821
+
1822
+ .enhanced-sprint-panel .future-epic:last-child {
1823
+ margin-bottom: 0;
1824
+ }
1825
+
1826
+ .enhanced-sprint-panel .future-epic-title {
1827
+ flex: 1;
1828
+ min-width: 0;
1829
+ overflow: hidden;
1830
+ text-overflow: ellipsis;
1831
+ white-space: nowrap;
1832
+ font-weight: 500;
1833
+ }
1834
+
1835
+ .enhanced-sprint-panel .future-epic-points {
1836
+ font-size: 0.65rem;
1837
+ color: var(--text-secondary, #8b8b8b);
1838
+ }
1839
+
1840
+ /* Future Epic Status Badges */
1841
+ .enhanced-sprint-panel .future-epic-status {
1842
+ padding: 2px 6px;
1843
+ border-radius: 3px;
1844
+ font-size: 0.6rem;
1845
+ text-transform: uppercase;
1846
+ font-weight: 500;
1847
+ }
1848
+
1849
+ .enhanced-sprint-panel .future-epic-status[data-status="ready"],
1850
+ .enhanced-sprint-panel .future-epic[data-testid*="ready"] .future-epic-status {
1851
+ background: var(--accent-color, #007acc);
1852
+ color: #fff;
1853
+ }
1854
+
1855
+ .enhanced-sprint-panel .future-epic-status[data-status="planning"],
1856
+ .enhanced-sprint-panel .future-epic[data-testid*="planning"] .future-epic-status {
1857
+ background: var(--bg-tertiary, #2d2d2d);
1858
+ color: var(--text-secondary, #8b8b8b);
1859
+ }
1860
+
1861
+ .enhanced-sprint-panel .future-epic-status[data-status="blocked"],
1862
+ .enhanced-sprint-panel .future-epic[data-testid*="blocked"] .future-epic-status {
1863
+ background: var(--warning-color, #cca700);
1864
+ color: #000;
1865
+ }
1866
+
1867
+ /* Promote Button */
1868
+ .enhanced-sprint-panel .promote-button {
1869
+ padding: 3px 10px;
1870
+ background: var(--accent-color, #007acc);
1871
+ border: none;
1872
+ border-radius: 3px;
1873
+ color: #fff;
1874
+ font-size: 0.65rem;
1875
+ font-weight: 500;
1876
+ cursor: pointer;
1877
+ transition: background 0.15s ease;
1878
+ }
1879
+
1880
+ .enhanced-sprint-panel .promote-button:hover:not(:disabled) {
1881
+ background: var(--accent-hover, #0098ff);
1882
+ }
1883
+
1884
+ .enhanced-sprint-panel .promote-button:disabled {
1885
+ opacity: 0.5;
1886
+ cursor: not-allowed;
1887
+ }
1888
+
1889
+ /* Empty State */
1890
+ .enhanced-sprint-panel .empty-state {
1891
+ padding: 16px;
1892
+ text-align: center;
1893
+ color: var(--text-secondary, #8b8b8b);
1894
+ border: 1px dashed var(--border-color, #3c3c3c);
1895
+ border-radius: 4px;
1896
+ }
1897
+
1898
+ .enhanced-sprint-panel .empty-state .hint {
1899
+ font-size: 0.7rem;
1900
+ margin-top: 6px;
1901
+ margin-bottom: 0;
1902
+ font-style: italic;
1903
+ }
1904
+
1905
+ /* Loading and Error States */
1906
+ .enhanced-sprint-panel .loading-state {
1907
+ padding: 20px;
1908
+ text-align: center;
1909
+ color: var(--text-secondary, #8b8b8b);
1910
+ }
1911
+
1912
+ .enhanced-sprint-panel .error-toast {
1913
+ padding: 8px 12px;
1914
+ background: var(--error-color, #f14c4c);
1915
+ color: #fff;
1916
+ border-radius: 4px;
1917
+ font-size: 0.75rem;
1918
+ margin-bottom: 12px;
1919
+ }
1920
+
1921
+ /* Confirmation Dialog */
1922
+ .enhanced-sprint-panel .confirm-dialog {
1923
+ padding: 12px;
1924
+ background: var(--bg-tertiary, #2d2d2d);
1925
+ border: 1px solid var(--border-color, #3c3c3c);
1926
+ border-radius: 4px;
1927
+ margin-bottom: 12px;
1928
+ }
1929
+
1930
+ .enhanced-sprint-panel .confirm-dialog p {
1931
+ margin: 0 0 8px 0;
1932
+ font-size: 0.8rem;
1933
+ }
1934
+
1935
+ .enhanced-sprint-panel .confirm-dialog button {
1936
+ padding: 4px 12px;
1937
+ margin-right: 8px;
1938
+ border-radius: 3px;
1939
+ font-size: 0.75rem;
1940
+ cursor: pointer;
1941
+ }
1942
+
1943
+ .enhanced-sprint-panel .confirm-dialog button[data-testid="confirm-archive-yes"] {
1944
+ background: var(--error-color, #f14c4c);
1945
+ border: none;
1946
+ color: #fff;
1947
+ }
1948
+
1949
+ .enhanced-sprint-panel .confirm-dialog button[data-testid="confirm-archive-no"] {
1950
+ background: transparent;
1951
+ border: 1px solid var(--border-color, #3c3c3c);
1952
+ color: var(--text-secondary, #8b8b8b);
1953
+ }
1954
+
1955
+ /* Git panel */
1956
+ .git-panel {
1957
+ padding: 8px;
1958
+ }
1959
+
1960
+ .git-panel .branch-info {
1961
+ display: flex;
1962
+ align-items: center;
1963
+ gap: 6px;
1964
+ margin-bottom: 8px;
1965
+ }
1966
+
1967
+ .git-panel .branch-icon {
1968
+ color: var(--accent-color, #007acc);
1969
+ }
1970
+
1971
+ .git-panel .branch-name {
1972
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
1973
+ font-size: 0.8rem;
1974
+ }
1975
+
1976
+ .git-panel .dirty-indicator {
1977
+ color: var(--warning-color, #cca700);
1978
+ }
1979
+
1980
+ .git-panel .sync-status {
1981
+ display: flex;
1982
+ gap: 8px;
1983
+ margin-bottom: 8px;
1984
+ font-size: 0.75rem;
1985
+ }
1986
+
1987
+ .git-panel .ahead {
1988
+ color: var(--success-color, #4ec9b0);
1989
+ }
1990
+
1991
+ .git-panel .behind {
1992
+ color: var(--warning-color, #cca700);
1993
+ }
1994
+
1995
+ .git-panel .file-status {
1996
+ display: flex;
1997
+ flex-wrap: wrap;
1998
+ gap: 8px;
1999
+ }
2000
+
2001
+ .git-panel .status-item {
2002
+ font-size: 0.75rem;
2003
+ }
2004
+
2005
+ .git-panel .status-item.staged {
2006
+ color: var(--success-color, #4ec9b0);
2007
+ }
2008
+
2009
+ .git-panel .status-item.modified {
2010
+ color: var(--warning-color, #cca700);
2011
+ }
2012
+
2013
+ .git-panel .status-item.untracked {
2014
+ color: var(--text-secondary, #8b8b8b);
2015
+ }
2016
+
2017
+ /* Git panel - stacked multi-repo view */
2018
+ .git-panel.stacked {
2019
+ display: flex;
2020
+ flex-direction: column;
2021
+ gap: 12px;
2022
+ }
2023
+
2024
+ .git-panel .repo-status {
2025
+ padding: 8px;
2026
+ background: var(--bg-tertiary, #2d2d2d);
2027
+ border-radius: 4px;
2028
+ border-left: 3px solid var(--accent-color, #007acc);
2029
+ }
2030
+
2031
+ .git-panel .repo-header {
2032
+ display: flex;
2033
+ align-items: center;
2034
+ gap: 6px;
2035
+ margin-bottom: 4px;
2036
+ }
2037
+
2038
+ .git-panel .repo-name {
2039
+ font-size: 0.75rem;
2040
+ font-weight: 600;
2041
+ color: var(--text-secondary, #8b8b8b);
2042
+ text-transform: uppercase;
2043
+ letter-spacing: 0.5px;
2044
+ }
2045
+
2046
+ .git-panel .repo-status .branch-info {
2047
+ margin-bottom: 4px;
2048
+ }
2049
+
2050
+ .git-panel .repo-status .sync-status {
2051
+ margin-bottom: 4px;
2052
+ }
2053
+
2054
+ /* Develop-behind indicator */
2055
+ .git-panel .develop-behind {
2056
+ color: var(--status-warning, #cca700);
2057
+ }
2058
+
2059
+ .git-panel .repo-status .file-status {
2060
+ gap: 6px;
2061
+ }
2062
+
2063
+ /* File status toggle button */
2064
+ .git-panel .file-status-toggle {
2065
+ display: flex;
2066
+ align-items: center;
2067
+ gap: 6px;
2068
+ background: none;
2069
+ border: none;
2070
+ padding: 4px 0;
2071
+ cursor: pointer;
2072
+ width: 100%;
2073
+ text-align: left;
2074
+ }
2075
+
2076
+ .git-panel .file-status-toggle:hover {
2077
+ opacity: 0.8;
2078
+ }
2079
+
2080
+ .git-panel .toggle-icon {
2081
+ font-size: 0.6rem;
2082
+ color: var(--text-secondary, #8b8b8b);
2083
+ transition: transform 0.15s ease;
2084
+ }
2085
+
2086
+ .git-panel .toggle-icon.open {
2087
+ transform: rotate(90deg);
2088
+ }
2089
+
2090
+ /* File list dropdown */
2091
+ .git-panel .file-list {
2092
+ list-style: none;
2093
+ margin: 8px 0 0 0;
2094
+ padding: 0;
2095
+ border-top: 1px solid var(--border-color, #404040);
2096
+ padding-top: 8px;
2097
+ max-height: 200px;
2098
+ overflow-y: auto;
2099
+ }
2100
+
2101
+ .git-panel .file-item {
2102
+ display: flex;
2103
+ align-items: center;
2104
+ gap: 8px;
2105
+ padding: 2px 0;
2106
+ font-size: 0.75rem;
2107
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
2108
+ }
2109
+
2110
+ .git-panel .file-status-icon {
2111
+ width: 14px;
2112
+ text-align: center;
2113
+ font-weight: 600;
2114
+ }
2115
+
2116
+ .git-panel .file-item.staged .file-status-icon {
2117
+ color: var(--success-color, #4ec9b0);
2118
+ }
2119
+
2120
+ .git-panel .file-item.modified .file-status-icon {
2121
+ color: var(--warning-color, #cca700);
2122
+ }
2123
+
2124
+ .git-panel .file-item.untracked .file-status-icon {
2125
+ color: var(--text-secondary, #8b8b8b);
2126
+ }
2127
+
2128
+ .git-panel .file-path {
2129
+ overflow: hidden;
2130
+ text-overflow: ellipsis;
2131
+ white-space: nowrap;
2132
+ color: var(--text-primary, #d4d4d4);
2133
+ }
2134
+
2135
+ /* Progress panel and Todo panel (shared styles) */
2136
+ .progress-panel,
2137
+ .todo-panel {
2138
+ padding: 8px;
2139
+ }
2140
+
2141
+ .progress-panel .progress-bar-container,
2142
+ .todo-panel .progress-bar-container {
2143
+ position: relative;
2144
+ height: 20px;
2145
+ background: var(--bg-tertiary, #2d2d2d);
2146
+ border-radius: 4px;
2147
+ margin-bottom: 12px;
2148
+ overflow: hidden;
2149
+ }
2150
+
2151
+ .progress-panel .progress-bar,
2152
+ .todo-panel .progress-bar {
2153
+ height: 100%;
2154
+ background: var(--accent-color, #007acc);
2155
+ transition: width 0.3s ease;
2156
+ }
2157
+
2158
+ .progress-panel .progress-text,
2159
+ .todo-panel .progress-text {
2160
+ position: absolute;
2161
+ top: 50%;
2162
+ left: 50%;
2163
+ transform: translate(-50%, -50%);
2164
+ font-size: 0.7rem;
2165
+ color: var(--text-primary, #d4d4d4);
2166
+ }
2167
+
2168
+ .progress-panel .todo-section,
2169
+ .todo-panel .todo-section {
2170
+ margin-bottom: 12px;
2171
+ }
2172
+
2173
+ .progress-panel .todo-section h4,
2174
+ .todo-panel .todo-section h4 {
2175
+ font-size: 0.75rem;
2176
+ color: var(--text-secondary, #8b8b8b);
2177
+ margin: 0 0 6px 0;
2178
+ text-transform: uppercase;
2179
+ }
2180
+
2181
+ .progress-panel .todo-item,
2182
+ .todo-panel .todo-item {
2183
+ display: flex;
2184
+ align-items: center;
2185
+ gap: 6px;
2186
+ padding: 4px 0;
2187
+ font-size: 0.8rem;
2188
+ }
2189
+
2190
+ .progress-panel .todo-status,
2191
+ .todo-panel .todo-status {
2192
+ width: 16px;
2193
+ text-align: center;
2194
+ color: var(--text-secondary, #8b8b8b);
2195
+ }
2196
+
2197
+ .progress-panel .todo-in_progress .todo-status,
2198
+ .todo-panel .todo-in_progress .todo-status {
2199
+ color: var(--accent-color, #007acc);
2200
+ }
2201
+
2202
+ .progress-panel .todo-completed .todo-status,
2203
+ .todo-panel .todo-completed .todo-status {
2204
+ color: var(--success-color, #4ec9b0);
2205
+ }
2206
+
2207
+ .progress-panel .todo-blocked,
2208
+ .todo-panel .todo-blocked {
2209
+ font-size: 0.7rem;
2210
+ color: var(--error-color, #f14c4c);
2211
+ }
2212
+
2213
+ /* Progress panel internal tabs (Workflow/AC/Todo) */
2214
+ .progress-tabs {
2215
+ display: flex;
2216
+ gap: 2px;
2217
+ margin-bottom: 8px;
2218
+ border-bottom: 1px solid var(--border-color, #3d3d3d);
2219
+ padding-bottom: 4px;
2220
+ }
2221
+
2222
+ .progress-tab {
2223
+ padding: 4px 8px;
2224
+ font-size: 0.75rem;
2225
+ color: var(--text-secondary, #8b8b8b);
2226
+ background: transparent;
2227
+ border: none;
2228
+ border-radius: 4px 4px 0 0;
2229
+ cursor: pointer;
2230
+ transition: color 0.15s, background 0.15s;
2231
+ position: relative;
2232
+ }
2233
+
2234
+ .progress-tab:hover {
2235
+ color: var(--text-primary, #d4d4d4);
2236
+ background: var(--bg-tertiary, #2d2d2d);
2237
+ }
2238
+
2239
+ .progress-tab.active {
2240
+ color: var(--text-primary, #d4d4d4);
2241
+ background: var(--bg-tertiary, #2d2d2d);
2242
+ border-bottom: 2px solid var(--accent-color, #007acc);
2243
+ margin-bottom: -5px;
2244
+ }
2245
+
2246
+ .progress-tab .tab-indicator {
2247
+ font-size: 0.5rem;
2248
+ color: var(--accent-color, #007acc);
2249
+ margin-left: 4px;
2250
+ vertical-align: super;
2251
+ }
2252
+
2253
+ .progress-tab-content {
2254
+ padding-top: 4px;
2255
+ }
2256
+
2257
+ /* Workflow content within Progress panel */
2258
+ .workflow-content {
2259
+ padding: 4px 0;
2260
+ }
2261
+
2262
+ .workflow-content .workflow-type-badge {
2263
+ display: inline-block;
2264
+ padding: 2px 8px;
2265
+ font-size: 0.7rem;
2266
+ font-weight: 600;
2267
+ color: var(--text-primary, #d4d4d4);
2268
+ background: var(--bg-tertiary, #2d2d2d);
2269
+ border-radius: 4px;
2270
+ margin-bottom: 8px;
2271
+ }
2272
+
2273
+ .workflow-content .phase-progress {
2274
+ display: flex;
2275
+ flex-wrap: wrap;
2276
+ align-items: center;
2277
+ gap: 4px;
2278
+ }
2279
+
2280
+ .workflow-content .phase-step {
2281
+ display: flex;
2282
+ align-items: center;
2283
+ gap: 4px;
2284
+ padding: 2px 6px;
2285
+ font-size: 0.7rem;
2286
+ border-radius: 4px;
2287
+ }
2288
+
2289
+ .workflow-content .phase-step.done {
2290
+ color: var(--success-color, #4ec9b0);
2291
+ }
2292
+
2293
+ .workflow-content .phase-step.current {
2294
+ color: var(--accent-color, #007acc);
2295
+ background: var(--bg-tertiary, #2d2d2d);
2296
+ }
2297
+
2298
+ .workflow-content .phase-step.pending {
2299
+ color: var(--text-secondary, #8b8b8b);
2300
+ }
2301
+
2302
+ .workflow-content .phase-arrow {
2303
+ color: var(--text-secondary, #8b8b8b);
2304
+ font-size: 0.65rem;
2305
+ }
2306
+
2307
+ .workflow-content .phase-icon {
2308
+ flex-shrink: 0;
2309
+ width: 14px;
2310
+ text-align: center;
2311
+ }
2312
+
2313
+ .workflow-content .phase-label {
2314
+ white-space: nowrap;
2315
+ }
2316
+
2317
+ /* Stepped workflow progress (Step N of M) */
2318
+ .stepped-progress {
2319
+ display: flex;
2320
+ align-items: baseline;
2321
+ gap: 8px;
2322
+ font-size: 0.75rem;
2323
+ }
2324
+
2325
+ .stepped-counter {
2326
+ color: var(--accent-color, #007acc);
2327
+ font-weight: 600;
2328
+ }
2329
+
2330
+ .stepped-current-label {
2331
+ color: var(--text-secondary, #8b8b8b);
2332
+ font-style: italic;
2333
+ }
2334
+
2335
+ /* Available workflows list (MSSCI-14301) */
2336
+ .available-workflows {
2337
+ padding: 4px 0;
2338
+ }
2339
+
2340
+ .available-workflows-header {
2341
+ padding: 4px 8px;
2342
+ border-bottom: 1px solid var(--border-color, #3c3c3c);
2343
+ }
2344
+
2345
+ .available-workflows-title {
2346
+ font-size: 0.7rem;
2347
+ font-weight: 600;
2348
+ color: var(--text-secondary, #8b8b8b);
2349
+ text-transform: uppercase;
2350
+ letter-spacing: 0.05em;
2351
+ }
2352
+
2353
+ .available-workflows-list {
2354
+ overflow-y: auto;
2355
+ }
2356
+
2357
+ .workflow-entry {
2358
+ padding: 6px 8px;
2359
+ border-bottom: 1px solid var(--border-color, #3c3c3c);
2360
+ }
2361
+
2362
+ .workflow-entry:last-child {
2363
+ border-bottom: none;
2364
+ }
2365
+
2366
+ .workflow-entry-header {
2367
+ display: flex;
2368
+ align-items: center;
2369
+ justify-content: space-between;
2370
+ gap: 6px;
2371
+ }
2372
+
2373
+ .workflow-entry-name {
2374
+ font-size: 0.8rem;
2375
+ font-weight: 500;
2376
+ color: var(--text-primary, #d4d4d4);
2377
+ }
2378
+
2379
+ .workflow-entry-type-badge {
2380
+ font-size: 0.6rem;
2381
+ padding: 0 4px;
2382
+ flex-shrink: 0;
2383
+ }
2384
+
2385
+ .workflow-entry-description {
2386
+ font-size: 0.7rem;
2387
+ color: var(--text-secondary, #8b8b8b);
2388
+ margin-top: 2px;
2389
+ line-height: 1.3;
2390
+ }
2391
+
2392
+ .workflow-entry-hint {
2393
+ font-size: 0.65rem;
2394
+ color: var(--accent-color, #007acc);
2395
+ font-family: var(--font-mono, monospace);
2396
+ margin-top: 4px;
2397
+ opacity: 0.8;
2398
+ }
2399
+
2400
+ .workflow-entry-footer {
2401
+ display: flex;
2402
+ justify-content: flex-end;
2403
+ margin-top: 4px;
2404
+ }
2405
+
2406
+ .workflow-start-button {
2407
+ font-size: 0.65rem;
2408
+ height: 22px;
2409
+ padding: 0 8px;
2410
+ color: var(--accent-color, #007acc);
2411
+ }
2412
+
2413
+ /* Workflow panel container */
2414
+ .workflow-panel {
2415
+ height: 100%;
2416
+ overflow-y: auto;
2417
+ padding: 4px 8px;
2418
+ }
2419
+
2420
+ .workflow-panel .error-message {
2421
+ color: var(--color-danger, #ef4444);
2422
+ font-size: 0.75rem;
2423
+ padding: 8px 0;
2424
+ }
2425
+
2426
+ /* Todo content wrapper */
2427
+ .todo-content {
2428
+ padding: 4px 0;
2429
+ }
2430
+
2431
+ /* Background panel */
2432
+ .background-panel {
2433
+ padding: 8px;
2434
+ }
2435
+
2436
+ .background-panel .panel-header {
2437
+ display: flex;
2438
+ justify-content: space-between;
2439
+ align-items: center;
2440
+ margin-bottom: 8px;
2441
+ }
2442
+
2443
+ .background-panel .task-counts {
2444
+ font-size: 0.75rem;
2445
+ color: var(--text-secondary, #8b8b8b);
2446
+ }
2447
+
2448
+ .background-panel .pending-count {
2449
+ color: var(--accent-color, #007acc);
2450
+ margin-right: 8px;
2451
+ }
2452
+
2453
+ .background-panel .clear-button {
2454
+ padding: 2px 8px;
2455
+ background: transparent;
2456
+ border: 1px solid var(--border-color, #3c3c3c);
2457
+ border-radius: 3px;
2458
+ color: var(--text-secondary, #8b8b8b);
2459
+ cursor: pointer;
2460
+ font-size: 0.7rem;
2461
+ }
2462
+
2463
+ .background-panel .task-item {
2464
+ display: flex;
2465
+ align-items: center;
2466
+ gap: 8px;
2467
+ padding: 6px 0;
2468
+ border-bottom: 1px solid var(--border-color, #3c3c3c);
2469
+ }
2470
+
2471
+ .background-panel .task-status {
2472
+ width: 20px;
2473
+ text-align: center;
2474
+ font-size: 0.8rem;
2475
+ }
2476
+
2477
+ .background-panel .task-pending .task-status {
2478
+ color: var(--accent-color, #007acc);
2479
+ }
2480
+
2481
+ .background-panel .task-completed .task-status {
2482
+ color: var(--success-color, #4ec9b0);
2483
+ }
2484
+
2485
+ .background-panel .task-error .task-status {
2486
+ color: var(--error-color, #f14c4c);
2487
+ }
2488
+
2489
+ .background-panel .task-content {
2490
+ flex: 1;
2491
+ min-width: 0;
2492
+ }
2493
+
2494
+ .background-panel .task-description {
2495
+ font-size: 0.8rem;
2496
+ display: block;
2497
+ overflow: hidden;
2498
+ text-overflow: ellipsis;
2499
+ white-space: nowrap;
2500
+ }
2501
+
2502
+ .background-panel .task-type {
2503
+ font-size: 0.7rem;
2504
+ color: var(--text-secondary, #8b8b8b);
2505
+ }
2506
+
2507
+ .background-panel .task-elapsed {
2508
+ font-size: 0.7rem;
2509
+ color: var(--text-secondary, #8b8b8b);
2510
+ }
2511
+
2512
+ /* Diffs panel */
2513
+ .diffs-panel {
2514
+ padding: 8px;
2515
+ }
2516
+
2517
+ .diffs-panel .panel-header {
2518
+ display: flex;
2519
+ justify-content: space-between;
2520
+ align-items: center;
2521
+ margin-bottom: 8px;
2522
+ }
2523
+
2524
+ .diffs-panel .diff-count {
2525
+ font-size: 0.75rem;
2526
+ color: var(--text-secondary, #8b8b8b);
2527
+ }
2528
+
2529
+ .diffs-panel .diff-tabs {
2530
+ display: flex;
2531
+ flex-wrap: wrap;
2532
+ gap: 4px;
2533
+ margin-bottom: 8px;
2534
+ }
2535
+
2536
+ .diffs-panel .diff-tab {
2537
+ padding: 4px 8px;
2538
+ background: var(--bg-tertiary, #2d2d2d);
2539
+ border: none;
2540
+ border-radius: 3px;
2541
+ color: var(--text-secondary, #8b8b8b);
2542
+ font-size: 0.75rem;
2543
+ cursor: pointer;
2544
+ }
2545
+
2546
+ .diffs-panel .diff-tab.active {
2547
+ color: var(--accent-color, #007acc);
2548
+ background: var(--bg-active, #37373d);
2549
+ }
2550
+
2551
+ .diffs-panel .diff-view {
2552
+ background: var(--bg-tertiary, #2d2d2d);
2553
+ border-radius: 4px;
2554
+ overflow: hidden;
2555
+ }
2556
+
2557
+ .diffs-panel .diff-header {
2558
+ display: flex;
2559
+ justify-content: space-between;
2560
+ padding: 6px 8px;
2561
+ background: var(--bg-secondary, #252526);
2562
+ font-size: 0.75rem;
2563
+ }
2564
+
2565
+ .diffs-panel .diff-path {
2566
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
2567
+ }
2568
+
2569
+ .diffs-panel .diff-tool {
2570
+ color: var(--text-secondary, #8b8b8b);
2571
+ }
2572
+
2573
+ .diffs-panel .diff-content {
2574
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
2575
+ font-size: 0.75rem;
2576
+ overflow-x: auto;
2577
+ }
2578
+
2579
+ .diffs-panel .diff-line {
2580
+ display: flex;
2581
+ padding: 0 8px;
2582
+ line-height: 1.4;
2583
+ }
2584
+
2585
+ .diffs-panel .diff-line.diff-added {
2586
+ background: rgba(78, 201, 176, 0.1);
2587
+ }
2588
+
2589
+ .diffs-panel .diff-line.diff-removed {
2590
+ background: rgba(241, 76, 76, 0.1);
2591
+ }
2592
+
2593
+ .diffs-panel .line-num {
2594
+ min-width: 32px;
2595
+ width: 32px;
2596
+ flex-shrink: 0;
2597
+ color: var(--text-secondary, #8b8b8b);
2598
+ text-align: right;
2599
+ padding-right: 8px;
2600
+ user-select: none;
2601
+ }
2602
+
2603
+ .diffs-panel .line-prefix {
2604
+ width: 16px;
2605
+ flex-shrink: 0;
2606
+ color: var(--text-secondary, #8b8b8b);
2607
+ }
2608
+
2609
+ .diffs-panel .line-content {
2610
+ flex: 1;
2611
+ white-space: pre;
2612
+ overflow-x: visible;
2613
+ }
2614
+
2615
+ .diffs-panel .diff-added .line-prefix {
2616
+ color: var(--success-color, #4ec9b0);
2617
+ }
2618
+
2619
+ .diffs-panel .diff-removed .line-prefix {
2620
+ color: var(--error-color, #f14c4c);
2621
+ }
2622
+
2623
+ /* Debug panel */
2624
+ .debug-panel {
2625
+ padding: 8px;
2626
+ }
2627
+
2628
+ .debug-panel h4 {
2629
+ font-size: 0.75rem;
2630
+ color: var(--text-secondary, #8b8b8b);
2631
+ margin: 0 0 8px 0;
2632
+ text-transform: uppercase;
2633
+ }
2634
+
2635
+ .debug-panel .context-info {
2636
+ background: var(--bg-tertiary, #2d2d2d);
2637
+ border-radius: 4px;
2638
+ padding: 8px 12px;
2639
+ margin-bottom: 16px;
2640
+ }
2641
+
2642
+ .debug-panel .context-bar {
2643
+ height: 8px;
2644
+ background: var(--bg-primary, #1e1e1e);
2645
+ border-radius: 4px;
2646
+ overflow: hidden;
2647
+ margin-bottom: 4px;
2648
+ }
2649
+
2650
+ .debug-panel .context-fill {
2651
+ height: 100%;
2652
+ background: var(--accent-color, #007acc);
2653
+ }
2654
+
2655
+ .context-sparkline {
2656
+ width: 100%;
2657
+ height: 32px;
2658
+ margin: 4px 0;
2659
+ }
2660
+
2661
+ .context-sparkline svg {
2662
+ width: 100%;
2663
+ height: 100%;
2664
+ }
2665
+
2666
+ .debug-panel .context-text {
2667
+ font-size: 0.75rem;
2668
+ color: var(--text-primary, #d4d4d4);
2669
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
2670
+ }
2671
+
2672
+ .debug-panel .token-stats {
2673
+ display: grid;
2674
+ grid-template-columns: auto 1fr;
2675
+ gap: 4px 12px;
2676
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
2677
+ font-size: 0.75rem;
2678
+ background: var(--bg-tertiary, #2d2d2d);
2679
+ padding: 8px 12px;
2680
+ border-radius: 4px;
2681
+ margin: 0;
2682
+ }
2683
+
2684
+ .debug-panel .token-stats dt {
2685
+ color: var(--text-secondary, #8b8b8b);
2686
+ }
2687
+
2688
+ .debug-panel .token-stats dd {
2689
+ color: var(--text-primary, #d4d4d4);
2690
+ text-align: right;
2691
+ margin: 0;
2692
+ }
2693
+
2694
+ .debug-panel .context-breakdown {
2695
+ display: grid;
2696
+ grid-template-columns: auto 1fr;
2697
+ gap: 4px 12px;
2698
+ font-size: 0.75rem;
2699
+ margin-top: 8px;
2700
+ padding-top: 8px;
2701
+ border-top: 1px solid var(--border-color, #3d3d3d);
2702
+ }
2703
+
2704
+ .debug-panel .context-breakdown dt {
2705
+ color: var(--text-secondary, #8b8b8b);
2706
+ }
2707
+
2708
+ .debug-panel .context-breakdown dd {
2709
+ color: var(--text-primary, #d4d4d4);
2710
+ text-align: right;
2711
+ margin: 0;
2712
+ }
2713
+
2714
+ /* Tier display - MSSCI-12799 */
2715
+ .debug-panel .tier-display {
2716
+ display: flex;
2717
+ align-items: center;
2718
+ gap: 8px;
2719
+ margin-bottom: 8px;
2720
+ padding: 6px 8px;
2721
+ background: var(--bg-tertiary, #2d2d2d);
2722
+ border-radius: 4px;
2723
+ }
2724
+
2725
+ .debug-panel .tier-badge {
2726
+ display: inline-flex;
2727
+ align-items: center;
2728
+ padding: 2px 8px;
2729
+ border-radius: 4px;
2730
+ font-size: 0.7rem;
2731
+ font-weight: 600;
2732
+ text-transform: uppercase;
2733
+ letter-spacing: 0.05em;
2734
+ }
2735
+
2736
+ .debug-panel .tier-badge.tier-full {
2737
+ background: rgba(59, 130, 246, 0.2);
2738
+ color: #3b82f6;
2739
+ border: 1px solid rgba(59, 130, 246, 0.4);
2740
+ }
2741
+
2742
+ .debug-panel .tier-badge.tier-refresh {
2743
+ background: rgba(34, 197, 94, 0.2);
2744
+ color: #22c55e;
2745
+ border: 1px solid rgba(34, 197, 94, 0.4);
2746
+ }
2747
+
2748
+ .debug-panel .tier-badge.tier-handoff {
2749
+ background: rgba(234, 179, 8, 0.2);
2750
+ color: #eab308;
2751
+ border: 1px solid rgba(234, 179, 8, 0.4);
2752
+ }
2753
+
2754
+ .debug-panel .tier-badge.tier-minimal {
2755
+ background: rgba(168, 85, 247, 0.2);
2756
+ color: #a855f7;
2757
+ border: 1px solid rgba(168, 85, 247, 0.4);
2758
+ }
2759
+
2760
+ .debug-panel .tier-savings {
2761
+ font-size: 0.7rem;
2762
+ color: var(--text-secondary, #8b8b8b);
2763
+ }
2764
+
2765
+ /* Token stat cards - MSSCI-12782 */
2766
+ .debug-panel .token-stat-card {
2767
+ display: contents;
2768
+ }
2769
+
2770
+ /* Component breakdown - MSSCI-12800 */
2771
+ .debug-panel .component-breakdown {
2772
+ margin: 8px 0;
2773
+ background: var(--bg-tertiary, #2d2d2d);
2774
+ border-radius: 4px;
2775
+ overflow: hidden;
2776
+ }
2777
+
2778
+ .debug-panel .breakdown-header {
2779
+ display: flex;
2780
+ align-items: center;
2781
+ justify-content: space-between;
2782
+ padding: 6px 8px;
2783
+ background: var(--bg-secondary, #252526);
2784
+ }
2785
+
2786
+ .debug-panel .breakdown-toggle {
2787
+ background: none;
2788
+ border: none;
2789
+ color: var(--text-secondary, #8b8b8b);
2790
+ cursor: pointer;
2791
+ font-size: 0.75rem;
2792
+ padding: 0;
2793
+ }
2794
+
2795
+ .debug-panel .breakdown-toggle:hover {
2796
+ color: var(--text-primary, #d4d4d4);
2797
+ }
2798
+
2799
+ .debug-panel .total-tokens {
2800
+ font-size: 0.7rem;
2801
+ color: var(--text-secondary, #8b8b8b);
2802
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
2803
+ }
2804
+
2805
+ .debug-panel .component-list {
2806
+ padding: 0 8px;
2807
+ max-height: 0;
2808
+ overflow: hidden;
2809
+ transition: max-height 0.2s ease, padding 0.2s ease;
2810
+ }
2811
+
2812
+ .debug-panel .component-list.expanded {
2813
+ max-height: 200px;
2814
+ padding: 8px;
2815
+ overflow-y: auto;
2816
+ }
2817
+
2818
+ .debug-panel .component-item {
2819
+ display: flex;
2820
+ justify-content: space-between;
2821
+ align-items: center;
2822
+ padding: 2px 0;
2823
+ font-size: 0.7rem;
2824
+ }
2825
+
2826
+ .debug-panel .component-name {
2827
+ color: var(--text-secondary, #8b8b8b);
2828
+ }
2829
+
2830
+ .debug-panel .component-tokens {
2831
+ color: var(--text-primary, #d4d4d4);
2832
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
2833
+ }
2834
+
2835
+ /* HealthGauge header and controls */
2836
+
2837
+ .health-gauge-header {
2838
+ display: flex;
2839
+ justify-content: space-between;
2840
+ align-items: center;
2841
+ margin-bottom: 0.25rem;
2842
+ }
2843
+
2844
+ .health-gauge-age {
2845
+ font-size: 0.75rem;
2846
+ color: var(--text-muted);
2847
+ }
2848
+
2849
+ .health-gauge-error {
2850
+ font-size: 0.75rem;
2851
+ color: var(--color-danger, #ef4444);
2852
+ }
2853
+
2854
+ /* HealthGauge SVG */
2855
+
2856
+ [data-testid="health-gauge"] svg {
2857
+ display: block;
2858
+ margin: 0 auto;
2859
+ }
2860
+
2861
+ /* HealthGauge dimension breakdown */
2862
+
2863
+ .health-gauge-partial {
2864
+ text-align: center;
2865
+ font-size: 0.75rem;
2866
+ color: var(--text-muted);
2867
+ margin-top: 0.25rem;
2868
+ }
2869
+
2870
+ .health-gauge-breakdown {
2871
+ display: flex;
2872
+ flex-direction: column;
2873
+ gap: 0.25rem;
2874
+ margin-top: 0.5rem;
2875
+ padding: 0.5rem 0;
2876
+ border-top: 1px solid var(--border);
2877
+ }
2878
+
2879
+ .health-gauge-dimension {
2880
+ display: flex;
2881
+ justify-content: space-between;
2882
+ align-items: center;
2883
+ cursor: pointer;
2884
+ padding: 0.25rem 0.5rem;
2885
+ border-radius: 4px;
2886
+ }
2887
+
2888
+ .health-gauge-dimension:hover {
2889
+ background: var(--border);
2890
+ }
2891
+
2892
+ .dimension-label {
2893
+ font-size: 0.8125rem;
2894
+ color: var(--text-secondary);
2895
+ text-decoration: underline;
2896
+ text-decoration-color: transparent;
2897
+ transition: text-decoration-color 0.15s, color 0.15s;
2898
+ }
2899
+
2900
+ .health-gauge-dimension:hover .dimension-label {
2901
+ text-decoration-color: currentColor;
2902
+ color: var(--text-primary);
2903
+ }
2904
+
2905
+ .dimension-score {
2906
+ font-size: 0.8125rem;
2907
+ font-variant-numeric: tabular-nums;
2908
+ text-align: right;
2909
+ font-family: var(--font-mono, monospace);
2910
+ color: var(--text-primary);
2911
+ }
2912
+
2913
+ /* Settings panel */
2914
+ .settings-panel {
2915
+ padding: 8px;
2916
+ }
2917
+
2918
+ .settings-panel .settings-section {
2919
+ margin-bottom: 16px;
2920
+ }
2921
+
2922
+ .settings-panel .settings-section h4 {
2923
+ font-size: 0.75rem;
2924
+ color: var(--text-secondary, #8b8b8b);
2925
+ margin: 0 0 8px 0;
2926
+ text-transform: uppercase;
2927
+ }
2928
+
2929
+ .settings-panel select {
2930
+ width: 100%;
2931
+ padding: 6px 8px;
2932
+ background: var(--bg-tertiary, #2d2d2d);
2933
+ border: 1px solid var(--border-color, #3c3c3c);
2934
+ border-radius: 4px;
2935
+ color: var(--text-primary, #d4d4d4);
2936
+ font-size: 0.8rem;
2937
+ }
2938
+
2939
+ .settings-panel .toggle-setting {
2940
+ display: grid;
2941
+ grid-template-columns: 36px 1fr;
2942
+ align-items: center;
2943
+ gap: 4px 8px;
2944
+ padding: 4px 0;
2945
+ font-size: 0.8rem;
2946
+ cursor: pointer;
2947
+ }
2948
+
2949
+ .settings-panel .setting-description {
2950
+ grid-column: 2;
2951
+ font-size: 0.7rem;
2952
+ color: var(--text-secondary, #8b8b8b);
2953
+ }
2954
+
2955
+ /* Switch (Radix) - explicit colors since Tailwind v4 data-[state] variants don't generate */
2956
+ .cyclist-switch {
2957
+ background: var(--bg-tertiary, #2d2d2d);
2958
+ border-color: var(--border-color, #3c3c3c);
2959
+ }
2960
+
2961
+ .cyclist-switch[data-state="checked"] {
2962
+ background: var(--accent, #4f46e5);
2963
+ border-color: var(--accent, #4f46e5);
2964
+ }
2965
+
2966
+ .cyclist-switch-thumb {
2967
+ background: var(--text-primary, #e4e4e7);
2968
+ }
2969
+
2970
+ /* ThemePalette in settings - ensure solid background for dropdown */
2971
+ .settings-panel .theme-palette-menu {
2972
+ background: var(--bg-secondary, #252526);
2973
+ }
2974
+
2975
+ /* Audit Log panel - Tufte-inspired: maximize data-ink, minimize chrome */
2976
+ .audit-log-panel {
2977
+ font-size: 0.8rem;
2978
+ }
2979
+
2980
+ .audit-log-panel .audit-log-stats {
2981
+ font-size: 0.75rem;
2982
+ color: var(--text-secondary, #8b8b8b);
2983
+ }
2984
+
2985
+ .audit-log-panel .audit-log-stats .text-success {
2986
+ color: var(--text-secondary, #8b8b8b);
2987
+ }
2988
+
2989
+ .audit-log-panel .audit-log-stats .text-error {
2990
+ color: var(--error, #ef4444);
2991
+ }
2992
+
2993
+ /* Only highlight error count when there are actual errors */
2994
+ .audit-log-panel .audit-log-stats .text-error:has(strong:empty),
2995
+ .audit-log-panel .audit-log-stats .text-error strong:only-child {
2996
+ opacity: 0.6;
2997
+ }
2998
+
2999
+ .audit-log-panel .audit-log-toolbar {
3000
+ gap: 6px;
3001
+ }
3002
+
3003
+ .audit-log-panel select {
3004
+ padding: 4px 8px;
3005
+ background: var(--bg-tertiary, #2d2d2d);
3006
+ border: 1px solid var(--border-color, #3c3c3c);
3007
+ border-radius: 4px;
3008
+ color: var(--text-primary, #d4d4d4);
3009
+ font-size: 0.75rem;
3010
+ }
3011
+
3012
+ .audit-log-panel .audit-log-btn {
3013
+ padding: 4px 10px !important;
3014
+ background: transparent !important;
3015
+ border: none !important;
3016
+ color: var(--text-secondary, #8b8b8b);
3017
+ font-size: 0.7rem;
3018
+ font-weight: normal;
3019
+ letter-spacing: 0.03em;
3020
+ opacity: 0.7;
3021
+ }
3022
+
3023
+ .audit-log-panel .audit-log-btn:hover {
3024
+ background: var(--bg-tertiary, #2d2d2d) !important;
3025
+ color: var(--text-primary, #d4d4d4);
3026
+ opacity: 1;
3027
+ }
3028
+
3029
+ .audit-log-panel .audit-log-btn-clear {
3030
+ color: var(--error, #ef4444);
3031
+ border-color: transparent !important;
3032
+ background: transparent;
3033
+ opacity: 0.6;
3034
+ }
3035
+
3036
+ .audit-log-panel .audit-log-btn-clear:hover {
3037
+ opacity: 1;
3038
+ background: transparent;
3039
+ }
3040
+
3041
+ .audit-log-panel table {
3042
+ border-collapse: collapse;
3043
+ width: 100%;
3044
+ }
3045
+
3046
+ .audit-log-panel thead th {
3047
+ font-size: 0.65rem;
3048
+ font-weight: 500;
3049
+ text-transform: uppercase;
3050
+ letter-spacing: 0.06em;
3051
+ color: var(--text-muted, #666);
3052
+ border-bottom: 1px solid var(--border-color, #3c3c3c);
3053
+ padding: 6px 8px;
3054
+ background: var(--bg-primary, #1e1e1e);
3055
+ }
3056
+
3057
+ .audit-log-panel tbody tr {
3058
+ border-bottom: none;
3059
+ }
3060
+
3061
+ .audit-log-panel tbody td {
3062
+ padding: 3px 8px;
3063
+ color: var(--text-secondary, #8b8b8b);
3064
+ font-size: 0.75rem;
3065
+ }
3066
+
3067
+ .audit-log-panel tbody tr:hover {
3068
+ background: var(--bg-secondary, #252526);
3069
+ }
3070
+
3071
+ .audit-log-panel tbody .tool-name {
3072
+ font-weight: 500;
3073
+ }
3074
+ .audit-log-panel tbody .tool-name[data-tool="read"] { color: var(--tool-read-color, #3b82f6); }
3075
+ .audit-log-panel tbody .tool-name[data-tool="write"] { color: var(--tool-write-color, #f97316); }
3076
+ .audit-log-panel tbody .tool-name[data-tool="bash"] { color: var(--tool-bash-color, #22c55e); }
3077
+ .audit-log-panel tbody .tool-name[data-tool="glob"] { color: var(--tool-glob-color, #a855f7); }
3078
+ .audit-log-panel tbody .tool-name[data-tool="grep"] { color: var(--tool-grep-color, #06b6d4); }
3079
+ .audit-log-panel tbody .tool-name[data-tool="edit"] { color: var(--tool-edit-color, #eab308); }
3080
+ .audit-log-panel tbody .tool-name[data-tool="task"] { color: var(--tool-task-color, #ec4899); }
3081
+ .audit-log-panel tbody .tool-name[data-tool="skill"] { color: var(--text-secondary, #8b8b8b); }
3082
+
3083
+ .audit-log-panel tbody .status-ok {
3084
+ color: var(--success, #22c55e);
3085
+ opacity: 0.4;
3086
+ }
3087
+
3088
+ .audit-log-panel tbody .status-err {
3089
+ color: var(--error, #ef4444);
3090
+ opacity: 0.9;
3091
+ }
3092
+
3093
+ .audit-log-panel .expanded-detail {
3094
+ background: var(--bg-secondary, #252526);
3095
+ }
3096
+
3097
+ .audit-log-panel .expanded-detail > td {
3098
+ padding: 8px 12px !important;
3099
+ }
3100
+
3101
+ .audit-log-panel .detail-grid {
3102
+ display: grid;
3103
+ grid-template-columns: auto 1fr;
3104
+ gap: 2px 12px;
3105
+ font-size: 0.72rem;
3106
+ }
3107
+
3108
+ .audit-log-panel .detail-row {
3109
+ display: contents;
3110
+ }
3111
+
3112
+ .audit-log-panel .detail-label {
3113
+ color: var(--text-muted, #666);
3114
+ font-size: 0.68rem;
3115
+ text-transform: uppercase;
3116
+ letter-spacing: 0.04em;
3117
+ white-space: nowrap;
3118
+ padding: 1px 0;
3119
+ }
3120
+
3121
+ .audit-log-panel .detail-value {
3122
+ color: var(--text-primary, #d4d4d4);
3123
+ word-break: break-all;
3124
+ padding: 1px 0;
3125
+ }
3126
+
3127
+ .audit-log-panel .detail-output {
3128
+ margin-top: 6px;
3129
+ }
3130
+
3131
+ .audit-log-panel .detail-output .detail-label {
3132
+ margin-bottom: 3px;
3133
+ }
3134
+
3135
+ .audit-log-panel .expanded-detail pre {
3136
+ background: var(--bg-tertiary, #2d2d2d);
3137
+ padding: 6px 8px;
3138
+ border-radius: 4px;
3139
+ font-size: 0.68rem;
3140
+ overflow-x: auto;
3141
+ max-height: 10rem;
3142
+ color: var(--text-secondary, #8b8b8b);
3143
+ margin: 0;
3144
+ }
3145
+
3146
+ /* Git panel - clickable file items for diff drill-through */
3147
+ .git-panel .file-item.clickable {
3148
+ cursor: pointer;
3149
+ border-radius: 2px;
3150
+ padding: 2px 4px;
3151
+ }
3152
+
3153
+ .git-panel .file-item.clickable:hover {
3154
+ background: var(--bg-hover, rgba(255, 255, 255, 0.05));
3155
+ }
3156
+
3157
+ .git-panel .diff-back-bar {
3158
+ display: flex;
3159
+ align-items: center;
3160
+ gap: 8px;
3161
+ padding: 6px 8px;
3162
+ border-bottom: 1px solid var(--border-color, #404040);
3163
+ margin-bottom: 8px;
3164
+ }
3165
+
3166
+ .git-panel .diff-back-bar .back-button {
3167
+ font-size: 0.75rem;
3168
+ padding: 2px 8px;
3169
+ }
3170
+
3171
+ .git-panel .diff-back-bar .breadcrumb-path {
3172
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
3173
+ font-size: 0.75rem;
3174
+ color: var(--text-secondary, #8b8b8b);
3175
+ overflow: hidden;
3176
+ text-overflow: ellipsis;
3177
+ white-space: nowrap;
3178
+ }
3179
+
3180
+ .git-panel.diff-drillthrough {
3181
+ display: flex;
3182
+ flex-direction: column;
3183
+ height: 100%;
3184
+ min-height: 0;
3185
+ overflow: auto;
3186
+ }
3187
+
3188
+ /* =============================================================================
3189
+ FileTree Component Styles
3190
+ ============================================================================= */
3191
+
3192
+ .filetree {
3193
+ display: flex;
3194
+ flex-direction: column;
3195
+ height: 100%;
3196
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
3197
+ font-size: 0.8rem;
3198
+ overflow: hidden;
3199
+ }
3200
+
3201
+ /* File count badge - positioned at top right */
3202
+ .file-count-badge {
3203
+ display: inline-flex;
3204
+ align-items: center;
3205
+ justify-content: center;
3206
+ min-width: 20px;
3207
+ height: 18px;
3208
+ padding: 0 6px;
3209
+ margin: 8px 8px 0 auto;
3210
+ background: var(--bg-tertiary, #2d2d2d);
3211
+ border: 1px solid var(--border-color, #3c3c3c);
3212
+ border-radius: 10px;
3213
+ color: var(--text-secondary, #8b8b8b);
3214
+ font-size: 0.7rem;
3215
+ font-weight: 600;
3216
+ flex-shrink: 0;
3217
+ }
3218
+
3219
+ .file-count-badge:not([title=""]) {
3220
+ background: var(--accent-color, #007acc);
3221
+ border-color: var(--accent-color, #007acc);
3222
+ color: #fff;
3223
+ }
3224
+
3225
+ /* Empty state */
3226
+ .filetree .empty-state {
3227
+ display: flex;
3228
+ align-items: center;
3229
+ justify-content: center;
3230
+ flex: 1;
3231
+ color: var(--text-secondary, #8b8b8b);
3232
+ font-size: 0.8rem;
3233
+ font-family: var(--font-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif);
3234
+ font-style: italic;
3235
+ }
3236
+
3237
+ /* Full file tree enhancements */
3238
+ .full-filetree .filetree-scroll {
3239
+ flex: 1;
3240
+ min-height: 0;
3241
+ }
3242
+
3243
+ .full-filetree .tree-loading {
3244
+ color: var(--text-secondary, #8b8b8b);
3245
+ font-size: 0.75rem;
3246
+ font-style: italic;
3247
+ padding: 4px 8px;
3248
+ }
3249
+
3250
+ .full-filetree .tree-error {
3251
+ color: var(--color-danger, #ef4444);
3252
+ font-size: 0.75rem;
3253
+ padding: 4px 8px;
3254
+ }
3255
+
3256
+ .full-filetree .directory-header.has-changes .directory-name {
3257
+ color: var(--color-warning, #f59e0b);
3258
+ }
3259
+
3260
+ /* Directory sections */
3261
+ .directory-section {
3262
+ border-bottom: 1px solid var(--border-color, #3c3c3c);
3263
+ }
3264
+
3265
+ .directory-section:last-child {
3266
+ border-bottom: none;
3267
+ }
3268
+
3269
+ /* Directory header (clickable toggle row) */
3270
+ .directory-header {
3271
+ display: flex;
3272
+ align-items: center;
3273
+ gap: 4px;
3274
+ padding: 6px 8px;
3275
+ background: var(--bg-secondary, #252526);
3276
+ cursor: pointer;
3277
+ user-select: none;
3278
+ transition: background 0.1s ease;
3279
+ }
3280
+
3281
+ .directory-header:hover {
3282
+ background: var(--bg-tertiary, #2d2d2d);
3283
+ }
3284
+
3285
+ /* Toggle button */
3286
+ .directory-toggle {
3287
+ display: flex;
3288
+ align-items: center;
3289
+ justify-content: center;
3290
+ width: 16px;
3291
+ height: 16px;
3292
+ padding: 0;
3293
+ background: transparent;
3294
+ border: none;
3295
+ color: var(--text-secondary, #8b8b8b);
3296
+ cursor: pointer;
3297
+ flex-shrink: 0;
3298
+ }
3299
+
3300
+ .directory-toggle:hover {
3301
+ color: var(--text-primary, #d4d4d4);
3302
+ }
3303
+
3304
+ .directory-toggle:focus {
3305
+ outline: 1px solid var(--accent-color, #007acc);
3306
+ outline-offset: 1px;
3307
+ border-radius: 2px;
3308
+ }
3309
+
3310
+ .toggle-icon {
3311
+ font-size: 0.65rem;
3312
+ line-height: 1;
3313
+ }
3314
+
3315
+ /* Directory name (path) */
3316
+ .directory-name {
3317
+ flex: 1;
3318
+ min-width: 0;
3319
+ color: var(--text-primary, #d4d4d4);
3320
+ font-weight: 500;
3321
+ overflow: hidden;
3322
+ text-overflow: ellipsis;
3323
+ white-space: nowrap;
3324
+ }
3325
+
3326
+ /* Directory file count */
3327
+ .directory-count {
3328
+ padding: 1px 6px;
3329
+ background: var(--bg-primary, #1e1e1e);
3330
+ border-radius: 8px;
3331
+ color: var(--text-secondary, #8b8b8b);
3332
+ font-size: 0.65rem;
3333
+ flex-shrink: 0;
3334
+ }
3335
+
3336
+ /* Container for file items within a directory */
3337
+ .directory-files {
3338
+ background: var(--bg-primary, #1e1e1e);
3339
+ }
3340
+
3341
+ /* Individual file item */
3342
+ .file-item {
3343
+ display: flex;
3344
+ align-items: center;
3345
+ gap: 8px;
3346
+ padding: 4px 8px 4px 28px;
3347
+ cursor: pointer;
3348
+ transition: background 0.1s ease;
3349
+ border-left: 2px solid transparent;
3350
+ }
3351
+
3352
+ .file-item:hover {
3353
+ background: var(--bg-tertiary, #2d2d2d);
3354
+ }
3355
+
3356
+ .file-item.focused,
3357
+ .file-item:focus {
3358
+ background: var(--bg-active, #37373d);
3359
+ border-left-color: var(--accent-color, #007acc);
3360
+ outline: none;
3361
+ }
3362
+
3363
+ /* File status colors - row background tint */
3364
+ .file-item.file-created {
3365
+ border-left-color: transparent;
3366
+ }
3367
+
3368
+ .file-item.file-created:hover,
3369
+ .file-item.file-created.focused,
3370
+ .file-item.file-created:focus {
3371
+ border-left-color: var(--color-success, #22c55e);
3372
+ }
3373
+
3374
+ .file-item.file-modified {
3375
+ border-left-color: transparent;
3376
+ }
3377
+
3378
+ .file-item.file-modified:hover,
3379
+ .file-item.file-modified.focused,
3380
+ .file-item.file-modified:focus {
3381
+ border-left-color: var(--color-warning, #f59e0b);
3382
+ }
3383
+
3384
+ .file-item.file-deleted {
3385
+ border-left-color: transparent;
3386
+ }
3387
+
3388
+ .file-item.file-deleted:hover,
3389
+ .file-item.file-deleted.focused,
3390
+ .file-item.file-deleted:focus {
3391
+ border-left-color: var(--color-danger, #ef4444);
3392
+ }
3393
+
3394
+ /* Status icon (+, ~, -) */
3395
+ .status-icon {
3396
+ display: inline-flex;
3397
+ align-items: center;
3398
+ justify-content: center;
3399
+ width: 14px;
3400
+ height: 14px;
3401
+ font-size: 0.85rem;
3402
+ font-weight: 700;
3403
+ flex-shrink: 0;
3404
+ line-height: 1;
3405
+ }
3406
+
3407
+ .status-icon.status-created {
3408
+ color: var(--color-success, #22c55e);
3409
+ }
3410
+
3411
+ .status-icon.status-modified {
3412
+ color: var(--color-warning, #f59e0b);
3413
+ }
3414
+
3415
+ .status-icon.status-deleted {
3416
+ color: var(--color-danger, #ef4444);
3417
+ }
3418
+
3419
+ /* File name */
3420
+ .file-name {
3421
+ flex: 1;
3422
+ min-width: 0;
3423
+ color: var(--text-primary, #d4d4d4);
3424
+ overflow: hidden;
3425
+ text-overflow: ellipsis;
3426
+ white-space: nowrap;
3427
+ }
3428
+
3429
+ /* Deleted files have muted/strikethrough style */
3430
+ .file-item.file-deleted .file-name {
3431
+ color: var(--text-secondary, #8b8b8b);
3432
+ text-decoration: line-through;
3433
+ text-decoration-color: var(--color-danger, #ef4444);
3434
+ }
3435
+
3436
+ /* Empty and placeholder states */
3437
+ .empty,
3438
+ .placeholder {
3439
+ display: flex;
3440
+ align-items: center;
3441
+ justify-content: center;
3442
+ color: var(--text-secondary, #8b8b8b);
3443
+ height: 100%;
3444
+ font-size: 0.875rem;
3445
+ }
3446
+
3447
+ .loading {
3448
+ display: flex;
3449
+ align-items: center;
3450
+ justify-content: center;
3451
+ height: 100%;
3452
+ }
3453
+
3454
+ .spinner {
3455
+ color: var(--text-secondary, #8b8b8b);
3456
+ font-size: 0.875rem;
3457
+ }
3458
+
3459
+ /* =============================================================================
3460
+ Hide vanilla JS UI when React is active
3461
+ ============================================================================= */
3462
+
3463
+ /* When React app is mounted, hide the vanilla JS container */
3464
+ #react-root:not(:empty) ~ #container {
3465
+ display: none !important;
3466
+ }
3467
+
3468
+ /* =============================================================================
3469
+ StatsStrip Component Styles
3470
+ ============================================================================= */
3471
+
3472
+ .stats-strip {
3473
+ display: flex;
3474
+ align-items: center;
3475
+ justify-content: space-between;
3476
+ padding: 0.25rem 0.75rem;
3477
+ background: var(--bg-secondary, #252526);
3478
+ border-top: 1px solid var(--border-color, #3c3c3c);
3479
+ font-size: 0.8125rem;
3480
+ flex-shrink: 0;
3481
+ }
3482
+
3483
+ .stats-left,
3484
+ .stats-right {
3485
+ display: flex;
3486
+ align-items: center;
3487
+ gap: 0.75rem;
3488
+ }
3489
+
3490
+ /* PWD display */
3491
+ .stats-pwd {
3492
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
3493
+ color: var(--text-secondary, #8b8b8b);
3494
+ font-size: 0.75rem;
3495
+ max-width: 200px;
3496
+ overflow: hidden;
3497
+ text-overflow: ellipsis;
3498
+ white-space: nowrap;
3499
+ }
3500
+
3501
+ .stats-pwd:empty {
3502
+ display: none;
3503
+ }
3504
+
3505
+ /* Identity elements */
3506
+ .stats-jira-email,
3507
+ .stats-github-user {
3508
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
3509
+ font-size: 0.75rem;
3510
+ color: var(--text-secondary, #8b8b8b);
3511
+ opacity: 0.8;
3512
+ white-space: nowrap;
3513
+ overflow: hidden;
3514
+ text-overflow: ellipsis;
3515
+ max-width: 150px;
3516
+ }
3517
+
3518
+ .stats-github-user {
3519
+ color: var(--text-muted, #6b6b6b);
3520
+ }
3521
+
3522
+ /* Model badge */
3523
+ .stats-model-badge {
3524
+ display: inline-flex;
3525
+ align-items: center;
3526
+ padding: 0.125rem 0.5rem;
3527
+ background: var(--accent-color, #007acc);
3528
+ color: white;
3529
+ border-radius: 10px;
3530
+ font-weight: 600;
3531
+ font-size: 0.7rem;
3532
+ text-transform: lowercase;
3533
+ letter-spacing: 0.03em;
3534
+ }
3535
+
3536
+ /* Context meter */
3537
+ .stats-context-meter {
3538
+ position: relative;
3539
+ width: 80px;
3540
+ height: 18px;
3541
+ background: var(--bg-primary, #1e1e1e);
3542
+ border-radius: 4px;
3543
+ overflow: hidden;
3544
+ }
3545
+
3546
+ .stats-context-meter .context-fill {
3547
+ position: absolute;
3548
+ top: 0;
3549
+ left: 0;
3550
+ height: 100%;
3551
+ border-radius: 4px;
3552
+ transition: width 0.3s ease, background-color 0.3s ease;
3553
+ }
3554
+
3555
+ .stats-context-meter .context-percent {
3556
+ position: absolute;
3557
+ top: 50%;
3558
+ left: 50%;
3559
+ transform: translate(-50%, -50%);
3560
+ font-size: 0.75rem;
3561
+ font-weight: 600;
3562
+ color: var(--text-primary, #d4d4d4);
3563
+ text-shadow: 0 0 2px var(--bg-primary, #1e1e1e);
3564
+ z-index: 1;
3565
+ }
3566
+
3567
+ /* Context level colors */
3568
+ .stats-context-meter.level-safe .context-fill {
3569
+ background: var(--color-success, #22c55e);
3570
+ }
3571
+
3572
+ .stats-context-meter.level-warning .context-fill {
3573
+ background: var(--color-warning, #f59e0b);
3574
+ }
3575
+
3576
+ .stats-context-meter.level-danger .context-fill {
3577
+ background: var(--color-danger, #ef4444);
3578
+ }
3579
+
3580
+ /* =============================================================================
3581
+ Queue Display Component Styles (MSSCI-12275)
3582
+ ============================================================================= */
3583
+
3584
+ .queue-display {
3585
+ display: flex;
3586
+ flex-direction: column;
3587
+ background: var(--bg-tertiary, #2d2d2d);
3588
+ border-radius: 4px;
3589
+ margin-top: 8px;
3590
+ max-height: 150px;
3591
+ overflow: hidden;
3592
+ }
3593
+
3594
+ .queue-header {
3595
+ display: flex;
3596
+ align-items: center;
3597
+ gap: 8px;
3598
+ padding: 6px 8px;
3599
+ background: var(--bg-secondary, #252526);
3600
+ border-bottom: 1px solid var(--border-color, #3c3c3c);
3601
+ }
3602
+
3603
+ .queue-display .queue-count {
3604
+ font-size: 0.75rem;
3605
+ color: var(--text-secondary, #8b8b8b);
3606
+ }
3607
+
3608
+ .queue-mode-badge {
3609
+ font-size: 0.7rem;
3610
+ padding: 1px 4px;
3611
+ border-radius: 3px;
3612
+ background: var(--bg-primary, #1e1e1e);
3613
+ }
3614
+
3615
+ .queue-mode-badge.bell-mode {
3616
+ background: rgba(245, 158, 11, 0.2);
3617
+ color: var(--color-warning, #f59e0b);
3618
+ }
3619
+
3620
+ .queue-clear-btn {
3621
+ margin-left: auto;
3622
+ padding: 2px 8px;
3623
+ background: transparent;
3624
+ border: 1px solid var(--border-color, #3c3c3c);
3625
+ border-radius: 3px;
3626
+ color: var(--text-secondary, #8b8b8b);
3627
+ cursor: pointer;
3628
+ font-size: 0.7rem;
3629
+ }
3630
+
3631
+ .queue-clear-btn:hover {
3632
+ color: var(--text-primary, #d4d4d4);
3633
+ border-color: var(--text-secondary, #8b8b8b);
3634
+ }
3635
+
3636
+ .queue-list {
3637
+ list-style: none;
3638
+ margin: 0;
3639
+ padding: 0;
3640
+ overflow-y: auto;
3641
+ max-height: 100px;
3642
+ }
3643
+
3644
+ .queue-item {
3645
+ display: flex;
3646
+ align-items: center;
3647
+ gap: 6px;
3648
+ padding: 4px 8px;
3649
+ border-bottom: 1px solid var(--border-color, #3c3c3c);
3650
+ font-size: 0.75rem;
3651
+ }
3652
+
3653
+ .queue-item:last-child {
3654
+ border-bottom: none;
3655
+ }
3656
+
3657
+ .queue-item-text {
3658
+ flex: 1;
3659
+ color: var(--text-primary, #d4d4d4);
3660
+ overflow: hidden;
3661
+ text-overflow: ellipsis;
3662
+ white-space: nowrap;
3663
+ }
3664
+
3665
+ .queue-image-indicator {
3666
+ color: var(--accent-color, #007acc);
3667
+ font-size: 0.7rem;
3668
+ flex-shrink: 0;
3669
+ }
3670
+
3671
+ .queue-item-remove {
3672
+ padding: 0 4px;
3673
+ background: transparent;
3674
+ border: none;
3675
+ color: var(--text-secondary, #8b8b8b);
3676
+ cursor: pointer;
3677
+ font-size: 0.9rem;
3678
+ line-height: 1;
3679
+ }
3680
+
3681
+ .queue-item-remove:hover {
3682
+ color: var(--error-color, #f14c4c);
3683
+ }
3684
+
3685
+ .queue-item-actions {
3686
+ display: flex;
3687
+ gap: 2px;
3688
+ flex-shrink: 0;
3689
+ }
3690
+
3691
+ .queue-item-inject {
3692
+ padding: 0 4px;
3693
+ background: transparent;
3694
+ border: none;
3695
+ color: var(--accent-color, #007acc);
3696
+ cursor: pointer;
3697
+ font-size: 0.7rem;
3698
+ line-height: 1;
3699
+ }
3700
+
3701
+ .queue-item-inject:hover {
3702
+ color: var(--success-color, #4caf50);
3703
+ }
3704
+
3705
+ /* =============================================================================
3706
+ Bell Injected Message Styles (Audit Fix 2026-02-03)
3707
+ ============================================================================= */
3708
+
3709
+ .message-bell-injected {
3710
+ border-left: 2px solid var(--warning-color, #cca700);
3711
+ padding-left: 0.75rem;
3712
+ }
3713
+
3714
+ .message-bell-injected .bell-indicator {
3715
+ display: inline-block;
3716
+ margin-right: 6px;
3717
+ font-size: 0.9em;
3718
+ opacity: 0.8;
3719
+ }
3720
+
3721
+ /* =============================================================================
3722
+ Agent Popup Styles (MSSCI-12403)
3723
+ ============================================================================= */
3724
+
3725
+ .agent-popup-backdrop {
3726
+ position: fixed;
3727
+ inset: 0;
3728
+ background: rgba(0, 0, 0, 0.5);
3729
+ z-index: 1000;
3730
+ }
3731
+
3732
+ .agent-popup {
3733
+ position: fixed;
3734
+ top: 50%;
3735
+ left: 50%;
3736
+ transform: translate(-50%, -50%);
3737
+ background: var(--surface-color, #1e1e1e);
3738
+ border: 1px solid var(--border-color, #3c3c3c);
3739
+ border-radius: 8px;
3740
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
3741
+ z-index: 1001;
3742
+ width: 600px;
3743
+ max-width: 90vw;
3744
+ max-height: 80vh;
3745
+ display: flex;
3746
+ flex-direction: column;
3747
+ overflow: hidden;
3748
+ }
3749
+
3750
+ .agent-popup-header {
3751
+ display: flex;
3752
+ justify-content: space-between;
3753
+ align-items: center;
3754
+ padding: 12px 16px;
3755
+ border-bottom: 1px solid var(--border-color, #3c3c3c);
3756
+ background: var(--surface-alt, #252526);
3757
+ }
3758
+
3759
+ .agent-popup-theme {
3760
+ font-size: 1.1rem;
3761
+ font-weight: 600;
3762
+ margin: 0;
3763
+ display: flex;
3764
+ align-items: center;
3765
+ gap: 8px;
3766
+ }
3767
+
3768
+ .agent-popup-close {
3769
+ background: transparent;
3770
+ border: none;
3771
+ color: var(--text-muted, #888);
3772
+ font-size: 1.5rem;
3773
+ cursor: pointer;
3774
+ padding: 0 4px;
3775
+ line-height: 1;
3776
+ }
3777
+
3778
+ .agent-popup-close:hover {
3779
+ color: var(--text-color, #fff);
3780
+ }
3781
+
3782
+ .agent-popup-content {
3783
+ display: grid;
3784
+ grid-template-columns: 200px 1fr;
3785
+ flex: 1;
3786
+ overflow: hidden;
3787
+ }
3788
+
3789
+ .agent-popup-loading,
3790
+ .agent-popup-error {
3791
+ padding: 32px;
3792
+ text-align: center;
3793
+ color: var(--text-muted, #888);
3794
+ }
3795
+
3796
+ /* Team Roster */
3797
+ .agent-popup-roster {
3798
+ border-right: 1px solid var(--border-color, #3c3c3c);
3799
+ overflow-y: auto;
3800
+ padding: 8px 0;
3801
+ }
3802
+
3803
+ .roster-title {
3804
+ font-size: 0.75rem;
3805
+ text-transform: uppercase;
3806
+ color: var(--text-muted, #888);
3807
+ padding: 4px 12px;
3808
+ margin: 0 0 4px 0;
3809
+ }
3810
+
3811
+ .roster-list {
3812
+ list-style: none;
3813
+ margin: 0;
3814
+ padding: 0;
3815
+ }
3816
+
3817
+ .roster-item {
3818
+ display: flex;
3819
+ align-items: center;
3820
+ gap: 8px;
3821
+ padding: 8px 12px;
3822
+ cursor: pointer;
3823
+ transition: background 0.15s;
3824
+ }
3825
+
3826
+ .roster-item:hover {
3827
+ background: var(--hover-color, rgba(255, 255, 255, 0.05));
3828
+ }
3829
+
3830
+ .roster-item.current {
3831
+ background: var(--hover-color, rgba(255, 255, 255, 0.08));
3832
+ }
3833
+
3834
+ .roster-item.previewing {
3835
+ background: var(--accent-bg, rgba(0, 122, 204, 0.15));
3836
+ }
3837
+
3838
+ .roster-character {
3839
+ flex: 1;
3840
+ white-space: nowrap;
3841
+ overflow: hidden;
3842
+ text-overflow: ellipsis;
3843
+ font-size: 0.9rem;
3844
+ }
3845
+
3846
+ .roster-role {
3847
+ font-size: 0.65rem;
3848
+ padding: 2px 6px;
3849
+ border-radius: 3px;
3850
+ text-transform: uppercase;
3851
+ font-weight: 500;
3852
+ color: #000;
3853
+ }
3854
+
3855
+ .roster-current-marker {
3856
+ font-size: 0.6rem;
3857
+ color: var(--accent-color, #007acc);
3858
+ }
3859
+
3860
+ /* Agent Details - MSSCI-14204: Fixed dimensions to prevent layout shift */
3861
+ .agent-popup-details {
3862
+ padding: 16px;
3863
+ overflow-y: auto;
3864
+ min-height: 380px;
3865
+ max-height: calc(80vh - 60px); /* Account for header */
3866
+ transition: opacity 0.15s ease;
3867
+ }
3868
+
3869
+ .popup-portrait {
3870
+ width: 200px;
3871
+ height: 200px;
3872
+ margin: 0 auto 16px;
3873
+ border-radius: 8px;
3874
+ overflow: hidden;
3875
+ background: var(--surface-alt, #252526);
3876
+ }
3877
+
3878
+ .popup-portrait img {
3879
+ width: 100%;
3880
+ height: 100%;
3881
+ object-fit: cover;
3882
+ }
3883
+
3884
+ .popup-portrait .portrait-placeholder {
3885
+ width: 100%;
3886
+ height: 100%;
3887
+ display: flex;
3888
+ align-items: center;
3889
+ justify-content: center;
3890
+ font-size: 3rem;
3891
+ }
3892
+
3893
+ .popup-character {
3894
+ text-align: center;
3895
+ font-size: 1.2rem;
3896
+ margin: 0 0 8px 0;
3897
+ }
3898
+
3899
+ .popup-role-mapping {
3900
+ text-align: center;
3901
+ font-size: 0.85rem;
3902
+ color: var(--text-muted, #888);
3903
+ margin-bottom: 16px;
3904
+ }
3905
+
3906
+ .popup-role-mapping .role-badge {
3907
+ display: inline-block;
3908
+ font-size: 0.65rem;
3909
+ padding: 2px 6px;
3910
+ border-radius: 3px;
3911
+ text-transform: uppercase;
3912
+ font-weight: 500;
3913
+ color: #000;
3914
+ margin-right: 4px;
3915
+ }
3916
+
3917
+ .popup-detail {
3918
+ margin-bottom: 12px;
3919
+ max-height: 4.5em; /* ~3 lines */
3920
+ overflow: hidden;
3921
+ }
3922
+
3923
+ .popup-detail label {
3924
+ display: block;
3925
+ font-size: 0.75rem;
3926
+ text-transform: uppercase;
3927
+ color: var(--text-muted, #888);
3928
+ margin-bottom: 2px;
3929
+ }
3930
+
3931
+ .popup-detail span {
3932
+ font-size: 0.9rem;
3933
+ display: -webkit-box;
3934
+ -webkit-line-clamp: 3;
3935
+ -webkit-box-orient: vertical;
3936
+ overflow: hidden;
3937
+ }
3938
+
3939
+ .lift-value.positive {
3940
+ color: var(--success-color, #4caf50);
3941
+ }
3942
+
3943
+ .lift-value.negative {
3944
+ color: var(--error-color, #f44336);
3945
+ }
3946
+
3947
+ .tier-badge {
3948
+ font-size: 0.7rem;
3949
+ padding: 2px 8px;
3950
+ border-radius: 4px;
3951
+ font-weight: 600;
3952
+ }
3953
+
3954
+ .tier-badge.tier-s {
3955
+ background: linear-gradient(135deg, #ffd700, #ffb700);
3956
+ color: #000;
3957
+ }
3958
+
3959
+ .tier-badge.tier-a {
3960
+ background: #4caf50;
3961
+ color: #fff;
3962
+ }
3963
+
3964
+ .tier-badge.tier-b {
3965
+ background: #2196f3;
3966
+ color: #fff;
3967
+ }
3968
+
3969
+ .tier-badge.tier-c {
3970
+ background: #757575;
3971
+ color: #fff;
3972
+ }
3973
+
3974
+ /* =============================================================================
3975
+ Span Timeline Styles
3976
+ ============================================================================= */
3977
+
3978
+ .span-timeline {
3979
+ display: flex;
3980
+ flex-direction: column;
3981
+ background: var(--surface-color, #1e1e1e);
3982
+ border: 1px solid var(--border-color, #3c3c3c);
3983
+ border-radius: 4px;
3984
+ overflow: hidden;
3985
+ }
3986
+
3987
+ .span-timeline-loading {
3988
+ padding: 16px;
3989
+ text-align: center;
3990
+ color: var(--text-muted, #888);
3991
+ }
3992
+
3993
+ .span-timeline-toolbar {
3994
+ display: flex;
3995
+ justify-content: space-between;
3996
+ align-items: center;
3997
+ padding: 4px 8px;
3998
+ background: var(--surface-alt, #252526);
3999
+ border-bottom: 1px solid var(--border-color, #3c3c3c);
4000
+ font-size: 0.8rem;
4001
+ }
4002
+
4003
+ .span-timeline-toolbar .span-count {
4004
+ color: var(--text-muted, #888);
4005
+ }
4006
+
4007
+ .span-timeline-toolbar .zoom-controls {
4008
+ display: flex;
4009
+ gap: 2px;
4010
+ }
4011
+
4012
+ .span-timeline-toolbar .zoom-controls button {
4013
+ width: 24px;
4014
+ height: 24px;
4015
+ padding: 0;
4016
+ background: var(--surface-color, #1e1e1e);
4017
+ border: 1px solid var(--border-color, #3c3c3c);
4018
+ border-radius: 3px;
4019
+ color: var(--text-color, #fff);
4020
+ cursor: pointer;
4021
+ font-size: 0.9rem;
4022
+ }
4023
+
4024
+ .span-timeline-toolbar .zoom-controls button:hover {
4025
+ background: var(--hover-color, rgba(255, 255, 255, 0.1));
4026
+ }
4027
+
4028
+ .span-timeline-container {
4029
+ flex: 1;
4030
+ overflow-x: auto;
4031
+ overflow-y: hidden;
4032
+ }
4033
+
4034
+ .span-timeline-track {
4035
+ position: relative;
4036
+ min-height: 160px;
4037
+ }
4038
+
4039
+ .span-timeline-axis {
4040
+ position: absolute;
4041
+ top: 0;
4042
+ left: 0;
4043
+ right: 0;
4044
+ height: 20px;
4045
+ border-bottom: 1px solid var(--border-color, #3c3c3c);
4046
+ }
4047
+
4048
+ .span-timeline-axis .axis-tick {
4049
+ position: absolute;
4050
+ top: 0;
4051
+ height: 100%;
4052
+ border-left: 1px solid var(--border-color, #3c3c3c);
4053
+ }
4054
+
4055
+ .span-timeline-axis .tick-label {
4056
+ position: absolute;
4057
+ top: 2px;
4058
+ left: 4px;
4059
+ font-size: 0.65rem;
4060
+ color: var(--text-muted, #888);
4061
+ white-space: nowrap;
4062
+ }
4063
+
4064
+ .span-timeline-bars {
4065
+ position: absolute;
4066
+ top: 24px;
4067
+ left: 0;
4068
+ right: 0;
4069
+ bottom: 0;
4070
+ }
4071
+
4072
+ .span-bar {
4073
+ position: absolute;
4074
+ height: 24px;
4075
+ border-radius: 3px;
4076
+ cursor: pointer;
4077
+ overflow: hidden;
4078
+ transition: opacity 0.15s, transform 0.15s;
4079
+ opacity: 0.85;
4080
+ }
4081
+
4082
+ .span-bar:hover {
4083
+ opacity: 1;
4084
+ transform: scaleY(1.1);
4085
+ z-index: 10;
4086
+ }
4087
+
4088
+ .span-bar.selected {
4089
+ opacity: 1;
4090
+ box-shadow: 0 0 0 2px var(--accent-color, #007acc);
4091
+ z-index: 11;
4092
+ }
4093
+
4094
+ .span-bar.error {
4095
+ background-image: repeating-linear-gradient(
4096
+ 45deg,
4097
+ transparent,
4098
+ transparent 4px,
4099
+ rgba(0, 0, 0, 0.2) 4px,
4100
+ rgba(0, 0, 0, 0.2) 8px
4101
+ );
4102
+ }
4103
+
4104
+ .span-bar-label {
4105
+ padding: 2px 6px;
4106
+ font-size: 0.65rem;
4107
+ color: #000;
4108
+ font-weight: 500;
4109
+ white-space: nowrap;
4110
+ overflow: hidden;
4111
+ text-overflow: ellipsis;
4112
+ }
4113
+
4114
+ .span-timeline-details {
4115
+ background: var(--surface-alt, #252526);
4116
+ border-top: 1px solid var(--border-color, #3c3c3c);
4117
+ padding: 8px;
4118
+ font-size: 0.8rem;
4119
+ }
4120
+
4121
+ .span-timeline-details .detail-header {
4122
+ display: flex;
4123
+ align-items: center;
4124
+ gap: 8px;
4125
+ margin-bottom: 8px;
4126
+ }
4127
+
4128
+ .span-timeline-details .tool-badge {
4129
+ padding: 2px 8px;
4130
+ border-radius: 3px;
4131
+ font-size: 0.7rem;
4132
+ font-weight: 500;
4133
+ color: #000;
4134
+ }
4135
+
4136
+ .span-timeline-details .duration {
4137
+ color: var(--text-muted, #888);
4138
+ }
4139
+
4140
+ .span-timeline-details .status.success {
4141
+ color: var(--success-color, #4caf50);
4142
+ }
4143
+
4144
+ .span-timeline-details .status.error {
4145
+ color: var(--error-color, #f44336);
4146
+ }
4147
+
4148
+ .span-timeline-details .close-details {
4149
+ margin-left: auto;
4150
+ background: transparent;
4151
+ border: none;
4152
+ color: var(--text-muted, #888);
4153
+ font-size: 1.2rem;
4154
+ cursor: pointer;
4155
+ padding: 0 4px;
4156
+ }
4157
+
4158
+ .span-timeline-details .close-details:hover {
4159
+ color: var(--text-color, #fff);
4160
+ }
4161
+
4162
+ .span-timeline-details .detail-body {
4163
+ display: grid;
4164
+ gap: 4px;
4165
+ }
4166
+
4167
+ .span-timeline-details .detail-row {
4168
+ display: flex;
4169
+ gap: 8px;
4170
+ }
4171
+
4172
+ .span-timeline-details .detail-row label {
4173
+ color: var(--text-muted, #888);
4174
+ min-width: 60px;
4175
+ }
4176
+
4177
+ .span-timeline-details .detail-row .mono {
4178
+ font-family: monospace;
4179
+ font-size: 0.75rem;
4180
+ }
4181
+
4182
+ .span-timeline-details .detail-row.error span {
4183
+ color: var(--error-color, #f44336);
4184
+ }
4185
+
4186
+ .span-timeline-legend {
4187
+ display: flex;
4188
+ gap: 12px;
4189
+ padding: 4px 8px;
4190
+ background: var(--surface-alt, #252526);
4191
+ border-top: 1px solid var(--border-color, #3c3c3c);
4192
+ font-size: 0.7rem;
4193
+ }
4194
+
4195
+ .span-timeline-legend .legend-item {
4196
+ display: flex;
4197
+ align-items: center;
4198
+ gap: 4px;
4199
+ }
4200
+
4201
+ .span-timeline-legend .legend-color {
4202
+ width: 12px;
4203
+ height: 12px;
4204
+ border-radius: 2px;
4205
+ }
4206
+
4207
+ .span-timeline-legend .legend-label {
4208
+ color: var(--text-muted, #888);
4209
+ }
4210
+
4211
+ /* =============================================================================
4212
+ Confirm Dialog Styles
4213
+ ============================================================================= */
4214
+
4215
+ .confirm-dialog-backdrop {
4216
+ position: fixed;
4217
+ inset: 0;
4218
+ background: rgba(0, 0, 0, 0.6);
4219
+ display: flex;
4220
+ align-items: center;
4221
+ justify-content: center;
4222
+ z-index: 2000;
4223
+ }
4224
+
4225
+ .confirm-dialog {
4226
+ background: var(--surface-color, #1e1e1e);
4227
+ border: 1px solid var(--border-color, #3c3c3c);
4228
+ border-radius: 8px;
4229
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
4230
+ width: 400px;
4231
+ max-width: 90vw;
4232
+ padding: 20px;
4233
+ }
4234
+
4235
+ .confirm-dialog.danger {
4236
+ border-color: var(--error-color, #f44336);
4237
+ }
4238
+
4239
+ .confirm-dialog-title {
4240
+ font-size: 1.1rem;
4241
+ font-weight: 600;
4242
+ margin: 0 0 12px 0;
4243
+ display: flex;
4244
+ align-items: center;
4245
+ gap: 8px;
4246
+ }
4247
+
4248
+ .confirm-dialog-title .danger-icon {
4249
+ font-size: 1.2rem;
4250
+ }
4251
+
4252
+ .confirm-dialog-message {
4253
+ margin: 0 0 20px 0;
4254
+ color: var(--text-muted, #b0b0b0);
4255
+ font-size: 0.95rem;
4256
+ line-height: 1.5;
4257
+ }
4258
+
4259
+ .confirm-dialog-actions {
4260
+ display: flex;
4261
+ justify-content: flex-end;
4262
+ gap: 8px;
4263
+ }
4264
+
4265
+ .confirm-dialog-btn {
4266
+ padding: 8px 16px;
4267
+ border-radius: 4px;
4268
+ font-size: 0.9rem;
4269
+ font-weight: 500;
4270
+ cursor: pointer;
4271
+ transition: background 0.15s, border-color 0.15s;
4272
+ }
4273
+
4274
+ .confirm-dialog-btn.cancel {
4275
+ background: transparent;
4276
+ border: 1px solid var(--border-color, #3c3c3c);
4277
+ color: var(--text-color, #fff);
4278
+ }
4279
+
4280
+ .confirm-dialog-btn.cancel:hover {
4281
+ background: var(--hover-color, rgba(255, 255, 255, 0.05));
4282
+ }
4283
+
4284
+ .confirm-dialog-btn.confirm {
4285
+ background: var(--accent-color, #007acc);
4286
+ border: 1px solid var(--accent-color, #007acc);
4287
+ color: #fff;
4288
+ }
4289
+
4290
+ .confirm-dialog-btn.confirm:hover {
4291
+ background: var(--accent-hover, #005a9e);
4292
+ }
4293
+
4294
+ .confirm-dialog-btn.confirm.danger {
4295
+ background: var(--error-color, #f44336);
4296
+ border-color: var(--error-color, #f44336);
4297
+ }
4298
+
4299
+ .confirm-dialog-btn.confirm.danger:hover {
4300
+ background: #d32f2f;
4301
+ border-color: #d32f2f;
4302
+ }
4303
+
4304
+ .confirm-dialog-btn:focus-visible {
4305
+ outline: 2px solid var(--accent-color, #007acc);
4306
+ outline-offset: 2px;
4307
+ }
4308
+
4309
+ /* =============================================================================
4310
+ Bell/Relay Toggle Styles (MSSCI-12275, MSSCI-12395)
4311
+ ============================================================================= */
4312
+
4313
+ .control-bar-toggles {
4314
+ display: flex;
4315
+ gap: 4px;
4316
+ margin-bottom: 4px;
4317
+ }
4318
+
4319
+ /* Agent Quick Picker (MSSCI-14762) */
4320
+ .agent-quick-picker-wrapper {
4321
+ position: relative;
4322
+ }
4323
+
4324
+ .agent-quick-picker-dropdown {
4325
+ position: absolute;
4326
+ bottom: 100%;
4327
+ left: 0;
4328
+ margin-bottom: 4px;
4329
+ min-width: 120px;
4330
+ max-height: 300px;
4331
+ overflow-y: auto;
4332
+ background: var(--bg-secondary, #1e1e1e);
4333
+ border: 1px solid var(--border-color, #3c3c3c);
4334
+ border-radius: 6px;
4335
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
4336
+ z-index: 100;
4337
+ padding: 4px;
4338
+ }
4339
+
4340
+ .agent-quick-picker-option {
4341
+ display: flex;
4342
+ align-items: center;
4343
+ gap: 8px;
4344
+ padding: 6px 8px;
4345
+ border-radius: 4px;
4346
+ cursor: pointer;
4347
+ transition: background 0.1s ease;
4348
+ }
4349
+
4350
+ .agent-quick-picker-option:hover {
4351
+ background: var(--bg-hover, #3c3c3c);
4352
+ }
4353
+
4354
+ .agent-quick-picker-option.current {
4355
+ background: var(--bg-tertiary, #2d2d2d);
4356
+ border-left: 2px solid var(--accent, #007acc);
4357
+ }
4358
+
4359
+ .agent-option-role {
4360
+ font-size: 0.7rem;
4361
+ text-transform: uppercase;
4362
+ color: var(--text-secondary, #8b8b8b);
4363
+ min-width: 64px;
4364
+ }
4365
+
4366
+
4367
+ .btn-toggle {
4368
+ display: flex;
4369
+ align-items: center;
4370
+ justify-content: center;
4371
+ width: 32px;
4372
+ height: 28px;
4373
+ padding: 0;
4374
+ background: var(--bg-tertiary, #2d2d2d);
4375
+ border: 1px solid var(--border-color, #3c3c3c);
4376
+ border-radius: 4px;
4377
+ cursor: pointer;
4378
+ transition: all 0.15s ease;
4379
+ }
4380
+
4381
+ .btn-toggle:hover {
4382
+ background: var(--bg-hover, #3c3c3c);
4383
+ border-color: var(--text-secondary, #8b8b8b);
4384
+ }
4385
+
4386
+ .btn-toggle svg {
4387
+ opacity: 0.5;
4388
+ transition: opacity 0.15s ease;
4389
+ }
4390
+
4391
+ .btn-toggle:hover svg {
4392
+ opacity: 0.8;
4393
+ }
4394
+
4395
+ /* Bell mode active */
4396
+ .btn-toggle.bell-toggle.active {
4397
+ background: rgba(245, 158, 11, 0.15);
4398
+ border-color: var(--color-warning, #f59e0b);
4399
+ }
4400
+
4401
+ .btn-toggle.bell-toggle.active svg {
4402
+ opacity: 1;
4403
+ }
4404
+
4405
+ /* Relay mode active */
4406
+ .btn-toggle.relay-toggle.active {
4407
+ background: rgba(139, 92, 246, 0.15);
4408
+ border-color: var(--color-purple, #8b5cf6);
4409
+ }
4410
+
4411
+ .btn-toggle.relay-toggle.active svg {
4412
+ opacity: 1;
4413
+ }
4414
+
4415
+ /* Active toggle colors (no animation - too distracting) */
4416
+ .btn-toggle.bell-toggle.active {
4417
+ color: var(--color-warning, #f59e0b);
4418
+ }
4419
+
4420
+ .btn-toggle.relay-toggle.active {
4421
+ color: var(--color-purple, #8b5cf6);
4422
+ }
4423
+
4424
+ /* TirePump button - visible at 50%+ context */
4425
+ .btn-toggle.pump-toggle {
4426
+ background: rgba(6, 182, 212, 0.15);
4427
+ border-color: var(--color-cyan, #06b6d4);
4428
+ }
4429
+
4430
+ .btn-toggle.pump-toggle svg {
4431
+ opacity: 1;
4432
+ }
4433
+
4434
+ /* TirePump warning state at 70%+ context */
4435
+ .btn-toggle.pump-toggle.warning {
4436
+ background: rgba(239, 68, 68, 0.2);
4437
+ border-color: var(--color-error, #ef4444);
4438
+ animation: pump-pulse 1.5s ease-in-out infinite;
4439
+ }
4440
+
4441
+ .btn-toggle.pump-toggle.warning svg {
4442
+ opacity: 1;
4443
+ }
4444
+
4445
+ @keyframes pump-pulse {
4446
+ 0%, 100% {
4447
+ opacity: 1;
4448
+ box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.4);
4449
+ }
4450
+ 50% {
4451
+ opacity: 0.85;
4452
+ box-shadow: 0 0 8px 2px rgba(239, 68, 68, 0.3);
4453
+ }
4454
+ }