@sleep2agi/agent-network-dashboard 0.5.3-preview.23 → 0.5.3-preview.230

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 (367) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/diagnostics/route-bundle-stats.json +7 -7
  4. package/.next/fallback-build-manifest.json +3 -3
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/.next/server/app/_not-found.html +2 -2
  14. package/.next/server/app/_not-found.rsc +2 -2
  15. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  16. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/admin.html +2 -2
  23. package/.next/server/app/admin.rsc +2 -2
  24. package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
  25. package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
  26. package/.next/server/app/admin.segments/_index.segment.rsc +2 -2
  27. package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
  28. package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
  29. package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
  30. package/.next/server/app/index.html +2 -2
  31. package/.next/server/app/index.rsc +3 -3
  32. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  33. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  34. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  35. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  36. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  37. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/login.html +2 -2
  39. package/.next/server/app/login.rsc +3 -3
  40. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  41. package/.next/server/app/login.segments/_head.segment.rsc +1 -1
  42. package/.next/server/app/login.segments/_index.segment.rsc +2 -2
  43. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  44. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  45. package/.next/server/app/login.segments/login.segment.rsc +1 -1
  46. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  47. package/.next/server/app/logs.html +2 -2
  48. package/.next/server/app/logs.rsc +2 -2
  49. package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
  50. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  51. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  52. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  53. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
  54. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  55. package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/messages.html +2 -2
  57. package/.next/server/app/messages.rsc +2 -2
  58. package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
  59. package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
  60. package/.next/server/app/messages.segments/_index.segment.rsc +2 -2
  61. package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
  62. package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
  63. package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
  64. package/.next/server/app/node/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app/node.html +2 -2
  66. package/.next/server/app/node.rsc +2 -2
  67. package/.next/server/app/node.segments/_full.segment.rsc +2 -2
  68. package/.next/server/app/node.segments/_head.segment.rsc +1 -1
  69. package/.next/server/app/node.segments/_index.segment.rsc +2 -2
  70. package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
  71. package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
  72. package/.next/server/app/node.segments/node.segment.rsc +1 -1
  73. package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
  74. package/.next/server/app/nodes.html +2 -2
  75. package/.next/server/app/nodes.rsc +2 -2
  76. package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
  77. package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
  78. package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
  79. package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
  80. package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
  81. package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
  82. package/.next/server/app/page_client-reference-manifest.js +1 -1
  83. package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
  84. package/.next/server/app/server-logs.html +2 -2
  85. package/.next/server/app/server-logs.rsc +2 -2
  86. package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
  87. package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
  88. package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
  89. package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
  90. package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
  91. package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
  92. package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
  93. package/.next/server/app/settings/networks.html +2 -2
  94. package/.next/server/app/settings/networks.rsc +2 -2
  95. package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
  96. package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
  97. package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
  98. package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
  99. package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
  100. package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
  101. package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
  102. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
  104. package/.next/server/app/settings/tokens.html +2 -2
  105. package/.next/server/app/settings/tokens.rsc +2 -2
  106. package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
  107. package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
  108. package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
  109. package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
  110. package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
  111. package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
  112. package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
  113. package/.next/server/app/settings.html +2 -2
  114. package/.next/server/app/settings.rsc +3 -3
  115. package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  116. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  117. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  118. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  119. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  120. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  121. package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
  122. package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
  123. package/.next/server/app/tasks.html +2 -2
  124. package/.next/server/app/tasks.rsc +2 -2
  125. package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
  126. package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
  127. package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
  128. package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
  129. package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
  130. package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
  131. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
  132. package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
  133. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -4
  134. package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
  135. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
  136. package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
  137. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
  138. package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
  139. package/.next/server/middleware-build-manifest.js +3 -3
  140. package/.next/server/pages/404.html +2 -2
  141. package/.next/server/pages/500.html +1 -1
  142. package/.next/static/chunks/07karo5wzchjd.js +1 -0
  143. package/.next/static/chunks/0fcch25_x_e6k.css +2 -0
  144. package/.next/static/chunks/0lahp9ikg1pf8.js +1 -0
  145. package/.next/static/chunks/0oq~4b1y9ni2h.js +4 -0
  146. package/.next/static/chunks/{0uasv5346--sz.js → 15c5xprepxiti.js} +1 -1
  147. package/.next/trace +2 -2
  148. package/.next/trace-build +1 -1
  149. package/app/components/TopoGraph.tsx +5611 -178
  150. package/app/globals.css +524 -7
  151. package/package.json +4 -4
  152. package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
  153. package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
  154. package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
  155. package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
  156. package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
  157. package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
  158. package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
  159. package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
  160. package/scripts/topo-avatar-rotate-test.mjs +85 -0
  161. package/scripts/topo-avatar-scale-test.mjs +89 -0
  162. package/scripts/topo-badge-chat-gate-test.mjs +74 -0
  163. package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
  164. package/scripts/topo-brand-logo-breath-test.mjs +102 -0
  165. package/scripts/topo-brand-logo-halo-layers-test.mjs +85 -0
  166. package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
  167. package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
  168. package/scripts/topo-brand-logo-hover-test.mjs +85 -0
  169. package/scripts/topo-card-chat-brightness-test.mjs +86 -0
  170. package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
  171. package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
  172. package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
  173. package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
  174. package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
  175. package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
  176. package/scripts/topo-chip-pin-halo-test.mjs +85 -0
  177. package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
  178. package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
  179. package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
  180. package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
  181. package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
  182. package/scripts/topo-chrome-layout-trailer-breath-test.mjs +86 -0
  183. package/scripts/topo-chrome-nodesize-trailer-breath-test.mjs +86 -0
  184. package/scripts/topo-chrome-wrapper-halo-test.mjs +83 -0
  185. package/scripts/topo-chrome-zoom-wrapper-breath-test.mjs +85 -0
  186. package/scripts/topo-click-ripple-glow-test.mjs +86 -0
  187. package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
  188. package/scripts/topo-click-ripple-sw-test.mjs +110 -0
  189. package/scripts/topo-cluster-count-attr-test.mjs +80 -0
  190. package/scripts/topo-crescent-breath-test.mjs +104 -0
  191. package/scripts/topo-crescent-envelope-breath-test.mjs +103 -0
  192. package/scripts/topo-crescent-recede-test.mjs +111 -0
  193. package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
  194. package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
  195. package/scripts/topo-dual-axis-surfaces-catalog-test.mjs +94 -0
  196. package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
  197. package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
  198. package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
  199. package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
  200. package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
  201. package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
  202. package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
  203. package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
  204. package/scripts/topo-edge-chat-gate-test.mjs +71 -0
  205. package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
  206. package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
  207. package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
  208. package/scripts/topo-edge-pill-glow-test.mjs +67 -0
  209. package/scripts/topo-edge-pin-halo-test.mjs +99 -0
  210. package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
  211. package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
  212. package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
  213. package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
  214. package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
  215. package/scripts/topo-filter-pill-glow-test.mjs +90 -0
  216. package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
  217. package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
  218. package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
  219. package/scripts/topo-fullscreen-attr-test.mjs +73 -0
  220. package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
  221. package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
  222. package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
  223. package/scripts/topo-group-box-brightness-test.mjs +84 -0
  224. package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
  225. package/scripts/topo-group-chat-gate-test.mjs +77 -0
  226. package/scripts/topo-group-label-brightness-test.mjs +84 -0
  227. package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
  228. package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
  229. package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
  230. package/scripts/topo-group-pill-glow-test.mjs +76 -0
  231. package/scripts/topo-group-tint-brightness-test.mjs +82 -0
  232. package/scripts/topo-h2-dual-axis-breath-test.mjs +92 -0
  233. package/scripts/topo-halo-chat-gate-test.mjs +72 -0
  234. package/scripts/topo-hover-detail-halo-test.mjs +76 -0
  235. package/scripts/topo-hub-core-brightness-test.mjs +82 -0
  236. package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
  237. package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
  238. package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
  239. package/scripts/topo-hub-digit-ls-test.mjs +119 -0
  240. package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
  241. package/scripts/topo-hub-halo-glow-test.mjs +96 -0
  242. package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
  243. package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
  244. package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
  245. package/scripts/topo-hub-highlight-fill-transition-test.mjs +84 -0
  246. package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
  247. package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
  248. package/scripts/topo-hub-highlight-r-test.mjs +112 -0
  249. package/scripts/topo-hub-highlight-recede-test.mjs +5 -1
  250. package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
  251. package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
  252. package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
  253. package/scripts/topo-hub-idle-breath-test.mjs +6 -7
  254. package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
  255. package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
  256. package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
  257. package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
  258. package/scripts/topo-kicker-breath-test.mjs +100 -0
  259. package/scripts/topo-kicker-dual-axis-breath-test.mjs +81 -0
  260. package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
  261. package/scripts/topo-label-card-brightness-test.mjs +81 -0
  262. package/scripts/topo-layout-hover-fw-test.mjs +98 -0
  263. package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
  264. package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
  265. package/scripts/topo-legend-count-brightness-test.mjs +80 -0
  266. package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
  267. package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
  268. package/scripts/topo-legend-label-fw-test.mjs +107 -0
  269. package/scripts/topo-legend-panel-title-breath-test.mjs +86 -0
  270. package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
  271. package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
  272. package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
  273. package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
  274. package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
  275. package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
  276. package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
  277. package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
  278. package/scripts/topo-minimap-container-halo-test.mjs +82 -0
  279. package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
  280. package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
  281. package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
  282. package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
  283. package/scripts/topo-more-footer-brightness-test.mjs +94 -0
  284. package/scripts/topo-node-alias-brightness-test.mjs +84 -0
  285. package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
  286. package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
  287. package/scripts/topo-node-label-card-halo-test.mjs +76 -0
  288. package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
  289. package/scripts/topo-nodesize-brightness-test.mjs +82 -0
  290. package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
  291. package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
  292. package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
  293. package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
  294. package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
  295. package/scripts/topo-panel-rect-halo-test.mjs +90 -0
  296. package/scripts/topo-panel-row-brightness-test.mjs +116 -0
  297. package/scripts/topo-panel-title-brightness-test.mjs +98 -0
  298. package/scripts/topo-panel-title-glow-test.mjs +111 -0
  299. package/scripts/topo-panel-titles-dual-axis-breath-test.mjs +94 -0
  300. package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
  301. package/scripts/topo-pill-x-rotate-test.mjs +96 -0
  302. package/scripts/topo-pip-brightness-test.mjs +85 -0
  303. package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
  304. package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
  305. package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
  306. package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
  307. package/scripts/topo-recent-count-brightness-test.mjs +84 -0
  308. package/scripts/topo-recent-more-fw-test.mjs +126 -0
  309. package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
  310. package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
  311. package/scripts/topo-recent-panel-title-breath-test.mjs +91 -0
  312. package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
  313. package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
  314. package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
  315. package/scripts/topo-recent-row-fw-test.mjs +115 -0
  316. package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
  317. package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
  318. package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
  319. package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
  320. package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
  321. package/scripts/topo-reset-brightness-test.mjs +83 -0
  322. package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
  323. package/scripts/topo-respiratory-rolodex-test.mjs +83 -0
  324. package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
  325. package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
  326. package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
  327. package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
  328. package/scripts/topo-section-title-breath-test.mjs +83 -0
  329. package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
  330. package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
  331. package/scripts/topo-starfield-hue-test.mjs +109 -0
  332. package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
  333. package/scripts/topo-status-ring-brightness-test.mjs +84 -0
  334. package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
  335. package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
  336. package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
  337. package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
  338. package/scripts/topo-title-block-envelope-breath-test.mjs +87 -0
  339. package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
  340. package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
  341. package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
  342. package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
  343. package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
  344. package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
  345. package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
  346. package/scripts/topo-vendor-distribution-wrapper-halo-test.mjs +93 -0
  347. package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
  348. package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
  349. package/scripts/topo-watermark-breath-test.mjs +100 -0
  350. package/scripts/topo-watermark-dual-axis-breath-test.mjs +88 -0
  351. package/scripts/topo-watermark-envelope-breath-test.mjs +88 -0
  352. package/scripts/topo-watermark-recede-test.mjs +114 -0
  353. package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
  354. package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
  355. package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
  356. package/scripts/topo-zoom-level-breath-test.mjs +87 -0
  357. package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
  358. package/scripts/topo-zoom-level-color-test.mjs +105 -0
  359. package/scripts/topo-zoom-level-dual-axis-breath-test.mjs +83 -0
  360. package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
  361. package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
  362. package/.next/static/chunks/0o7ix_c958qcs.js +0 -4
  363. package/.next/static/chunks/10q5vtqj7.g7b.js +0 -1
  364. package/.next/static/chunks/16faz62o8faa9.js +0 -1
  365. /package/.next/static/{hJ3DiAf0PdSz8-LSqjCPy → 5tGWgIr_3AQnGenlkjpLm}/_buildManifest.js +0 -0
  366. /package/.next/static/{hJ3DiAf0PdSz8-LSqjCPy → 5tGWgIr_3AQnGenlkjpLm}/_clientMiddlewareManifest.js +0 -0
  367. /package/.next/static/{hJ3DiAf0PdSz8-LSqjCPy → 5tGWgIr_3AQnGenlkjpLm}/_ssgManifest.js +0 -0
