principles-disciple 1.8.1 → 1.8.2

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 (470) hide show
  1. package/ADVANCED_CONFIG_ZH.md +97 -0
  2. package/AGENT_INSTALL.md +173 -0
  3. package/AGENT_INSTALL_EN.md +173 -0
  4. package/INSTALL.md +256 -0
  5. package/SKILL.md +63 -0
  6. package/docs/COMMAND_REFERENCE.md +76 -0
  7. package/docs/COMMAND_REFERENCE_EN.md +79 -0
  8. package/esbuild.config.js +75 -0
  9. package/openclaw.plugin.json +4 -4
  10. package/package.json +11 -13
  11. package/scripts/build-web.mjs +46 -0
  12. package/scripts/install-dependencies.cjs +47 -0
  13. package/scripts/sync-plugin.mjs +802 -0
  14. package/scripts/verify-build.mjs +109 -0
  15. package/src/agents/nocturnal-dreamer.md +152 -0
  16. package/src/agents/nocturnal-philosopher.md +138 -0
  17. package/src/agents/nocturnal-reflector.md +126 -0
  18. package/src/agents/nocturnal-scribe.md +164 -0
  19. package/src/commands/capabilities.ts +85 -0
  20. package/{dist/commands/context.js → src/commands/context.ts} +78 -38
  21. package/src/commands/evolution-status.ts +146 -0
  22. package/src/commands/export.ts +111 -0
  23. package/src/commands/focus.ts +533 -0
  24. package/src/commands/nocturnal-review.ts +311 -0
  25. package/src/commands/nocturnal-rollout.ts +763 -0
  26. package/src/commands/nocturnal-train.ts +1002 -0
  27. package/{dist/commands/pain.js → src/commands/pain.ts} +68 -49
  28. package/src/commands/principle-rollback.ts +27 -0
  29. package/{dist/commands/rollback.js → src/commands/rollback.ts} +44 -12
  30. package/src/commands/samples.ts +60 -0
  31. package/src/commands/strategy.ts +38 -0
  32. package/{dist/commands/thinking-os.js → src/commands/thinking-os.ts} +59 -36
  33. package/src/commands/workflow-debug.ts +128 -0
  34. package/{dist/config/defaults/runtime.js → src/config/defaults/runtime.ts} +12 -5
  35. package/src/config/errors.ts +163 -0
  36. package/{dist/config/index.d.ts → src/config/index.ts} +2 -1
  37. package/src/constants/diagnostician.ts +66 -0
  38. package/src/constants/tools.ts +62 -0
  39. package/src/core/adaptive-thresholds.ts +476 -0
  40. package/{dist/core/config-service.js → src/core/config-service.ts} +7 -4
  41. package/{dist/core/config.js → src/core/config.ts} +158 -46
  42. package/src/core/control-ui-db.ts +435 -0
  43. package/{dist/core/detection-funnel.js → src/core/detection-funnel.ts} +36 -21
  44. package/{dist/core/detection-service.js → src/core/detection-service.ts} +7 -4
  45. package/{dist/core/dictionary-service.js → src/core/dictionary-service.ts} +7 -4
  46. package/{dist/core/dictionary.js → src/core/dictionary.ts} +57 -34
  47. package/src/core/empathy-keyword-matcher.ts +327 -0
  48. package/src/core/empathy-types.ts +218 -0
  49. package/src/core/event-log.ts +544 -0
  50. package/src/core/evolution-engine.ts +612 -0
  51. package/src/core/evolution-logger.ts +353 -0
  52. package/src/core/evolution-migration.ts +77 -0
  53. package/src/core/evolution-reducer.ts +731 -0
  54. package/src/core/evolution-types.ts +456 -0
  55. package/src/core/external-training-contract.ts +527 -0
  56. package/src/core/focus-history.ts +1458 -0
  57. package/src/core/hygiene/tracker.ts +117 -0
  58. package/{dist/core/init.js → src/core/init.ts} +39 -26
  59. package/src/core/local-worker-routing.ts +617 -0
  60. package/{dist/core/migration.js → src/core/migration.ts} +18 -11
  61. package/src/core/model-deployment-registry.ts +722 -0
  62. package/src/core/model-training-registry.ts +813 -0
  63. package/src/core/nocturnal-arbiter.ts +706 -0
  64. package/src/core/nocturnal-candidate-scoring.ts +392 -0
  65. package/src/core/nocturnal-compliance.ts +1075 -0
  66. package/src/core/nocturnal-dataset.ts +668 -0
  67. package/src/core/nocturnal-executability.ts +428 -0
  68. package/src/core/nocturnal-export.ts +390 -0
  69. package/{dist/core/nocturnal-paths.js → src/core/nocturnal-paths.ts} +49 -23
  70. package/src/core/nocturnal-trajectory-extractor.ts +484 -0
  71. package/src/core/nocturnal-trinity.ts +1384 -0
  72. package/src/core/pain.ts +122 -0
  73. package/{dist/core/path-resolver.js → src/core/path-resolver.ts} +157 -36
  74. package/{dist/core/paths.js → src/core/paths.ts} +13 -4
  75. package/src/core/principle-training-state.ts +450 -0
  76. package/src/core/profile.ts +226 -0
  77. package/src/core/promotion-gate.ts +822 -0
  78. package/{dist/core/risk-calculator.js → src/core/risk-calculator.ts} +42 -16
  79. package/{dist/core/session-tracker.js → src/core/session-tracker.ts} +175 -62
  80. package/src/core/shadow-observation-registry.ts +534 -0
  81. package/{dist/core/system-logger.js → src/core/system-logger.ts} +9 -5
  82. package/src/core/thinking-models.ts +217 -0
  83. package/src/core/training-program.ts +630 -0
  84. package/src/core/trajectory-types.ts +243 -0
  85. package/src/core/trajectory.ts +1673 -0
  86. package/{dist/core/workspace-context.js → src/core/workspace-context.ts} +57 -32
  87. package/src/hooks/bash-risk.ts +171 -0
  88. package/src/hooks/edit-verification.ts +295 -0
  89. package/src/hooks/gate-block-helper.ts +160 -0
  90. package/src/hooks/gate.ts +210 -0
  91. package/src/hooks/gfi-gate.ts +177 -0
  92. package/src/hooks/lifecycle.ts +326 -0
  93. package/{dist/hooks/llm.js → src/hooks/llm.ts} +160 -80
  94. package/src/hooks/message-sanitize.ts +45 -0
  95. package/src/hooks/pain.ts +384 -0
  96. package/src/hooks/progressive-trust-gate.ts +174 -0
  97. package/src/hooks/prompt.ts +920 -0
  98. package/src/hooks/subagent.ts +207 -0
  99. package/src/hooks/thinking-checkpoint.ts +73 -0
  100. package/src/hooks/trajectory-collector.ts +290 -0
  101. package/src/http/principles-console-route.ts +716 -0
  102. package/src/i18n/commands.ts +117 -0
  103. package/src/index.ts +694 -0
  104. package/src/service/central-database.ts +831 -0
  105. package/src/service/control-ui-query-service.ts +888 -0
  106. package/src/service/evolution-query-service.ts +405 -0
  107. package/src/service/evolution-worker.ts +1646 -0
  108. package/src/service/health-query-service.ts +836 -0
  109. package/{dist/service/nocturnal-runtime.js → src/service/nocturnal-runtime.ts} +235 -79
  110. package/src/service/nocturnal-service.ts +1015 -0
  111. package/src/service/nocturnal-target-selector.ts +532 -0
  112. package/src/service/phase3-input-filter.ts +237 -0
  113. package/src/service/runtime-summary-service.ts +757 -0
  114. package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +513 -0
  115. package/{dist/service/subagent-workflow/empathy-observer-workflow-manager.js → src/service/subagent-workflow/empathy-observer-workflow-manager.ts} +240 -117
  116. package/src/service/subagent-workflow/index.ts +51 -0
  117. package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +856 -0
  118. package/src/service/subagent-workflow/runtime-direct-driver.ts +166 -0
  119. package/{dist/service/subagent-workflow/types.d.ts → src/service/subagent-workflow/types.ts} +137 -18
  120. package/src/service/subagent-workflow/workflow-store.ts +328 -0
  121. package/src/service/trajectory-service.ts +15 -0
  122. package/{dist/tools/critique-prompt.js → src/tools/critique-prompt.ts} +25 -8
  123. package/src/tools/deep-reflect.ts +349 -0
  124. package/{dist/tools/model-index.js → src/tools/model-index.ts} +33 -17
  125. package/src/types/event-types.ts +453 -0
  126. package/src/types/hygiene-types.ts +31 -0
  127. package/src/types/principle-tree-schema.ts +244 -0
  128. package/src/types/runtime-summary.ts +49 -0
  129. package/src/types.ts +74 -0
  130. package/src/utils/file-lock.ts +391 -0
  131. package/{dist/utils/glob-match.js → src/utils/glob-match.ts} +21 -20
  132. package/{dist/utils/hashing.js → src/utils/hashing.ts} +6 -4
  133. package/src/utils/io.ts +110 -0
  134. package/{dist/utils/nlp.js → src/utils/nlp.ts} +19 -12
  135. package/{dist/utils/plugin-logger.js → src/utils/plugin-logger.ts} +33 -8
  136. package/src/utils/subagent-probe.ts +94 -0
  137. package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +70 -1
  138. package/templates/pain_settings.json +2 -1
  139. package/tests/README.md +120 -0
  140. package/tests/build-artifacts.test.ts +111 -0
  141. package/tests/commands/evolution-status.test.ts +222 -0
  142. package/tests/commands/evolver.test.ts +22 -0
  143. package/tests/commands/export.test.ts +78 -0
  144. package/tests/commands/nocturnal-review.test.ts +448 -0
  145. package/tests/commands/nocturnal-train.test.ts +97 -0
  146. package/tests/commands/pain.test.ts +108 -0
  147. package/tests/commands/samples.test.ts +65 -0
  148. package/tests/commands/strategy.test.ts +34 -0
  149. package/tests/commands/thinking-os.test.ts +88 -0
  150. package/tests/core/adaptive-thresholds.test.ts +261 -0
  151. package/tests/core/config-service.test.ts +89 -0
  152. package/tests/core/config.test.ts +90 -0
  153. package/tests/core/control-ui-db.test.ts +75 -0
  154. package/tests/core/core-template-guidance.test.ts +21 -0
  155. package/tests/core/detection-funnel.test.ts +63 -0
  156. package/tests/core/detection-service.test.ts +50 -0
  157. package/tests/core/dictionary-service.test.ts +116 -0
  158. package/tests/core/dictionary.test.ts +168 -0
  159. package/tests/core/empathy-keyword-matcher.test.ts +209 -0
  160. package/tests/core/event-log.test.ts +181 -0
  161. package/tests/core/evolution-e2e.test.ts +58 -0
  162. package/tests/core/evolution-engine-gate-integration.test.ts +543 -0
  163. package/tests/core/evolution-engine.test.ts +562 -0
  164. package/tests/core/evolution-logger.test.ts +148 -0
  165. package/tests/core/evolution-migration.test.ts +50 -0
  166. package/tests/core/evolution-paths.test.ts +21 -0
  167. package/tests/core/evolution-reducer.detector-metadata.test.ts +602 -0
  168. package/tests/core/evolution-reducer.test.ts +180 -0
  169. package/tests/core/evolution-types-loop.test.ts +48 -0
  170. package/tests/core/evolution-user-stories.e2e.test.ts +249 -0
  171. package/tests/core/external-training-contract.test.ts +463 -0
  172. package/tests/core/focus-history.test.ts +682 -0
  173. package/tests/core/init-flatten.test.ts +69 -0
  174. package/tests/core/init-refactor.test.ts +87 -0
  175. package/tests/core/init-v1.3.test.ts +46 -0
  176. package/tests/core/init.test.ts +190 -0
  177. package/tests/core/local-worker-routing.test.ts +757 -0
  178. package/tests/core/migration.test.ts +84 -0
  179. package/tests/core/model-deployment-registry.test.ts +845 -0
  180. package/tests/core/model-training-registry.test.ts +889 -0
  181. package/tests/core/nocturnal-arbiter.test.ts +494 -0
  182. package/tests/core/nocturnal-candidate-scoring.test.ts +400 -0
  183. package/tests/core/nocturnal-compliance.test.ts +646 -0
  184. package/tests/core/nocturnal-dataset.test.ts +892 -0
  185. package/tests/core/nocturnal-executability.test.ts +357 -0
  186. package/tests/core/nocturnal-export.test.ts +462 -0
  187. package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +428 -0
  188. package/tests/core/nocturnal-trajectory-extractor.test.ts +634 -0
  189. package/tests/core/nocturnal-trinity.test.ts +953 -0
  190. package/tests/core/pain.test.ts +33 -0
  191. package/tests/core/path-resolver.test.ts +57 -0
  192. package/tests/core/paths-refactor.test.ts +42 -0
  193. package/tests/core/phase7-rollout-integration.test.ts +477 -0
  194. package/tests/core/principle-training-state.test.ts +712 -0
  195. package/tests/core/profile.test.ts +56 -0
  196. package/tests/core/promotion-gate.test.ts +556 -0
  197. package/tests/core/risk-calculator.test.ts +168 -0
  198. package/tests/core/session-tracker.test.ts +191 -0
  199. package/tests/core/training-program.test.ts +472 -0
  200. package/tests/core/trajectory.test.ts +265 -0
  201. package/tests/core/workspace-context-factory.test.ts +18 -0
  202. package/tests/core/workspace-context.test.ts +134 -0
  203. package/tests/fixtures/nocturnal-reviewed-subset.json +183 -0
  204. package/tests/fixtures/production-compatibility.test.ts +147 -0
  205. package/tests/fixtures/production-mock-generator.ts +282 -0
  206. package/tests/hooks/bash-risk-integration.test.ts +137 -0
  207. package/tests/hooks/bash-risk.test.ts +81 -0
  208. package/tests/hooks/edit-verification.test.ts +678 -0
  209. package/tests/hooks/gate-edit-verification-p1.test.ts +632 -0
  210. package/tests/hooks/gate-edit-verification.test.ts +435 -0
  211. package/tests/hooks/gate-pipeline-integration.test.ts +404 -0
  212. package/tests/hooks/gate.test.ts +271 -0
  213. package/tests/hooks/gfi-gate-unit.test.ts +422 -0
  214. package/tests/hooks/gfi-gate.test.ts +669 -0
  215. package/tests/hooks/lifecycle.test.ts +248 -0
  216. package/tests/hooks/llm.test.ts +308 -0
  217. package/tests/hooks/message-sanitize.test.ts +36 -0
  218. package/tests/hooks/pain.test.ts +141 -0
  219. package/tests/hooks/progressive-trust-gate.test.ts +277 -0
  220. package/tests/hooks/prompt.test.ts +1411 -0
  221. package/tests/hooks/subagent.test.ts +467 -0
  222. package/tests/hooks/thinking-gate.test.ts +313 -0
  223. package/tests/http/principles-console-route.test.ts +140 -0
  224. package/tests/hygiene-tracker.test.ts +77 -0
  225. package/tests/index.integration.test.ts +179 -0
  226. package/tests/index.shadow-routing.integration.test.ts +140 -0
  227. package/tests/index.test.ts +9 -0
  228. package/tests/integration/empathy-workflow-integration.test.ts +627 -0
  229. package/tests/service/control-ui-query-service.test.ts +121 -0
  230. package/tests/service/empathy-observer-workflow-manager.test.ts +176 -0
  231. package/tests/service/evolution-worker.test.ts +585 -0
  232. package/tests/service/nocturnal-runtime.test.ts +470 -0
  233. package/tests/service/nocturnal-service.test.ts +577 -0
  234. package/tests/service/nocturnal-target-selector.test.ts +615 -0
  235. package/tests/service/nocturnal-workflow-manager.test.ts +439 -0
  236. package/tests/service/phase3-input-filter.test.ts +289 -0
  237. package/tests/service/runtime-summary-service.test.ts +919 -0
  238. package/tests/task-compliance.test.ts +166 -0
  239. package/tests/test-utils.ts +48 -0
  240. package/tests/tools/critique-prompt.test.ts +260 -0
  241. package/tests/tools/deep-reflect.test.ts +232 -0
  242. package/tests/tools/model-index.test.ts +246 -0
  243. package/tests/ui/app.test.tsx +114 -0
  244. package/tests/utils/file-lock.test.ts +407 -0
  245. package/tests/utils/hashing.test.ts +32 -0
  246. package/tests/utils/io.test.ts +39 -0
  247. package/tests/utils/nlp.test.ts +53 -0
  248. package/tests/utils/plugin-logger.test.ts +156 -0
  249. package/tsconfig.json +16 -0
  250. package/tsconfig.tsbuildinfo +1 -0
  251. package/ui/src/App.tsx +45 -0
  252. package/ui/src/api.ts +216 -0
  253. package/ui/src/charts.tsx +586 -0
  254. package/ui/src/components/ErrorState.tsx +6 -0
  255. package/ui/src/components/Loading.tsx +13 -0
  256. package/ui/src/components/ProtectedRoute.tsx +12 -0
  257. package/ui/src/components/Shell.tsx +91 -0
  258. package/ui/src/components/WorkspaceConfig.tsx +146 -0
  259. package/ui/src/components/index.ts +5 -0
  260. package/ui/src/context/auth.tsx +80 -0
  261. package/ui/src/context/theme.tsx +66 -0
  262. package/ui/src/hooks/useAutoRefresh.ts +39 -0
  263. package/ui/src/i18n/ui.ts +363 -0
  264. package/ui/src/main.tsx +16 -0
  265. package/ui/src/pages/EvolutionPage.tsx +352 -0
  266. package/ui/src/pages/FeedbackPage.tsx +140 -0
  267. package/ui/src/pages/GateMonitorPage.tsx +136 -0
  268. package/ui/src/pages/LoginPage.tsx +88 -0
  269. package/ui/src/pages/OverviewPage.tsx +238 -0
  270. package/ui/src/pages/SamplesPage.tsx +174 -0
  271. package/ui/src/pages/ThinkingModelsPage.tsx +127 -0
  272. package/ui/src/styles.css +1661 -0
  273. package/ui/src/types.ts +368 -0
  274. package/ui/src/utils/format.ts +15 -0
  275. package/vitest.config.ts +23 -0
  276. package/dist/commands/capabilities.d.ts +0 -3
  277. package/dist/commands/capabilities.js +0 -73
  278. package/dist/commands/context.d.ts +0 -5
  279. package/dist/commands/evolution-status.d.ts +0 -4
  280. package/dist/commands/evolution-status.js +0 -117
  281. package/dist/commands/evolver.d.ts +0 -9
  282. package/dist/commands/evolver.js +0 -26
  283. package/dist/commands/export.d.ts +0 -2
  284. package/dist/commands/export.js +0 -98
  285. package/dist/commands/focus.d.ts +0 -14
  286. package/dist/commands/focus.js +0 -457
  287. package/dist/commands/nocturnal-review.d.ts +0 -24
  288. package/dist/commands/nocturnal-review.js +0 -265
  289. package/dist/commands/nocturnal-rollout.d.ts +0 -27
  290. package/dist/commands/nocturnal-rollout.js +0 -671
  291. package/dist/commands/nocturnal-train.d.ts +0 -25
  292. package/dist/commands/nocturnal-train.js +0 -919
  293. package/dist/commands/pain.d.ts +0 -5
  294. package/dist/commands/principle-rollback.d.ts +0 -4
  295. package/dist/commands/principle-rollback.js +0 -22
  296. package/dist/commands/rollback.d.ts +0 -19
  297. package/dist/commands/samples.d.ts +0 -2
  298. package/dist/commands/samples.js +0 -55
  299. package/dist/commands/strategy.d.ts +0 -3
  300. package/dist/commands/strategy.js +0 -29
  301. package/dist/commands/thinking-os.d.ts +0 -2
  302. package/dist/config/defaults/runtime.d.ts +0 -40
  303. package/dist/config/errors.d.ts +0 -84
  304. package/dist/config/errors.js +0 -94
  305. package/dist/config/index.js +0 -7
  306. package/dist/constants/diagnostician.d.ts +0 -12
  307. package/dist/constants/diagnostician.js +0 -56
  308. package/dist/constants/tools.d.ts +0 -17
  309. package/dist/constants/tools.js +0 -54
  310. package/dist/core/adaptive-thresholds.d.ts +0 -186
  311. package/dist/core/adaptive-thresholds.js +0 -300
  312. package/dist/core/config-service.d.ts +0 -15
  313. package/dist/core/config.d.ts +0 -129
  314. package/dist/core/control-ui-db.d.ts +0 -95
  315. package/dist/core/control-ui-db.js +0 -292
  316. package/dist/core/detection-funnel.d.ts +0 -33
  317. package/dist/core/detection-service.d.ts +0 -15
  318. package/dist/core/dictionary-service.d.ts +0 -15
  319. package/dist/core/dictionary.d.ts +0 -38
  320. package/dist/core/event-log.d.ts +0 -82
  321. package/dist/core/event-log.js +0 -463
  322. package/dist/core/evolution-engine.d.ts +0 -118
  323. package/dist/core/evolution-engine.js +0 -464
  324. package/dist/core/evolution-logger.d.ts +0 -137
  325. package/dist/core/evolution-logger.js +0 -256
  326. package/dist/core/evolution-migration.d.ts +0 -5
  327. package/dist/core/evolution-migration.js +0 -65
  328. package/dist/core/evolution-reducer.d.ts +0 -98
  329. package/dist/core/evolution-reducer.js +0 -465
  330. package/dist/core/evolution-types.d.ts +0 -287
  331. package/dist/core/evolution-types.js +0 -78
  332. package/dist/core/external-training-contract.d.ts +0 -276
  333. package/dist/core/external-training-contract.js +0 -269
  334. package/dist/core/focus-history.d.ts +0 -210
  335. package/dist/core/focus-history.js +0 -1185
  336. package/dist/core/hygiene/tracker.d.ts +0 -22
  337. package/dist/core/hygiene/tracker.js +0 -106
  338. package/dist/core/init.d.ts +0 -12
  339. package/dist/core/local-worker-routing.d.ts +0 -175
  340. package/dist/core/local-worker-routing.js +0 -525
  341. package/dist/core/migration.d.ts +0 -6
  342. package/dist/core/model-deployment-registry.d.ts +0 -218
  343. package/dist/core/model-deployment-registry.js +0 -503
  344. package/dist/core/model-training-registry.d.ts +0 -295
  345. package/dist/core/model-training-registry.js +0 -475
  346. package/dist/core/nocturnal-arbiter.d.ts +0 -159
  347. package/dist/core/nocturnal-arbiter.js +0 -534
  348. package/dist/core/nocturnal-candidate-scoring.d.ts +0 -137
  349. package/dist/core/nocturnal-candidate-scoring.js +0 -266
  350. package/dist/core/nocturnal-compliance.d.ts +0 -175
  351. package/dist/core/nocturnal-compliance.js +0 -824
  352. package/dist/core/nocturnal-dataset.d.ts +0 -224
  353. package/dist/core/nocturnal-dataset.js +0 -443
  354. package/dist/core/nocturnal-executability.d.ts +0 -85
  355. package/dist/core/nocturnal-executability.js +0 -331
  356. package/dist/core/nocturnal-export.d.ts +0 -124
  357. package/dist/core/nocturnal-export.js +0 -275
  358. package/dist/core/nocturnal-paths.d.ts +0 -124
  359. package/dist/core/nocturnal-trajectory-extractor.d.ts +0 -242
  360. package/dist/core/nocturnal-trajectory-extractor.js +0 -307
  361. package/dist/core/nocturnal-trinity.d.ts +0 -311
  362. package/dist/core/nocturnal-trinity.js +0 -880
  363. package/dist/core/pain.d.ts +0 -4
  364. package/dist/core/pain.js +0 -70
  365. package/dist/core/path-resolver.d.ts +0 -46
  366. package/dist/core/paths.d.ts +0 -65
  367. package/dist/core/principle-training-state.d.ts +0 -121
  368. package/dist/core/principle-training-state.js +0 -321
  369. package/dist/core/profile.d.ts +0 -62
  370. package/dist/core/profile.js +0 -210
  371. package/dist/core/promotion-gate.d.ts +0 -238
  372. package/dist/core/promotion-gate.js +0 -529
  373. package/dist/core/risk-calculator.d.ts +0 -22
  374. package/dist/core/session-tracker.d.ts +0 -101
  375. package/dist/core/shadow-observation-registry.d.ts +0 -217
  376. package/dist/core/shadow-observation-registry.js +0 -308
  377. package/dist/core/system-logger.d.ts +0 -8
  378. package/dist/core/thinking-models.d.ts +0 -38
  379. package/dist/core/thinking-models.js +0 -170
  380. package/dist/core/training-program.d.ts +0 -233
  381. package/dist/core/training-program.js +0 -433
  382. package/dist/core/trajectory.d.ts +0 -411
  383. package/dist/core/trajectory.js +0 -1307
  384. package/dist/core/workspace-context.d.ts +0 -71
  385. package/dist/hooks/bash-risk.d.ts +0 -57
  386. package/dist/hooks/bash-risk.js +0 -137
  387. package/dist/hooks/edit-verification.d.ts +0 -62
  388. package/dist/hooks/edit-verification.js +0 -256
  389. package/dist/hooks/gate-block-helper.d.ts +0 -44
  390. package/dist/hooks/gate-block-helper.js +0 -119
  391. package/dist/hooks/gate.d.ts +0 -24
  392. package/dist/hooks/gate.js +0 -173
  393. package/dist/hooks/gfi-gate.d.ts +0 -40
  394. package/dist/hooks/gfi-gate.js +0 -113
  395. package/dist/hooks/lifecycle.d.ts +0 -5
  396. package/dist/hooks/lifecycle.js +0 -284
  397. package/dist/hooks/llm.d.ts +0 -13
  398. package/dist/hooks/message-sanitize.d.ts +0 -3
  399. package/dist/hooks/message-sanitize.js +0 -37
  400. package/dist/hooks/pain.d.ts +0 -5
  401. package/dist/hooks/pain.js +0 -301
  402. package/dist/hooks/progressive-trust-gate.d.ts +0 -52
  403. package/dist/hooks/progressive-trust-gate.js +0 -134
  404. package/dist/hooks/prompt.d.ts +0 -49
  405. package/dist/hooks/prompt.js +0 -905
  406. package/dist/hooks/subagent.d.ts +0 -10
  407. package/dist/hooks/subagent.js +0 -387
  408. package/dist/hooks/thinking-checkpoint.d.ts +0 -37
  409. package/dist/hooks/thinking-checkpoint.js +0 -51
  410. package/dist/hooks/trajectory-collector.d.ts +0 -32
  411. package/dist/hooks/trajectory-collector.js +0 -256
  412. package/dist/http/principles-console-route.d.ts +0 -9
  413. package/dist/http/principles-console-route.js +0 -681
  414. package/dist/i18n/commands.d.ts +0 -26
  415. package/dist/i18n/commands.js +0 -116
  416. package/dist/index.d.ts +0 -7
  417. package/dist/index.js +0 -581
  418. package/dist/service/central-database.d.ts +0 -104
  419. package/dist/service/central-database.js +0 -649
  420. package/dist/service/control-ui-query-service.d.ts +0 -221
  421. package/dist/service/control-ui-query-service.js +0 -543
  422. package/dist/service/empathy-observer-manager.d.ts +0 -88
  423. package/dist/service/empathy-observer-manager.js +0 -414
  424. package/dist/service/evolution-query-service.d.ts +0 -155
  425. package/dist/service/evolution-query-service.js +0 -258
  426. package/dist/service/evolution-worker.d.ts +0 -101
  427. package/dist/service/evolution-worker.js +0 -975
  428. package/dist/service/health-query-service.d.ts +0 -170
  429. package/dist/service/health-query-service.js +0 -662
  430. package/dist/service/nocturnal-runtime.d.ts +0 -183
  431. package/dist/service/nocturnal-service.d.ts +0 -163
  432. package/dist/service/nocturnal-service.js +0 -787
  433. package/dist/service/nocturnal-target-selector.d.ts +0 -145
  434. package/dist/service/nocturnal-target-selector.js +0 -315
  435. package/dist/service/phase3-input-filter.d.ts +0 -73
  436. package/dist/service/phase3-input-filter.js +0 -172
  437. package/dist/service/runtime-summary-service.d.ts +0 -122
  438. package/dist/service/runtime-summary-service.js +0 -485
  439. package/dist/service/subagent-workflow/empathy-observer-workflow-manager.d.ts +0 -48
  440. package/dist/service/subagent-workflow/index.d.ts +0 -4
  441. package/dist/service/subagent-workflow/index.js +0 -3
  442. package/dist/service/subagent-workflow/runtime-direct-driver.d.ts +0 -77
  443. package/dist/service/subagent-workflow/runtime-direct-driver.js +0 -75
  444. package/dist/service/subagent-workflow/types.js +0 -11
  445. package/dist/service/subagent-workflow/workflow-store.d.ts +0 -26
  446. package/dist/service/subagent-workflow/workflow-store.js +0 -165
  447. package/dist/service/trajectory-service.d.ts +0 -2
  448. package/dist/service/trajectory-service.js +0 -15
  449. package/dist/tools/critique-prompt.d.ts +0 -14
  450. package/dist/tools/deep-reflect.d.ts +0 -39
  451. package/dist/tools/deep-reflect.js +0 -350
  452. package/dist/tools/model-index.d.ts +0 -9
  453. package/dist/types/event-types.d.ts +0 -306
  454. package/dist/types/event-types.js +0 -106
  455. package/dist/types/hygiene-types.d.ts +0 -20
  456. package/dist/types/hygiene-types.js +0 -12
  457. package/dist/types/runtime-summary.d.ts +0 -47
  458. package/dist/types/runtime-summary.js +0 -1
  459. package/dist/types.d.ts +0 -50
  460. package/dist/types.js +0 -22
  461. package/dist/utils/file-lock.d.ts +0 -71
  462. package/dist/utils/file-lock.js +0 -309
  463. package/dist/utils/glob-match.d.ts +0 -28
  464. package/dist/utils/hashing.d.ts +0 -9
  465. package/dist/utils/io.d.ts +0 -6
  466. package/dist/utils/io.js +0 -106
  467. package/dist/utils/nlp.d.ts +0 -9
  468. package/dist/utils/plugin-logger.d.ts +0 -39
  469. package/dist/utils/subagent-probe.d.ts +0 -34
  470. package/dist/utils/subagent-probe.js +0 -81
