agentworkshop 0.7.41 → 0.7.44

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 (265) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/B8uy9iRW.js +1 -0
  3. package/.output/public/_nuxt/BGTYYQH-.js +1 -0
  4. package/.output/public/_nuxt/BUmHEJ77.js +2 -0
  5. package/.output/public/_nuxt/BY7YrV_D.js +1 -0
  6. package/.output/public/_nuxt/Bqcgz95s.js +18 -0
  7. package/.output/public/_nuxt/C7UlqPeD.js +1 -0
  8. package/.output/public/_nuxt/CTmDn-YP.js +1 -0
  9. package/.output/public/_nuxt/Cs8pVeVG.js +1 -0
  10. package/.output/public/_nuxt/DKySmNPI.js +14 -0
  11. package/.output/public/_nuxt/Di0NY_ht.js +1 -0
  12. package/.output/public/_nuxt/Du9v6qGB.js +1 -0
  13. package/.output/public/_nuxt/{DGbd-UiG.js → EHlEMRii.js} +1 -1
  14. package/.output/public/_nuxt/Eke1fs-U.js +1 -0
  15. package/.output/public/_nuxt/{DeJykBFf.js → H0BcqZtT.js} +1 -1
  16. package/.output/public/_nuxt/{C4oW1HsE.js → HSYEkkce.js} +1 -1
  17. package/.output/public/_nuxt/{D_OTvQza.js → J9oU00D1.js} +1 -1
  18. package/.output/public/_nuxt/OmpTerminalPanel.BxR5-lvi.css +1 -0
  19. package/.output/public/_nuxt/SSyAPaHc.js +1 -0
  20. package/.output/public/_nuxt/TownView.li4EMQxK.css +1 -0
  21. package/.output/public/_nuxt/VdLk4jLE2.js +1 -0
  22. package/.output/public/_nuxt/_id_.BhsXoEuk.css +1 -0
  23. package/.output/public/_nuxt/_id_.DQyj-WKN.css +1 -0
  24. package/.output/public/_nuxt/{_wsId_.B4WiqkIS.css → _wsId_.CTx-BlfF.css} +1 -1
  25. package/.output/public/_nuxt/aShsv_rG.js +19 -0
  26. package/.output/public/_nuxt/{yF0aYMF1.js → aesgXKSr.js} +3 -3
  27. package/.output/public/_nuxt/agents.B21nUEUX.css +1 -0
  28. package/.output/public/_nuxt/aml.ekTjxFkf.css +1 -0
  29. package/.output/public/_nuxt/builds/latest.json +1 -1
  30. package/.output/public/_nuxt/builds/meta/b5506ef0-f48e-4f14-a6c0-d65e505d0b09.json +1 -0
  31. package/.output/public/_nuxt/channel-templates.DplM1pJ3.css +1 -0
  32. package/.output/public/_nuxt/daq.BdVmoIfe.css +1 -0
  33. package/.output/public/_nuxt/dcw.DCgyzpWV.css +1 -0
  34. package/.output/public/_nuxt/{default.J32SgqFY.css → default.Bh3L2HU8.css} +1 -1
  35. package/.output/public/_nuxt/lHAxdSsj.js +1 -0
  36. package/.output/public/_nuxt/pages.j9rzRocr.css +1 -0
  37. package/.output/public/_nuxt/plugins.DhiZbHU8.css +1 -0
  38. package/.output/public/_nuxt/settings.BRx9rIDg.css +1 -0
  39. package/.output/public/_nuxt/teams.BLlOPB_Z.css +1 -0
  40. package/.output/public/_nuxt/tokens.De8xzszn.css +1 -0
  41. package/.output/public/_nuxt/workshop.D1jFNkrn.css +1 -0
  42. package/.output/server/chunks/_/nitro.mjs +748 -733
  43. package/.output/server/chunks/build/{OmpTerminalPanel-Cu_s4i0A.mjs → OmpTerminalPanel-CVvxpsF7.mjs} +15 -15
  44. package/.output/server/chunks/build/{OmpTerminalPanel-Cu_s4i0A.mjs.map → OmpTerminalPanel-CVvxpsF7.mjs.map} +1 -1
  45. package/.output/server/chunks/build/{TownView--otsnr_7.mjs → TownView-CJ6IsDCc.mjs} +226 -225
  46. package/.output/server/chunks/build/{TownView--otsnr_7.mjs.map → TownView-CJ6IsDCc.mjs.map} +1 -1
  47. package/.output/server/chunks/build/{_id_-Brv-JSvr.mjs → _id_-CVD_H0ir.mjs} +143 -142
  48. package/.output/server/chunks/build/_id_-CVD_H0ir.mjs.map +1 -0
  49. package/.output/server/chunks/build/{_id_-D9pl1OZy.mjs → _id_-CtxMb3qp.mjs} +41 -41
  50. package/.output/server/chunks/build/_id_-CtxMb3qp.mjs.map +1 -0
  51. package/.output/server/chunks/build/{_wsId_-BASfDf0s.mjs → _wsId_-DpY3T-md.mjs} +514 -444
  52. package/.output/server/chunks/build/{_wsId_-BASfDf0s.mjs.map → _wsId_-DpY3T-md.mjs.map} +1 -1
  53. package/.output/server/chunks/build/{agents-CLQqJF2y.mjs → agents-DsCkuXDV.mjs} +49 -46
  54. package/.output/server/chunks/build/agents-DsCkuXDV.mjs.map +1 -0
  55. package/.output/server/chunks/build/{aml-_7FdFL2p.mjs → aml-CT0xKGKI.mjs} +122 -105
  56. package/.output/server/chunks/build/aml-CT0xKGKI.mjs.map +1 -0
  57. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs +117 -0
  58. package/.output/server/chunks/build/builtin-catalog-edpDcgfL.mjs.map +1 -0
  59. package/.output/server/chunks/build/{channel-templates-p6SZNjlM.mjs → channel-templates-Dla9FbYa.mjs} +49 -37
  60. package/.output/server/chunks/build/channel-templates-Dla9FbYa.mjs.map +1 -0
  61. package/.output/server/chunks/build/{daq-DkMvD8sg.mjs → daq-DWWSKGAV.mjs} +89 -88
  62. package/.output/server/chunks/build/daq-DWWSKGAV.mjs.map +1 -0
  63. package/.output/server/chunks/build/{dcw-C1jgVJkO.mjs → dcw-CT8k17_E.mjs} +44 -43
  64. package/.output/server/chunks/build/dcw-CT8k17_E.mjs.map +1 -0
  65. package/.output/server/chunks/build/{default-BE4r0FZN.mjs → default-D3525UFX.mjs} +16 -15
  66. package/.output/server/chunks/build/{default-BE4r0FZN.mjs.map → default-D3525UFX.mjs.map} +1 -1
  67. package/.output/server/chunks/build/{monitor-C0okQaXz.mjs → monitor-Dh2Kvaq5.mjs} +2 -2
  68. package/.output/server/chunks/build/{monitor-C0okQaXz.mjs.map → monitor-Dh2Kvaq5.mjs.map} +1 -1
  69. package/.output/server/chunks/build/{pages-B0bUWnC6.mjs → pages-BHcSBM2D.mjs} +24 -18
  70. package/.output/server/chunks/build/pages-BHcSBM2D.mjs.map +1 -0
  71. package/.output/server/chunks/build/{plugins-lGlUr1lj.mjs → plugins-BNgIi61W.mjs} +23 -17
  72. package/.output/server/chunks/build/plugins-BNgIi61W.mjs.map +1 -0
  73. package/.output/server/chunks/build/{settings-Ddd1qx2Z.mjs → settings-ipYBDWdn.mjs} +45 -44
  74. package/.output/server/chunks/build/settings-ipYBDWdn.mjs.map +1 -0
  75. package/.output/server/chunks/build/{teams-MEDLZdMn.mjs → teams-5lx-CwFa.mjs} +47 -44
  76. package/.output/server/chunks/build/teams-5lx-CwFa.mjs.map +1 -0
  77. package/.output/server/chunks/build/{tokens-C7fTM5C2.mjs → tokens-q-IDT8Io.mjs} +73 -53
  78. package/.output/server/chunks/build/tokens-q-IDT8Io.mjs.map +1 -0
  79. package/.output/server/chunks/build/{town-CoQdblbZ.mjs → town-QJWB5wng.mjs} +3 -2
  80. package/.output/server/chunks/build/town-QJWB5wng.mjs.map +1 -0
  81. package/.output/server/chunks/build/{workshop-BL5bhfs0.mjs → workshop-BIlCj_ZP.mjs} +45 -45
  82. package/.output/server/chunks/build/workshop-BIlCj_ZP.mjs.map +1 -0
  83. package/.output/server/chunks/routes/renderer.mjs +1 -1
  84. package/.output/server/chunks/virtual/entry.mjs +637 -86
  85. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  86. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  87. package/.output/server/package.json +1 -1
  88. package/README-zh.md +13 -3
  89. package/README.md +13 -3
  90. package/app/components/AppHeader.vue +961 -959
  91. package/app/components/workshop/A2aRpcDebugger.vue +237 -237
  92. package/app/components/workshop/AgentInspectorDrawer.vue +424 -424
  93. package/app/components/workshop/AgentLanesView.vue +998 -998
  94. package/app/components/workshop/ArtifactCard.vue +120 -120
  95. package/app/components/workshop/AssetLibrary.vue +452 -452
  96. package/app/components/workshop/ChannelSessionList.vue +812 -804
  97. package/app/components/workshop/CommandPalette.vue +269 -269
  98. package/app/components/workshop/Composer.vue +827 -827
  99. package/app/components/workshop/DeviceTwinPanel.vue +643 -643
  100. package/app/components/workshop/EventBlock.vue +602 -602
  101. package/app/components/workshop/FileSelectorModal.vue +188 -188
  102. package/app/components/workshop/InspectorPanel.vue +301 -301
  103. package/app/components/workshop/MemoryPanel.vue +364 -364
  104. package/app/components/workshop/MultiChannelView.vue +189 -189
  105. package/app/components/workshop/TaskBoardView.vue +686 -686
  106. package/app/components/workshop/TaskInspectorDrawer.vue +390 -390
  107. package/app/components/workshop/TranscriptTimeline.vue +601 -601
  108. package/app/components/workshop/blocks/ClusterArtifact.vue +61 -61
  109. package/app/components/workshop/blocks/ClusterError.vue +85 -85
  110. package/app/components/workshop/blocks/ClusterLife.vue +87 -87
  111. package/app/components/workshop/blocks/ClusterMember.vue +95 -93
  112. package/app/components/workshop/blocks/ClusterMemory.vue +84 -84
  113. package/app/components/workshop/blocks/ClusterOther.vue +67 -67
  114. package/app/components/workshop/blocks/ClusterStatus.vue +149 -147
  115. package/app/components/workshop/blocks/ClusterTool.vue +158 -158
  116. package/app/components/workshop/terminal/OmpTerminalPanel.vue +1011 -1011
  117. package/app/components/workshop/town/TownView.vue +56 -56
  118. package/app/middleware/locale-cookie.global.ts +22 -0
  119. package/app/pages/aml/index.vue +24 -2
  120. package/app/pages/daq/[id].vue +11 -11
  121. package/app/pages/daq/index.vue +2316 -2316
  122. package/app/pages/dcw/[id].vue +18 -19
  123. package/app/pages/dcw/index.vue +3 -3
  124. package/app/pages/index.vue +987 -981
  125. package/app/pages/plugins/index.vue +317 -311
  126. package/app/pages/settings.vue +1564 -1562
  127. package/app/pages/tokens.vue +15 -15
  128. package/app/pages/workshop/agents.vue +612 -609
  129. package/app/pages/workshop/channel-templates.vue +18 -11
  130. package/app/pages/workshop/index.vue +668 -668
  131. package/app/pages/workshop/teams.vue +743 -740
  132. package/app/pages/workshop/w/[wsId].vue +704 -704
  133. package/app/plugins/locale-restore.client.ts +16 -1
  134. package/app/utils/builtin-catalog.ts +104 -0
  135. package/config.yml +170 -170
  136. package/docs/full-test-plan.md +2 -3
  137. package/i18n/locales/en.ts +293 -35
  138. package/i18n/locales/zh-CN.ts +265 -7
  139. package/package.json +2 -2
  140. package/scripts/_dbg-perms-e2e.mjs +132 -109
  141. package/scripts/_demo-agentteam-capture.mjs +278 -0
  142. package/scripts/_e2e-ui-functional.mjs +371 -0
  143. package/scripts/_i18n-en-cjk-scan.mjs +28 -0
  144. package/scripts/_i18n-en-verify.mjs +107 -0
  145. package/scripts/_i18n-extra-checks.mjs +53 -0
  146. package/scripts/_i18n-scan-hardcoded.mjs +180 -0
  147. package/scripts/_i18n-verify-keys.mjs +50 -0
  148. package/scripts/_loop-biax-campaign.mjs +15 -9
  149. package/scripts/_sweep-button-contrast.mjs +87 -0
  150. package/scripts/ui/record-demo.mjs +557 -0
  151. package/server/plugins-builtin/diag-bridge/index.mjs +608 -661
  152. package/server/plugins-builtin/rag-bridge/index.mjs +57 -133
  153. package/server/services/workshop/daq/drivers.ts +11 -0
  154. package/.output/public/_nuxt/88GOowgO2.js +0 -1
  155. package/.output/public/_nuxt/BN16aRdQ.js +0 -1
  156. package/.output/public/_nuxt/BWVhZntO.js +0 -1
  157. package/.output/public/_nuxt/BXxH0UQE.js +0 -1
  158. package/.output/public/_nuxt/BsROmY89.js +0 -1
  159. package/.output/public/_nuxt/C0ZrS1KL.js +0 -19
  160. package/.output/public/_nuxt/C4s_niy-.js +0 -14
  161. package/.output/public/_nuxt/D6mbFA-a.js +0 -1
  162. package/.output/public/_nuxt/DS8qj8EL.js +0 -1
  163. package/.output/public/_nuxt/DUjW5Yq5.js +0 -1
  164. package/.output/public/_nuxt/Dap5PmTL.js +0 -2
  165. package/.output/public/_nuxt/Dqw1lpr-.js +0 -1
  166. package/.output/public/_nuxt/DvLxILQP.js +0 -1
  167. package/.output/public/_nuxt/OmpTerminalPanel.B_Pl5Ynm.css +0 -1
  168. package/.output/public/_nuxt/TownView.f-YOdXRs.css +0 -1
  169. package/.output/public/_nuxt/_id_.D9ymtHB5.css +0 -1
  170. package/.output/public/_nuxt/_id_.jf-_8E_c.css +0 -1
  171. package/.output/public/_nuxt/agents.ZD0rVdHE.css +0 -1
  172. package/.output/public/_nuxt/aml.BN8ZEW4h.css +0 -1
  173. package/.output/public/_nuxt/builds/meta/78a295bb-2072-48a4-8b46-6d545fdae743.json +0 -1
  174. package/.output/public/_nuxt/channel-templates.BOtahzPi.css +0 -1
  175. package/.output/public/_nuxt/daq.DjSgY94l.css +0 -1
  176. package/.output/public/_nuxt/dcw.8Y7FqCVN.css +0 -1
  177. package/.output/public/_nuxt/eqq3wWQF.js +0 -18
  178. package/.output/public/_nuxt/pages.D7aSDlUI.css +0 -1
  179. package/.output/public/_nuxt/plugins.sb4nDGqr.css +0 -1
  180. package/.output/public/_nuxt/qr6R6Ha1.js +0 -1
  181. package/.output/public/_nuxt/settings.BTgR-NiE.css +0 -1
  182. package/.output/public/_nuxt/teams.CxnxKVVs.css +0 -1
  183. package/.output/public/_nuxt/tokens.BFY7qv4f.css +0 -1
  184. package/.output/public/_nuxt/workshop.CR_QzeAN.css +0 -1
  185. package/.output/server/chunks/build/_id_-Brv-JSvr.mjs.map +0 -1
  186. package/.output/server/chunks/build/_id_-D9pl1OZy.mjs.map +0 -1
  187. package/.output/server/chunks/build/agents-CLQqJF2y.mjs.map +0 -1
  188. package/.output/server/chunks/build/aml-_7FdFL2p.mjs.map +0 -1
  189. package/.output/server/chunks/build/channel-templates-p6SZNjlM.mjs.map +0 -1
  190. package/.output/server/chunks/build/daq-DkMvD8sg.mjs.map +0 -1
  191. package/.output/server/chunks/build/dcw-C1jgVJkO.mjs.map +0 -1
  192. package/.output/server/chunks/build/pages-B0bUWnC6.mjs.map +0 -1
  193. package/.output/server/chunks/build/plugins-lGlUr1lj.mjs.map +0 -1
  194. package/.output/server/chunks/build/settings-Ddd1qx2Z.mjs.map +0 -1
  195. package/.output/server/chunks/build/teams-MEDLZdMn.mjs.map +0 -1
  196. package/.output/server/chunks/build/tokens-C7fTM5C2.mjs.map +0 -1
  197. package/.output/server/chunks/build/town-CoQdblbZ.mjs.map +0 -1
  198. package/.output/server/chunks/build/workshop-BL5bhfs0.mjs.map +0 -1
  199. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.continue.json +0 -1
  200. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.json +0 -1
  201. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/054bb4bc4e4217a2ab0b0c6b663747214a9af464f5568ea60e784704e340bb0f.source +0 -153
  202. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/0554197c3d2bac203a1f5c48a5d52495d1336db1bd7aa4f4c19875810363e684.source +0 -153
  203. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/05c203d12a954fffba942e1d626e3f5fec05b18a5aef2bac003b7884a4b77406.source +0 -431
  204. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/145a6e6ba811af35aed31e0cc3211f53706a14980fa069ee9e3c1591139f96f0.source +0 -180
  205. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/1ae0fb281f97899c025e368ca73f41349b01fb5f85b19e08d7ebccff49095ed5.source +0 -112
  206. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/20ee9967aa0541c516db7575bdd4a1a745939bc7016bd10d7635903113edb8ec.source +0 -227
  207. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/233751843aeba9d4c5263f275b8102de00443c06f286918cbd23e0b6729e01aa.source +0 -131
  208. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/263c2e05b425e5c322e60c6475279f963bab3a873eb521b21df7fec935a46597.source +0 -160
  209. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/2ac5eaac28eaaee2178c4b32014df8e732f9dd432a285a872f5b7f31c1395fa4.source +0 -157
  210. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/33a0db0d2d95d2c11d0720090458e5fba1425376f5ceb5b422d1d3471be3226b.source +0 -348
  211. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/359e474ae83db35e4615d3728de6bf694b64d4dce9b536730a3b6518f9c0494a.source +0 -296
  212. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/37a4c3c31c4b70f6b719c53d1e9c4fcba603f31adfdd11bb6ef9f0d094923c56.source +0 -285
  213. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/461feca1c14a695eb8b0f17a6f95fe97eeceabc0510faaea4ba6d25bde147d8d.source +0 -217
  214. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/4cfadbda8591f29d5e1e230dc000e701b756e850441b3900fb596a4d2f6e98c2.source +0 -301
  215. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/50ca2810cf0b248c96948994c0c404531bbad6e553166b6816b3b03bfa0f75d2.source +0 -151
  216. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/52d9e8cb591a9ae86e238c3620a610cd386717bee222c0f37b25b2ac7e523dc4.source +0 -135
  217. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/6c87daafa4c006560a954636a97333f6123153c9d34d96203f7ee3a14e556357.source +0 -156
  218. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/77bc47854b577900621cacf1697f81fa2bc005af129d37614a97a3441c08f99f.source +0 -72
  219. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/7bbb789d3a527817118cf8399ed1861d6a962ade10878fd07223435d333a7089.source +0 -469
  220. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/86b7c1daafc8b60ba9982dde5bf1bcc74265709483c176e71f23ec6fc267451f.source +0 -259
  221. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/8df66d62bd41984d0970e8236882080c5085ac937d07a29779463d6a03b37c76.source +0 -97
  222. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/9962f2d1b3a85137bd40cc835725600b39f89ee02a27c06b2e0402e1eafde115.source +0 -277
  223. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/a1090ea066b792cb201739f4994e37bf7c12f52e805239a1eab87f18a537f266.source +0 -171
  224. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/a5241091650134d0919897e086a606a3846c8b2b54f8b4c84a8696c145ac3e9e.source +0 -425
  225. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/af19fa4c6e34d5540028be4b17600161283af3a2a2dfc61a3fdc0834436a0c14.source +0 -99
  226. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/b3713d78e2b2f93905ff6be8d58a8d0a2f42dea322eb67c987fda22ff6a084d5.source +0 -325
  227. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/b3849943c3aff102d1af815631fc843a2a52c17646a4b04696ece323e483bbec.source +0 -332
  228. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/bac735a3803a6650b7f1eb8f587e6dc5c68ea055000c3c99a11789438b78e837.source +0 -43
  229. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/d32c24d61eb8b33c73e5a8fc7e4dc7ef437aed238ee4371c2b00617e6104090a.source +0 -154
  230. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/d5170dc9a9879fda04fdf91d8a110d4efb6787ee38dda596d4da899883d36a72.source +0 -531
  231. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/dc59bcd7bb397be63ba2f2c3fec23f3782dcb17d2d75a9981eeced761f33eb32.source +0 -439
  232. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/eb5ff8cf66b92aec7bf6726781d8df74faa2b030c3aaac17d6b00c1fc04c9b32.source +0 -323
  233. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f10615a6fae18436e70d1201b2d44fdae3174a3aa7bb4db97dea1b3ed291d721.source +0 -433
  234. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f36d3e271668bc1260c2823542d22dbf1d0f7041ff16b1ac175bce2256e582ca.source +0 -280
  235. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/f94449380af09f31ac352152007146a75cc80bae8d6411ffe57b2c56f933b0ff.source +0 -117
  236. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/fe4dfd81178fd6b648335f6405d9ede71319aebde796008e50db21f8adf44c99.source +0 -160
  237. package/scripts/.mimosa/hook-state/sess_aeaecb58-8833-4b83-b93c-050467d21e03.mtxwtxme-61028-1f4519fbc4.baseline/ffb4e3aa548cfdadabaa44ab599f9b6a3ca6288176a2cc7a4b2fc2a12b5fb848.source +0 -101
  238. package/scripts/.mimosa/hook-status/sess_aeaecb58-8833-4b83-b93c-050467d21e03-d944d71bb3.json +0 -14
  239. package/scripts/_dbg-audit-all-pages.mjs +0 -43
  240. package/scripts/_dbg-daq-frames-e2e.mjs +0 -118
  241. package/scripts/_dbg-daq-rowstyle-verify.mjs +0 -112
  242. package/scripts/_dbg-hitl-timeout-e2e.mjs +0 -93
  243. package/scripts/_dbg-live-line-e2e.mjs +0 -279
  244. package/scripts/_dbg-minimal-omp.mjs +0 -77
  245. package/scripts/_dbg-mode-nav.mjs +0 -173
  246. package/scripts/_dbg-real-scenario-timeline.log +0 -55
  247. package/scripts/_dbg-team-repro.mjs +0 -76
  248. package/scripts/_dbg-town-agents-probe.mjs +0 -60
  249. package/scripts/_dbg-visual-acceptance.mjs +0 -63
  250. package/scripts/_townview_style.css +0 -1185
  251. package/scripts/_townview_template.html +0 -1215
  252. package/server/data/agent-node-bindings.json +0 -554
  253. package/server/data/daq-templates.json +0 -16
  254. package/server/data/daqs.json +0 -7464
  255. package/server/data/dcw-lines.json +0 -1787
  256. package/server/data/dcw-products.json +0 -1626
  257. package/server/data/dcw-recipes.json +0 -4672
  258. package/server/data/dcw-rollback.json +0 -20754
  259. package/server/data/dcw-runs.json +0 -6354
  260. package/server/data/dcw-templates.json +0 -146
  261. package/server/data/dcw-writes.json +0 -15650
  262. package/server/data/dcws.json +0 -9033
  263. package/server/data/device-twins.json +0 -133
  264. package/server/data/line-runs.json +0 -322
  265. package/server/data/scene-layouts.json +0 -277