package/app/globals.css CHANGED
@@ -949,15 +949,40 @@ body {
949
949
  all preserved) plus `outline-color` for R490. All at 200ms ease-
950
950
  out, matching the chip-row's existing Tailwind duration-200 ease-
951
951
  out so visible animations on the chip are unchanged.
952
- Trade-off: chips with inline `style.transition` (e.g. R210
953
- pressure-bar segments at 220ms width / 150ms boxShadow / 150ms
954
- filter, line 2338 in TopoGraph.tsx) keep their inline value
955
- because inline style wins over class rules regardless of
956
- !important. That's intentional those custom timings were
957
- deliberate and stay scoped to their element. */
952
+
953
+ Round 524 / Loop CORRECTION + bug fix.
954
+ R490's original 'trade-off' note read:
955
+ 'chips with inline style.transition (R210 pressure-bar
956
+ segments at 220ms width / 150ms boxShadow / 150ms filter)
957
+ keep their inline value because inline style wins over class
958
+ rules regardless of !important.'
959
+ That was WRONG about CSS cascade. Per the spec, `!important`
960
+ author declarations DO override normal-priority inline-style
961
+ declarations. So R490's transition-property list silently
962
+ dropped every inline transition that targeted a property NOT
963
+ in this class's list — including R165's width 220ms tween on
964
+ the pressure-bar segments AND R210's filter brightness(1.2)
965
+ hover on those same segments. Both motion polishes have been
966
+ silently broken (snapping instead of easing) since R490
967
+ landed; banked as test-craft lesson in R523.
968
+ R524 fixes by extending the transition-property list to
969
+ include `width` and `filter` so the pressure-bar segments
970
+ (and any future chip-focus surface with width/filter motion)
971
+ animate per the class's unified 200ms ease-out. The cadence
972
+ shift (R165's 220ms → 200ms, R210's 150ms → 200ms) loses 20-
973
+ 50ms of intent precision but slots into the dashboard's
974
+ uniform 200ms motion vocabulary the rest of the chip family
975
+ already uses — net visible improvement (motion was DEAD,
976
+ now eases at 200ms; that's a strictly better state than
977
+ snapping).
978
+ Other chip-focus surfaces (filter pills, online/working
979
+ chips, minimap container, "+N more" footer's <g>) don't
980
+ change width or filter at runtime, so adding these
981
+ properties to the list is a no-op for them. */
958
982
  transition-property:
959
983
  outline-color, color, background-color, border-color,
960
- text-decoration-color, fill, stroke, opacity, box-shadow, transform
984
+ text-decoration-color, fill, stroke, opacity, box-shadow, transform,
985
+ width, filter
961
986
  !important;
962
987
  transition-duration: 200ms !important;
963
988
  transition-timing-function: ease-out !important;
@@ -1049,6 +1074,498 @@ body {
1049
1074
  animation-iteration-count: infinite;
1050
1075
  }
1051
1076
 
1077
+ /* Round 553 — title-block brand logo subtle idle breath.
1078
+ 5th anchor in the 呼吸感 breath family — cadence ladder:
1079
+ row hot 3s
1080
+ hub idle 4s
1081
+ brand logo 5s ← this round
1082
+ watermark 6s
1083
+ crescent 7s
1084
+ Pure opacity breath (0.92 ↔ 1, ~8% delta) on the title-block
1085
+ crescent SVG so the brand mark reads as a "living mark" at
1086
+ rest. Composes cleanly with R548 hover:scale-105 +
1087
+ R549 hover:rotate-6 (independent properties: opacity vs
1088
+ scale/rotate; the moon keeps breathing as it lifts on hover).
1089
+ prefers-reduced-motion handled by R29 blanket override —
1090
+ animation-duration → 0.001ms neutralises the keyframe without
1091
+ killing the static opacity baseline. Component-side gate also
1092
+ applied (`!reducedMotion` toggles the className) as canonical
1093
+ TopoGraph breath pattern (sibling to R130 hub idle / R519
1094
+ watermark / R326 crescent breath gates). */
1095
+ @keyframes anet-topo-brand-logo-breath-kf {
1096
+ 0%, 100% { opacity: 1; }
1097
+ 50% { opacity: 0.92; }
1098
+ }
1099
+ .anet-topo-brand-logo-breath {
1100
+ animation: anet-topo-brand-logo-breath-kf 5s ease-in-out infinite;
1101
+ }
1102
+
1103
+ /* Round 683 — brand 书生 logo extends single-layer drop-shadow hover
1104
+ (R604, Tailwind `hover:drop-shadow-[0_0_8px_currentColor]`) to the
1105
+ multi-layer halo family vocabulary: near 8px + far 16px (2× blur
1106
+ stride) at currentColor (inherits inline style.color = teal #0d9488
1107
+ / cyan #67e8f9), stacked with brightness(1.10). Matches R642-R667
1108
+ 0.5×-falloff convention by using currentColor for both layers —
1109
+ the same hue at native alpha layers up because drop-shadow alpha
1110
+ accumulates additively when stacked.
1111
+ Pure CSS `:hover` so no new React state needed; the SVG element
1112
+ listens via its own pseudo-class. Inline transition list already
1113
+ covers `filter 200ms ease-out` (R557) so the multi-layer halo eases
1114
+ under the same cadence. Tailwind v4 utility composition for multi-
1115
+ drop-shadow doesn't work cleanly (per R659 detour note), so dropping
1116
+ the utility classes (`hover:brightness-110`, `hover:drop-shadow-[...]`)
1117
+ in favor of an explicit CSS rule that wins over the cascade.
1118
+ 42nd anchor in multi-layer halo family — first brand-mark anchor. */
1119
+ .anet-topo-brand-logo-mark:hover {
1120
+ filter: drop-shadow(0 0 8px currentColor)
1121
+ drop-shadow(0 0 16px currentColor)
1122
+ brightness(1.10);
1123
+ }
1124
+
1125
+ /* Round 684 — title-block H2 "Command mesh" gains multi-layer halo
1126
+ via the wrapper's `:hover` (sibling pattern to R683 brand logo —
1127
+ both lift together when ANY surface in the title-block cluster
1128
+ is hovered, including the brand logo, kicker, or H2 itself).
1129
+ Pre-R684 the H2 had only 2 typographic hover axes (R554 tracking-
1130
+ tighter + R556 font-bold) via group-hover Tailwind utilities; the
1131
+ paint axis was untouched. R684 adds the multi-layer halo paint
1132
+ axis to the H2's hover signature — same near + far layered glow
1133
+ vocabulary the 42 other surfaces in the family share.
1134
+ Stride: 4 + 8px (2× blur stride at h2 scale, text-lg = 18px —
1135
+ smaller than brand logo's 8+16 since the H2 is text not graphic).
1136
+ Tint: currentColor — inherits the H2's resolved fill color
1137
+ (white on cyber, darker on light theme overrides).
1138
+ No brightness multiply — H2 text-white is already near-peak
1139
+ luminance on cyber; adding brightness would push past saturation.
1140
+ The selector targets the H2 via its data-attr `data-topo-section-
1141
+ title` nested under the title-block wrapper's group container
1142
+ (`data-topo-section-titleblock-group`). Inline `transition-
1143
+ [letter-spacing,font-weight]` on the H2 doesn't include filter,
1144
+ so the halo would snap on. Add a transition rule here so the
1145
+ halo eases under the same 200ms cadence as the existing 2 axes —
1146
+ keeps the cluster's hover gesture motion-coherent.
1147
+ 43rd anchor in multi-layer halo family — sibling to R683 brand
1148
+ logo, closing the title-block cluster's paint-axis halo at the
1149
+ H2 element scope. */
1150
+ [data-topo-section-titleblock-group]:hover [data-topo-section-title] {
1151
+ filter: drop-shadow(0 0 4px currentColor)
1152
+ drop-shadow(0 0 8px currentColor);
1153
+ }
1154
+ [data-topo-section-title] {
1155
+ transition: letter-spacing 200ms ease-out,
1156
+ font-weight 200ms ease-out,
1157
+ filter 200ms ease-out;
1158
+ }
1159
+
1160
+ /* Round 685 — kicker "Network Topology" gains multi-layer halo via
1161
+ the title-block wrapper's `:hover`, closing the title-block trio
1162
+ at 3/3 paint-axis halo (logo R683 + H2 R684 + kicker R685). Pre-
1163
+ R685 the kicker had only 2 hover axes (R555 tracking-spread +
1164
+ color lift gray-500 → gray-400); the paint axis was untouched.
1165
+ R685 adds 2-layer drop-shadow at 2 + 4px stride (2× blur stride
1166
+ at kicker scale — text-xs = 12px, smaller than H2's 4+8 and
1167
+ logo's 8+16). currentColor inherits the kicker's resolved fill
1168
+ (gray-500 rest / gray-400 hover post-R555) so the halo paints
1169
+ in the same hue as the text.
1170
+ Selector targets the kicker via `data-topo-section-kicker` data-
1171
+ attr (already present on the kicker div). Sibling rule + transition
1172
+ pattern to R684 H2; both fire on the wrapper's :hover and ease at
1173
+ 200ms.
1174
+ When the user hovers the title cluster, ALL 3 surfaces (logo +
1175
+ H2 + kicker) glow simultaneously — cluster reads as one
1176
+ coherent hover unit, paint axis CLOSED across all surfaces.
1177
+ 44th anchor in multi-layer halo family — completes title-block
1178
+ trio 3/3. */
1179
+ [data-topo-section-titleblock-group]:hover [data-topo-section-kicker] {
1180
+ filter: drop-shadow(0 0 2px currentColor)
1181
+ drop-shadow(0 0 4px currentColor);
1182
+ }
1183
+ [data-topo-section-kicker] {
1184
+ transition: letter-spacing 200ms ease-out,
1185
+ color 200ms ease-out,
1186
+ filter 200ms ease-out;
1187
+ }
1188
+
1189
+ /* Round 697 — chrome strip segmented-control wrappers gain a wrapper-
1190
+ level multi-layer halo when ANY inner button is hovered. Pre-R697
1191
+ the 3 chrome wrappers (Layout / nodeSize / zoom) had only static
1192
+ border + background — individual buttons inside halo via R674/R675/
1193
+ R673/R668 but the parent wrapper stayed flat. R697 uses CSS `:has()`
1194
+ to detect inner button hover and applies a 2-layer drop-shadow at
1195
+ cyan-300 (#67e8f9) — compact-chrome tier (2+4 stride, 0.5/0.25 alpha).
1196
+
1197
+ When user hovers a child Ring/Grid/S/M/L/zoom button, the WRAPPER
1198
+ itself echoes the inner-button halo outward in a soft glow — chrome
1199
+ strip reads as one coherent "this control group is active" gesture
1200
+ alongside the per-button cyan halo.
1201
+
1202
+ Cyan-300 hardcoded (vs theme-driven pal.legendAccent) since CSS
1203
+ doesn't have a clean handle on the React-computed palette token at
1204
+ this wrapper level. Cyan-300 ≈ light theme's pal.legendAccent
1205
+ (#0d9488 teal-600) is bluish; the halo is hover-only + brief so the
1206
+ slight cross-theme hue mismatch is acceptable.
1207
+
1208
+ transition: filter 200ms ease-out — matches the inner buttons'
1209
+ 200ms cadence so wrapper + buttons ease together on hover-in/out.
1210
+
1211
+ 53rd anchor in multi-layer halo family — first wrapper-level
1212
+ has-hover anchor. Closes chrome-strip "active control group"
1213
+ signal at the parent scope alongside R667-R675 per-button anchors. */
1214
+ [data-topo-chrome-layout-trailer]:has(button:hover),
1215
+ [data-topo-chrome-fleet-group-trailer]:has(button:hover),
1216
+ [data-topo-chrome-zoom-wrapper]:has(button:hover) {
1217
+ filter: drop-shadow(0 0 2px rgba(103, 232, 249, 0.5))
1218
+ drop-shadow(0 0 4px rgba(103, 232, 249, 0.25));
1219
+ }
1220
+ [data-topo-chrome-layout-trailer],
1221
+ [data-topo-chrome-fleet-group-trailer],
1222
+ [data-topo-chrome-zoom-wrapper] {
1223
+ transition: background-color 200ms ease-out,
1224
+ border-color 200ms ease-out,
1225
+ filter 200ms ease-out;
1226
+ }
1227
+
1228
+ /* ─────────────────────────────────────────────────────────────────────
1229
+ Round 698 — vendor-distribution chip-row outer wrapper joins the
1230
+ R697 wrapper-level :has() halo family. Pre-R698 only the chrome-strip
1231
+ wrappers (Layout/nodeSize/zoom) echoed inner-button hover at the
1232
+ parent scope; the vendor-distribution wrapper stayed flat even though
1233
+ its inner vendor letter chips already halo'd per-element (R676/R688/
1234
+ R690).
1235
+
1236
+ R697 used `:has(button:hover)` because chrome wrappers contain real
1237
+ <button> children. The vendor letter chips are `<span role="button">`
1238
+ (clickable spans, not buttons — preserves inline-baseline alignment
1239
+ with the title text). The :has() selector variant `[role="button"]:hover`
1240
+ extends R697's wrapper-level vocabulary from real-button children
1241
+ to ARIA-button children — same gesture, broader applicability.
1242
+
1243
+ Cyan-300 (#67e8f9) at 2+4 stride, 0.5/0.25 alpha — matches R697
1244
+ cadence exactly. Transition matches the per-chip 200ms hover cascade.
1245
+ When user hovers any A:N / O:N / 书:N / ?:N chip, the outer chip-row
1246
+ wrapper echoes the per-chip halo outward — reads as "this vendor-
1247
+ distribution control group is active" alongside the existing R676
1248
+ vendor letter glyph halo + R688 count suffix halo.
1249
+
1250
+ 54th anchor in multi-layer halo family — 2nd wrapper-level :has()
1251
+ anchor. First :has() rule targeting [role="button"] (vs <button>)
1252
+ children. Closes vendor-chip-row "active control group" signal at
1253
+ the parent scope. */
1254
+ [data-topo-chrome-vendor-distribution-wrapper]:has([role="button"]:hover) {
1255
+ filter: drop-shadow(0 0 2px rgba(103, 232, 249, 0.5))
1256
+ drop-shadow(0 0 4px rgba(103, 232, 249, 0.25));
1257
+ }
1258
+ [data-topo-chrome-vendor-distribution-wrapper] {
1259
+ transition: background-color 200ms ease-out,
1260
+ border-color 200ms ease-out,
1261
+ filter 200ms ease-out;
1262
+ }
1263
+
1264
+ /* ─────────────────────────────────────────────────────────────────────
1265
+ Round 699 — kicker "Network Topology" at-rest breathing fade.
1266
+
1267
+ The H2 below ("Command mesh") already had its hover halo via the R684
1268
+ descendant rule; the kicker eyebrow above had R685 hover halo + R555
1269
+ tracking-expand, but at REST it sat at a fixed alpha — static, no
1270
+ sign of life. R699 adds a slow respiratory cycle (opacity 0.78 ↔ 1
1271
+ at 6 s ease-in-out infinite) on `.anet-topo-kicker-breath`.
1272
+
1273
+ 6 s is deliberately ~3× slower than the sidebar brand-pulse (1.6 s)
1274
+ and the recent-hot pulse (3 s) — kicker isn't signaling urgency, just
1275
+ "this section is alive". Group-hover overrides via R555/R685 take
1276
+ precedence the moment user enters the title-block, so the breath
1277
+ never competes with the gesture vocabulary.
1278
+
1279
+ Pure opacity: no transform / no filter blur / no size change → text
1280
+ bounding box stable → topo-overlap-test grid + ring untouched. Pairs
1281
+ sequentially with `anet-brand-pulse-kf` (1.6 s, brand status) and
1282
+ `anet-recent-hot-pulse-kf` (3 s, recent-signal heat) as the third
1283
+ distinct respiratory rhythm in the topo canvas.
1284
+
1285
+ prefers-reduced-motion: reduce → animation: none (kicker freezes at
1286
+ resting alpha = 1, sibling to other R29-family motion guards).
1287
+ ───────────────────────────────────────────────────────────────────── */
1288
+ /* Round 699 + R714 — kicker "Network Topology" dual-axis breath.
1289
+ R699 introduced 6s opacity breath (0.78 ↔ 1, ~22%); R714 adds a
1290
+ SECOND axis in the same @keyframes: a transform scale (0.995 ↔ 1,
1291
+ ~0.5%). Two axes share cadence (6s) so they breathe IN PHASE —
1292
+ the dimmest moment is also the smallest moment, mirroring the
1293
+ R711 H2 dual-axis at the title-block's eyebrow tier.
1294
+
1295
+ Why scale 0.5%: the kicker is the section's secondary text (eyebrow
1296
+ above the H2 headline). Its alpha range is wider (22% vs H2's 12%)
1297
+ so a slightly wider scale range (0.5% vs H2's 0.3%) keeps the
1298
+ axes proportionally weighted. Still sub-pixel at xs font-size
1299
+ (~12 px text height → 0.06px swing) — imperceptible per-frame,
1300
+ accumulates as "the eyebrow gently pulses with the breath".
1301
+
1302
+ Mirrors R711 H2 pattern (HTML text dual-axis: opacity + CSS
1303
+ transform scale) — both title-block text tiers now have dual-axis
1304
+ breath, closing title-block dual-axis symmetry across kicker and
1305
+ H2. Brand-logo (the 3rd title-block trio member) still single-axis
1306
+ since it already has its own 5-axis hover signature (R548/R549/R553/
1307
+ R557/R604) plus 5s breath; further axes would oversubscribe the
1308
+ brand mark. Pattern budget: title-block trio members get dual-axis
1309
+ if their hover signature is sparse, single-axis if rich.
1310
+
1311
+ transform-origin defaults to center — kicker scales around its own
1312
+ midpoint, no glyph drift. paint-only → flex parent stable → topo-
1313
+ overlap-test untouched. prefers-reduced-motion: reduce neutralizes. */
1314
+ @keyframes anet-topo-kicker-breath-kf {
1315
+ 0%, 100% { opacity: 1; transform: scale(1); }
1316
+ 50% { opacity: 0.78; transform: scale(0.995); }
1317
+ }
1318
+ .anet-topo-kicker-breath {
1319
+ animation: anet-topo-kicker-breath-kf 6s ease-in-out infinite;
1320
+ }
1321
+ @media (prefers-reduced-motion: reduce) {
1322
+ .anet-topo-kicker-breath { animation: none; }
1323
+ }
1324
+
1325
+ /* Round 702 — H2 "Command mesh" at-rest breathing fade, completing the
1326
+ title-block respiratory trio (brand-logo 5 s / kicker 6 s / H2 10 s).
1327
+ Tighter alpha range (0.88 ↔ 1, ~12%) vs the kicker (0.78 ↔ 1, ~22%):
1328
+ H2 carries more visual weight, so a gentler breath keeps it from
1329
+ looking flickery. Slowest in the trio — 10 s reads as calm anchoring,
1330
+ not anxious. prefers-reduced-motion: reduce → animation: none,
1331
+ sibling to the R699 kicker guard. */
1332
+ /* Round 702 + R711 — H2 "Command mesh" dual-axis breath. R702 introduced
1333
+ the 10s opacity breath (0.88 ↔ 1, ~12%); R711 adds a SECOND axis in
1334
+ the same @keyframes: a transform scale (0.997 ↔ 1, ~0.3%). The two
1335
+ axes share cadence (10s) so they breathe in PHASE — the dimmest moment
1336
+ is also the smallest moment, like a single coherent inhale-exhale.
1337
+
1338
+ Why scale 0.3%: the H2 is the section's primary text identity; scale
1339
+ changes affect glyph rasterization at sub-pixel level. 0.3% range
1340
+ keeps the visible change at fraction of a pixel for a 40-px-tall text,
1341
+ imperceptible per-frame but cumulatively reads as "the title gently
1342
+ pulses with the breath", reinforcing the opacity dimming without
1343
+ adding new gesture. Scale doesn't affect layout flow (CSS transform
1344
+ is paint-only) — flex parent stays stable, overlap test safe.
1345
+
1346
+ First DUAL-AXIS breath anchor in the 呼吸感 family — establishes that
1347
+ future anchors can layer multiple animation properties on a single
1348
+ keyframe block for "deeper aliveness" on a single surface, without
1349
+ needing a second class or animation. Pattern budget: prefer single-
1350
+ axis on most anchors (visual hierarchy) and reserve dual-axis for
1351
+ primary identity surfaces (H2 here = first primary-identity dual). */
1352
+ @keyframes anet-topo-section-title-breath-kf {
1353
+ 0%, 100% { opacity: 1; transform: scale(1); }
1354
+ 50% { opacity: 0.88; transform: scale(0.997); }
1355
+ }
1356
+ .anet-topo-section-title-breath {
1357
+ animation: anet-topo-section-title-breath-kf 10s ease-in-out infinite;
1358
+ /* transform-origin defaults to 50% 50% which is what we want — the H2
1359
+ scales around its own center, no glyph drift. */
1360
+ }
1361
+ @media (prefers-reduced-motion: reduce) {
1362
+ .anet-topo-section-title-breath { animation: none; }
1363
+ }
1364
+
1365
+ /* Round 703 — chrome zoom-level readout at-rest breath. 9 s cadence sits
1366
+ between the 8 s panel titles and the 10 s H2 in the respiratory
1367
+ rolodex. Tighter alpha range (0.85 ↔ 1, ~15%) than the kicker —
1368
+ readout carries tabular numeric data, so it shouldn't drift too far
1369
+ from full opacity. Hover gate via the data attribute: when
1370
+ data-topo-chrome-zoom-level-hover="true", animation: none, and the
1371
+ existing R347 ls + R420 fw + R517 color + R593 brightness + R668
1372
+ halo 4-axis lift takes precedence cleanly. prefers-reduced-motion:
1373
+ reduce neutralizes, sibling to R699/R702 guards. */
1374
+ /* Round 703 + R715 — chrome zoom-level readout dual-axis breath.
1375
+ R703 introduced 9s opacity breath (0.85 ↔ 1, ~15%); R715 adds a
1376
+ SECOND axis in the same @keyframes: a transform scale (0.996 ↔ 1,
1377
+ ~0.4%). Two axes share cadence (9s) so they breathe IN PHASE —
1378
+ dimmest = smallest, mirroring R711 H2 / R714 kicker pattern at the
1379
+ CHROME DATA TIER (vs title-block primary text tier).
1380
+
1381
+ Why scale 0.4% on zoom-level (vs H2's 0.3%, kicker's 0.5%): zoom-
1382
+ level's alpha range is between H2 (12%) and kicker (22%) at 15%
1383
+ — scale axis interpolated to 0.4% keeps the three dual-axis HTML
1384
+ text surfaces co-proportioned. Sub-pixel at xs font-size → ~0.04px
1385
+ swing at ~10px text height; imperceptible per-frame, accumulates
1386
+ as "the readout pulses with the breath".
1387
+
1388
+ Pattern budget extension — chrome data tier dual-axis:
1389
+ R699+R714 kicker 6s eyebrow tier
1390
+ R703+R715 zoom-level 9s chrome data tier ← this round
1391
+ R702+R711 H2 10s primary headline tier
1392
+ The 6/9/10 s cadences and the kicker/zoom-level/H2 scale ratios
1393
+ (0.5/0.4/0.3 %) form a tier-graded ladder: faster cadence + larger
1394
+ scale on secondary-tier text; slower cadence + smaller scale on
1395
+ primary-tier text. Each tier has its own "tempo + amplitude"
1396
+ coupled signature — kicker pulses quickly-and-noticeably, H2
1397
+ pulses slowly-and-subtly, zoom-level sits between.
1398
+
1399
+ Hover gate via `[data-topo-chrome-zoom-level-hover="true"]` →
1400
+ animation: none, so R347/R420/R517/R593 hover axes take precedence
1401
+ without animation underneath. transform-origin defaults to center
1402
+ — pill scales around its own midpoint. prefers-reduced-motion:
1403
+ reduce also neutralizes. */
1404
+ @keyframes anet-topo-chrome-zoom-level-breath-kf {
1405
+ 0%, 100% { opacity: 1; transform: scale(1); }
1406
+ 50% { opacity: 0.85; transform: scale(0.996); }
1407
+ }
1408
+ .anet-topo-chrome-zoom-level-breath {
1409
+ animation: anet-topo-chrome-zoom-level-breath-kf 9s ease-in-out infinite;
1410
+ }
1411
+ .anet-topo-chrome-zoom-level-breath[data-topo-chrome-zoom-level-hover="true"] {
1412
+ animation: none;
1413
+ }
1414
+ @media (prefers-reduced-motion: reduce) {
1415
+ .anet-topo-chrome-zoom-level-breath { animation: none; }
1416
+ }
1417
+
1418
+ /* Round 704 — brand watermark WRAPPER envelope breath at 15 s — slowest
1419
+ tier in the respiratory rolodex. Inner "sleep2agi" text already
1420
+ breathes at 6 s (R519); this adds an outer wrapper envelope so the
1421
+ brand area has nested respiration (fast inner / slow outer). 0.85 ↔ 1
1422
+ alpha range (~15%) matches the R703 tabular/decorative surface band
1423
+ — heavy visual register shouldn't drift too far from full opacity.
1424
+
1425
+ Focal-recede gate via data-attr selector — when the wrapper's
1426
+ data-topo-brand-watermark-recede attr flips to "true" (user is
1427
+ hovering a node/edge/group on the canvas), animation: none gates
1428
+ off so the R525 inline opacity={0.7} attr takes effect cleanly.
1429
+ Pattern sibling to R703 zoom-level data-attr selector gate.
1430
+ prefers-reduced-motion: reduce also neutralizes. */
1431
+ @keyframes anet-topo-brand-watermark-envelope-breath-kf {
1432
+ 0%, 100% { opacity: 1; }
1433
+ 50% { opacity: 0.85; }
1434
+ }
1435
+ .anet-topo-brand-watermark-envelope-breath {
1436
+ animation: anet-topo-brand-watermark-envelope-breath-kf 15s ease-in-out infinite;
1437
+ }
1438
+ .anet-topo-brand-watermark-envelope-breath[data-topo-brand-watermark-recede="true"] {
1439
+ animation: none;
1440
+ }
1441
+ @media (prefers-reduced-motion: reduce) {
1442
+ .anet-topo-brand-watermark-envelope-breath { animation: none; }
1443
+ }
1444
+
1445
+ /* Round 705 — canvas crescent wrapper envelope breath at 13 s. Mirror
1446
+ to R704 watermark wrapper, closing canvas-brand-pair envelope
1447
+ symmetry. Cadence 13 s coprime with R704 (15 s) so the two never
1448
+ beat together when both visible. Tighter alpha range (0.30 ↔ 0.35,
1449
+ ~14%) deliberately hugs the existing inline 0.35 baseline — preserves
1450
+ the visible-state intent while adding nested respiration.
1451
+
1452
+ Two gate-off rules instead of one (R704 had a single recede gate):
1453
+ - visible="false" → animation: none, so inline opacity={0} holds when
1454
+ the recent panel is shown (crescent must be invisible).
1455
+ - recede="true" → animation: none, so inline opacity={0.245} holds
1456
+ when canvas attention is elsewhere.
1457
+ Either gate flips → CSS releases control to inline opacity attr.
1458
+ prefers-reduced-motion: reduce also neutralizes. */
1459
+ @keyframes anet-topo-brand-canvas-mark-envelope-breath-kf {
1460
+ 0%, 100% { opacity: 0.35; }
1461
+ 50% { opacity: 0.30; }
1462
+ }
1463
+ .anet-topo-brand-canvas-mark-envelope-breath {
1464
+ animation: anet-topo-brand-canvas-mark-envelope-breath-kf 13s ease-in-out infinite;
1465
+ }
1466
+ .anet-topo-brand-canvas-mark-envelope-breath[data-topo-brand-canvas-mark-visible="false"] {
1467
+ animation: none;
1468
+ }
1469
+ .anet-topo-brand-canvas-mark-envelope-breath[data-topo-brand-canvas-mark-recede="true"] {
1470
+ animation: none;
1471
+ }
1472
+ @media (prefers-reduced-motion: reduce) {
1473
+ .anet-topo-brand-canvas-mark-envelope-breath { animation: none; }
1474
+ }
1475
+
1476
+ /* Round 706 — title-block wrapper envelope breath at 11s. Mirrors the
1477
+ canvas-brand-pair nested-envelope pattern (R704/R705) at the title-
1478
+ block scope. 11s coprime with all 3 inner trio cadences (5, 6, 10) —
1479
+ no common factor → no phase lock with inner anchors. Tighter alpha
1480
+ range (0.92 ↔ 1, ~8%) than canvas-brand-pair envelopes because the
1481
+ title-block carries primary text identity; even subtle dimming on
1482
+ the H2 + kicker headline reads as flicker if too aggressive. 8%
1483
+ range = "barely-perceptible aliveness". prefers-reduced-motion:
1484
+ reduce neutralizes. */
1485
+ @keyframes anet-topo-title-block-envelope-breath-kf {
1486
+ 0%, 100% { opacity: 1; }
1487
+ 50% { opacity: 0.92; }
1488
+ }
1489
+ .anet-topo-title-block-envelope-breath {
1490
+ animation: anet-topo-title-block-envelope-breath-kf 11s ease-in-out infinite;
1491
+ }
1492
+ @media (prefers-reduced-motion: reduce) {
1493
+ .anet-topo-title-block-envelope-breath { animation: none; }
1494
+ }
1495
+
1496
+ /* Round 707 — chrome Layout wrapper at-rest breath at 17 s. Slowest tier
1497
+ among HTML chrome respiratory anchors (sibling to R703 zoom-level 9 s
1498
+ in the chrome strip's data tier; this 17 s lands in the chrome strip's
1499
+ control tier). 17 is prime → coprime with every other cadence in the
1500
+ rolodex (3/4/5/6/7/8/9/10/11/13/15). Never phase-locks with any other
1501
+ anchor.
1502
+
1503
+ Tightest alpha range yet (0.94 ↔ 1, ~6%) — the Layout buttons are
1504
+ interactive controls with active-state cyan tint; even ~10% dimming
1505
+ on the inner button color would feel jarring. 6% = "barely-perceptible
1506
+ aliveness" on a control group.
1507
+
1508
+ Hover gate via :has() selector — when user hovers any inner Ring/Grid
1509
+ button, the R697 wrapper-level halo (cyan filter) takes precedence;
1510
+ animation: none on hover pauses the breath so the halo reads crisp
1511
+ without underlying alpha drift. Third gate-off mechanism in the family
1512
+ vocabulary, sibling to R703 hover data-attr gate + R704/R705 recede
1513
+ gates. */
1514
+ @keyframes anet-topo-chrome-layout-trailer-breath-kf {
1515
+ 0%, 100% { opacity: 1; }
1516
+ 50% { opacity: 0.94; }
1517
+ }
1518
+ .anet-topo-chrome-layout-trailer-breath {
1519
+ animation: anet-topo-chrome-layout-trailer-breath-kf 17s ease-in-out infinite;
1520
+ }
1521
+ .anet-topo-chrome-layout-trailer-breath:has(button:hover) {
1522
+ animation: none;
1523
+ }
1524
+ @media (prefers-reduced-motion: reduce) {
1525
+ .anet-topo-chrome-layout-trailer-breath { animation: none; }
1526
+ }
1527
+
1528
+ /* Round 708 — chrome nodeSize wrapper at-rest breath at 19 s. Sibling
1529
+ to R707 Layout 17 s — both chrome control-tier wrappers carry the
1530
+ same alpha range (6%) + the same :has(button:hover) gate. Two coprime
1531
+ prime cadences (17, 19) form a chrome-control respiratory pair,
1532
+ pattern-parallel to canvas-brand-pair (R704/R705) coprime envelope
1533
+ pair. */
1534
+ @keyframes anet-topo-chrome-fleet-group-trailer-breath-kf {
1535
+ 0%, 100% { opacity: 1; }
1536
+ 50% { opacity: 0.94; }
1537
+ }
1538
+ .anet-topo-chrome-fleet-group-trailer-breath {
1539
+ animation: anet-topo-chrome-fleet-group-trailer-breath-kf 19s ease-in-out infinite;
1540
+ }
1541
+ .anet-topo-chrome-fleet-group-trailer-breath:has(button:hover) {
1542
+ animation: none;
1543
+ }
1544
+ @media (prefers-reduced-motion: reduce) {
1545
+ .anet-topo-chrome-fleet-group-trailer-breath { animation: none; }
1546
+ }
1547
+
1548
+ /* Round 709 — chrome zoom wrapper at-rest breath at 23 s. Closes the
1549
+ chrome control trio (R707 Layout 17s + R708 nodeSize 19s + R709 zoom
1550
+ 23s) with three adjacent prime coprime cadences. 23s slowest in the
1551
+ chrome trio — reads as "calm anchor for the viewport-control cluster"
1552
+ since zoom is the most functional of the 3 wrappers (its inner buttons
1553
+ compound viewport math). Same alpha (6%) + :has(button:hover) gate
1554
+ as siblings. */
1555
+ @keyframes anet-topo-chrome-zoom-wrapper-breath-kf {
1556
+ 0%, 100% { opacity: 1; }
1557
+ 50% { opacity: 0.94; }
1558
+ }
1559
+ .anet-topo-chrome-zoom-wrapper-breath {
1560
+ animation: anet-topo-chrome-zoom-wrapper-breath-kf 23s ease-in-out infinite;
1561
+ }
1562
+ .anet-topo-chrome-zoom-wrapper-breath:has(button:hover) {
1563
+ animation: none;
1564
+ }
1565
+ @media (prefers-reduced-motion: reduce) {
1566
+ .anet-topo-chrome-zoom-wrapper-breath { animation: none; }
1567
+ }
1568
+
1052
1569
  /* ─────────────────────────────────────────────────────────────────────
1053
1570
  Round 29 — prefers-reduced-motion a11y sweep
1054
1571
 
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@sleep2agi/agent-network-dashboard",
3
- "version": "0.5.3-preview.23",
4
- "description": "Agent Network Dashboard Web UI for managing AI Agent networks",
3
+ "version": "0.5.3-preview.230",
4
+ "description": "Agent Network Dashboard \u2014 Web UI for managing AI Agent networks",
5
5
  "scripts": {
6
6
  "dev": "next dev",
7
7
  "build": "next build",
8
8
  "start": "next start",
9
9
  "lint": "eslint",
10
- "prepublishOnly": "[ -f .next/BUILD_ID ] || (echo 'prepublishOnly: .next/BUILD_ID missing run npm run build first (see commit 05c1ebf body for R224 chunk-500 root cause)' >&2 && exit 1)"
10
+ "prepublishOnly": "[ -f .next/BUILD_ID ] || (echo 'prepublishOnly: .next/BUILD_ID missing \u2014 run npm run build first (see commit 05c1ebf body for R224 chunk-500 root cause)' >&2 && exit 1)"
11
11
  },
12
12
  "bin": {
13
13
  "agent-network-dashboard": "./bin/start.js"
@@ -44,4 +44,4 @@
44
44
  "tailwindcss": "^4",
45
45
  "typescript": "^5"
46
46
  }
47
- }
47
+ }
@@ -0,0 +1,107 @@
1
+ /* Round 552 verification: chrome active-variant buttons gain
2
+ * hover:text-cyan-200 lift. Coordinated 4-anchor edit:
3
+ * Ring | Grid | S/M/L | Fullscreen
4
+ *
5
+ * Test phases:
6
+ * 1. Pick an active button (Ring is active by default in ring layout)
7
+ * 2. Read rest text color (cyan-300 = rgb(103, 232, 249))
8
+ * 3. Hover → text color = cyan-200 (rgb(165, 243, 252))
9
+ * 4. Verify bg also deepened (cyan-500/20)
10
+ * 5. Source-side regex: 4 occurrences of the new className substring
11
+ */
12
+ import { chromium } from 'playwright';
13
+ import { readFileSync } from 'node:fs';
14
+
15
+ const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
16
+ const fresh = new Date(Date.now() - 60 * 1000).toISOString();
17
+
18
+ const browser = await chromium.launch({ headless: true });
19
+ const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
20
+ await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
21
+ await ctx.addInitScript(() => {
22
+ try {
23
+ localStorage.setItem('anet-theme', 'cyber');
24
+ localStorage.setItem('anet-topo-layout', 'ring');
25
+ sessionStorage.setItem('anet_v3_auth', '1');
26
+ } catch {}
27
+ });
28
+ await ctx.route('**/api/hub/status*', async (route) => {
29
+ const r = await route.fetch();
30
+ const b = await r.json();
31
+ const nid = (b.sessions || [])[0]?.network_id || 'default';
32
+ const mk = (alias) => ({
33
+ alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
34
+ network_id: nid, project_dir: null,
35
+ created_at: fresh, updated_at: fresh, last_seen_at: fresh,
36
+ });
37
+ await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1')] } });
38
+ });
39
+ await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
40
+ await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
41
+ const page = await ctx.newPage();
42
+ await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
43
+ await page.waitForSelector('[data-topo-chrome-layout="ring"]', { timeout: 15000 });
44
+ await page.waitForTimeout(500);
45
+
46
+ // Ring is active in ring layout
47
+ const sel = '[data-topo-chrome-layout="ring"]';
48
+ const rest = await page.evaluate((s) => {
49
+ const el = document.querySelector(s);
50
+ if (!el) return null;
51
+ const cs = getComputedStyle(el);
52
+ return {
53
+ color: cs.color,
54
+ bg: cs.backgroundColor,
55
+ activeAttr: el.getAttribute('data-topo-chrome-layout-active'),
56
+ };
57
+ }, sel);
58
+
59
+ await page.hover(sel);
60
+ await page.waitForTimeout(400);
61
+ const hover = await page.evaluate((s) => {
62
+ const el = document.querySelector(s);
63
+ if (!el) return null;
64
+ const cs = getComputedStyle(el);
65
+ return { color: cs.color, bg: cs.backgroundColor };
66
+ }, sel);
67
+
68
+ await browser.close();
69
+
70
+ const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
71
+ // New active-variant substring must appear 4× (Ring, Grid, S/M/L, Fullscreen)
72
+ const occurrences = (src.match(/bg-cyan-500\/15 text-cyan-300 font-medium hover:bg-cyan-500\/20 hover:text-cyan-200 active:bg-cyan-500\/25/g) || []).length;
73
+
74
+ // Tailwind v4 emits cyan-300 / cyan-200 in lab() / oklab() color
75
+ // space, not legacy rgb(). Parse the L (lightness) component and
76
+ // verify hover L > rest L (cyan-200 is lighter than cyan-300).
77
+ // Bg uses oklab with alpha; rest alpha = 0.15 (cyan-500/15), hover
78
+ // alpha = 0.2 (cyan-500/20).
79
+ const parseLab = (s) => {
80
+ const m = (s || '').match(/lab\(([0-9.]+)\s/) || (s || '').match(/oklab\(([0-9.]+)\s/);
81
+ return m ? parseFloat(m[1]) : NaN;
82
+ };
83
+ const parseAlpha = (s) => {
84
+ const m = (s || '').match(/\/\s*([0-9.]+)\)/);
85
+ return m ? parseFloat(m[1]) : NaN;
86
+ };
87
+ const restL = parseLab(rest?.color);
88
+ const hoverL = parseLab(hover?.color);
89
+ const restBgA = parseAlpha(rest?.bg);
90
+ const hoverBgA = parseAlpha(hover?.bg);
91
+
92
+ const results = {
93
+ active_attr: rest?.activeAttr === 'true',
94
+ rest_text_parsed: !Number.isNaN(restL),
95
+ hover_text_parsed: !Number.isNaN(hoverL),
96
+ hover_text_lighter_than_rest: hoverL > restL + 3, // cyan-200 L≈91 > cyan-300 L≈85
97
+ rest_bg_alpha_0_15: Math.abs(restBgA - 0.15) < 0.01,
98
+ hover_bg_alpha_0_20: Math.abs(hoverBgA - 0.20) < 0.01,
99
+ source_4_occurrences: occurrences === 4,
100
+ };
101
+ const ok = Object.values(results).every(Boolean);
102
+ console.log(`${ok ? '✅' : '❌'} R552 chrome active-variant hover:text-cyan-200 (4 anchors):`,
103
+ JSON.stringify(results, null, 2),
104
+ '\n rest:', JSON.stringify(rest),
105
+ '\n hover:', JSON.stringify(hover),
106
+ '\n source occurrences:', occurrences);
107
+ process.exit(ok ? 0 : 1);