htmlgraph 0.20.1__py3-none-any.whl → 0.27.5__py3-none-any.whl

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 (304) hide show
  1. htmlgraph/.htmlgraph/.session-warning-state.json +6 -0
  2. htmlgraph/.htmlgraph/agents.json +72 -0
  3. htmlgraph/.htmlgraph/htmlgraph.db +0 -0
  4. htmlgraph/__init__.py +51 -1
  5. htmlgraph/__init__.pyi +123 -0
  6. htmlgraph/agent_detection.py +26 -10
  7. htmlgraph/agent_registry.py +2 -1
  8. htmlgraph/analytics/__init__.py +8 -1
  9. htmlgraph/analytics/cli.py +86 -20
  10. htmlgraph/analytics/cost_analyzer.py +391 -0
  11. htmlgraph/analytics/cost_monitor.py +664 -0
  12. htmlgraph/analytics/cost_reporter.py +675 -0
  13. htmlgraph/analytics/cross_session.py +617 -0
  14. htmlgraph/analytics/dependency.py +10 -6
  15. htmlgraph/analytics/pattern_learning.py +771 -0
  16. htmlgraph/analytics/session_graph.py +707 -0
  17. htmlgraph/analytics/strategic/__init__.py +80 -0
  18. htmlgraph/analytics/strategic/cost_optimizer.py +611 -0
  19. htmlgraph/analytics/strategic/pattern_detector.py +876 -0
  20. htmlgraph/analytics/strategic/preference_manager.py +709 -0
  21. htmlgraph/analytics/strategic/suggestion_engine.py +747 -0
  22. htmlgraph/analytics/work_type.py +67 -27
  23. htmlgraph/analytics_index.py +53 -20
  24. htmlgraph/api/__init__.py +3 -0
  25. htmlgraph/api/cost_alerts_websocket.py +416 -0
  26. htmlgraph/api/main.py +2498 -0
  27. htmlgraph/api/static/htmx.min.js +1 -0
  28. htmlgraph/api/static/style-redesign.css +1344 -0
  29. htmlgraph/api/static/style.css +1079 -0
  30. htmlgraph/api/templates/dashboard-redesign.html +1366 -0
  31. htmlgraph/api/templates/dashboard.html +794 -0
  32. htmlgraph/api/templates/partials/activity-feed-hierarchical.html +326 -0
  33. htmlgraph/api/templates/partials/activity-feed.html +1100 -0
  34. htmlgraph/api/templates/partials/agents-redesign.html +317 -0
  35. htmlgraph/api/templates/partials/agents.html +317 -0
  36. htmlgraph/api/templates/partials/event-traces.html +373 -0
  37. htmlgraph/api/templates/partials/features-kanban-redesign.html +509 -0
  38. htmlgraph/api/templates/partials/features.html +578 -0
  39. htmlgraph/api/templates/partials/metrics-redesign.html +346 -0
  40. htmlgraph/api/templates/partials/metrics.html +346 -0
  41. htmlgraph/api/templates/partials/orchestration-redesign.html +443 -0
  42. htmlgraph/api/templates/partials/orchestration.html +198 -0
  43. htmlgraph/api/templates/partials/spawners.html +375 -0
  44. htmlgraph/api/templates/partials/work-items.html +613 -0
  45. htmlgraph/api/websocket.py +538 -0
  46. htmlgraph/archive/__init__.py +24 -0
  47. htmlgraph/archive/bloom.py +234 -0
  48. htmlgraph/archive/fts.py +297 -0
  49. htmlgraph/archive/manager.py +583 -0
  50. htmlgraph/archive/search.py +244 -0
  51. htmlgraph/atomic_ops.py +560 -0
  52. htmlgraph/attribute_index.py +2 -1
  53. htmlgraph/bounded_paths.py +539 -0
  54. htmlgraph/builders/base.py +57 -2
  55. htmlgraph/builders/bug.py +19 -3
  56. htmlgraph/builders/chore.py +19 -3
  57. htmlgraph/builders/epic.py +19 -3
  58. htmlgraph/builders/feature.py +27 -3
  59. htmlgraph/builders/insight.py +2 -1
  60. htmlgraph/builders/metric.py +2 -1
  61. htmlgraph/builders/pattern.py +2 -1
  62. htmlgraph/builders/phase.py +19 -3
  63. htmlgraph/builders/spike.py +29 -3
  64. htmlgraph/builders/track.py +42 -1
  65. htmlgraph/cigs/__init__.py +81 -0
  66. htmlgraph/cigs/autonomy.py +385 -0
  67. htmlgraph/cigs/cost.py +475 -0
  68. htmlgraph/cigs/messages_basic.py +472 -0
  69. htmlgraph/cigs/messaging.py +365 -0
  70. htmlgraph/cigs/models.py +771 -0
  71. htmlgraph/cigs/pattern_storage.py +427 -0
  72. htmlgraph/cigs/patterns.py +503 -0
  73. htmlgraph/cigs/posttool_analyzer.py +234 -0
  74. htmlgraph/cigs/reporter.py +818 -0
  75. htmlgraph/cigs/tracker.py +317 -0
  76. htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
  77. htmlgraph/cli/.htmlgraph/agents.json +72 -0
  78. htmlgraph/cli/.htmlgraph/htmlgraph.db +0 -0
  79. htmlgraph/cli/__init__.py +42 -0
  80. htmlgraph/cli/__main__.py +6 -0
  81. htmlgraph/cli/analytics.py +1424 -0
  82. htmlgraph/cli/base.py +685 -0
  83. htmlgraph/cli/constants.py +206 -0
  84. htmlgraph/cli/core.py +954 -0
  85. htmlgraph/cli/main.py +147 -0
  86. htmlgraph/cli/models.py +475 -0
  87. htmlgraph/cli/templates/__init__.py +1 -0
  88. htmlgraph/cli/templates/cost_dashboard.py +399 -0
  89. htmlgraph/cli/work/__init__.py +239 -0
  90. htmlgraph/cli/work/browse.py +115 -0
  91. htmlgraph/cli/work/features.py +568 -0
  92. htmlgraph/cli/work/orchestration.py +676 -0
  93. htmlgraph/cli/work/report.py +728 -0
  94. htmlgraph/cli/work/sessions.py +466 -0
  95. htmlgraph/cli/work/snapshot.py +559 -0
  96. htmlgraph/cli/work/tracks.py +486 -0
  97. htmlgraph/cli_commands/__init__.py +1 -0
  98. htmlgraph/cli_commands/feature.py +195 -0
  99. htmlgraph/cli_framework.py +115 -0
  100. htmlgraph/collections/__init__.py +2 -0
  101. htmlgraph/collections/base.py +197 -14
  102. htmlgraph/collections/bug.py +2 -1
  103. htmlgraph/collections/chore.py +2 -1
  104. htmlgraph/collections/epic.py +2 -1
  105. htmlgraph/collections/feature.py +2 -1
  106. htmlgraph/collections/insight.py +2 -1
  107. htmlgraph/collections/metric.py +2 -1
  108. htmlgraph/collections/pattern.py +2 -1
  109. htmlgraph/collections/phase.py +2 -1
  110. htmlgraph/collections/session.py +194 -0
  111. htmlgraph/collections/spike.py +13 -2
  112. htmlgraph/collections/task_delegation.py +241 -0
  113. htmlgraph/collections/todo.py +14 -1
  114. htmlgraph/collections/traces.py +487 -0
  115. htmlgraph/config/cost_models.json +56 -0
  116. htmlgraph/config.py +190 -0
  117. htmlgraph/context_analytics.py +2 -1
  118. htmlgraph/converter.py +116 -7
  119. htmlgraph/cost_analysis/__init__.py +5 -0
  120. htmlgraph/cost_analysis/analyzer.py +438 -0
  121. htmlgraph/dashboard.html +2246 -248
  122. htmlgraph/dashboard.html.backup +6592 -0
  123. htmlgraph/dashboard.html.bak +7181 -0
  124. htmlgraph/dashboard.html.bak2 +7231 -0
  125. htmlgraph/dashboard.html.bak3 +7232 -0
  126. htmlgraph/db/__init__.py +38 -0
  127. htmlgraph/db/queries.py +790 -0
  128. htmlgraph/db/schema.py +1788 -0
  129. htmlgraph/decorators.py +317 -0
  130. htmlgraph/dependency_models.py +2 -1
  131. htmlgraph/deploy.py +26 -27
  132. htmlgraph/docs/API_REFERENCE.md +841 -0
  133. htmlgraph/docs/HTTP_API.md +750 -0
  134. htmlgraph/docs/INTEGRATION_GUIDE.md +752 -0
  135. htmlgraph/docs/ORCHESTRATION_PATTERNS.md +717 -0
  136. htmlgraph/docs/README.md +532 -0
  137. htmlgraph/docs/__init__.py +77 -0
  138. htmlgraph/docs/docs_version.py +55 -0
  139. htmlgraph/docs/metadata.py +93 -0
  140. htmlgraph/docs/migrations.py +232 -0
  141. htmlgraph/docs/template_engine.py +143 -0
  142. htmlgraph/docs/templates/_sections/cli_reference.md.j2 +52 -0
  143. htmlgraph/docs/templates/_sections/core_concepts.md.j2 +29 -0
  144. htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +69 -0
  145. htmlgraph/docs/templates/base_agents.md.j2 +78 -0
  146. htmlgraph/docs/templates/example_user_override.md.j2 +47 -0
  147. htmlgraph/docs/version_check.py +163 -0
  148. htmlgraph/edge_index.py +2 -1
  149. htmlgraph/error_handler.py +544 -0
  150. htmlgraph/event_log.py +86 -37
  151. htmlgraph/event_migration.py +2 -1
  152. htmlgraph/file_watcher.py +12 -8
  153. htmlgraph/find_api.py +2 -1
  154. htmlgraph/git_events.py +67 -9
  155. htmlgraph/hooks/.htmlgraph/.session-warning-state.json +6 -0
  156. htmlgraph/hooks/.htmlgraph/agents.json +72 -0
  157. htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
  158. htmlgraph/hooks/__init__.py +8 -0
  159. htmlgraph/hooks/bootstrap.py +169 -0
  160. htmlgraph/hooks/cigs_pretool_enforcer.py +354 -0
  161. htmlgraph/hooks/concurrent_sessions.py +208 -0
  162. htmlgraph/hooks/context.py +350 -0
  163. htmlgraph/hooks/drift_handler.py +525 -0
  164. htmlgraph/hooks/event_tracker.py +790 -99
  165. htmlgraph/hooks/git_commands.py +175 -0
  166. htmlgraph/hooks/installer.py +5 -1
  167. htmlgraph/hooks/orchestrator.py +327 -76
  168. htmlgraph/hooks/orchestrator_reflector.py +31 -4
  169. htmlgraph/hooks/post_tool_use_failure.py +32 -7
  170. htmlgraph/hooks/post_tool_use_handler.py +257 -0
  171. htmlgraph/hooks/posttooluse.py +92 -19
  172. htmlgraph/hooks/pretooluse.py +527 -7
  173. htmlgraph/hooks/prompt_analyzer.py +637 -0
  174. htmlgraph/hooks/session_handler.py +668 -0
  175. htmlgraph/hooks/session_summary.py +395 -0
  176. htmlgraph/hooks/state_manager.py +504 -0
  177. htmlgraph/hooks/subagent_detection.py +202 -0
  178. htmlgraph/hooks/subagent_stop.py +369 -0
  179. htmlgraph/hooks/task_enforcer.py +99 -4
  180. htmlgraph/hooks/validator.py +212 -91
  181. htmlgraph/ids.py +2 -1
  182. htmlgraph/learning.py +125 -100
  183. htmlgraph/mcp_server.py +2 -1
  184. htmlgraph/models.py +217 -18
  185. htmlgraph/operations/README.md +62 -0
  186. htmlgraph/operations/__init__.py +79 -0
  187. htmlgraph/operations/analytics.py +339 -0
  188. htmlgraph/operations/bootstrap.py +289 -0
  189. htmlgraph/operations/events.py +244 -0
  190. htmlgraph/operations/fastapi_server.py +231 -0
  191. htmlgraph/operations/hooks.py +350 -0
  192. htmlgraph/operations/initialization.py +597 -0
  193. htmlgraph/operations/initialization.py.backup +228 -0
  194. htmlgraph/operations/server.py +303 -0
  195. htmlgraph/orchestration/__init__.py +58 -0
  196. htmlgraph/orchestration/claude_launcher.py +179 -0
  197. htmlgraph/orchestration/command_builder.py +72 -0
  198. htmlgraph/orchestration/headless_spawner.py +281 -0
  199. htmlgraph/orchestration/live_events.py +377 -0
  200. htmlgraph/orchestration/model_selection.py +327 -0
  201. htmlgraph/orchestration/plugin_manager.py +140 -0
  202. htmlgraph/orchestration/prompts.py +137 -0
  203. htmlgraph/orchestration/spawner_event_tracker.py +383 -0
  204. htmlgraph/orchestration/spawners/__init__.py +16 -0
  205. htmlgraph/orchestration/spawners/base.py +194 -0
  206. htmlgraph/orchestration/spawners/claude.py +173 -0
  207. htmlgraph/orchestration/spawners/codex.py +435 -0
  208. htmlgraph/orchestration/spawners/copilot.py +294 -0
  209. htmlgraph/orchestration/spawners/gemini.py +471 -0
  210. htmlgraph/orchestration/subprocess_runner.py +36 -0
  211. htmlgraph/{orchestration.py → orchestration/task_coordination.py} +16 -8
  212. htmlgraph/orchestration.md +563 -0
  213. htmlgraph/orchestrator-system-prompt-optimized.txt +863 -0
  214. htmlgraph/orchestrator.py +2 -1
  215. htmlgraph/orchestrator_config.py +357 -0
  216. htmlgraph/orchestrator_mode.py +115 -4
  217. htmlgraph/parallel.py +2 -1
  218. htmlgraph/parser.py +86 -6
  219. htmlgraph/path_query.py +608 -0
  220. htmlgraph/pattern_matcher.py +636 -0
  221. htmlgraph/pydantic_models.py +476 -0
  222. htmlgraph/quality_gates.py +350 -0
  223. htmlgraph/query_builder.py +2 -1
  224. htmlgraph/query_composer.py +509 -0
  225. htmlgraph/reflection.py +443 -0
  226. htmlgraph/refs.py +344 -0
  227. htmlgraph/repo_hash.py +512 -0
  228. htmlgraph/repositories/__init__.py +292 -0
  229. htmlgraph/repositories/analytics_repository.py +455 -0
  230. htmlgraph/repositories/analytics_repository_standard.py +628 -0
  231. htmlgraph/repositories/feature_repository.py +581 -0
  232. htmlgraph/repositories/feature_repository_htmlfile.py +668 -0
  233. htmlgraph/repositories/feature_repository_memory.py +607 -0
  234. htmlgraph/repositories/feature_repository_sqlite.py +858 -0
  235. htmlgraph/repositories/filter_service.py +620 -0
  236. htmlgraph/repositories/filter_service_standard.py +445 -0
  237. htmlgraph/repositories/shared_cache.py +621 -0
  238. htmlgraph/repositories/shared_cache_memory.py +395 -0
  239. htmlgraph/repositories/track_repository.py +552 -0
  240. htmlgraph/repositories/track_repository_htmlfile.py +619 -0
  241. htmlgraph/repositories/track_repository_memory.py +508 -0
  242. htmlgraph/repositories/track_repository_sqlite.py +711 -0
  243. htmlgraph/sdk/__init__.py +398 -0
  244. htmlgraph/sdk/__init__.pyi +14 -0
  245. htmlgraph/sdk/analytics/__init__.py +19 -0
  246. htmlgraph/sdk/analytics/engine.py +155 -0
  247. htmlgraph/sdk/analytics/helpers.py +178 -0
  248. htmlgraph/sdk/analytics/registry.py +109 -0
  249. htmlgraph/sdk/base.py +484 -0
  250. htmlgraph/sdk/constants.py +216 -0
  251. htmlgraph/sdk/core.pyi +308 -0
  252. htmlgraph/sdk/discovery.py +120 -0
  253. htmlgraph/sdk/help/__init__.py +12 -0
  254. htmlgraph/sdk/help/mixin.py +699 -0
  255. htmlgraph/sdk/mixins/__init__.py +15 -0
  256. htmlgraph/sdk/mixins/attribution.py +113 -0
  257. htmlgraph/sdk/mixins/mixin.py +410 -0
  258. htmlgraph/sdk/operations/__init__.py +12 -0
  259. htmlgraph/sdk/operations/mixin.py +427 -0
  260. htmlgraph/sdk/orchestration/__init__.py +17 -0
  261. htmlgraph/sdk/orchestration/coordinator.py +203 -0
  262. htmlgraph/sdk/orchestration/spawner.py +204 -0
  263. htmlgraph/sdk/planning/__init__.py +19 -0
  264. htmlgraph/sdk/planning/bottlenecks.py +93 -0
  265. htmlgraph/sdk/planning/mixin.py +211 -0
  266. htmlgraph/sdk/planning/parallel.py +186 -0
  267. htmlgraph/sdk/planning/queue.py +210 -0
  268. htmlgraph/sdk/planning/recommendations.py +87 -0
  269. htmlgraph/sdk/planning/smart_planning.py +319 -0
  270. htmlgraph/sdk/session/__init__.py +19 -0
  271. htmlgraph/sdk/session/continuity.py +57 -0
  272. htmlgraph/sdk/session/handoff.py +110 -0
  273. htmlgraph/sdk/session/info.py +309 -0
  274. htmlgraph/sdk/session/manager.py +103 -0
  275. htmlgraph/sdk/strategic/__init__.py +26 -0
  276. htmlgraph/sdk/strategic/mixin.py +563 -0
  277. htmlgraph/server.py +295 -107
  278. htmlgraph/session_hooks.py +300 -0
  279. htmlgraph/session_manager.py +285 -3
  280. htmlgraph/session_registry.py +587 -0
  281. htmlgraph/session_state.py +436 -0
  282. htmlgraph/session_warning.py +2 -1
  283. htmlgraph/sessions/__init__.py +23 -0
  284. htmlgraph/sessions/handoff.py +756 -0
  285. htmlgraph/system_prompts.py +450 -0
  286. htmlgraph/templates/orchestration-view.html +350 -0
  287. htmlgraph/track_builder.py +33 -1
  288. htmlgraph/track_manager.py +38 -0
  289. htmlgraph/transcript.py +18 -5
  290. htmlgraph/validation.py +115 -0
  291. htmlgraph/watch.py +2 -1
  292. htmlgraph/work_type_utils.py +2 -1
  293. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/dashboard.html +2246 -248
  294. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/METADATA +95 -64
  295. htmlgraph-0.27.5.dist-info/RECORD +337 -0
  296. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/entry_points.txt +1 -1
  297. htmlgraph/cli.py +0 -4839
  298. htmlgraph/sdk.py +0 -2359
  299. htmlgraph-0.20.1.dist-info/RECORD +0 -118
  300. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/styles.css +0 -0
  301. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/AGENTS.md.template +0 -0
  302. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/CLAUDE.md.template +0 -0
  303. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/GEMINI.md.template +0 -0
  304. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/WHEEL +0 -0