@@ -1,1185 +0,0 @@
1
- <style scoped>
2
- /* ============================================================
3
- * DIGITAL TWIN · 控制室 UI(设计稿 1:1 架构)
4
- * topnav 50 / 三栏网格(250 · 1fr · 342) / dock / statusbar 30
5
- * ============================================================ */
6
- .town-view {
7
- --hud-bg: #070b13;
8
- --hud-panel: #0d1420;
9
- --hud-panel-2: #111a2b;
10
- --hud-panel-raised: #152034;
11
- --hud-panel-hover: #16233a;
12
- --hud-line: #1d2a42;
13
- --hud-line-soft: #16202f;
14
- --hud-line-hi: #2c4568;
15
- --hud-input: #0a111d;
16
- --hud-text: #e8eef8;
17
- --hud-dim: #8fa0b5;
18
- --hud-faint: #5f6e84;
19
- --hud-accent: #35e0a0;
20
- --hud-accent-dim: #1f9e6e;
21
- --hud-cyan: #41c8f4;
22
- --hud-amber: #f6c453;
23
- --hud-ok: #35e0a0;
24
- --hud-danger: #ff6b6b;
25
- --hud-shadow: 0 16px 40px rgba(0, 0, 0, 0.55);
26
- --hud-ease: cubic-bezier(0.22, 0.68, 0.36, 1);
27
- --hud-r-sm: 8px;
28
- --hud-r-md: 10px;
29
- --hud-r-lg: 12px;
30
- height: 100%;
31
- min-height: 0;
32
- display: flex;
33
- flex-direction: column;
34
- background: var(--hud-bg);
35
- color: var(--hud-text);
36
- font-family: var(--font-body);
37
- font-size: 13px;
38
- }
39
-
40
- /* ===== 顶部导航 ===== */
41
- .topnav {
42
- height: 50px;
43
- flex: none;
44
- display: flex;
45
- align-items: center;
46
- gap: 14px;
47
- padding: 0 16px;
48
- background: linear-gradient(180deg, #0c1320, #0a101b);
49
- border-bottom: 1px solid var(--hud-line-soft);
50
- position: relative;
51
- z-index: 60;
52
- }
53
- .brand { display: flex; align-items: center; gap: 10px; min-width: 230px; }
54
- .brand-glyph { width: 26px; height: 26px; flex: none; }
55
- .brand-name { font-weight: 800; font-size: 14.5px; letter-spacing: 0.04em; }
56
- .brand-name em { font-style: normal; color: var(--hud-accent); }
57
- .brand-sub { font-size: 10.5px; color: var(--hud-faint); letter-spacing: 0.14em; margin-top: 1px; }
58
- .nav-tabs {
59
- position: absolute;
60
- left: 50%;
61
- transform: translateX(-50%);
62
- display: flex;
63
- gap: 10px;
64
- align-items: center;
65
- }
66
- .nav-action {
67
- height: 32px;
68
- padding: 0 14px;
69
- border-radius: var(--hud-r-sm);
70
- font-size: 12px;
71
- font-weight: 600;
72
- color: var(--hud-text);
73
- border: 1px solid #27395c;
74
- transition: background 0.15s var(--hud-ease), border-color 0.15s var(--hud-ease);
75
- }
76
- .nav-action:hover { background: #14203a; border-color: #33507c; }
77
- .nav-right { margin-left: auto; display: flex; align-items: center; gap: 10px; }
78
- .nav-chip {
79
- font-family: var(--font-mono);
80
- font-size: 10.5px;
81
- color: var(--hud-dim);
82
- border: 1px solid var(--hud-line);
83
- border-radius: 6px;
84
- padding: 2px 8px;
85
- font-variant-numeric: tabular-nums;
86
- }
87
- .avatar-chip {
88
- display: flex;
89
- align-items: center;
90
- gap: 8px;
91
- padding: 4px 10px 4px 4px;
92
- border-radius: 999px;
93
- border: 1px solid var(--hud-line-soft);
94
- background: #0e1626;
95
- }
96
- .avatar-chip span { font-size: 12px; color: var(--hud-text); }
97
- .avatar-fallback {
98
- width: 24px;
99
- height: 24px;
100
- border-radius: 50%;
101
- background: linear-gradient(135deg, #1f9e6e, #41c8f4);
102
- display: grid;
103
- place-items: center;
104
- font-size: 10px;
105
- font-weight: 700;
106
- color: #04120c;
107
- }
108
- .seg {
109
- display: inline-flex;
110
- background: #0a111d;
111
- border: 1px solid var(--hud-line);
112
- border-radius: var(--hud-r-sm);
113
- padding: 2px;
114
- }
115
- .seg button {
116
- padding: 4px 16px;
117
- border-radius: 6px;
118
- font-size: 11.5px;
119
- color: var(--hud-dim);
120
- font-weight: 600;
121
- transition: background 0.15s var(--hud-ease), color 0.15s var(--hud-ease);
122
- }
123
- .seg button.on { background: var(--hud-accent); color: #04120c; }
124
-
125
- /* ===== 三栏应用区 ===== */
126
- .app {
127
- flex: 1;
128
- min-height: 0;
129
- display: grid;
130
- grid-template-columns: 250px minmax(540px, 1fr) 342px;
131
- }
132
- .rail {
133
- min-height: 0;
134
- overflow-y: auto;
135
- overflow-x: hidden;
136
- padding: 10px;
137
- display: flex;
138
- flex-direction: column;
139
- gap: 10px;
140
- background: #080d16;
141
- }
142
- .rail-left { border-right: 1px solid var(--hud-line-soft); }
143
- .rail-right { border-left: 1px solid var(--hud-line-soft); }
144
- .rail::-webkit-scrollbar { width: 8px; }
145
- .rail::-webkit-scrollbar-thumb { background: #1c2942; border-radius: 4px; border: 2px solid #080d16; }
146
- .rail::-webkit-scrollbar-track { background: transparent; }
147
-
148
- .panel {
149
- background: linear-gradient(180deg, #101827 0%, #0d1420 100%);
150
- border: 1px solid var(--hud-line);
151
- border-radius: var(--hud-r-lg);
152
- padding: 12px;
153
- flex: none;
154
- }
155
- .panel-hd {
156
- display: flex;
157
- align-items: center;
158
- gap: 8px;
159
- margin-bottom: 10px;
160
- }
161
- .panel-hd h3 {
162
- margin: 0;
163
- font-size: 12.5px;
164
- font-weight: 700;
165
- letter-spacing: 0.02em;
166
- flex: 1;
167
- }
168
- .panel-tag {
169
- font-family: var(--font-mono);
170
- font-size: 9.5px;
171
- color: var(--hud-cyan);
172
- background: rgba(65, 200, 244, 0.1);
173
- border: 1px solid rgba(65, 200, 244, 0.25);
174
- padding: 0 6px;
175
- border-radius: 6px;
176
- line-height: 15px;
177
- }
178
-
179
- /* ===== 左轨:资源 / DAQ / 场景管理 ===== */
180
- .lib-embed { margin: -4px 0 0; }
181
- .daq-list, .scene-list { display: flex; flex-direction: column; gap: 4px; }
182
- .daq-card {
183
- display: flex;
184
- gap: 10px;
185
- align-items: center;
186
- padding: 8px 9px;
187
- border-radius: var(--hud-r-md);
188
- background: var(--hud-panel-2);
189
- border: 1px solid rgba(31, 74, 58, 0.55);
190
- margin-bottom: 4px;
191
- cursor: grab;
192
- transition: transform 0.15s var(--hud-ease), border-color 0.15s var(--hud-ease), background 0.15s var(--hud-ease);
193
- }
194
- .daq-card:hover {
195
- transform: translateY(-1px);
196
- border-color: rgba(53, 224, 160, 0.5);
197
- background: #12291f;
198
- }
199
- .daq-card:active { cursor: grabbing; }
200
- .daq-ico {
201
- width: 34px;
202
- height: 34px;
203
- flex: none;
204
- border-radius: 9px;
205
- background: radial-gradient(circle at 35% 30%, rgba(53, 224, 160, 0.4), rgba(14, 26, 36, 0.9));
206
- border: 1px solid rgba(53, 224, 160, 0.4);
207
- position: relative;
208
- }
209
- .daq-ico::after {
210
- content: '';
211
- position: absolute;
212
- inset: 11px;
213
- border-radius: 50%;
214
- background: var(--hud-accent);
215
- box-shadow: 0 0 10px rgba(53, 224, 160, 0.8);
216
- }
217
- .daq-meta { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
218
- .daq-name { font-size: 12px; font-weight: 600; color: var(--hud-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
219
- .daq-code { font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.08em; color: var(--hud-faint); }
220
- .daq-count {
221
- flex: none;
222
- font-family: var(--font-mono);
223
- font-size: 9px;
224
- color: var(--hud-accent);
225
- background: rgba(53, 224, 160, 0.1);
226
- border: 1px solid rgba(53, 224, 160, 0.28);
227
- padding: 0 6px;
228
- border-radius: 6px;
229
- line-height: 15px;
230
- }
231
- .scene-row {
232
- display: flex;
233
- align-items: center;
234
- gap: 10px;
235
- padding: 8px 9px;
236
- border-radius: var(--hud-r-md);
237
- border: 1px solid transparent;
238
- margin-bottom: 4px;
239
- cursor: grab;
240
- transition: background 0.15s var(--hud-ease), border-color 0.15s var(--hud-ease);
241
- }
242
- .scene-row:hover { background: #111b2c; }
243
- .scene-row.active {
244
- background: rgba(53, 224, 160, 0.06);
245
- border-color: rgba(53, 224, 160, 0.35);
246
- }
247
- .scene-row:active { cursor: grabbing; }
248
- .scene-ico {
249
- width: 30px;
250
- height: 30px;
251
- border-radius: 8px;
252
- flex: none;
253
- background: color-mix(in srgb, var(--ch, var(--hud-accent)) 16%, #101a2c);
254
- border: 1px solid color-mix(in srgb, var(--ch, var(--hud-accent)) 45%, transparent);
255
- }
256
- .scene-row.active .scene-ico { box-shadow: 0 0 10px color-mix(in srgb, var(--ch, var(--hud-accent)) 40%, transparent); }
257
- .scene-meta-wrap { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
258
- .scene-name { font-size: 12px; font-weight: 600; color: var(--hud-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
259
- .scene-meta { font-family: var(--font-mono); font-size: 9px; color: var(--hud-faint); }
260
- .scene-cur, .scene-add {
261
- margin-left: auto;
262
- flex: none;
263
- font-size: 10px;
264
- border-radius: 6px;
265
- padding: 1px 7px;
266
- }
267
- .scene-cur { color: var(--hud-accent); border: 1px solid rgba(53, 224, 160, 0.4); }
268
- .scene-add { color: var(--hud-dim); border: 1px solid var(--hud-line); }
269
- .scene-hint {
270
- font-size: 10px;
271
- color: var(--hud-amber);
272
- padding: 6px 4px 0;
273
- line-height: 1.5;
274
- }
275
-
276
- /* ===== 舞台 ===== */
277
- .stage-col { min-width: 0; min-height: 0; display: flex; flex-direction: column; }
278
- .stage { flex: 1; position: relative; min-height: 320px; background: #060a11; overflow: hidden; }
279
- .stage:fullscreen { border-radius: 0; }
280
- .town-host { position: absolute; inset: 0; }
281
- .town-host canvas { display: block; image-rendering: auto; }
282
- .stage-vignette {
283
- position: absolute;
284
- inset: 0;
285
- pointer-events: none;
286
- z-index: 3;
287
- background:
288
- radial-gradient(120% 90% at 50% 38%, transparent 52%, rgba(2, 4, 9, 0.5) 100%),
289
- linear-gradient(180deg, rgba(8, 13, 24, 0.32), transparent 18%);
290
- }
291
- .stage-top {
292
- position: absolute;
293
- top: 0;
294
- left: 0;
295
- right: 0;
296
- z-index: 6;
297
- display: flex;
298
- align-items: flex-start;
299
- justify-content: space-between;
300
- padding: 14px 16px;
301
- pointer-events: none;
302
- }
303
- .stage-top > * { pointer-events: auto; }
304
- .vp-title {
305
- display: flex;
306
- align-items: center;
307
- gap: 10px;
308
- background: rgba(9, 14, 24, 0.72);
309
- border: 1px solid #1c2942;
310
- border-radius: var(--hud-r-md);
311
- padding: 8px 12px;
312
- backdrop-filter: blur(8px);
313
- -webkit-backdrop-filter: blur(8px);
314
- }
315
- .vp-title h2 { margin: 0; font-size: 15px; font-weight: 700; letter-spacing: 0.02em; }
316
- .vp-id {
317
- font-family: var(--font-mono);
318
- font-size: 10px;
319
- color: var(--hud-faint);
320
- border: 1px solid #223050;
321
- border-radius: 6px;
322
- padding: 1px 6px;
323
- white-space: nowrap;
324
- }
325
- .vp-tools { display: flex; gap: 8px; align-items: center; }
326
- .vp-tool {
327
- width: 34px;
328
- height: 34px;
329
- border-radius: 50%;
330
- display: grid;
331
- place-items: center;
332
- color: var(--hud-dim);
333
- background: rgba(13, 20, 32, 0.85);
334
- border: 1px solid #223050;
335
- backdrop-filter: blur(8px);
336
- -webkit-backdrop-filter: blur(8px);
337
- font-size: 12px;
338
- font-weight: 600;
339
- transition: color 0.15s var(--hud-ease), border-color 0.15s var(--hud-ease), background 0.15s var(--hud-ease);
340
- }
341
- .vp-tool:hover { color: var(--hud-text); border-color: #33507c; }
342
- .vp-tool.on { color: #04120c; background: var(--hud-accent); border-color: var(--hud-accent); }
343
- .angle-chip {
344
- position: absolute;
345
- top: 64px;
346
- left: 16px;
347
- z-index: 6;
348
- display: flex;
349
- align-items: center;
350
- gap: 6px;
351
- background: rgba(9, 14, 24, 0.78);
352
- border: 1px solid #1c2942;
353
- border-radius: var(--hud-r-sm);
354
- padding: 5px 8px;
355
- backdrop-filter: blur(8px);
356
- -webkit-backdrop-filter: blur(8px);
357
- font-size: 11.5px;
358
- color: var(--hud-dim);
359
- }
360
- .angle-chip select {
361
- background: transparent;
362
- border: 0;
363
- color: var(--hud-text);
364
- font-size: 11.5px;
365
- font-weight: 600;
366
- cursor: pointer;
367
- }
368
- .angle-chip select option { background: #0e1626; }
369
-
370
- /* 标注层 */
371
- .callout-layer {
372
- position: absolute;
373
- inset: 0;
374
- z-index: 7;
375
- pointer-events: none;
376
- overflow: hidden;
377
- }
378
- .callout {
379
- position: absolute;
380
- min-width: 150px;
381
- transform: translate(-50%, -112%);
382
- background: linear-gradient(180deg, rgba(16, 26, 43, 0.94), rgba(10, 16, 28, 0.94));
383
- border: 1px solid rgba(65, 200, 244, 0.4);
384
- border-radius: var(--hud-r-md);
385
- padding: 9px 12px 8px;
386
- box-shadow: var(--hud-shadow);
387
- backdrop-filter: blur(8px);
388
- -webkit-backdrop-filter: blur(8px);
389
- transition: border-color 0.15s var(--hud-ease);
390
- }
391
- .callout.warn { border-color: rgba(246, 196, 83, 0.6); }
392
- .co-label {
393
- display: flex;
394
- gap: 6px;
395
- align-items: center;
396
- font-size: 10.5px;
397
- color: var(--hud-dim);
398
- white-space: nowrap;
399
- }
400
- .co-dot {
401
- width: 6px;
402
- height: 6px;
403
- border-radius: 50%;
404
- background: var(--hud-cyan);
405
- box-shadow: 0 0 8px rgba(65, 200, 244, 0.9);
406
- flex: none;
407
- }
408
- .callout.warn .co-dot { background: var(--hud-amber); box-shadow: 0 0 8px rgba(246, 196, 83, 0.9); }
409
- .co-val {
410
- font-family: var(--font-mono);
411
- font-size: 21px;
412
- font-weight: 700;
413
- letter-spacing: -0.01em;
414
- margin-top: 2px;
415
- color: var(--hud-text);
416
- font-variant-numeric: tabular-nums;
417
- }
418
- .co-val small { font-size: 10.5px; color: var(--hud-dim); font-weight: 500; margin-left: 3px; }
419
- .co-range {
420
- font-family: var(--font-mono);
421
- font-size: 9.5px;
422
- color: var(--hud-faint);
423
- margin-top: 1px;
424
- }
425
- .callout.warn .co-range { color: var(--hud-amber); }
426
-
427
- /* KPI 条 */
428
- .kpi-strip {
429
- position: absolute;
430
- left: 0;
431
- right: 0;
432
- bottom: 12px;
433
- z-index: 6;
434
- display: flex;
435
- gap: 10px;
436
- justify-content: center;
437
- padding: 0 16px;
438
- pointer-events: none;
439
- flex-wrap: wrap;
440
- }
441
- .kpi {
442
- display: flex;
443
- align-items: center;
444
- gap: 10px;
445
- padding: 8px 14px;
446
- pointer-events: auto;
447
- background: rgba(12, 19, 32, 0.9);
448
- border: 1px solid #1e2c46;
449
- border-radius: var(--hud-r-md);
450
- backdrop-filter: blur(8px);
451
- -webkit-backdrop-filter: blur(8px);
452
- }
453
- .kpi-ico {
454
- width: 30px;
455
- height: 30px;
456
- border-radius: 8px;
457
- display: grid;
458
- place-items: center;
459
- flex: none;
460
- font-size: 12px;
461
- font-weight: 700;
462
- }
463
- .kpi-ico.c1 { background: rgba(65, 200, 244, 0.12); color: var(--hud-cyan); }
464
- .kpi-ico.c2 { background: rgba(53, 224, 160, 0.12); color: var(--hud-accent); }
465
- .kpi-ico.c3 { background: rgba(246, 196, 83, 0.12); color: var(--hud-amber); }
466
- .kpi-ico.c4 { background: rgba(167, 139, 250, 0.14); color: #a78bfa; }
467
- .kpi-ico.c5 { background: rgba(255, 107, 107, 0.12); color: var(--hud-danger); }
468
- .kpi-meta { line-height: 1.25; }
469
- .kpi-label { font-size: 10.5px; color: var(--hud-dim); }
470
- .kpi-val {
471
- font-family: var(--font-mono);
472
- font-size: 16px;
473
- font-weight: 700;
474
- color: var(--hud-text);
475
- font-variant-numeric: tabular-nums;
476
- }
477
- .kpi-val small { font-size: 10px; color: var(--hud-faint); font-weight: 500; margin-left: 2px; }
478
- .empty-hint {
479
- position: absolute;
480
- left: 50%;
481
- top: 44%;
482
- transform: translate(-50%, -50%);
483
- z-index: 4;
484
- text-align: center;
485
- color: var(--hud-dim);
486
- pointer-events: none;
487
- }
488
- .empty-hint b { color: var(--hud-text); font-size: 14px; display: block; margin-bottom: 4px; }
489
- .empty-hint span { font-size: 12px; }
490
-
491
- /* ===== 底部坞 ===== */
492
- .dock {
493
- flex: none;
494
- display: grid;
495
- grid-template-columns: 308px 1fr;
496
- gap: 10px;
497
- padding: 10px;
498
- background: #080d16;
499
- border-top: 1px solid var(--hud-line-soft);
500
- }
501
- .dock-card {
502
- background: linear-gradient(180deg, #101827 0%, #0d1420 100%);
503
- border: 1px solid var(--hud-line);
504
- border-radius: var(--hud-r-lg);
505
- padding: 12px 14px;
506
- min-height: 178px;
507
- display: flex;
508
- flex-direction: column;
509
- }
510
- .dock-hd { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
511
- .dock-hd h3 { margin: 0; font-size: 12.5px; font-weight: 700; flex: 1; }
512
- .dock-mode {
513
- font-family: var(--font-mono);
514
- font-size: 9px;
515
- letter-spacing: 0.1em;
516
- color: var(--hud-faint);
517
- border: 1px solid var(--hud-line);
518
- border-radius: 6px;
519
- padding: 1px 7px;
520
- }
521
- .ctl-row { display: flex; align-items: center; gap: 10px; margin-bottom: 9px; }
522
- .ctl-name { font-size: 11.5px; color: var(--hud-dim); width: 64px; flex: none; }
523
- .ctl-val {
524
- font-family: var(--font-mono);
525
- font-size: 11px;
526
- color: var(--hud-text);
527
- width: 38px;
528
- text-align: right;
529
- flex: none;
530
- font-variant-numeric: tabular-nums;
531
- }
532
- .ctl-range {
533
- -webkit-appearance: none;
534
- appearance: none;
535
- flex: 1;
536
- height: 4px;
537
- border-radius: 2px;
538
- background: linear-gradient(90deg, var(--hud-accent-dim) var(--fill, 50%), #1d2a42 var(--fill, 50%));
539
- cursor: pointer;
540
- }
541
- .ctl-range::-webkit-slider-thumb {
542
- -webkit-appearance: none;
543
- width: 13px;
544
- height: 13px;
545
- border-radius: 50%;
546
- background: #fff;
547
- border: 2.5px solid var(--hud-accent);
548
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
549
- }
550
- .snap-toggle {
551
- flex: 1;
552
- height: 22px;
553
- font-size: 10.5px;
554
- font-weight: 600;
555
- color: var(--hud-dim);
556
- background: var(--hud-input);
557
- border: 1px solid var(--hud-line);
558
- border-radius: 6px;
559
- cursor: pointer;
560
- }
561
- .snap-toggle.on { color: var(--hud-accent); border-color: rgba(53, 224, 160, 0.4); background: rgba(53, 224, 160, 0.08); }
562
- .ctl-btns { display: flex; gap: 8px; margin-top: auto; }
563
- .btn {
564
- display: inline-flex;
565
- align-items: center;
566
- justify-content: center;
567
- gap: 6px;
568
- height: 32px;
569
- padding: 0 10px;
570
- border-radius: var(--hud-r-sm);
571
- font-size: 12px;
572
- font-weight: 600;
573
- flex: 1;
574
- white-space: nowrap;
575
- cursor: pointer;
576
- transition: filter 0.15s var(--hud-ease), background 0.15s var(--hud-ease), border-color 0.15s var(--hud-ease);
577
- }
578
- .btn-primary { background: var(--hud-accent-dim); color: #04120c; }
579
- .btn-primary:hover { background: #25b57e; }
580
- .btn-ghost { border: 1px solid #27395c; color: var(--hud-text); }
581
- .btn-ghost:hover { background: #14203a; border-color: #33507c; }
582
-
583
- /* 趋势 */
584
- .trend-legend { display: flex; gap: 5px; flex-wrap: wrap; margin-left: auto; }
585
- .lg-chip {
586
- display: flex;
587
- align-items: center;
588
- gap: 5px;
589
- font-size: 10.5px;
590
- color: var(--hud-dim);
591
- border: 1px solid var(--hud-line);
592
- border-radius: 6px;
593
- padding: 2px 8px;
594
- cursor: pointer;
595
- transition: opacity 0.15s var(--hud-ease);
596
- }
597
- .lg-chip.off { opacity: 0.32; }
598
- .lg-dot { width: 7px; height: 7px; border-radius: 2px; }
599
- .trend-wrap { flex: 1; min-height: 0; position: relative; }
600
- .trend-cv { position: absolute; inset: 0; width: 100%; height: 100%; }
601
- .trend-empty {
602
- position: absolute;
603
- inset: 0;
604
- display: grid;
605
- place-content: center;
606
- font-family: var(--font-mono);
607
- font-size: 10.5px;
608
- color: var(--hud-faint);
609
- }
610
-
611
- /* ===== 右轨 ===== */
612
- .inspector { animation: rise 0.18s var(--hud-ease); }
613
- @keyframes rise {
614
- from { opacity: 0; transform: translateY(6px); }
615
- to { opacity: 1; transform: none; }
616
- }
617
- .ins-chip-row { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 10px; }
618
- .ins-chip {
619
- font-family: var(--font-mono);
620
- font-size: 9.5px;
621
- color: var(--hud-dim);
622
- border: 1px solid #26354a;
623
- border-radius: 6px;
624
- padding: 1.5px 7px;
625
- }
626
- .ins-chip.accent { color: var(--hud-accent); border-color: rgba(53, 224, 160, 0.4); }
627
- .sect-hd {
628
- font-size: 10px;
629
- color: var(--hud-faint);
630
- letter-spacing: 0.16em;
631
- font-weight: 700;
632
- margin: 10px 0 7px;
633
- }
634
- .obj-row { display: flex; gap: 8px; align-items: center; margin-bottom: 8px; }
635
- .obj-label { flex: none; width: 52px; font-size: 10.5px; color: var(--hud-dim); }
636
- .obj-input, .obj-select {
637
- flex: 1;
638
- min-width: 0;
639
- font-size: 11.5px;
640
- color: var(--hud-text);
641
- background: var(--hud-input);
642
- border: 1px solid var(--hud-line);
643
- border-radius: 7px;
644
- padding: 5px 8px;
645
- transition: border-color 0.15s var(--hud-ease);
646
- }
647
- .obj-input:focus, .obj-select:focus { outline: none; border-color: var(--hud-accent); }
648
- .obj-sep { height: 1px; background: var(--hud-line-soft); margin: 8px 0; }
649
- .range-status { flex: 1; min-width: 0; font-size: 10px; color: var(--hud-faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
650
- .obj-mini {
651
- flex: none;
652
- padding: 4px 10px;
653
- font-size: 10.5px;
654
- font-weight: 600;
655
- color: var(--hud-dim);
656
- background: var(--hud-input);
657
- border: 1px solid var(--hud-line);
658
- border-radius: 7px;
659
- cursor: pointer;
660
- }
661
- .obj-mini.on { color: #04120c; background: var(--hud-accent); border-color: var(--hud-accent); }
662
- .obj-mini.danger { color: var(--hud-danger); margin-top: 4px; width: 100%; }
663
- .obj-range { flex: 1; accent-color: var(--hud-accent); }
664
- .bp-val {
665
- flex: none;
666
- width: 40px;
667
- text-align: right;
668
- font-family: var(--font-mono);
669
- font-size: 10.5px;
670
- color: var(--hud-text);
671
- font-variant-numeric: tabular-nums;
672
- }
673
- .bp-seg { display: flex; gap: 4px; }
674
- .seg-btn {
675
- padding: 4px 12px;
676
- font-size: 10.5px;
677
- font-weight: 600;
678
- color: var(--hud-dim);
679
- background: var(--hud-input);
680
- border: 1px solid var(--hud-line);
681
- border-radius: 7px;
682
- cursor: pointer;
683
- transition: border-color 0.14s var(--hud-ease), color 0.14s var(--hud-ease), background 0.14s var(--hud-ease);
684
- }
685
- .seg-btn:hover { border-color: var(--hud-line-hi); color: var(--hud-text); }
686
- .seg-btn.on { color: #04120c; background: var(--hud-accent); border-color: var(--hud-accent); }
687
- .xz-seg { display: flex; gap: 6px; margin-bottom: 8px; }
688
- .xz-seg .seg-btn { flex: 1; }
689
- .scale-row { display: flex; gap: 8px; align-items: center; }
690
- .scale-min, .scale-max { font-family: var(--font-mono); font-size: 9px; color: var(--hud-faint); }
691
- .scale-range { flex: 1; accent-color: var(--hud-accent); }
692
- .scale-val {
693
- text-align: center;
694
- font-family: var(--font-mono);
695
- font-size: 11px;
696
- color: var(--hud-text);
697
- font-variant-numeric: tabular-nums;
698
- margin-bottom: 4px;
699
- }
700
- .ins-foot { display: flex; gap: 8px; margin-top: 12px; }
701
- .ins-del { border: 0; background: rgba(255, 107, 107, 0.1); color: var(--hud-danger); border: 1px solid rgba(255, 107, 107, 0.4); }
702
- .ins-del.armed { background: var(--hud-danger); color: #fff; }
703
- .ins-empty { color: var(--hud-faint); font-size: 11px; text-align: center; padding: 8px 0 6px; }
704
-
705
- /* 设备健康环 */
706
- .health-body { display: flex; align-items: center; gap: 14px; }
707
- .donut-wrap { position: relative; width: 118px; height: 118px; flex: none; }
708
- .donut-wrap canvas { width: 118px; height: 118px; }
709
- .donut-center {
710
- position: absolute;
711
- inset: 0;
712
- display: grid;
713
- place-content: center;
714
- text-align: center;
715
- }
716
- .donut-center b { font-family: var(--font-mono); font-size: 21px; font-weight: 700; color: var(--hud-accent); }
717
- .donut-center span { font-size: 9.5px; color: var(--hud-faint); }
718
- .health-legend { flex: 1; display: flex; flex-direction: column; gap: 8px; }
719
- .hl-row { display: flex; align-items: center; gap: 7px; font-size: 11.5px; }
720
- .hl-dot { width: 7px; height: 7px; border-radius: 50%; flex: none; }
721
- .hl-row .n { margin-left: auto; font-family: var(--font-mono); font-weight: 700; font-size: 13px; color: var(--hud-text); }
722
-
723
- /* 实时事件 */
724
- .event-list {
725
- flex: 1;
726
- min-height: 0;
727
- max-height: 200px;
728
- display: flex;
729
- flex-direction: column;
730
- overflow: hidden auto;
731
- }
732
- .event-row {
733
- display: flex;
734
- gap: 7px;
735
- align-items: center;
736
- padding: 4px 6px;
737
- border-radius: 7px;
738
- transition: background 0.13s var(--hud-ease);
739
- }
740
- .event-row:hover { background: rgba(53, 224, 160, 0.05); }
741
- .ev-time { flex: none; font-family: var(--font-mono); font-size: 9px; font-variant-numeric: tabular-nums; color: var(--hud-faint); }
742
- .ev-name {
743
- flex: none;
744
- max-width: 70px;
745
- overflow: hidden;
746
- text-overflow: ellipsis;
747
- white-space: nowrap;
748
- font-family: var(--font-mono);
749
- font-size: 10px;
750
- font-weight: 600;
751
- color: var(--hud-text);
752
- }
753
- .ev-text {
754
- flex: 1;
755
- min-width: 0;
756
- overflow: hidden;
757
- text-overflow: ellipsis;
758
- white-space: nowrap;
759
- font-size: 10.5px;
760
- color: var(--hud-dim);
761
- }
762
- .event-empty { padding: 12px; font-family: var(--font-mono); font-size: 9.5px; color: var(--hud-faint); text-align: center; }
763
-
764
- /* 导航图 */
765
- .mm-body { display: flex; gap: 8px; align-items: stretch; }
766
- .mm-wrap {
767
- flex: 1;
768
- position: relative;
769
- border-radius: var(--hud-r-md);
770
- overflow: hidden;
771
- border: 1px solid #223050;
772
- min-height: 148px;
773
- background: #060b13;
774
- }
775
- .mini-svg { position: absolute; inset: 0; width: 100%; height: 100%; cursor: crosshair; }
776
- .mm-col { display: flex; flex-direction: column; gap: 6px; }
777
- .mm-col .vp-tool { width: 30px; height: 30px; border-radius: 8px; }
778
- .mm-meta {
779
- margin-top: 8px;
780
- font-size: 9.5px;
781
- color: var(--hud-faint);
782
- letter-spacing: 0.08em;
783
- text-align: center;
784
- }
785
-
786
- /* ===== 浮动:精魂会话台 / 频道边界 / 芯片 ===== */
787
- .agent-chat {
788
- position: absolute;
789
- left: 16px;
790
- bottom: 84px;
791
- width: clamp(320px, 46%, 560px);
792
- max-height: min(46vh, 460px);
793
- display: flex;
794
- flex-direction: column;
795
- z-index: 9;
796
- background: linear-gradient(180deg, rgba(16, 24, 39, 0.96), rgba(13, 20, 32, 0.96));
797
- border: 1px solid var(--hud-line);
798
- border-radius: var(--hud-r-lg);
799
- box-shadow: var(--hud-shadow);
800
- backdrop-filter: blur(8px);
801
- -webkit-backdrop-filter: blur(8px);
802
- pointer-events: auto;
803
- }
804
- .agent-chat-head {
805
- display: flex;
806
- align-items: center;
807
- gap: 10px;
808
- padding: 9px 12px;
809
- border-bottom: 1px solid var(--hud-line);
810
- cursor: grab;
811
- touch-action: none;
812
- }
813
- .agent-chat-head:active { cursor: grabbing; }
814
- .chat-badge {
815
- --p-acc: var(--hud-accent);
816
- flex: none;
817
- width: 34px;
818
- height: 34px;
819
- display: grid;
820
- place-items: center;
821
- font-family: var(--font-mono);
822
- font-size: 15px;
823
- font-weight: 700;
824
- color: var(--p-acc);
825
- background: color-mix(in srgb, var(--p-acc) 10%, transparent);
826
- border: 1px solid color-mix(in srgb, var(--p-acc) 45%, transparent);
827
- border-radius: var(--hud-r-sm);
828
- }
829
- .chat-nameplate { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
830
- .chat-name { font-size: 13px; font-weight: 650; color: var(--hud-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
831
- .chat-meta { display: flex; gap: 6px; align-items: center; }
832
- .chat-state {
833
- font-family: var(--font-mono);
834
- font-size: 8.5px;
835
- letter-spacing: 0.1em;
836
- color: var(--hud-dim);
837
- padding: 1px 6px;
838
- border: 1px solid var(--hud-line);
839
- border-radius: 6px;
840
- }
841
- .chat-state.s-busy { color: var(--hud-amber); border-color: rgba(246, 196, 83, 0.5); }
842
- .chat-state.s-stopped { color: var(--hud-danger); border-color: rgba(255, 107, 107, 0.5); }
843
- .chat-harness { font-family: var(--font-mono); font-size: 8.5px; letter-spacing: 0.1em; color: var(--hud-faint); }
844
- .chat-count { font-family: var(--font-mono); font-size: 8.5px; color: var(--hud-faint); }
845
- .chat-refresh {
846
- flex: none;
847
- width: 22px;
848
- height: 22px;
849
- font-family: var(--font-mono);
850
- font-size: 11px;
851
- color: var(--hud-dim);
852
- background: transparent;
853
- border: 1px solid var(--hud-line);
854
- border-radius: 6px;
855
- cursor: pointer;
856
- transition: border-color 0.14s var(--hud-ease), color 0.14s var(--hud-ease), transform 0.32s var(--hud-ease);
857
- }
858
- .chat-refresh:hover { border-color: var(--hud-accent); color: var(--hud-accent); }
859
- .chat-refresh:active { transform: rotate(180deg); }
860
- .rpg-lines {
861
- flex: 1;
862
- min-height: 0;
863
- display: flex;
864
- flex-direction: column;
865
- gap: 7px;
866
- padding: 10px 12px 12px;
867
- overflow: hidden auto;
868
- }
869
- .rpg-divider { margin: 4px 0 2px; font-family: var(--font-mono); font-size: 8.5px; letter-spacing: 0.2em; color: var(--hud-faint); }
870
- .rpg-divider.live { color: var(--hud-amber); }
871
- .rpg-line { display: flex; gap: 8px; align-items: flex-start; }
872
- .rpg-time {
873
- flex: none;
874
- width: 52px;
875
- text-align: right;
876
- margin-top: 5px;
877
- font-family: var(--font-mono);
878
- font-size: 9px;
879
- font-variant-numeric: tabular-nums;
880
- color: var(--hud-faint);
881
- }
882
- .rpg-bubble {
883
- flex: 1;
884
- min-width: 0;
885
- display: flex;
886
- flex-direction: column;
887
- gap: 2px;
888
- padding: 7px 11px;
889
- background: var(--hud-panel-2);
890
- border: 1px solid var(--hud-line);
891
- border-radius: var(--hud-r-md);
892
- }
893
- .rpg-line.hist { opacity: 0.62; }
894
- .rpg-line.live .rpg-bubble {
895
- animation: rise 0.26s var(--hud-ease) both;
896
- background: #14213a;
897
- border-color: var(--hud-line-hi);
898
- }
899
- .rpg-kind { align-self: flex-start; font-family: var(--font-mono); font-size: 8px; letter-spacing: 0.14em; color: var(--hud-faint); }
900
- .rpg-kind.k-artifact { color: var(--hud-accent); }
901
- .rpg-kind.k-error { color: var(--hud-danger); }
902
- .rpg-text { font-size: 13px; line-height: 1.6; color: var(--hud-text); word-break: break-word; text-wrap: pretty; }
903
- .rpg-line.live .rpg-text { color: #edf4fa; }
904
- .rpg-typing { display: flex; gap: 4px; align-items: center; padding: 5px 2px; }
905
- .ty-dot {
906
- width: 5px;
907
- height: 5px;
908
- border-radius: 50%;
909
- background: var(--hud-amber);
910
- animation: ty-bounce 1.15s var(--hud-ease) infinite;
911
- }
912
- .ty-dot:nth-child(2) { animation-delay: 0.15s; }
913
- .ty-dot:nth-child(3) { animation-delay: 0.3s; }
914
- .ty-label { margin-left: 5px; font-family: var(--font-mono); font-size: 9px; color: var(--hud-faint); }
915
- .rpg-note { font-family: var(--font-mono); font-size: 10px; color: var(--hud-dim); text-align: center; padding: 14px 0; }
916
-
917
- /* 频道边界编辑(浮动) */
918
- .boundary-panel {
919
- position: absolute;
920
- top: 84px;
921
- left: 16px;
922
- width: 302px;
923
- display: flex;
924
- flex-direction: column;
925
- gap: 7px;
926
- padding: 12px 14px;
927
- z-index: 9;
928
- background: linear-gradient(180deg, rgba(16, 24, 39, 0.97), rgba(13, 20, 32, 0.97));
929
- border: 1px solid var(--hud-line);
930
- border-radius: var(--hud-r-lg);
931
- box-shadow: var(--hud-shadow);
932
- backdrop-filter: blur(8px);
933
- -webkit-backdrop-filter: blur(8px);
934
- pointer-events: auto;
935
- }
936
- .bp-title { display: flex; gap: 8px; align-items: center; padding-bottom: 8px; border-bottom: 1px solid var(--hud-line); cursor: grab; touch-action: none; }
937
- .bp-title:active { cursor: grabbing; }
938
- .bp-name { font-size: 13px; font-weight: 700; color: var(--hud-text); }
939
- .bp-sub { font-family: var(--font-mono); font-size: 8.5px; letter-spacing: 0.12em; color: var(--hud-faint); }
940
- .bp-tabs { display: flex; gap: 4px; margin-left: auto; }
941
- .bp-tab {
942
- padding: 3px 10px;
943
- font-size: 10px;
944
- font-weight: 600;
945
- color: var(--hud-dim);
946
- background: var(--hud-input);
947
- border: 1px solid var(--hud-line);
948
- border-radius: 6px;
949
- cursor: pointer;
950
- }
951
- .bp-tab.on { color: #04120c; background: var(--hud-accent); border-color: var(--hud-accent); }
952
- .bp-row { display: flex; gap: 8px; align-items: center; }
953
- .bp-label { flex: none; width: 52px; font-size: 10.5px; color: var(--hud-dim); }
954
- .bp-range { flex: 1; accent-color: var(--hud-accent); }
955
- .bp-hint { font-size: 10px; line-height: 1.6; color: var(--hud-faint); }
956
- .bp-actions { display: flex; gap: 6px; margin-top: 4px; }
957
- .bp-btn {
958
- flex: 1;
959
- padding: 6px 10px;
960
- font-size: 11px;
961
- font-weight: 600;
962
- color: var(--hud-text);
963
- background: transparent;
964
- border: 1px solid #27395c;
965
- border-radius: var(--hud-r-sm);
966
- cursor: pointer;
967
- }
968
- .bp-btn:hover { border-color: #33507c; background: #14203a; }
969
- .bp-btn.save { color: #04120c; background: var(--hud-accent-dim); border-color: var(--hud-accent-dim); }
970
- .bp-btn.save:hover { background: #25b57e; }
971
- .bp-btn.danger { color: var(--hud-danger); border-color: rgba(255, 107, 107, 0.4); }
972
- .bp-btn.danger:hover { background: rgba(255, 107, 107, 0.1); }
973
- .member-list { display: flex; flex-direction: column; gap: 5px; max-height: 220px; overflow: hidden auto; }
974
- .member-row {
975
- display: flex;
976
- gap: 8px;
977
- align-items: center;
978
- padding: 6px 8px;
979
- background: var(--hud-panel-2);
980
- border: 1px solid var(--hud-line-soft);
981
- border-radius: var(--hud-r-md);
982
- }
983
- .member-ava {
984
- display: inline-flex;
985
- align-items: center;
986
- justify-content: center;
987
- width: 24px;
988
- height: 24px;
989
- flex: none;
990
- font-family: var(--font-mono);
991
- font-size: 10px;
992
- font-weight: 700;
993
- color: var(--hud-text);
994
- background: var(--hud-panel-raised);
995
- border: 1px solid var(--hud-line);
996
- border-radius: 7px;
997
- }
998
- .member-info { flex: 1; min-width: 0; display: flex; flex-direction: column; }
999
- .member-name { font-size: 11px; font-weight: 600; color: var(--hud-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1000
- .member-role { font-family: var(--font-mono); font-size: 8.5px; color: var(--hud-faint); }
1001
- .member-select { flex: 1; min-width: 0; font-size: 10px; color: var(--hud-text); background: var(--hud-input); border: 1px solid var(--hud-line); border-radius: 6px; padding: 3px 6px; }
1002
-
1003
- /* 芯片(Toast 风) */
1004
- .drop-chip, .error-chip {
1005
- position: absolute;
1006
- top: 64px;
1007
- left: 50%;
1008
- transform: translateX(-50%);
1009
- z-index: 20;
1010
- display: flex;
1011
- gap: 8px;
1012
- align-items: center;
1013
- padding: 8px 14px;
1014
- font-size: 11.5px;
1015
- background: rgba(14, 22, 38, 0.96);
1016
- border: 1px solid #2a3d63;
1017
- border-radius: var(--hud-r-md);
1018
- box-shadow: var(--hud-shadow);
1019
- backdrop-filter: blur(8px);
1020
- -webkit-backdrop-filter: blur(8px);
1021
- max-width: 70%;
1022
- overflow: hidden;
1023
- text-overflow: ellipsis;
1024
- white-space: nowrap;
1025
- }
1026
- .drop-chip { color: var(--hud-accent); }
1027
- .error-chip { color: var(--hud-danger); border-color: rgba(255, 107, 107, 0.4); }
1028
-
1029
- /* 数采绑定/信息 */
1030
- .bind-row-item {
1031
- display: flex;
1032
- gap: 8px;
1033
- align-items: center;
1034
- padding: 6px 9px;
1035
- margin-bottom: 6px;
1036
- background: #0f1726;
1037
- border: 1px solid var(--hud-line-soft);
1038
- border-radius: var(--hud-r-md);
1039
- }
1040
- .bind-dot { width: 7px; height: 7px; border-radius: 2px; flex: none; }
1041
- .bind-name { flex: 1; min-width: 0; font-size: 11px; font-weight: 600; color: var(--hud-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1042
- .bind-val { flex: none; font-family: var(--font-mono); font-size: 10px; color: var(--hud-cyan); font-variant-numeric: tabular-nums; }
1043
- .bind-x {
1044
- flex: none;
1045
- width: 22px;
1046
- height: 22px;
1047
- color: var(--hud-faint);
1048
- background: transparent;
1049
- border: 0;
1050
- border-radius: 6px;
1051
- cursor: pointer;
1052
- }
1053
- .bind-x:hover { background: rgba(255, 107, 107, 0.12); color: var(--hud-danger); }
1054
- .bind-add {
1055
- display: flex;
1056
- gap: 6px;
1057
- }
1058
- .bind-select {
1059
- flex: 1;
1060
- min-width: 0;
1061
- font-size: 10.5px;
1062
- color: var(--hud-dim);
1063
- background: var(--hud-input);
1064
- border: 1px dashed #274064;
1065
- border-radius: var(--hud-r-sm);
1066
- padding: 5px 8px;
1067
- }
1068
- .bind-select:focus { outline: none; border-color: var(--hud-accent); color: var(--hud-text); }
1069
- .bind-add-btn {
1070
- flex: none;
1071
- height: 28px;
1072
- padding: 0 12px;
1073
- font-size: 10.5px;
1074
- font-weight: 600;
1075
- color: #04120c;
1076
- background: var(--hud-accent-dim);
1077
- border: 0;
1078
- border-radius: var(--hud-r-sm);
1079
- cursor: pointer;
1080
- }
1081
- .bind-add-btn:disabled { opacity: 0.4; cursor: default; }
1082
- .daq-info-row {
1083
- display: flex;
1084
- justify-content: space-between;
1085
- gap: 8px;
1086
- font-size: 11px;
1087
- color: var(--hud-dim);
1088
- padding: 3px 0;
1089
- }
1090
- .daq-info-row b { font-family: var(--font-mono); font-weight: 600; color: var(--hud-text); font-variant-numeric: tabular-nums; }
1091
- .daq-info-row b.cy { color: var(--hud-cyan); font-size: 13px; }
1092
-
1093
- /* ===== 状态栏 ===== */
1094
- .statusbar {
1095
- height: 30px;
1096
- flex: none;
1097
- display: flex;
1098
- align-items: center;
1099
- gap: 18px;
1100
- padding: 0 14px;
1101
- background: #0a101b;
1102
- border-top: 1px solid var(--hud-line-soft);
1103
- font-size: 11px;
1104
- color: var(--hud-dim);
1105
- position: relative;
1106
- z-index: 60;
1107
- }
1108
- .statusbar b { color: var(--hud-accent); font-weight: 600; }
1109
- .sb-dot {
1110
- width: 7px;
1111
- height: 7px;
1112
- border-radius: 50%;
1113
- background: var(--hud-accent);
1114
- box-shadow: 0 0 6px var(--hud-accent);
1115
- display: inline-block;
1116
- margin-right: 6px;
1117
- vertical-align: 1px;
1118
- }
1119
- .sb-dot.red { background: var(--hud-danger); box-shadow: 0 0 6px var(--hud-danger); }
1120
- .sb-lat {
1121
- position: absolute;
1122
- left: 50%;
1123
- transform: translateX(-50%);
1124
- font-family: var(--font-mono);
1125
- font-variant-numeric: tabular-nums;
1126
- }
1127
- .statusbar .copy { margin-left: auto; color: var(--hud-faint); font-family: var(--font-mono); font-size: 10px; }
1128
-
1129
- /* ===== 加载遮罩 ===== */
1130
- .loading-mask {
1131
- position: fixed;
1132
- inset: 0;
1133
- z-index: 90;
1134
- display: flex;
1135
- flex-direction: column;
1136
- gap: 14px;
1137
- align-items: center;
1138
- justify-content: center;
1139
- background: var(--hud-bg);
1140
- }
1141
- .loading-spinner {
1142
- width: 30px;
1143
- height: 30px;
1144
- border: 2.5px solid var(--hud-line);
1145
- border-top-color: var(--hud-accent);
1146
- border-radius: 50%;
1147
- animation: spin 0.9s linear infinite;
1148
- }
1149
- .loading-text {
1150
- font-family: var(--font-mono);
1151
- font-size: 11px;
1152
- letter-spacing: 0.24em;
1153
- color: var(--hud-dim);
1154
- }
1155
- @keyframes spin { to { transform: rotate(360deg); } }
1156
- @keyframes ty-bounce {
1157
- 0%, 60%, 100% { transform: translateY(0); opacity: 0.5; }
1158
- 30% { transform: translateY(-3px); opacity: 1; }
1159
- }
1160
-
1161
- /* 拖动面板抓手 */
1162
- .drag-grip { cursor: grab; touch-action: none; }
1163
- .drag-grip:active { cursor: grabbing; }
1164
- .drag-panel { will-change: left, top; }
1165
-
1166
- /* 滚动条 */
1167
- .town-view ::-webkit-scrollbar { width: 8px; height: 8px; }
1168
- .town-view ::-webkit-scrollbar-track { background: transparent; }
1169
- .town-view ::-webkit-scrollbar-thumb { background: #1c2942; border-radius: 4px; border: 2px solid #080d16; }
1170
- .town-view ::-webkit-scrollbar-thumb:hover { background: #2c4568; }
1171
-
1172
- @media (prefers-reduced-motion: reduce) {
1173
- .rpg-line.live .rpg-bubble, .ty-dot, .loading-spinner { animation: none; }
1174
- }
1175
-
1176
- /* 窄屏:轨道收为抽屉 */
1177
- @media (max-width: 1180px) {
1178
- .app { grid-template-columns: 0 1fr 0; }
1179
- .rail { position: fixed; top: 50px; bottom: 30px; z-index: 70; width: 288px; background: #0a101b; transition: transform 0.22s var(--hud-ease); box-shadow: var(--hud-shadow); }
1180
- .rail-left { left: 0; transform: translateX(-104%); }
1181
- .rail-right { right: 0; transform: translateX(104%); }
1182
- .dock { grid-template-columns: 1fr; }
1183
- .stage-dock { grid-template-columns: 1fr; }
1184
- }
1185
- </style>