@@ -0,0 +1,1661 @@
1
+ /* ==========================================================================
2
+ Principles Console - Design System
3
+ Warm Natural × Soft UI Evolution
4
+ ========================================================================== */
5
+
6
+ /* Google Fonts - display=swap for non-blocking font loading */
7
+ @import url('https://fonts.googleapis.com/css2?family=Calistoga&family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
8
+
9
+ /* ==========================================================================
10
+ CSS Variables - Design Tokens
11
+ ========================================================================== */
12
+
13
+ :root {
14
+ /* Background Layers - 暖奶油色系 */
15
+ --bg-base: #FAF7F2;
16
+ --bg-elevated: #FFFFFF;
17
+ --bg-sunken: #F0EBE3;
18
+
19
+ /* Accent - 深橄榄绿 (柔和版本) */
20
+ --accent: #4A7C6F;
21
+ --accent-hover: #3D6A5E;
22
+ --accent-soft: rgba(74, 124, 111, 0.1);
23
+ --accent-muted: rgba(74, 124, 111, 0.06);
24
+
25
+ /* Earth Tones - 大地色系 */
26
+ --earth-brown: #8B7355;
27
+ --earth-tan: #C4A882;
28
+ --earth-cream: #E8DFD0;
29
+ --earth-warm: #D4C4A8;
30
+
31
+ /* Text Hierarchy */
32
+ --text-primary: #2D2A26;
33
+ --text-secondary: #6B6560;
34
+ --text-tertiary: #9A948C;
35
+
36
+ /* Borders & Dividers */
37
+ --border: rgba(139, 115, 85, 0.15);
38
+ --border-hover: rgba(139, 115, 85, 0.25);
39
+
40
+ /* Status Colors */
41
+ --success: #4A7C6F;
42
+ --warning: #B8860B;
43
+ --error: #C45C4A;
44
+ --info: #5B8BA0;
45
+
46
+ /* Cards & Surfaces */
47
+ --card-bg: #FFFFFF;
48
+ --card-radius: 16px;
49
+
50
+ /* Shadows */
51
+ --shadow-sm: 0 1px 2px rgba(139, 115, 85, 0.05);
52
+ --shadow-md: 0 2px 8px rgba(139, 115, 85, 0.08), 0 4px 16px rgba(139, 115, 85, 0.04);
53
+ --shadow-lg: 0 4px 12px rgba(139, 115, 85, 0.12), 0 8px 24px rgba(139, 115, 85, 0.06);
54
+
55
+ /* Typography */
56
+ --font-display: 'Calistoga', serif;
57
+ --font-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
58
+ --font-mono: 'JetBrains Mono', 'SF Mono', Consolas, monospace;
59
+
60
+ /* Spacing */
61
+ --space-1: 4px;
62
+ --space-2: 8px;
63
+ --space-3: 12px;
64
+ --space-4: 16px;
65
+ --space-5: 20px;
66
+ --space-6: 24px;
67
+ --space-8: 32px;
68
+ --space-10: 40px;
69
+ --space-12: 48px;
70
+
71
+ /* Border Radius */
72
+ --radius-sm: 6px;
73
+ --radius-md: 8px;
74
+ --radius-lg: 12px;
75
+ --radius-xl: 16px;
76
+ --radius-full: 9999px;
77
+
78
+ /* Animation */
79
+ --duration-fast: 150ms;
80
+ --duration-normal: 200ms;
81
+ --duration-slow: 300ms;
82
+ --ease-out: cubic-bezier(0.4, 0, 0.2, 1);
83
+ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
84
+ }
85
+
86
+ /* ==========================================================================
87
+ Dark Mode — system preference + manual toggle via [data-theme]
88
+ ========================================================================== */
89
+
90
+ [data-theme="dark"] {
91
+ --bg-base: #1A1917;
92
+ --bg-elevated: #242220;
93
+ --bg-sunken: #131311;
94
+ --accent: #6BA394;
95
+ --accent-hover: #7DB5A8;
96
+ --accent-soft: rgba(107, 163, 148, 0.15);
97
+ --accent-muted: rgba(107, 163, 148, 0.08);
98
+ --earth-brown: #A08E74;
99
+ --earth-tan: #9A8A70;
100
+ --earth-cream: #3D3830;
101
+ --earth-warm: #4A4238;
102
+ --text-primary: #F5F2ED;
103
+ --text-secondary: #A8A29A;
104
+ --text-tertiary: #706B65;
105
+ --border: rgba(160, 142, 116, 0.2);
106
+ --border-hover: rgba(160, 142, 116, 0.35);
107
+ --card-bg: #242220;
108
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.2);
109
+ --shadow-md: 0 2px 8px rgba(0,0,0,0.25), 0 4px 16px rgba(0,0,0,0.12);
110
+ --shadow-lg: 0 4px 12px rgba(0,0,0,0.3), 0 8px 24px rgba(0,0,0,0.15);
111
+ }
112
+
113
+ @media (prefers-color-scheme: dark) {
114
+ :root:not([data-theme="light"]) {
115
+ --bg-base: #1A1917;
116
+ --bg-elevated: #242220;
117
+ --bg-sunken: #131311;
118
+ --accent: #6BA394;
119
+ --accent-hover: #7DB5A8;
120
+ --accent-soft: rgba(107, 163, 148, 0.15);
121
+ --accent-muted: rgba(107, 163, 148, 0.08);
122
+ --earth-brown: #A08E74;
123
+ --earth-tan: #9A8A70;
124
+ --earth-cream: #3D3830;
125
+ --earth-warm: #4A4238;
126
+ --text-primary: #F5F2ED;
127
+ --text-secondary: #A8A29A;
128
+ --text-tertiary: #706B65;
129
+ --border: rgba(160, 142, 116, 0.2);
130
+ --border-hover: rgba(160, 142, 116, 0.35);
131
+ --card-bg: #242220;
132
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.2);
133
+ --shadow-md: 0 2px 8px rgba(0,0,0,0.25), 0 4px 16px rgba(0,0,0,0.12);
134
+ --shadow-lg: 0 4px 12px rgba(0,0,0,0.3), 0 8px 24px rgba(0,0,0,0.15);
135
+ }
136
+
137
+ .spinner {
138
+ border-color: rgba(255,255,255,0.1);
139
+ border-top-color: var(--accent);
140
+ }
141
+
142
+ .auth-checking {
143
+ background: var(--bg-base);
144
+ }
145
+
146
+ .auth-checking-content {
147
+ color: var(--text-primary);
148
+ }
149
+ }
150
+
151
+ /* ==========================================================================
152
+ Base Styles
153
+ ========================================================================== */
154
+
155
+ * {
156
+ box-sizing: border-box;
157
+ margin: 0;
158
+ padding: 0;
159
+ }
160
+
161
+ html {
162
+ font-size: 16px;
163
+ -webkit-font-smoothing: antialiased;
164
+ -moz-osx-font-smoothing: grayscale;
165
+ }
166
+
167
+ body {
168
+ font-family: var(--font-body);
169
+ font-size: 15px;
170
+ line-height: 1.6;
171
+ color: var(--text-primary);
172
+ background: var(--bg-base);
173
+ min-height: 100vh;
174
+ }
175
+
176
+ a {
177
+ color: inherit;
178
+ text-decoration: none;
179
+ }
180
+
181
+ button {
182
+ font-family: inherit;
183
+ cursor: pointer;
184
+ border: none;
185
+ background: none;
186
+ }
187
+
188
+ input, select {
189
+ font-family: inherit;
190
+ font-size: inherit;
191
+ }
192
+
193
+ /* ==========================================================================
194
+ App Shell Layout
195
+ ========================================================================== */
196
+
197
+ .app-shell {
198
+ display: grid;
199
+ grid-template-columns: 260px minmax(0, 1fr);
200
+ min-height: 100dvh;
201
+ }
202
+
203
+ /* Skip to content link for keyboard accessibility */
204
+ .skip-link {
205
+ position: absolute;
206
+ top: -40px;
207
+ left: 0;
208
+ background: var(--accent);
209
+ color: white;
210
+ padding: var(--space-2) var(--space-4);
211
+ z-index: 9999;
212
+ border-radius: 0 0 var(--radius-md) 0;
213
+ font-size: 14px;
214
+ font-weight: 500;
215
+ transition: top var(--duration-fast) var(--ease-out);
216
+ }
217
+
218
+ .skip-link:focus {
219
+ top: 0;
220
+ outline: 2px solid var(--accent);
221
+ outline-offset: 2px;
222
+ }
223
+
224
+ /* ==========================================================================
225
+ Sidebar
226
+ ========================================================================== */
227
+
228
+ .sidebar {
229
+ display: flex;
230
+ flex-direction: column;
231
+ padding: var(--space-6);
232
+ background: var(--card-bg);
233
+ border-right: 1px solid var(--border);
234
+ position: sticky;
235
+ top: 0;
236
+ height: 100vh;
237
+ overflow-y: auto;
238
+ }
239
+
240
+ .brand {
241
+ margin-bottom: var(--space-8);
242
+ }
243
+
244
+ .brand-logo {
245
+ display: flex;
246
+ align-items: center;
247
+ gap: var(--space-3);
248
+ margin-bottom: var(--space-3);
249
+ }
250
+
251
+ .brand-logo .logo-icon {
252
+ width: 40px;
253
+ height: 40px;
254
+ display: flex;
255
+ align-items: center;
256
+ justify-content: center;
257
+ background: var(--accent-soft);
258
+ border-radius: var(--radius-md);
259
+ color: var(--accent);
260
+ }
261
+
262
+ .brand-logo .logo-icon svg {
263
+ width: 22px;
264
+ height: 22px;
265
+ }
266
+
267
+ .brand h1 {
268
+ font-family: var(--font-display);
269
+ font-size: 22px;
270
+ font-weight: 400;
271
+ color: var(--text-primary);
272
+ margin-bottom: var(--space-1);
273
+ }
274
+
275
+ .brand p {
276
+ font-size: 13px;
277
+ color: var(--text-tertiary);
278
+ }
279
+
280
+ .eyebrow {
281
+ display: inline-block;
282
+ font-size: 11px;
283
+ font-weight: 600;
284
+ text-transform: uppercase;
285
+ letter-spacing: 0.08em;
286
+ color: var(--accent);
287
+ margin-bottom: var(--space-2);
288
+ }
289
+
290
+ /* Navigation */
291
+ .nav {
292
+ display: flex;
293
+ flex-direction: column;
294
+ gap: var(--space-2);
295
+ flex: 1;
296
+ }
297
+
298
+ .nav-link {
299
+ display: flex;
300
+ align-items: center;
301
+ gap: var(--space-3);
302
+ padding: var(--space-3) var(--space-4);
303
+ border-radius: var(--radius-lg);
304
+ color: var(--text-secondary);
305
+ font-size: 14px;
306
+ font-weight: 500;
307
+ transition: all var(--duration-fast) var(--ease-out);
308
+ position: relative;
309
+ }
310
+
311
+ .nav-link:hover {
312
+ background: var(--accent-muted);
313
+ color: var(--text-primary);
314
+ }
315
+
316
+ .nav-link.active {
317
+ background: var(--accent-soft);
318
+ color: var(--accent);
319
+ }
320
+
321
+ .nav-link.active::before {
322
+ content: '';
323
+ position: absolute;
324
+ left: 0;
325
+ top: 50%;
326
+ transform: translateY(-50%);
327
+ width: 3px;
328
+ height: 20px;
329
+ background: var(--accent);
330
+ border-radius: 0 2px 2px 0;
331
+ }
332
+
333
+ .nav-icon {
334
+ width: 20px;
335
+ height: 20px;
336
+ display: flex;
337
+ align-items: center;
338
+ justify-content: center;
339
+ flex-shrink: 0;
340
+ }
341
+
342
+ .nav-icon svg {
343
+ width: 18px;
344
+ height: 18px;
345
+ stroke-width: 1.75;
346
+ }
347
+
348
+ /* Sidebar Footer */
349
+ .sidebar-footer {
350
+ display: flex;
351
+ flex-direction: column;
352
+ gap: var(--space-2);
353
+ padding-top: var(--space-6);
354
+ border-top: 1px solid var(--border);
355
+ margin-top: var(--space-6);
356
+ }
357
+
358
+ .export-link,
359
+ .logout-button {
360
+ display: flex;
361
+ align-items: center;
362
+ gap: var(--space-3);
363
+ padding: var(--space-3) var(--space-4);
364
+ border-radius: var(--radius-lg);
365
+ color: var(--text-secondary);
366
+ font-size: 14px;
367
+ font-weight: 500;
368
+ transition: all var(--duration-fast) var(--ease-out);
369
+ }
370
+
371
+ .export-link:hover {
372
+ background: var(--accent-muted);
373
+ color: var(--text-primary);
374
+ }
375
+
376
+ .logout-button:hover {
377
+ background: rgba(196, 92, 74, 0.08);
378
+ color: var(--error);
379
+ }
380
+
381
+ /* ==========================================================================
382
+ Main Content
383
+ ========================================================================== */
384
+
385
+ .content {
386
+ padding: var(--space-6) var(--space-8);
387
+ min-height: 100vh;
388
+ }
389
+
390
+ .page {
391
+ display: grid;
392
+ gap: var(--space-6);
393
+ animation: page-enter var(--duration-slow) var(--ease-out);
394
+ }
395
+
396
+ @keyframes page-enter {
397
+ from {
398
+ opacity: 0;
399
+ transform: translateY(8px);
400
+ }
401
+ to {
402
+ opacity: 1;
403
+ transform: translateY(0);
404
+ }
405
+ }
406
+
407
+ .page-header {
408
+ display: flex;
409
+ justify-content: space-between;
410
+ align-items: flex-start;
411
+ gap: var(--space-4);
412
+ flex-wrap: wrap;
413
+ }
414
+
415
+ .page-header h2 {
416
+ font-family: var(--font-display);
417
+ font-size: 26px;
418
+ font-weight: 400;
419
+ color: var(--text-primary);
420
+ margin: 0;
421
+ }
422
+
423
+ .page-header .meta {
424
+ font-size: 13px;
425
+ color: var(--text-tertiary);
426
+ text-align: right;
427
+ display: flex;
428
+ flex-wrap: wrap;
429
+ gap: var(--space-3);
430
+ align-items: center;
431
+ }
432
+
433
+ .refresh-indicator {
434
+ display: inline-flex;
435
+ align-items: center;
436
+ gap: 4px;
437
+ color: var(--accent);
438
+ font-size: 12px;
439
+ animation: pulse 1.5s ease-in-out infinite;
440
+ }
441
+
442
+ @keyframes pulse {
443
+ 0%, 100% { opacity: 1; }
444
+ 50% { opacity: 0.5; }
445
+ }
446
+
447
+ /* ==========================================================================
448
+ Grid Layouts
449
+ ========================================================================== */
450
+
451
+ .grid {
452
+ display: grid;
453
+ gap: var(--space-5);
454
+ }
455
+
456
+ .two-columns {
457
+ grid-template-columns: repeat(2, minmax(0, 1fr));
458
+ }
459
+
460
+ .wide-right {
461
+ grid-template-columns: minmax(300px, 1.1fr) minmax(340px, 1.3fr);
462
+ }
463
+
464
+ .kpi-grid {
465
+ display: grid;
466
+ grid-template-columns: repeat(4, minmax(0, 1fr));
467
+ gap: var(--space-4);
468
+ }
469
+
470
+ /* ==========================================================================
471
+ Panel / Card
472
+ ========================================================================== */
473
+
474
+ .panel {
475
+ background: var(--card-bg);
476
+ border: 1px solid var(--border);
477
+ border-radius: var(--radius-xl);
478
+ padding: var(--space-5);
479
+ box-shadow: var(--shadow-md);
480
+ transition: all var(--duration-normal) var(--ease-out);
481
+ }
482
+
483
+ .panel:hover {
484
+ box-shadow: var(--shadow-lg);
485
+ }
486
+
487
+ .panel h3 {
488
+ font-size: 16px;
489
+ font-weight: 600;
490
+ color: var(--text-primary);
491
+ margin-bottom: var(--space-4);
492
+ }
493
+
494
+ .panel h4 {
495
+ font-size: 13px;
496
+ font-weight: 600;
497
+ color: var(--text-primary);
498
+ margin: var(--space-4) 0 var(--space-3);
499
+ }
500
+
501
+ .panel.error {
502
+ background: rgba(196, 92, 74, 0.05);
503
+ border-color: rgba(196, 92, 74, 0.2);
504
+ color: var(--error);
505
+ }
506
+
507
+ /* KPI Panel */
508
+ .panel.kpi {
509
+ padding: var(--space-4) var(--space-5);
510
+ }
511
+
512
+ .panel.kpi .label {
513
+ font-size: 11px;
514
+ font-weight: 600;
515
+ text-transform: uppercase;
516
+ letter-spacing: 0.06em;
517
+ color: var(--text-tertiary);
518
+ margin-bottom: var(--space-2);
519
+ }
520
+
521
+ .panel.kpi .value {
522
+ font-family: var(--font-mono);
523
+ font-size: 28px;
524
+ font-weight: 500;
525
+ color: var(--text-primary);
526
+ line-height: 1.2;
527
+ }
528
+
529
+ .panel.kpi .sub {
530
+ font-size: 12px;
531
+ color: var(--text-tertiary);
532
+ margin-top: var(--space-1);
533
+ }
534
+
535
+ /* ==========================================================================
536
+ Row Cards & List Items
537
+ ========================================================================== */
538
+
539
+ .trend-list,
540
+ .stack,
541
+ .detail-stack,
542
+ .list-table {
543
+ display: grid;
544
+ gap: var(--space-3);
545
+ }
546
+
547
+ .row-card,
548
+ .trend-row,
549
+ .table-row {
550
+ display: flex;
551
+ justify-content: space-between;
552
+ align-items: center;
553
+ gap: var(--space-4);
554
+ padding: var(--space-3) var(--space-4);
555
+ border: 1px solid var(--border);
556
+ border-radius: var(--radius-lg);
557
+ background: var(--bg-elevated);
558
+ transition: all var(--duration-fast) var(--ease-out);
559
+ }
560
+
561
+ .trend-row:hover,
562
+ .row-card:hover,
563
+ .table-row:hover {
564
+ background: var(--accent-muted);
565
+ border-color: var(--border-hover);
566
+ }
567
+
568
+ .table-row {
569
+ width: 100%;
570
+ text-align: left;
571
+ cursor: pointer;
572
+ }
573
+
574
+ .table-row.active {
575
+ background: var(--accent-soft);
576
+ border-color: var(--accent);
577
+ }
578
+
579
+ .row-card > div {
580
+ display: flex;
581
+ flex-direction: column;
582
+ gap: var(--space-1);
583
+ }
584
+
585
+ .row-card strong,
586
+ .table-row strong {
587
+ font-size: 14px;
588
+ font-weight: 600;
589
+ color: var(--text-primary);
590
+ }
591
+
592
+ .row-card span,
593
+ .table-row span,
594
+ .trend-row span {
595
+ font-size: 13px;
596
+ color: var(--text-tertiary);
597
+ }
598
+
599
+ .row-card.vertical {
600
+ display: grid;
601
+ gap: var(--space-2);
602
+ }
603
+
604
+ .align-right {
605
+ text-align: right;
606
+ }
607
+
608
+ /* ==========================================================================
609
+ Badges & Pills
610
+ ========================================================================== */
611
+
612
+ .badge {
613
+ display: inline-flex;
614
+ align-items: center;
615
+ gap: var(--space-1);
616
+ padding: var(--space-1) var(--space-3);
617
+ border-radius: var(--radius-full);
618
+ background: var(--accent-soft);
619
+ color: var(--accent);
620
+ font-size: 12px;
621
+ font-weight: 500;
622
+ white-space: nowrap;
623
+ }
624
+
625
+ .badge.success {
626
+ background: rgba(74, 124, 111, 0.12);
627
+ color: var(--success);
628
+ }
629
+
630
+ .badge.warning {
631
+ background: rgba(184, 134, 11, 0.12);
632
+ color: var(--warning);
633
+ }
634
+
635
+ .badge.error {
636
+ background: rgba(196, 92, 74, 0.12);
637
+ color: var(--error);
638
+ }
639
+
640
+ .badge.info {
641
+ background: rgba(91, 139, 160, 0.12);
642
+ color: var(--info);
643
+ }
644
+
645
+ .pill-row {
646
+ display: flex;
647
+ flex-wrap: wrap;
648
+ gap: var(--space-2);
649
+ }
650
+
651
+ /* ==========================================================================
652
+ Buttons
653
+ ========================================================================== */
654
+
655
+ button,
656
+ .button {
657
+ display: inline-flex;
658
+ align-items: center;
659
+ justify-content: center;
660
+ gap: var(--space-2);
661
+ padding: var(--space-3) var(--space-5);
662
+ border-radius: var(--radius-md);
663
+ font-size: 14px;
664
+ font-weight: 500;
665
+ transition: all var(--duration-fast) var(--ease-out);
666
+ }
667
+
668
+ .button-primary {
669
+ background: var(--accent);
670
+ color: white;
671
+ border: none;
672
+ }
673
+
674
+ .button-primary:hover {
675
+ background: var(--accent-hover);
676
+ box-shadow: var(--shadow-lg);
677
+ }
678
+
679
+ .button-secondary {
680
+ background: transparent;
681
+ color: var(--text-primary);
682
+ border: 1px solid var(--border);
683
+ }
684
+
685
+ .button-secondary:hover {
686
+ background: var(--bg-sunken);
687
+ border-color: var(--border-hover);
688
+ }
689
+
690
+ .button-ghost {
691
+ background: transparent;
692
+ color: var(--text-secondary);
693
+ border: none;
694
+ }
695
+
696
+ .button-ghost:hover {
697
+ background: var(--accent-muted);
698
+ color: var(--text-primary);
699
+ }
700
+
701
+ button:disabled {
702
+ opacity: 0.5;
703
+ cursor: not-allowed;
704
+ }
705
+
706
+ button:focus-visible,
707
+ .nav-link:focus-visible,
708
+ select:focus-visible,
709
+ input:focus-visible,
710
+ .table-row:focus-visible {
711
+ outline: 2px solid var(--accent);
712
+ outline-offset: 2px;
713
+ }
714
+
715
+ .button-row {
716
+ display: flex;
717
+ gap: var(--space-3);
718
+ }
719
+
720
+ /* ==========================================================================
721
+ Filters & Select
722
+ ========================================================================== */
723
+
724
+ .filters {
725
+ display: flex;
726
+ flex-wrap: wrap;
727
+ gap: var(--space-3);
728
+ margin-bottom: var(--space-4);
729
+ }
730
+
731
+ .filters label {
732
+ display: flex;
733
+ align-items: center;
734
+ gap: var(--space-2);
735
+ font-size: 13px;
736
+ color: var(--text-secondary);
737
+ }
738
+
739
+ select {
740
+ padding: var(--space-2) var(--space-3);
741
+ border: 1px solid var(--border);
742
+ border-radius: var(--radius-md);
743
+ background: var(--bg-elevated);
744
+ color: var(--text-primary);
745
+ font-size: 13px;
746
+ cursor: pointer;
747
+ transition: border-color var(--duration-fast) var(--ease-out);
748
+ }
749
+
750
+ select:hover {
751
+ border-color: var(--border-hover);
752
+ }
753
+
754
+ select:focus {
755
+ outline: none;
756
+ border-color: var(--accent);
757
+ box-shadow: 0 0 0 3px var(--accent-soft);
758
+ }
759
+
760
+ /* ==========================================================================
761
+ Timeline
762
+ ========================================================================== */
763
+
764
+ .timeline {
765
+ position: relative;
766
+ padding-left: var(--space-8);
767
+ }
768
+
769
+ .timeline::before {
770
+ content: '';
771
+ position: absolute;
772
+ left: 11px;
773
+ top: 16px;
774
+ bottom: 16px;
775
+ width: 2px;
776
+ background: var(--border);
777
+ border-radius: 1px;
778
+ }
779
+
780
+ .timeline-item {
781
+ position: relative;
782
+ padding: var(--space-3) 0 var(--space-3) 28px;
783
+ display: grid;
784
+ gap: var(--space-1);
785
+ }
786
+
787
+ .timeline-marker {
788
+ position: absolute;
789
+ left: 5px;
790
+ top: 16px;
791
+ width: 12px;
792
+ height: 12px;
793
+ border-radius: 50%;
794
+ border: 3px solid white;
795
+ box-shadow: var(--shadow-sm);
796
+ z-index: 1;
797
+ }
798
+
799
+ .timeline-time {
800
+ font-size: 12px;
801
+ font-family: var(--font-mono);
802
+ color: var(--text-tertiary);
803
+ }
804
+
805
+ .timeline-stage {
806
+ font-weight: 600;
807
+ font-size: 14px;
808
+ }
809
+
810
+ .timeline-summary {
811
+ font-size: 13px;
812
+ color: var(--text-secondary);
813
+ line-height: 1.5;
814
+ }
815
+
816
+ /* ==========================================================================
817
+ Detail Panel
818
+ ========================================================================== */
819
+
820
+ .detail-header {
821
+ display: flex;
822
+ justify-content: space-between;
823
+ align-items: flex-start;
824
+ gap: var(--space-4);
825
+ margin-bottom: var(--space-5);
826
+ padding-bottom: var(--space-4);
827
+ border-bottom: 1px solid var(--border);
828
+ }
829
+
830
+ .detail-header h3 {
831
+ font-size: 18px;
832
+ font-weight: 600;
833
+ margin: 0;
834
+ }
835
+
836
+ .detail-header p {
837
+ font-size: 13px;
838
+ color: var(--text-tertiary);
839
+ margin: var(--space-1) 0 0;
840
+ }
841
+
842
+ .detail-stack {
843
+ display: grid;
844
+ gap: var(--space-4);
845
+ }
846
+
847
+ .detail-stack article {
848
+ padding-top: var(--space-4);
849
+ border-top: 1px solid var(--border);
850
+ }
851
+
852
+ .detail-stack article:first-child {
853
+ padding-top: 0;
854
+ border-top: none;
855
+ }
856
+
857
+ /* ==========================================================================
858
+ Forms & Inputs
859
+ ========================================================================== */
860
+
861
+ .form-group {
862
+ display: grid;
863
+ gap: var(--space-2);
864
+ }
865
+
866
+ .form-group label {
867
+ font-size: 14px;
868
+ font-weight: 500;
869
+ color: var(--text-primary);
870
+ }
871
+
872
+ .form-group input {
873
+ padding: var(--space-3) var(--space-4);
874
+ border: 1px solid var(--border);
875
+ border-radius: var(--radius-md);
876
+ font-size: 15px;
877
+ background: var(--bg-elevated);
878
+ color: var(--text-primary);
879
+ transition: all var(--duration-fast) var(--ease-out);
880
+ }
881
+
882
+ .form-group input:focus {
883
+ outline: none;
884
+ border-color: var(--accent);
885
+ box-shadow: 0 0 0 3px var(--accent-soft);
886
+ }
887
+
888
+ .form-group input::placeholder {
889
+ color: var(--text-tertiary);
890
+ }
891
+
892
+ .form-hint {
893
+ font-size: 12px;
894
+ color: var(--text-tertiary);
895
+ }
896
+
897
+ .form-hint code {
898
+ font-family: var(--font-mono);
899
+ font-size: 11px;
900
+ background: var(--accent-soft);
901
+ padding: 2px 6px;
902
+ border-radius: var(--radius-sm);
903
+ }
904
+
905
+ .form-error {
906
+ padding: var(--space-3) var(--space-4);
907
+ background: rgba(196, 92, 74, 0.08);
908
+ border: 1px solid rgba(196, 92, 74, 0.2);
909
+ border-radius: var(--radius-md);
910
+ color: var(--error);
911
+ font-size: 14px;
912
+ }
913
+
914
+ /* ==========================================================================
915
+ Auth & Login
916
+ ========================================================================== */
917
+
918
+ .auth-checking {
919
+ min-height: 100vh;
920
+ display: flex;
921
+ align-items: center;
922
+ justify-content: center;
923
+ background: var(--bg-base);
924
+ }
925
+
926
+ .auth-checking-content {
927
+ display: flex;
928
+ flex-direction: column;
929
+ align-items: center;
930
+ gap: var(--space-4);
931
+ color: var(--text-tertiary);
932
+ }
933
+
934
+ .loading-state {
935
+ display: flex;
936
+ flex-direction: column;
937
+ align-items: center;
938
+ justify-content: center;
939
+ gap: var(--space-4);
940
+ padding: var(--space-10);
941
+ color: var(--text-tertiary);
942
+ font-size: 14px;
943
+ }
944
+
945
+ .loading-state .spinner {
946
+ width: 28px;
947
+ height: 28px;
948
+ }
949
+
950
+ .login-page {
951
+ min-height: 100vh;
952
+ display: flex;
953
+ align-items: center;
954
+ justify-content: center;
955
+ background: var(--bg-base);
956
+ padding: var(--space-5);
957
+ }
958
+
959
+ .login-container {
960
+ width: 100%;
961
+ max-width: 400px;
962
+ background: var(--card-bg);
963
+ border: 1px solid var(--border);
964
+ border-radius: var(--radius-xl);
965
+ padding: var(--space-8);
966
+ box-shadow: var(--shadow-lg);
967
+ }
968
+
969
+ .login-header {
970
+ text-align: center;
971
+ margin-bottom: var(--space-8);
972
+ }
973
+
974
+ .login-logo {
975
+ display: flex;
976
+ flex-direction: column;
977
+ align-items: center;
978
+ gap: var(--space-3);
979
+ margin-bottom: var(--space-4);
980
+ }
981
+
982
+ .login-logo .logo-icon {
983
+ width: 56px;
984
+ height: 56px;
985
+ display: flex;
986
+ align-items: center;
987
+ justify-content: center;
988
+ background: var(--accent-soft);
989
+ border-radius: var(--radius-lg);
990
+ color: var(--accent);
991
+ }
992
+
993
+ .login-logo .logo-icon svg {
994
+ width: 32px;
995
+ height: 32px;
996
+ }
997
+
998
+ .login-logo h1 {
999
+ font-family: var(--font-display);
1000
+ font-size: 24px;
1001
+ font-weight: 400;
1002
+ color: var(--text-primary);
1003
+ }
1004
+
1005
+ .login-subtitle {
1006
+ font-size: 14px;
1007
+ color: var(--text-tertiary);
1008
+ }
1009
+
1010
+ .login-form {
1011
+ display: grid;
1012
+ gap: var(--space-5);
1013
+ }
1014
+
1015
+ .login-button {
1016
+ width: 100%;
1017
+ padding: var(--space-4);
1018
+ background: var(--accent);
1019
+ color: white;
1020
+ border: none;
1021
+ border-radius: var(--radius-md);
1022
+ font-size: 15px;
1023
+ font-weight: 500;
1024
+ cursor: pointer;
1025
+ transition: all var(--duration-fast) var(--ease-out);
1026
+ }
1027
+
1028
+ .login-button:hover:not(:disabled) {
1029
+ background: var(--accent-hover);
1030
+ transform: translateY(-1px);
1031
+ }
1032
+
1033
+ .login-button:active {
1034
+ transform: scale(0.98);
1035
+ }
1036
+
1037
+ .login-footer {
1038
+ margin-top: var(--space-6);
1039
+ padding-top: var(--space-5);
1040
+ border-top: 1px solid var(--border);
1041
+ }
1042
+
1043
+ .login-footer h4 {
1044
+ font-size: 12px;
1045
+ font-weight: 600;
1046
+ color: var(--text-tertiary);
1047
+ text-transform: uppercase;
1048
+ letter-spacing: 0.05em;
1049
+ margin-bottom: var(--space-3);
1050
+ }
1051
+
1052
+ .login-footer ol {
1053
+ font-size: 13px;
1054
+ color: var(--text-secondary);
1055
+ line-height: 1.8;
1056
+ padding-left: var(--space-5);
1057
+ }
1058
+
1059
+ .login-footer code {
1060
+ font-family: var(--font-mono);
1061
+ font-size: 11px;
1062
+ background: var(--accent-soft);
1063
+ padding: 2px 6px;
1064
+ border-radius: var(--radius-sm);
1065
+ color: var(--accent);
1066
+ }
1067
+
1068
+ /* ==========================================================================
1069
+ Spinner
1070
+ ========================================================================== */
1071
+
1072
+ .spinner {
1073
+ width: 32px;
1074
+ height: 32px;
1075
+ border: 3px solid var(--border);
1076
+ border-top-color: var(--accent);
1077
+ border-radius: 50%;
1078
+ animation: spin 0.8s linear infinite;
1079
+ }
1080
+
1081
+ .spinner-small {
1082
+ width: 16px;
1083
+ height: 16px;
1084
+ border: 2px solid rgba(255, 255, 255, 0.3);
1085
+ border-top-color: white;
1086
+ border-radius: 50%;
1087
+ animation: spin 0.8s linear infinite;
1088
+ display: inline-block;
1089
+ margin-right: var(--space-2);
1090
+ vertical-align: middle;
1091
+ }
1092
+
1093
+ @keyframes spin {
1094
+ to {
1095
+ transform: rotate(360deg);
1096
+ }
1097
+ }
1098
+
1099
+ /* ==========================================================================
1100
+ Pre / Code
1101
+ ========================================================================== */
1102
+
1103
+ pre {
1104
+ font-family: var(--font-mono);
1105
+ font-size: 12px;
1106
+ line-height: 1.6;
1107
+ white-space: pre-wrap;
1108
+ overflow-wrap: anywhere;
1109
+ background: var(--bg-sunken);
1110
+ padding: var(--space-3) var(--space-4);
1111
+ border-radius: var(--radius-md);
1112
+ color: var(--text-primary);
1113
+ }
1114
+
1115
+ .muted {
1116
+ color: var(--text-tertiary);
1117
+ font-size: 13px;
1118
+ }
1119
+
1120
+ /* ==========================================================================
1121
+ Back Button
1122
+ ========================================================================== */
1123
+
1124
+ .back-button {
1125
+ display: flex;
1126
+ align-items: center;
1127
+ justify-content: center;
1128
+ width: 32px;
1129
+ height: 32px;
1130
+ border-radius: var(--radius-md);
1131
+ background: var(--bg-sunken);
1132
+ color: var(--text-secondary);
1133
+ transition: all var(--duration-fast) var(--ease-out);
1134
+ flex-shrink: 0;
1135
+ }
1136
+
1137
+ .back-button:hover {
1138
+ background: var(--accent-soft);
1139
+ color: var(--accent);
1140
+ }
1141
+
1142
+ /* ==========================================================================
1143
+ Empty State
1144
+ ========================================================================== */
1145
+
1146
+ .empty-state {
1147
+ display: flex;
1148
+ flex-direction: column;
1149
+ align-items: center;
1150
+ justify-content: center;
1151
+ padding: var(--space-8) var(--space-4);
1152
+ text-align: center;
1153
+ color: var(--text-tertiary);
1154
+ }
1155
+
1156
+ .empty-state-icon {
1157
+ margin-bottom: var(--space-4);
1158
+ color: var(--text-tertiary);
1159
+ opacity: 0.6;
1160
+ }
1161
+
1162
+ .empty-state-title {
1163
+ font-size: 14px;
1164
+ font-weight: 500;
1165
+ color: var(--text-secondary);
1166
+ margin-bottom: var(--space-2);
1167
+ }
1168
+
1169
+ .empty-state-desc {
1170
+ font-size: 13px;
1171
+ color: var(--text-tertiary);
1172
+ max-width: 280px;
1173
+ line-height: 1.5;
1174
+ }
1175
+
1176
+ .empty-state-action {
1177
+ margin-top: var(--space-4);
1178
+ }
1179
+
1180
+ /* ==========================================================================
1181
+ Pagination
1182
+ ========================================================================== */
1183
+
1184
+ .pagination {
1185
+ display: flex;
1186
+ justify-content: center;
1187
+ align-items: center;
1188
+ padding-top: var(--space-4);
1189
+ font-size: 13px;
1190
+ color: var(--text-tertiary);
1191
+ }
1192
+
1193
+ /* ==========================================================================
1194
+ Responsive
1195
+ ========================================================================== */
1196
+
1197
+ @media (max-width: 1200px) {
1198
+ .kpi-grid {
1199
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1200
+ }
1201
+ }
1202
+
1203
+ @media (max-width: 1024px) {
1204
+ .app-shell {
1205
+ grid-template-columns: 1fr;
1206
+ }
1207
+
1208
+ .sidebar {
1209
+ position: relative;
1210
+ height: auto;
1211
+ border-right: none;
1212
+ border-bottom: 1px solid var(--border);
1213
+ flex-direction: row;
1214
+ flex-wrap: wrap;
1215
+ padding: var(--space-4);
1216
+ }
1217
+
1218
+ .brand {
1219
+ margin-bottom: 0;
1220
+ margin-right: var(--space-6);
1221
+ }
1222
+
1223
+ .nav {
1224
+ flex-direction: row;
1225
+ flex-wrap: wrap;
1226
+ gap: var(--space-2);
1227
+ }
1228
+
1229
+ .nav-link.active::before {
1230
+ display: none;
1231
+ }
1232
+
1233
+ .sidebar-footer {
1234
+ flex-direction: row;
1235
+ margin-left: auto;
1236
+ padding-top: 0;
1237
+ border-top: none;
1238
+ margin-top: 0;
1239
+ }
1240
+
1241
+ .two-columns,
1242
+ .wide-right {
1243
+ grid-template-columns: 1fr;
1244
+ }
1245
+ }
1246
+
1247
+ @media (max-width: 640px) {
1248
+ .content {
1249
+ padding: var(--space-4);
1250
+ }
1251
+
1252
+ .kpi-grid {
1253
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1254
+ }
1255
+
1256
+ .page-header {
1257
+ flex-direction: column;
1258
+ }
1259
+
1260
+ .page-header .meta {
1261
+ text-align: left;
1262
+ }
1263
+
1264
+ .login-container {
1265
+ padding: var(--space-6);
1266
+ }
1267
+ }
1268
+
1269
+ /* Mobile: sidebar becomes a top nav bar */
1270
+ @media (max-width: 768px) {
1271
+ .app-shell {
1272
+ grid-template-columns: 1fr;
1273
+ grid-template-rows: auto 1fr;
1274
+ }
1275
+
1276
+ .sidebar {
1277
+ position: sticky;
1278
+ top: 0;
1279
+ height: auto;
1280
+ width: 100%;
1281
+ flex-direction: row;
1282
+ align-items: center;
1283
+ padding: var(--space-3) var(--space-4);
1284
+ border-right: none;
1285
+ border-bottom: 1px solid var(--border);
1286
+ z-index: 100;
1287
+ overflow-x: auto;
1288
+ overflow-y: visible;
1289
+ }
1290
+
1291
+ .brand {
1292
+ display: none;
1293
+ }
1294
+
1295
+ .nav {
1296
+ flex-direction: row;
1297
+ flex: none;
1298
+ gap: var(--space-1);
1299
+ }
1300
+
1301
+ .nav-link {
1302
+ padding: var(--space-2) var(--space-3);
1303
+ font-size: 13px;
1304
+ white-space: nowrap;
1305
+ }
1306
+
1307
+ .nav-link::before {
1308
+ display: none;
1309
+ }
1310
+
1311
+ .nav-icon svg {
1312
+ width: 16px;
1313
+ height: 16px;
1314
+ }
1315
+
1316
+ .sidebar-footer {
1317
+ flex-direction: row;
1318
+ padding-top: 0;
1319
+ padding-left: var(--space-3);
1320
+ border-top: none;
1321
+ border-left: 1px solid var(--border);
1322
+ margin-top: 0;
1323
+ margin-left: auto;
1324
+ gap: var(--space-1);
1325
+ }
1326
+
1327
+ .export-link span:last-child,
1328
+ .logout-button span:last-child,
1329
+ .theme-toggle span:last-child {
1330
+ display: none;
1331
+ }
1332
+
1333
+ .theme-toggle {
1334
+ padding: var(--space-2) var(--space-3);
1335
+ }
1336
+
1337
+ .content {
1338
+ padding: var(--space-4);
1339
+ min-height: calc(100dvh - 60px);
1340
+ }
1341
+ }
1342
+
1343
+ /* ==========================================================================
1344
+ Reduced Motion
1345
+ ========================================================================== */
1346
+
1347
+ @media (prefers-reduced-motion: reduce) {
1348
+ *,
1349
+ *::before,
1350
+ *::after {
1351
+ animation-duration: 0.01ms !important;
1352
+ animation-iteration-count: 1 !important;
1353
+ transition-duration: 0.01ms !important;
1354
+ }
1355
+ /* EXCEPT page transitions — keep them instant */
1356
+ .page {
1357
+ animation: none !important;
1358
+ }
1359
+ /* Keep skeleton shimmer for loading states */
1360
+ .skeleton,
1361
+ .skeleton::before,
1362
+ .skeleton::after {
1363
+ animation: none !important;
1364
+ }
1365
+ }
1366
+
1367
+ /* ==========================================================================
1368
+ Charts
1369
+ ========================================================================== */
1370
+
1371
+ /* Sparkline */
1372
+ .sparkline {
1373
+ display: inline-block;
1374
+ vertical-align: middle;
1375
+ }
1376
+
1377
+ .sparkline-empty,
1378
+ .chart-empty {
1379
+ color: var(--text-tertiary);
1380
+ font-size: 12px;
1381
+ }
1382
+
1383
+ .sparkline-animated .sparkline-line {
1384
+ stroke-dasharray: 200;
1385
+ stroke-dashoffset: 200;
1386
+ animation: sparkline-draw 0.6s ease-out forwards;
1387
+ }
1388
+
1389
+ .sparkline-animated .sparkline-area {
1390
+ opacity: 0;
1391
+ animation: sparkline-fade 0.4s ease-out 0.3s forwards;
1392
+ }
1393
+
1394
+ @keyframes sparkline-draw {
1395
+ to {
1396
+ stroke-dashoffset: 0;
1397
+ }
1398
+ }
1399
+
1400
+ @keyframes sparkline-fade {
1401
+ to {
1402
+ opacity: 1;
1403
+ }
1404
+ }
1405
+
1406
+ /* Mini Bar Chart */
1407
+ .mini-bar-chart .bar {
1408
+ transition: opacity var(--duration-fast) var(--ease-out);
1409
+ }
1410
+
1411
+ .mini-bar-chart:hover .bar {
1412
+ opacity: 0.8;
1413
+ }
1414
+
1415
+ .mini-bar-chart:hover .bar:hover {
1416
+ opacity: 1;
1417
+ }
1418
+
1419
+ /* Grouped Bar Chart */
1420
+ .grouped-bar-chart .bar {
1421
+ transition: opacity var(--duration-fast) var(--ease-out);
1422
+ }
1423
+
1424
+ .grouped-bar-chart:hover .bar {
1425
+ opacity: 0.8;
1426
+ }
1427
+
1428
+ .grouped-bar-chart:hover .bar:hover {
1429
+ opacity: 1;
1430
+ }
1431
+
1432
+ /* Donut Chart */
1433
+ .donut-chart-wrapper {
1434
+ display: flex;
1435
+ align-items: center;
1436
+ gap: var(--space-4);
1437
+ }
1438
+
1439
+ .donut-chart {
1440
+ flex-shrink: 0;
1441
+ }
1442
+
1443
+ .donut-segment {
1444
+ transition: opacity var(--duration-fast) var(--ease-out);
1445
+ }
1446
+
1447
+ .donut-chart:hover .donut-segment {
1448
+ opacity: 0.8;
1449
+ }
1450
+
1451
+ .donut-chart:hover .donut-segment:hover {
1452
+ opacity: 1;
1453
+ }
1454
+
1455
+ .donut-total {
1456
+ font-family: var(--font-mono);
1457
+ font-size: 16px;
1458
+ font-weight: 600;
1459
+ fill: var(--text-primary);
1460
+ }
1461
+
1462
+ .donut-label {
1463
+ font-size: 10px;
1464
+ fill: var(--text-tertiary);
1465
+ }
1466
+
1467
+ .donut-legend {
1468
+ display: flex;
1469
+ flex-direction: column;
1470
+ gap: var(--space-2);
1471
+ }
1472
+
1473
+ .legend-item {
1474
+ display: flex;
1475
+ align-items: center;
1476
+ gap: var(--space-2);
1477
+ font-size: 12px;
1478
+ }
1479
+
1480
+ .legend-color {
1481
+ width: 10px;
1482
+ height: 10px;
1483
+ border-radius: var(--radius-sm);
1484
+ flex-shrink: 0;
1485
+ }
1486
+
1487
+ .legend-label {
1488
+ color: var(--text-secondary);
1489
+ flex: 1;
1490
+ }
1491
+
1492
+ .legend-value {
1493
+ font-family: var(--font-mono);
1494
+ color: var(--text-primary);
1495
+ font-weight: 500;
1496
+ }
1497
+
1498
+ /* Time Range Selector */
1499
+ .time-range-selector {
1500
+ display: inline-flex;
1501
+ background: var(--bg-sunken);
1502
+ border-radius: var(--radius-md);
1503
+ padding: 2px;
1504
+ }
1505
+
1506
+ .time-range-option {
1507
+ padding: var(--space-1) var(--space-3);
1508
+ font-size: 12px;
1509
+ font-weight: 500;
1510
+ color: var(--text-secondary);
1511
+ background: transparent;
1512
+ border: none;
1513
+ border-radius: var(--radius-sm);
1514
+ cursor: pointer;
1515
+ transition: all var(--duration-fast) var(--ease-out);
1516
+ }
1517
+
1518
+ .time-range-option:hover {
1519
+ color: var(--text-primary);
1520
+ }
1521
+
1522
+ .time-range-option.active {
1523
+ background: var(--card-bg);
1524
+ color: var(--accent);
1525
+ box-shadow: var(--shadow-sm);
1526
+ }
1527
+
1528
+ /* Stat Card */
1529
+ .stat-card {
1530
+ display: flex;
1531
+ justify-content: space-between;
1532
+ align-items: center;
1533
+ padding: var(--space-4) var(--space-5);
1534
+ background: var(--card-bg);
1535
+ border: 1px solid var(--border);
1536
+ border-radius: var(--radius-xl);
1537
+ box-shadow: var(--shadow-md);
1538
+ transition: all var(--duration-normal) var(--ease-out);
1539
+ }
1540
+
1541
+ .stat-card:hover {
1542
+ box-shadow: var(--shadow-lg);
1543
+ }
1544
+
1545
+ .stat-content {
1546
+ display: flex;
1547
+ flex-direction: column;
1548
+ gap: var(--space-1);
1549
+ }
1550
+
1551
+ .stat-label {
1552
+ font-size: 11px;
1553
+ font-weight: 600;
1554
+ text-transform: uppercase;
1555
+ letter-spacing: 0.06em;
1556
+ color: var(--text-tertiary);
1557
+ }
1558
+
1559
+ .stat-value {
1560
+ font-family: var(--font-mono);
1561
+ font-size: 28px;
1562
+ font-weight: 500;
1563
+ color: var(--text-primary);
1564
+ line-height: 1.2;
1565
+ }
1566
+
1567
+ .stat-trend-label {
1568
+ font-size: 11px;
1569
+ color: var(--text-tertiary);
1570
+ }
1571
+
1572
+ .stat-sparkline {
1573
+ flex-shrink: 0;
1574
+ }
1575
+
1576
+ /* Trend Indicator */
1577
+ .trend-indicator {
1578
+ display: inline-flex;
1579
+ align-items: center;
1580
+ gap: var(--space-1);
1581
+ font-size: 12px;
1582
+ font-weight: 500;
1583
+ }
1584
+
1585
+ .trend-up {
1586
+ color: var(--success);
1587
+ }
1588
+
1589
+ .trend-down {
1590
+ color: var(--error);
1591
+ }
1592
+
1593
+ .trend-neutral {
1594
+ color: var(--text-tertiary);
1595
+ }
1596
+
1597
+ .trend-percent {
1598
+ font-family: var(--font-mono);
1599
+ }
1600
+
1601
+ /* ==========================================================================
1602
+ Collapsible Panel
1603
+ ========================================================================== */
1604
+
1605
+ .collapsible-panel {
1606
+ overflow: hidden;
1607
+ }
1608
+
1609
+ .collapsible-panel .panel-header {
1610
+ display: flex;
1611
+ justify-content: space-between;
1612
+ align-items: center;
1613
+ cursor: pointer;
1614
+ user-select: none;
1615
+ margin-bottom: 0;
1616
+ padding: var(--space-5);
1617
+ transition: background var(--duration-fast) var(--ease-out);
1618
+ }
1619
+
1620
+ .collapsible-panel .panel-header:hover {
1621
+ background: var(--accent-muted);
1622
+ }
1623
+
1624
+ .collapsible-panel .panel-header-left {
1625
+ display: flex;
1626
+ align-items: center;
1627
+ gap: var(--space-3);
1628
+ }
1629
+
1630
+ .collapsible-panel .panel-header h3 {
1631
+ margin: 0;
1632
+ }
1633
+
1634
+ .collapse-toggle {
1635
+ display: flex;
1636
+ align-items: center;
1637
+ justify-content: center;
1638
+ width: 28px;
1639
+ height: 28px;
1640
+ border-radius: var(--radius-md);
1641
+ background: var(--bg-sunken);
1642
+ color: var(--text-secondary);
1643
+ transition: all var(--duration-fast) var(--ease-out);
1644
+ }
1645
+
1646
+ .collapse-toggle:hover {
1647
+ background: var(--accent-soft);
1648
+ color: var(--accent);
1649
+ }
1650
+
1651
+ .collapsible-panel .panel-content {
1652
+ padding: 0 var(--space-5) var(--space-5);
1653
+ }
1654
+
1655
+ .collapsible-panel.collapsed {
1656
+ box-shadow: var(--shadow-sm);
1657
+ }
1658
+
1659
+ .collapsible-panel.collapsed .panel-header {
1660
+ border-bottom: none;
1661
+ }