@@ -0,0 +1,1079 @@
1
+ /* HtmlGraph Dashboard - Dark Theme Stylesheet */
2
+
3
+ * {
4
+ margin: 0;
5
+ padding: 0;
6
+ box-sizing: border-box;
7
+ }
8
+
9
+ :root {
10
+ --primary-color: #00d9ff;
11
+ --secondary-color: #ff006e;
12
+ --success-color: #00ff41;
13
+ --warning-color: #ffbe0b;
14
+ --error-color: #ff006e;
15
+ --bg-dark: #0a0e27;
16
+ --bg-darker: #05080f;
17
+ --text-primary: #e0e0e0;
18
+ --text-secondary: #a0a0a0;
19
+ --border-color: #1a2332;
20
+ --card-bg: #0f1426;
21
+ --hover-bg: #151e3a;
22
+ }
23
+
24
+ body.dark-theme {
25
+ background-color: var(--bg-dark);
26
+ color: var(--text-primary);
27
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
28
+ line-height: 1.6;
29
+ font-size: 14px;
30
+ }
31
+
32
+ /* Dashboard Container */
33
+ .dashboard-container {
34
+ min-height: 100vh;
35
+ display: flex;
36
+ flex-direction: column;
37
+ }
38
+
39
+ /* Header */
40
+ .dashboard-header {
41
+ background: linear-gradient(135deg, var(--bg-darker) 0%, var(--bg-dark) 100%);
42
+ border-bottom: 2px solid var(--border-color);
43
+ padding: 1.5rem 2rem;
44
+ box-shadow: 0 4px 12px rgba(0, 217, 255, 0.1);
45
+ }
46
+
47
+ .header-content {
48
+ display: flex;
49
+ justify-content: space-between;
50
+ align-items: center;
51
+ max-width: 1400px;
52
+ margin: 0 auto;
53
+ width: 100%;
54
+ }
55
+
56
+ .logo {
57
+ display: flex;
58
+ align-items: center;
59
+ gap: 0.75rem;
60
+ font-size: 1.5rem;
61
+ font-weight: 700;
62
+ color: var(--primary-color);
63
+ }
64
+
65
+ .logo-icon {
66
+ font-size: 2rem;
67
+ animation: pulse 2s ease-in-out infinite;
68
+ }
69
+
70
+ .header-stats {
71
+ display: flex;
72
+ gap: 1.5rem;
73
+ }
74
+
75
+ .stat-badge {
76
+ background: var(--card-bg);
77
+ border: 1px solid var(--border-color);
78
+ border-radius: 0.5rem;
79
+ padding: 0.5rem 1rem;
80
+ display: flex;
81
+ align-items: center;
82
+ gap: 0.5rem;
83
+ }
84
+
85
+ .stat-badge.pulse {
86
+ animation: pulse 0.5s ease-out;
87
+ border-color: var(--primary-color);
88
+ }
89
+
90
+ .stat-label {
91
+ color: var(--text-secondary);
92
+ font-size: 0.85rem;
93
+ }
94
+
95
+ .stat-value {
96
+ font-weight: 700;
97
+ color: var(--primary-color);
98
+ font-size: 1.2rem;
99
+ }
100
+
101
+ /* Navigation Tabs */
102
+ .tabs-navigation {
103
+ display: flex;
104
+ border-bottom: 1px solid var(--border-color);
105
+ background-color: var(--bg-darker);
106
+ padding: 0;
107
+ overflow-x: auto;
108
+ }
109
+
110
+ .tab-button {
111
+ flex: 0 0 auto;
112
+ padding: 1rem 1.5rem;
113
+ background: none;
114
+ border: none;
115
+ color: var(--text-secondary);
116
+ cursor: pointer;
117
+ font-size: 1rem;
118
+ font-weight: 500;
119
+ display: flex;
120
+ align-items: center;
121
+ gap: 0.5rem;
122
+ transition: all 0.3s ease;
123
+ border-bottom: 3px solid transparent;
124
+ position: relative;
125
+ }
126
+
127
+ .tab-button:hover {
128
+ color: var(--primary-color);
129
+ background-color: var(--hover-bg);
130
+ }
131
+
132
+ .tab-button.active {
133
+ color: var(--primary-color);
134
+ border-bottom-color: var(--primary-color);
135
+ background-color: transparent;
136
+ }
137
+
138
+ .tab-icon {
139
+ font-size: 1.2rem;
140
+ }
141
+
142
+ /* Content Area */
143
+ .content-area {
144
+ flex: 1;
145
+ padding: 2rem;
146
+ overflow-y: auto;
147
+ }
148
+
149
+ .loading-indicator {
150
+ display: flex;
151
+ flex-direction: column;
152
+ align-items: center;
153
+ justify-content: center;
154
+ height: 300px;
155
+ gap: 1rem;
156
+ }
157
+
158
+ .spinner {
159
+ width: 40px;
160
+ height: 40px;
161
+ border: 3px solid var(--border-color);
162
+ border-top-color: var(--primary-color);
163
+ border-radius: 50%;
164
+ animation: spin 1s linear infinite;
165
+ }
166
+
167
+ @keyframes spin {
168
+ to { transform: rotate(360deg); }
169
+ }
170
+
171
+ @keyframes pulse {
172
+ 0%, 100% { opacity: 1; }
173
+ 50% { opacity: 0.7; }
174
+ }
175
+
176
+ /* View Container */
177
+ .view-container {
178
+ max-width: 1400px;
179
+ margin: 0 auto;
180
+ animation: fadeIn 0.3s ease;
181
+ }
182
+
183
+ @keyframes fadeIn {
184
+ from { opacity: 0; transform: translateY(10px); }
185
+ to { opacity: 1; transform: translateY(0); }
186
+ }
187
+
188
+ .view-header {
189
+ margin-bottom: 2rem;
190
+ }
191
+
192
+ .view-header h2 {
193
+ font-size: 1.75rem;
194
+ color: var(--primary-color);
195
+ margin-bottom: 0.5rem;
196
+ }
197
+
198
+ .view-description {
199
+ color: var(--text-secondary);
200
+ font-size: 0.95rem;
201
+ }
202
+
203
+ .view-filters {
204
+ display: flex;
205
+ gap: 1rem;
206
+ margin-top: 1rem;
207
+ }
208
+
209
+ .filter-group {
210
+ display: flex;
211
+ align-items: center;
212
+ gap: 0.5rem;
213
+ }
214
+
215
+ .filter-group label {
216
+ color: var(--text-secondary);
217
+ font-size: 0.9rem;
218
+ }
219
+
220
+ .filter-input,
221
+ .filter-select {
222
+ background-color: var(--card-bg);
223
+ border: 1px solid var(--border-color);
224
+ color: var(--text-primary);
225
+ padding: 0.5rem 0.75rem;
226
+ border-radius: 0.375rem;
227
+ font-size: 0.9rem;
228
+ transition: border-color 0.2s ease;
229
+ }
230
+
231
+ .filter-input:focus,
232
+ .filter-select:focus {
233
+ outline: none;
234
+ border-color: var(--primary-color);
235
+ box-shadow: 0 0 8px rgba(0, 217, 255, 0.2);
236
+ }
237
+
238
+ /* Empty State */
239
+ .empty-state {
240
+ text-align: center;
241
+ padding: 3rem 1rem;
242
+ color: var(--text-secondary);
243
+ }
244
+
245
+ .empty-state p {
246
+ font-size: 1.1rem;
247
+ margin-bottom: 0.5rem;
248
+ }
249
+
250
+ .empty-state small {
251
+ font-size: 0.85rem;
252
+ }
253
+
254
+ /* ========== ACTIVITY FEED ========== */
255
+
256
+ .activity-list {
257
+ display: flex;
258
+ flex-direction: column;
259
+ gap: 1rem;
260
+ }
261
+
262
+ .activity-list.hierarchical {
263
+ gap: 0.5rem;
264
+ }
265
+
266
+ .activity-group {
267
+ display: flex;
268
+ flex-direction: column;
269
+ gap: 0;
270
+ border-left: 3px solid var(--primary-color);
271
+ padding-left: 0.5rem;
272
+ }
273
+
274
+ .activity-item {
275
+ background: var(--card-bg);
276
+ border: 1px solid var(--border-color);
277
+ border-left: 4px solid var(--primary-color);
278
+ border-radius: 0.5rem;
279
+ padding: 1rem;
280
+ transition: all 0.2s ease;
281
+ }
282
+
283
+ .activity-item.parent-event {
284
+ border-left-color: var(--primary-color);
285
+ background: linear-gradient(135deg, var(--card-bg) 0%, var(--hover-bg) 30%);
286
+ font-weight: 500;
287
+ }
288
+
289
+ .activity-item.parent-event:hover {
290
+ border-color: var(--primary-color);
291
+ background-color: var(--hover-bg);
292
+ box-shadow: 0 6px 16px rgba(0, 217, 255, 0.2);
293
+ }
294
+
295
+ .activity-item.child-event {
296
+ border-left: 2px dotted var(--primary-color);
297
+ background: var(--bg-darker);
298
+ margin-top: -1px;
299
+ opacity: 0.95;
300
+ }
301
+
302
+ .activity-item.child-event:hover {
303
+ border-left-color: var(--primary-color);
304
+ background-color: var(--card-bg);
305
+ box-shadow: 0 4px 12px rgba(0, 217, 255, 0.1);
306
+ }
307
+
308
+ .activity-children {
309
+ display: flex;
310
+ flex-direction: column;
311
+ gap: 0;
312
+ margin-top: -1px;
313
+ }
314
+
315
+ .child-indent-marker {
316
+ display: none;
317
+ }
318
+
319
+ .parent-indicator {
320
+ margin-right: 0.5rem;
321
+ font-size: 1.1rem;
322
+ opacity: 0.8;
323
+ }
324
+
325
+ .child-indicator {
326
+ margin-right: 0.5rem;
327
+ font-size: 1rem;
328
+ color: var(--text-secondary);
329
+ opacity: 0.6;
330
+ }
331
+
332
+ .parent-type-label {
333
+ margin-left: 0.5rem;
334
+ }
335
+
336
+ .badge {
337
+ display: inline-block;
338
+ padding: 0.25rem 0.5rem;
339
+ border-radius: 0.25rem;
340
+ font-size: 0.75rem;
341
+ font-weight: 600;
342
+ text-transform: uppercase;
343
+ letter-spacing: 0.5px;
344
+ }
345
+
346
+ .badge-delegation {
347
+ background: rgba(0, 217, 255, 0.2);
348
+ color: var(--primary-color);
349
+ border: 1px solid var(--primary-color);
350
+ }
351
+
352
+ .view-info {
353
+ color: var(--text-secondary);
354
+ font-size: 0.9rem;
355
+ margin-bottom: 1rem;
356
+ padding-left: 0.5rem;
357
+ }
358
+
359
+ .activity-item:hover {
360
+ border-color: var(--primary-color);
361
+ background-color: var(--hover-bg);
362
+ box-shadow: 0 4px 12px rgba(0, 217, 255, 0.15);
363
+ }
364
+
365
+ .activity-item.event-error {
366
+ border-left-color: var(--error-color);
367
+ }
368
+
369
+ .activity-item.event-success {
370
+ border-left-color: var(--success-color);
371
+ }
372
+
373
+ .activity-item-header {
374
+ display: flex;
375
+ align-items: center;
376
+ gap: 0.75rem;
377
+ margin-bottom: 0.75rem;
378
+ }
379
+
380
+ .event-type-badge {
381
+ font-size: 1.25rem;
382
+ flex-shrink: 0;
383
+ }
384
+
385
+ .agent-name {
386
+ font-weight: 600;
387
+ color: var(--primary-color);
388
+ }
389
+
390
+ .event-timestamp {
391
+ font-size: 0.85rem;
392
+ color: var(--text-secondary);
393
+ margin-left: auto;
394
+ }
395
+
396
+ .activity-item-tool {
397
+ margin-bottom: 0.75rem;
398
+ }
399
+
400
+ .tool-name {
401
+ background: var(--bg-darker);
402
+ color: var(--primary-color);
403
+ padding: 0.25rem 0.5rem;
404
+ border-radius: 0.25rem;
405
+ font-size: 0.85rem;
406
+ font-family: "Courier New", monospace;
407
+ }
408
+
409
+ .activity-item-content {
410
+ display: flex;
411
+ flex-direction: column;
412
+ gap: 0.5rem;
413
+ margin-bottom: 0.75rem;
414
+ }
415
+
416
+ .event-input,
417
+ .event-output {
418
+ display: flex;
419
+ gap: 0.5rem;
420
+ }
421
+
422
+ .summary-label {
423
+ color: var(--text-secondary);
424
+ font-weight: 500;
425
+ flex-shrink: 0;
426
+ }
427
+
428
+ .summary-text {
429
+ color: var(--text-primary);
430
+ font-size: 0.9rem;
431
+ }
432
+
433
+ .activity-item-footer {
434
+ display: flex;
435
+ gap: 1rem;
436
+ font-size: 0.8rem;
437
+ }
438
+
439
+ .event-id,
440
+ .session-id {
441
+ color: var(--text-secondary);
442
+ font-family: monospace;
443
+ background: var(--bg-darker);
444
+ padding: 0.25rem 0.5rem;
445
+ border-radius: 0.25rem;
446
+ }
447
+
448
+ .auto-refresh-indicator {
449
+ margin-top: 1.5rem;
450
+ display: flex;
451
+ align-items: center;
452
+ gap: 0.5rem;
453
+ color: var(--text-secondary);
454
+ font-size: 0.9rem;
455
+ }
456
+
457
+ .refresh-dot {
458
+ width: 8px;
459
+ height: 8px;
460
+ background-color: var(--success-color);
461
+ border-radius: 50%;
462
+ animation: pulse 1s ease-in-out infinite;
463
+ }
464
+
465
+ /* ========== ORCHESTRATION ========== */
466
+
467
+ .orchestration-chains {
468
+ display: flex;
469
+ flex-direction: column;
470
+ gap: 1.5rem;
471
+ }
472
+
473
+ .delegation-chain {
474
+ background: var(--card-bg);
475
+ border: 1px solid var(--border-color);
476
+ border-radius: 0.5rem;
477
+ padding: 1.5rem;
478
+ transition: all 0.2s ease;
479
+ }
480
+
481
+ .delegation-chain:hover {
482
+ border-color: var(--primary-color);
483
+ background-color: var(--hover-bg);
484
+ }
485
+
486
+ .chain-header {
487
+ margin-bottom: 1rem;
488
+ }
489
+
490
+ .timestamp-badge {
491
+ background: var(--bg-darker);
492
+ color: var(--text-secondary);
493
+ padding: 0.25rem 0.75rem;
494
+ border-radius: 0.25rem;
495
+ font-size: 0.8rem;
496
+ font-family: monospace;
497
+ }
498
+
499
+ .chain-flow {
500
+ display: flex;
501
+ align-items: center;
502
+ gap: 2rem;
503
+ margin: 1.5rem 0;
504
+ padding: 1rem;
505
+ background: var(--bg-darker);
506
+ border-radius: 0.375rem;
507
+ }
508
+
509
+ .agent-node {
510
+ display: flex;
511
+ flex-direction: column;
512
+ align-items: center;
513
+ gap: 0.5rem;
514
+ flex: 1;
515
+ }
516
+
517
+ .agent-icon {
518
+ font-size: 1.5rem;
519
+ }
520
+
521
+ .agent-label {
522
+ font-weight: 600;
523
+ color: var(--primary-color);
524
+ text-align: center;
525
+ }
526
+
527
+ .delegation-arrow {
528
+ display: flex;
529
+ flex-direction: column;
530
+ align-items: center;
531
+ gap: 0.25rem;
532
+ color: var(--secondary-color);
533
+ }
534
+
535
+ .arrow-icon {
536
+ font-size: 1.5rem;
537
+ }
538
+
539
+ .delegation-label {
540
+ font-size: 0.75rem;
541
+ color: var(--text-secondary);
542
+ }
543
+
544
+ .chain-details {
545
+ display: flex;
546
+ flex-direction: column;
547
+ gap: 0.5rem;
548
+ margin: 1rem 0;
549
+ }
550
+
551
+ .delegation-task,
552
+ .delegation-result {
553
+ display: flex;
554
+ gap: 0.5rem;
555
+ }
556
+
557
+ .detail-label {
558
+ color: var(--text-secondary);
559
+ font-weight: 500;
560
+ flex-shrink: 0;
561
+ }
562
+
563
+ .detail-value {
564
+ color: var(--text-primary);
565
+ font-size: 0.9rem;
566
+ }
567
+
568
+ .chain-footer {
569
+ display: flex;
570
+ gap: 1rem;
571
+ font-size: 0.8rem;
572
+ padding-top: 1rem;
573
+ border-top: 1px solid var(--border-color);
574
+ }
575
+
576
+ .orchestration-stats {
577
+ display: grid;
578
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
579
+ gap: 1rem;
580
+ margin-top: 2rem;
581
+ }
582
+
583
+ .stat-card {
584
+ background: var(--card-bg);
585
+ border: 1px solid var(--border-color);
586
+ border-radius: 0.5rem;
587
+ padding: 1rem;
588
+ text-align: center;
589
+ }
590
+
591
+ .stat-title {
592
+ display: block;
593
+ color: var(--text-secondary);
594
+ font-size: 0.85rem;
595
+ margin-bottom: 0.5rem;
596
+ }
597
+
598
+ .stat-value {
599
+ display: block;
600
+ font-size: 1.75rem;
601
+ font-weight: 700;
602
+ color: var(--primary-color);
603
+ }
604
+
605
+ /* ========== FEATURES / KANBAN ========== */
606
+
607
+ .kanban-board {
608
+ display: grid;
609
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
610
+ gap: 1.5rem;
611
+ margin-top: 1.5rem;
612
+ }
613
+
614
+ .kanban-column {
615
+ background: var(--bg-darker);
616
+ border: 1px solid var(--border-color);
617
+ border-radius: 0.5rem;
618
+ overflow: hidden;
619
+ display: flex;
620
+ flex-direction: column;
621
+ max-height: 800px;
622
+ }
623
+
624
+ .column-header {
625
+ background: var(--bg-dark);
626
+ border-bottom: 2px solid var(--border-color);
627
+ padding: 1rem;
628
+ display: flex;
629
+ align-items: center;
630
+ justify-content: space-between;
631
+ flex-shrink: 0;
632
+ }
633
+
634
+ .column-header h3 {
635
+ font-size: 1rem;
636
+ color: var(--text-primary);
637
+ margin: 0;
638
+ }
639
+
640
+ .column-count {
641
+ background: var(--primary-color);
642
+ color: var(--bg-dark);
643
+ padding: 0.25rem 0.5rem;
644
+ border-radius: 1rem;
645
+ font-size: 0.85rem;
646
+ font-weight: 600;
647
+ }
648
+
649
+ .column-cards {
650
+ flex: 1;
651
+ overflow-y: auto;
652
+ padding: 1rem;
653
+ display: flex;
654
+ flex-direction: column;
655
+ gap: 0.75rem;
656
+ }
657
+
658
+ .feature-card {
659
+ background: var(--card-bg);
660
+ border: 1px solid var(--border-color);
661
+ border-radius: 0.375rem;
662
+ padding: 0.75rem;
663
+ transition: all 0.2s ease;
664
+ cursor: pointer;
665
+ }
666
+
667
+ .feature-card:hover {
668
+ transform: translateY(-2px);
669
+ border-color: var(--primary-color);
670
+ box-shadow: 0 4px 12px rgba(0, 217, 255, 0.15);
671
+ }
672
+
673
+ .card-header {
674
+ display: flex;
675
+ gap: 0.5rem;
676
+ margin-bottom: 0.5rem;
677
+ flex-wrap: wrap;
678
+ }
679
+
680
+ .feature-type-badge {
681
+ font-size: 0.75rem;
682
+ padding: 0.25rem 0.5rem;
683
+ border-radius: 0.25rem;
684
+ font-weight: 600;
685
+ background: var(--bg-darker);
686
+ }
687
+
688
+ .feature-type-badge.type-feature {
689
+ color: var(--primary-color);
690
+ border: 1px solid var(--primary-color);
691
+ }
692
+
693
+ .feature-type-badge.type-bug {
694
+ color: var(--error-color);
695
+ border: 1px solid var(--error-color);
696
+ }
697
+
698
+ .feature-type-badge.type-spike {
699
+ color: var(--warning-color);
700
+ border: 1px solid var(--warning-color);
701
+ }
702
+
703
+ .priority-badge {
704
+ font-size: 0.75rem;
705
+ padding: 0.25rem 0.5rem;
706
+ border-radius: 0.25rem;
707
+ font-weight: 600;
708
+ }
709
+
710
+ .priority-badge.priority-critical {
711
+ background: rgba(255, 0, 110, 0.2);
712
+ color: var(--error-color);
713
+ }
714
+
715
+ .priority-badge.priority-high {
716
+ background: rgba(255, 190, 11, 0.2);
717
+ color: var(--warning-color);
718
+ }
719
+
720
+ .priority-badge.priority-medium {
721
+ background: rgba(0, 217, 255, 0.2);
722
+ color: var(--primary-color);
723
+ }
724
+
725
+ .priority-badge.priority-low {
726
+ background: rgba(0, 255, 65, 0.2);
727
+ color: var(--success-color);
728
+ }
729
+
730
+ .card-title {
731
+ font-size: 0.95rem;
732
+ font-weight: 600;
733
+ color: var(--text-primary);
734
+ margin: 0 0 0.5rem 0;
735
+ line-height: 1.3;
736
+ }
737
+
738
+ .card-description {
739
+ font-size: 0.85rem;
740
+ color: var(--text-secondary);
741
+ margin: 0 0 0.75rem 0;
742
+ line-height: 1.3;
743
+ }
744
+
745
+ .card-footer {
746
+ display: flex;
747
+ gap: 0.5rem;
748
+ font-size: 0.75rem;
749
+ padding-top: 0.5rem;
750
+ border-top: 1px solid var(--border-color);
751
+ align-items: center;
752
+ }
753
+
754
+ .feature-id {
755
+ color: var(--text-secondary);
756
+ font-family: monospace;
757
+ background: var(--bg-darker);
758
+ padding: 0.2rem 0.4rem;
759
+ border-radius: 0.2rem;
760
+ }
761
+
762
+ .assigned-to {
763
+ color: var(--primary-color);
764
+ margin-left: auto;
765
+ }
766
+
767
+ .empty-column {
768
+ text-align: center;
769
+ color: var(--text-secondary);
770
+ padding: 1rem;
771
+ font-size: 0.9rem;
772
+ }
773
+
774
+ /* ========== METRICS ========== */
775
+
776
+ .stats-grid {
777
+ display: grid;
778
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
779
+ gap: 1.5rem;
780
+ margin-bottom: 2rem;
781
+ }
782
+
783
+ .stat-card.large {
784
+ background: linear-gradient(135deg, var(--card-bg) 0%, var(--hover-bg) 100%);
785
+ border: 1px solid var(--border-color);
786
+ border-radius: 0.5rem;
787
+ padding: 1.5rem;
788
+ display: flex;
789
+ align-items: center;
790
+ gap: 1rem;
791
+ transition: all 0.2s ease;
792
+ }
793
+
794
+ .stat-card.large:hover {
795
+ transform: translateY(-4px);
796
+ border-color: var(--primary-color);
797
+ box-shadow: 0 8px 16px rgba(0, 217, 255, 0.15);
798
+ }
799
+
800
+ .stat-card-icon {
801
+ font-size: 2rem;
802
+ flex-shrink: 0;
803
+ }
804
+
805
+ .stat-card-content {
806
+ display: flex;
807
+ flex-direction: column;
808
+ }
809
+
810
+ .stat-card-label {
811
+ color: var(--text-secondary);
812
+ font-size: 0.85rem;
813
+ margin-bottom: 0.25rem;
814
+ }
815
+
816
+ .stat-card-value {
817
+ font-size: 1.75rem;
818
+ font-weight: 700;
819
+ color: var(--primary-color);
820
+ }
821
+
822
+ .sessions-section {
823
+ margin-bottom: 2rem;
824
+ }
825
+
826
+ .section-title {
827
+ font-size: 1.25rem;
828
+ font-weight: 600;
829
+ color: var(--primary-color);
830
+ margin-bottom: 1rem;
831
+ }
832
+
833
+ .sessions-timeline {
834
+ display: flex;
835
+ flex-direction: column;
836
+ gap: 1rem;
837
+ }
838
+
839
+ .session-item {
840
+ background: var(--card-bg);
841
+ border: 1px solid var(--border-color);
842
+ border-radius: 0.5rem;
843
+ padding: 1rem;
844
+ transition: all 0.2s ease;
845
+ }
846
+
847
+ .session-item:hover {
848
+ border-color: var(--primary-color);
849
+ background-color: var(--hover-bg);
850
+ }
851
+
852
+ .session-item-header {
853
+ display: flex;
854
+ justify-content: space-between;
855
+ align-items: flex-start;
856
+ margin-bottom: 0.75rem;
857
+ gap: 1rem;
858
+ }
859
+
860
+ .session-info {
861
+ display: flex;
862
+ gap: 1rem;
863
+ flex-wrap: wrap;
864
+ align-items: center;
865
+ }
866
+
867
+ .session-id {
868
+ font-family: monospace;
869
+ background: var(--bg-darker);
870
+ padding: 0.25rem 0.5rem;
871
+ border-radius: 0.25rem;
872
+ color: var(--primary-color);
873
+ font-size: 0.85rem;
874
+ }
875
+
876
+ .session-agent {
877
+ color: var(--text-secondary);
878
+ font-size: 0.9rem;
879
+ }
880
+
881
+ .session-status {
882
+ padding: 0.25rem 0.75rem;
883
+ border-radius: 1rem;
884
+ font-size: 0.85rem;
885
+ font-weight: 600;
886
+ }
887
+
888
+ .session-item.session-completed .session-status {
889
+ background: rgba(0, 255, 65, 0.2);
890
+ color: var(--success-color);
891
+ }
892
+
893
+ .session-item.session-in_progress .session-status {
894
+ background: rgba(0, 217, 255, 0.2);
895
+ color: var(--primary-color);
896
+ }
897
+
898
+ .session-item.session-blocked .session-status {
899
+ background: rgba(255, 190, 11, 0.2);
900
+ color: var(--warning-color);
901
+ }
902
+
903
+ .session-meta {
904
+ text-align: right;
905
+ font-size: 0.85rem;
906
+ }
907
+
908
+ .session-timestamp {
909
+ color: var(--text-secondary);
910
+ }
911
+
912
+ .session-stats {
913
+ display: flex;
914
+ gap: 1.5rem;
915
+ margin-bottom: 0.75rem;
916
+ flex-wrap: wrap;
917
+ }
918
+
919
+ .stat-item {
920
+ display: flex;
921
+ gap: 0.5rem;
922
+ align-items: center;
923
+ }
924
+
925
+ .stat-label {
926
+ color: var(--text-secondary);
927
+ font-size: 0.85rem;
928
+ }
929
+
930
+ .session-progress {
931
+ margin-bottom: 0.5rem;
932
+ }
933
+
934
+ .progress-bar {
935
+ width: 100%;
936
+ height: 4px;
937
+ background: var(--bg-darker);
938
+ border-radius: 2px;
939
+ overflow: hidden;
940
+ }
941
+
942
+ .progress-fill {
943
+ height: 100%;
944
+ background: linear-gradient(90deg, var(--primary-color), var(--secondary-color));
945
+ transition: width 0.3s ease;
946
+ }
947
+
948
+ .performance-section {
949
+ margin-bottom: 2rem;
950
+ }
951
+
952
+ .performance-grid {
953
+ display: grid;
954
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
955
+ gap: 1rem;
956
+ }
957
+
958
+ .performance-card {
959
+ background: var(--card-bg);
960
+ border: 1px solid var(--border-color);
961
+ border-radius: 0.5rem;
962
+ padding: 1.5rem;
963
+ text-align: center;
964
+ }
965
+
966
+ .perf-label {
967
+ display: block;
968
+ color: var(--text-secondary);
969
+ font-size: 0.85rem;
970
+ margin-bottom: 0.5rem;
971
+ }
972
+
973
+ .perf-value {
974
+ display: block;
975
+ font-size: 1.5rem;
976
+ font-weight: 700;
977
+ color: var(--primary-color);
978
+ }
979
+
980
+ .metrics-legend {
981
+ display: flex;
982
+ gap: 2rem;
983
+ padding: 1rem;
984
+ background: var(--card-bg);
985
+ border: 1px solid var(--border-color);
986
+ border-radius: 0.5rem;
987
+ margin-top: 2rem;
988
+ flex-wrap: wrap;
989
+ }
990
+
991
+ .legend-item {
992
+ display: flex;
993
+ align-items: center;
994
+ gap: 0.5rem;
995
+ color: var(--text-secondary);
996
+ font-size: 0.9rem;
997
+ }
998
+
999
+ .legend-dot {
1000
+ width: 12px;
1001
+ height: 12px;
1002
+ border-radius: 50%;
1003
+ }
1004
+
1005
+ .legend-dot.completed {
1006
+ background: var(--success-color);
1007
+ }
1008
+
1009
+ .legend-dot.in-progress {
1010
+ background: var(--primary-color);
1011
+ }
1012
+
1013
+ .legend-dot.blocked {
1014
+ background: var(--warning-color);
1015
+ }
1016
+
1017
+ /* Responsive Design */
1018
+ @media (max-width: 768px) {
1019
+ .header-content {
1020
+ flex-direction: column;
1021
+ gap: 1rem;
1022
+ }
1023
+
1024
+ .header-stats {
1025
+ width: 100%;
1026
+ justify-content: space-around;
1027
+ }
1028
+
1029
+ .tabs-navigation {
1030
+ overflow-x: auto;
1031
+ }
1032
+
1033
+ .tab-button {
1034
+ flex: 0 0 auto;
1035
+ font-size: 0.9rem;
1036
+ padding: 0.75rem 1rem;
1037
+ }
1038
+
1039
+ .kanban-board {
1040
+ grid-template-columns: 1fr;
1041
+ }
1042
+
1043
+ .column-cards {
1044
+ max-height: 400px;
1045
+ }
1046
+
1047
+ .chain-flow {
1048
+ flex-direction: column;
1049
+ gap: 1rem;
1050
+ }
1051
+
1052
+ .performance-grid {
1053
+ grid-template-columns: 1fr;
1054
+ }
1055
+
1056
+ .metrics-legend {
1057
+ flex-direction: column;
1058
+ gap: 0.75rem;
1059
+ }
1060
+ }
1061
+
1062
+ /* Scrollbar Styling */
1063
+ ::-webkit-scrollbar {
1064
+ width: 8px;
1065
+ height: 8px;
1066
+ }
1067
+
1068
+ ::-webkit-scrollbar-track {
1069
+ background: var(--bg-darker);
1070
+ }
1071
+
1072
+ ::-webkit-scrollbar-thumb {
1073
+ background: var(--border-color);
1074
+ border-radius: 4px;
1075
+ }
1076
+
1077
+ ::-webkit-scrollbar-thumb:hover {
1078
+ background: var(--text-secondary);
1079
+ }