@sleep2agi/agent-network-dashboard 0.5.3-preview.24 → 0.5.3-preview.241
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.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/diagnostics/route-bundle-stats.json +7 -7
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +2 -2
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/server/app/admin.html +2 -2
- package/.next/server/app/admin.rsc +2 -2
- package/.next/server/app/admin.segments/_full.segment.rsc +2 -2
- package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
- package/.next/server/app/admin.segments/_index.segment.rsc +2 -2
- package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +3 -3
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +2 -2
- package/.next/server/app/login.rsc +3 -3
- package/.next/server/app/login.segments/_full.segment.rsc +3 -3
- package/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/.next/server/app/login.segments/_index.segment.rsc +2 -2
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/logs.html +2 -2
- package/.next/server/app/logs.rsc +2 -2
- package/.next/server/app/logs.segments/_full.segment.rsc +2 -2
- package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
- package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
- package/.next/server/app/messages/page_client-reference-manifest.js +1 -1
- package/.next/server/app/messages.html +2 -2
- package/.next/server/app/messages.rsc +2 -2
- package/.next/server/app/messages.segments/_full.segment.rsc +2 -2
- package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
- package/.next/server/app/messages.segments/_index.segment.rsc +2 -2
- package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
- package/.next/server/app/node/page_client-reference-manifest.js +1 -1
- package/.next/server/app/node.html +2 -2
- package/.next/server/app/node.rsc +2 -2
- package/.next/server/app/node.segments/_full.segment.rsc +2 -2
- package/.next/server/app/node.segments/_head.segment.rsc +1 -1
- package/.next/server/app/node.segments/_index.segment.rsc +2 -2
- package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/node.segments/node.segment.rsc +1 -1
- package/.next/server/app/nodes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/nodes.html +2 -2
- package/.next/server/app/nodes.rsc +2 -2
- package/.next/server/app/nodes.segments/_full.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/_index.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/server-logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/server-logs.html +2 -2
- package/.next/server/app/server-logs.rsc +2 -2
- package/.next/server/app/server-logs.segments/_full.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/_index.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
- package/.next/server/app/settings/networks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/networks.html +2 -2
- package/.next/server/app/settings/networks.rsc +2 -2
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens.html +2 -2
- package/.next/server/app/settings/tokens.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
- package/.next/server/app/settings.html +2 -2
- package/.next/server/app/settings.rsc +3 -3
- package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/tasks/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tasks.html +2 -2
- package/.next/server/app/tasks.rsc +2 -2
- package/.next/server/app/tasks.segments/_full.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/_index.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0sv~g.o._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -4
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_01jhlxz._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +2 -2
- package/.next/server/pages/500.html +1 -1
- package/.next/static/chunks/024nhti9gv5nb.js +1 -0
- package/.next/static/chunks/040lvwcu-_z1_.css +2 -0
- package/.next/static/chunks/{115yobnkg0j9i.js → 0_teenxqq9lvq.js} +1 -1
- package/.next/static/chunks/0ac4j_t84kf05.js +1 -0
- package/.next/static/chunks/11zr.y3xk.6s1.js +4 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/TopoGraph.tsx +5797 -179
- package/app/globals.css +757 -7
- package/package.json +4 -4
- package/scripts/topo-active-chrome-hover-text-test.mjs +107 -0
- package/scripts/topo-active-links-chip-halo-layers-test.mjs +81 -0
- package/scripts/topo-alias-chat-brightness-test.mjs +79 -0
- package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
- package/scripts/topo-avatar-chat-gate-test.mjs +77 -0
- package/scripts/topo-avatar-drop-shadow-test.mjs +86 -0
- package/scripts/topo-avatar-fallback-hover-test.mjs +104 -0
- package/scripts/topo-avatar-fallback-rotate-test.mjs +92 -0
- package/scripts/topo-avatar-rotate-test.mjs +85 -0
- package/scripts/topo-avatar-scale-test.mjs +89 -0
- package/scripts/topo-badge-chat-gate-test.mjs +74 -0
- package/scripts/topo-brand-drop-shadow-test.mjs +71 -0
- package/scripts/topo-brand-logo-breath-test.mjs +102 -0
- package/scripts/topo-brand-logo-halo-layers-test.mjs +85 -0
- package/scripts/topo-brand-logo-hover-brightness-test.mjs +105 -0
- package/scripts/topo-brand-logo-hover-rotate-test.mjs +93 -0
- package/scripts/topo-brand-logo-hover-test.mjs +85 -0
- package/scripts/topo-card-chat-brightness-test.mjs +86 -0
- package/scripts/topo-chat-ring-breath-curve-test.mjs +114 -0
- package/scripts/topo-chat-ring-brightness-test.mjs +80 -0
- package/scripts/topo-chat-ring-halo-layers-test.mjs +100 -0
- package/scripts/topo-chat-ring-r-breath-test.mjs +121 -0
- package/scripts/topo-chat-ring-status-halo-test.mjs +106 -0
- package/scripts/topo-chat-ring-sw-breath-test.mjs +123 -0
- package/scripts/topo-chip-pin-halo-test.mjs +85 -0
- package/scripts/topo-chip-row-digit-ls-test.mjs +135 -0
- package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
- package/scripts/topo-chip-row-tier-glow-brightness-test.mjs +99 -0
- package/scripts/topo-chip-row-unit-hover-tracking-test.mjs +124 -0
- package/scripts/topo-chrome-control-halo-layers-test.mjs +22 -0
- package/scripts/topo-chrome-fullscreen-breath-test.mjs +121 -0
- package/scripts/topo-chrome-layout-trailer-breath-test.mjs +86 -0
- package/scripts/topo-chrome-nodesize-trailer-breath-test.mjs +86 -0
- package/scripts/topo-chrome-reset-breath-test.mjs +115 -0
- package/scripts/topo-chrome-wrapper-halo-test.mjs +83 -0
- package/scripts/topo-chrome-zoom-wrapper-breath-test.mjs +85 -0
- package/scripts/topo-click-ripple-glow-test.mjs +86 -0
- package/scripts/topo-click-ripple-halo-layers-test.mjs +79 -0
- package/scripts/topo-click-ripple-sw-test.mjs +110 -0
- package/scripts/topo-cluster-count-attr-test.mjs +80 -0
- package/scripts/topo-crescent-breath-test.mjs +104 -0
- package/scripts/topo-crescent-envelope-breath-test.mjs +103 -0
- package/scripts/topo-crescent-recede-test.mjs +111 -0
- package/scripts/topo-dense-alias-chat-halo-test.mjs +73 -0
- package/scripts/topo-dense-alias-halo-layers-test.mjs +80 -0
- package/scripts/topo-dual-axis-surfaces-catalog-test.mjs +94 -0
- package/scripts/topo-edge-badge-circle-brightness-test.mjs +82 -0
- package/scripts/topo-edge-badge-circle-hot-pulse-test.mjs +100 -0
- package/scripts/topo-edge-badge-digit-halo-layers-test.mjs +107 -0
- package/scripts/topo-edge-badge-endpoint-gate-test.mjs +94 -0
- package/scripts/topo-edge-badge-halo-layers-test.mjs +85 -0
- package/scripts/topo-edge-badge-hot-pulse-test.mjs +92 -0
- package/scripts/topo-edge-badge-hover-glow-test.mjs +90 -0
- package/scripts/topo-edge-badge-text-brightness-test.mjs +83 -0
- package/scripts/topo-edge-chat-gate-test.mjs +71 -0
- package/scripts/topo-edge-flow-rail-halo-layers-test.mjs +89 -0
- package/scripts/topo-edge-particle-brightness-test.mjs +82 -0
- package/scripts/topo-edge-particle-halo-layers-test.mjs +91 -0
- package/scripts/topo-edge-pill-glow-test.mjs +67 -0
- package/scripts/topo-edge-pin-halo-test.mjs +99 -0
- package/scripts/topo-edge-visible-brightness-test.mjs +84 -0
- package/scripts/topo-edge-visible-halo-layers-test.mjs +87 -0
- package/scripts/topo-endpoint-ring-brightness-test.mjs +83 -0
- package/scripts/topo-endpoint-ring-flow-halo-test.mjs +107 -0
- package/scripts/topo-endpoint-ring-halo-layers-test.mjs +100 -0
- package/scripts/topo-filter-pill-glow-test.mjs +90 -0
- package/scripts/topo-filter-pill-halo-layers-test.mjs +27 -0
- package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
- package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
- package/scripts/topo-fullscreen-attr-test.mjs +73 -0
- package/scripts/topo-fullscreen-brightness-test.mjs +84 -0
- package/scripts/topo-fullscreen-icon-rotate-test.mjs +93 -0
- package/scripts/topo-grid-content-bottom-attr-test.mjs +72 -0
- package/scripts/topo-group-box-brightness-test.mjs +84 -0
- package/scripts/topo-group-box-halo-layers-test.mjs +91 -0
- package/scripts/topo-group-chat-gate-test.mjs +77 -0
- package/scripts/topo-group-label-brightness-test.mjs +84 -0
- package/scripts/topo-group-label-halo-layers-test.mjs +78 -0
- package/scripts/topo-group-label-hover-glow-test.mjs +86 -0
- package/scripts/topo-group-label-member-alias-hover-test.mjs +125 -0
- package/scripts/topo-group-pill-glow-test.mjs +76 -0
- package/scripts/topo-group-tint-brightness-test.mjs +82 -0
- package/scripts/topo-h2-dual-axis-breath-test.mjs +92 -0
- package/scripts/topo-h2-triple-axis-breath-test.mjs +142 -0
- package/scripts/topo-halo-chat-gate-test.mjs +72 -0
- package/scripts/topo-hover-detail-halo-test.mjs +76 -0
- package/scripts/topo-hub-core-brightness-test.mjs +82 -0
- package/scripts/topo-hub-core-halo-layers-test.mjs +81 -0
- package/scripts/topo-hub-digit-brightness-test.mjs +79 -0
- package/scripts/topo-hub-digit-halo-layers-test.mjs +76 -0
- package/scripts/topo-hub-digit-ls-test.mjs +119 -0
- package/scripts/topo-hub-halo-brightness-test.mjs +80 -0
- package/scripts/topo-hub-halo-glow-test.mjs +96 -0
- package/scripts/topo-hub-halo-halo-layers-test.mjs +76 -0
- package/scripts/topo-hub-highlight-amplify-test.mjs +139 -0
- package/scripts/topo-hub-highlight-brightness-test.mjs +84 -0
- package/scripts/topo-hub-highlight-glow-test.mjs +99 -0
- package/scripts/topo-hub-highlight-halo-layers-test.mjs +78 -0
- package/scripts/topo-hub-highlight-r-test.mjs +112 -0
- package/scripts/topo-hub-highlight-recede-test.mjs +5 -1
- package/scripts/topo-hub-hover-ring-brightness-test.mjs +79 -0
- package/scripts/topo-hub-hover-ring-glow-test.mjs +97 -0
- package/scripts/topo-hub-hover-ring-halo-layers-test.mjs +71 -0
- package/scripts/topo-hub-idle-breath-test.mjs +6 -7
- package/scripts/topo-hub-spoke-brightness-test.mjs +77 -0
- package/scripts/topo-hub-spoke-glow-test.mjs +112 -0
- package/scripts/topo-hub-spoke-halo-layers-test.mjs +97 -0
- package/scripts/topo-hub-spoke-self-filter-test.mjs +119 -0
- package/scripts/topo-kicker-breath-test.mjs +100 -0
- package/scripts/topo-kicker-dual-axis-breath-test.mjs +81 -0
- package/scripts/topo-kicker-halo-layers-test.mjs +82 -0
- package/scripts/topo-kicker-triple-axis-breath-test.mjs +124 -0
- package/scripts/topo-label-card-brightness-test.mjs +81 -0
- package/scripts/topo-layout-hover-fw-test.mjs +98 -0
- package/scripts/topo-layout-toggle-brightness-test.mjs +94 -0
- package/scripts/topo-layout-toggle-halo-layers-test.mjs +95 -0
- package/scripts/topo-legend-count-brightness-test.mjs +80 -0
- package/scripts/topo-legend-count-halo-layers-test.mjs +79 -0
- package/scripts/topo-legend-count-letter-spacing-test.mjs +108 -0
- package/scripts/topo-legend-label-fw-test.mjs +107 -0
- package/scripts/topo-legend-panel-title-breath-test.mjs +86 -0
- package/scripts/topo-legend-pin-ring-brightness-test.mjs +82 -0
- package/scripts/topo-legend-pin-ring-halo-layers-test.mjs +71 -0
- package/scripts/topo-legend-row-count-brightness-test.mjs +85 -0
- package/scripts/topo-legend-row-label-glow-test.mjs +102 -0
- package/scripts/topo-legend-swatch-glow-test.mjs +109 -0
- package/scripts/topo-legend-swatch-member-alias-match-test.mjs +139 -0
- package/scripts/topo-legend-tint-brightness-test.mjs +83 -0
- package/scripts/topo-legend-trio-halo-layers-test.mjs +22 -0
- package/scripts/topo-minimap-container-halo-test.mjs +82 -0
- package/scripts/topo-minimap-dot-chat-gate-test.mjs +81 -0
- package/scripts/topo-minimap-hover-glow-test.mjs +109 -0
- package/scripts/topo-minimap-viewport-brightness-test.mjs +84 -0
- package/scripts/topo-minimap-viewport-halo-layers-test.mjs +24 -0
- package/scripts/topo-more-footer-brightness-test.mjs +94 -0
- package/scripts/topo-node-alias-brightness-test.mjs +84 -0
- package/scripts/topo-node-avatar-halo-layers-test.mjs +25 -0
- package/scripts/topo-node-hover-ring-halo-layers-test.mjs +70 -0
- package/scripts/topo-node-label-card-halo-test.mjs +76 -0
- package/scripts/topo-node-sub-text-brightness-test.mjs +88 -0
- package/scripts/topo-nodesize-brightness-test.mjs +82 -0
- package/scripts/topo-nodesize-halo-layers-test.mjs +89 -0
- package/scripts/topo-nodesize-hover-fw-test.mjs +99 -0
- package/scripts/topo-orphan-label-opacity-test.mjs +98 -0
- package/scripts/topo-panel-count-halo-layers-test.mjs +91 -0
- package/scripts/topo-panel-count-hover-ls-test.mjs +87 -0
- package/scripts/topo-panel-rect-halo-test.mjs +90 -0
- package/scripts/topo-panel-row-brightness-test.mjs +116 -0
- package/scripts/topo-panel-title-brightness-test.mjs +98 -0
- package/scripts/topo-panel-title-glow-test.mjs +111 -0
- package/scripts/topo-panel-titles-dual-axis-breath-test.mjs +94 -0
- package/scripts/topo-panel-titles-halo-layers-test.mjs +23 -0
- package/scripts/topo-pill-x-rotate-test.mjs +96 -0
- package/scripts/topo-pip-brightness-test.mjs +85 -0
- package/scripts/topo-pressure-bar-halo-layers-test.mjs +19 -0
- package/scripts/topo-pressure-seg-glow-test.mjs +92 -0
- package/scripts/topo-pressure-seg-member-alias-match-test.mjs +133 -0
- package/scripts/topo-pressure-seg-motion-test.mjs +101 -0
- package/scripts/topo-r717-triple-axis-pair-pattern-test.mjs +113 -0
- package/scripts/topo-r717-triple-axis-tier-pattern-test.mjs +115 -0
- package/scripts/topo-recent-count-brightness-test.mjs +84 -0
- package/scripts/topo-recent-more-fw-test.mjs +126 -0
- package/scripts/topo-recent-more-halo-layers-test.mjs +90 -0
- package/scripts/topo-recent-panel-hot-pulse-test.mjs +105 -0
- package/scripts/topo-recent-panel-title-breath-test.mjs +91 -0
- package/scripts/topo-recent-pip-halo-layers-test.mjs +82 -0
- package/scripts/topo-recent-row-chat-gate-test.mjs +75 -0
- package/scripts/topo-recent-row-content-lift-test.mjs +140 -0
- package/scripts/topo-recent-row-fw-test.mjs +115 -0
- package/scripts/topo-recent-row-text-glow-test.mjs +86 -0
- package/scripts/topo-recent-row-text-halo-layers-test.mjs +67 -0
- package/scripts/topo-recent-tint-brightness-test.mjs +80 -0
- package/scripts/topo-recent-ts-brightness-test.mjs +86 -0
- package/scripts/topo-reduced-motion-attr-test.mjs +69 -0
- package/scripts/topo-reset-brightness-test.mjs +83 -0
- package/scripts/topo-reset-icon-hover-scale-test.mjs +102 -0
- package/scripts/topo-respiratory-patterns-catalog-test.mjs +106 -0
- package/scripts/topo-respiratory-rolodex-test.mjs +83 -0
- package/scripts/topo-respiratory-tiers-catalog-test.mjs +119 -0
- package/scripts/topo-respiratory-triple-axis-surfaces-catalog-test.mjs +127 -0
- package/scripts/topo-runtime-badge-brightness-test.mjs +78 -0
- package/scripts/topo-runtime-badge-glow-test.mjs +108 -0
- package/scripts/topo-runtime-badge-halo-layers-test.mjs +87 -0
- package/scripts/topo-runtime-badge-rotate-test.mjs +85 -0
- package/scripts/topo-section-title-breath-test.mjs +83 -0
- package/scripts/topo-section-title-halo-layers-test.mjs +88 -0
- package/scripts/topo-spoke-chat-gate-test.mjs +72 -0
- package/scripts/topo-starfield-hue-test.mjs +109 -0
- package/scripts/topo-status-pin-pill-halo-layers-test.mjs +17 -0
- package/scripts/topo-status-ring-brightness-test.mjs +84 -0
- package/scripts/topo-status-ring-chat-gate-test.mjs +72 -0
- package/scripts/topo-status-ring-halo-layers-test.mjs +105 -0
- package/scripts/topo-status-ring-status-halo-test.mjs +110 -0
- package/scripts/topo-sub-text-chat-brightness-test.mjs +81 -0
- package/scripts/topo-title-block-envelope-breath-test.mjs +87 -0
- package/scripts/topo-titleblock-h2-hover-fw-test.mjs +109 -0
- package/scripts/topo-titleblock-h2-hover-tracking-test.mjs +128 -0
- package/scripts/topo-titleblock-kicker-hover-test.mjs +134 -0
- package/scripts/topo-vendor-chip-glow-test.mjs +97 -0
- package/scripts/topo-vendor-chip-halo-layers-test.mjs +18 -0
- package/scripts/topo-vendor-chip-pin-halo-test.mjs +88 -0
- package/scripts/topo-vendor-count-suffix-halo-layers-test.mjs +79 -0
- package/scripts/topo-vendor-distribution-wrapper-halo-test.mjs +93 -0
- package/scripts/topo-vendor-letter-halo-layers-test.mjs +93 -0
- package/scripts/topo-vendor-pill-glow-test.mjs +98 -0
- package/scripts/topo-watermark-breath-test.mjs +100 -0
- package/scripts/topo-watermark-dual-axis-breath-test.mjs +88 -0
- package/scripts/topo-watermark-envelope-breath-test.mjs +88 -0
- package/scripts/topo-watermark-recede-test.mjs +114 -0
- package/scripts/topo-watermark-triple-axis-breath-test.mjs +129 -0
- package/scripts/topo-working-online-chip-halo-layers-test.mjs +94 -0
- package/scripts/topo-zoom-buttons-brightness-test.mjs +94 -0
- package/scripts/topo-zoom-in-out-halo-layers-test.mjs +97 -0
- package/scripts/topo-zoom-level-breath-test.mjs +87 -0
- package/scripts/topo-zoom-level-brightness-test.mjs +83 -0
- package/scripts/topo-zoom-level-color-test.mjs +105 -0
- package/scripts/topo-zoom-level-dual-axis-breath-test.mjs +83 -0
- package/scripts/topo-zoom-level-halo-layers-test.mjs +78 -0
- package/scripts/topo-zoom-level-triple-axis-breath-test.mjs +143 -0
- package/.next/static/chunks/01_u86y_l.lyl.js +0 -1
- package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
- package/.next/static/chunks/0u-2pbnw428e2.js +0 -1
- package/.next/static/chunks/0yt96fzy~na3o.js +0 -4
- /package/.next/static/{Zlpna2lT3oD0Hh_j8KRN8 → fR0ebw1JI7cnTNTC-B5-l}/_buildManifest.js +0 -0
- /package/.next/static/{Zlpna2lT3oD0Hh_j8KRN8 → fR0ebw1JI7cnTNTC-B5-l}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{Zlpna2lT3oD0Hh_j8KRN8 → fR0ebw1JI7cnTNTC-B5-l}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/* Round 525 verification: brand watermark gains focal-recede on
|
|
2
|
+
* non-hub canvas hover — extends R507/R508 focal-recede pattern to
|
|
3
|
+
* 3rd anchor.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. rest: wrapper opacity=1, recede attr='false'
|
|
7
|
+
* 2. hover an alias (non-hub canvas surface): wrapper opacity=0.7,
|
|
8
|
+
* recede attr='true'
|
|
9
|
+
* 3. mouseleave: wrapper opacity returns to 1
|
|
10
|
+
* 4. SMIL <animate> still mounted on inner text (R519 preserved)
|
|
11
|
+
* 5. source-side regex confirms wrapper opacity ternary + attr
|
|
12
|
+
*/
|
|
13
|
+
import { chromium } from 'playwright';
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
|
|
16
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
17
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
18
|
+
|
|
19
|
+
const browser = await chromium.launch({ headless: true });
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript(() => {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
25
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
26
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
27
|
+
} catch {}
|
|
28
|
+
});
|
|
29
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
30
|
+
const r = await route.fetch();
|
|
31
|
+
const b = await r.json();
|
|
32
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
33
|
+
const mk = (alias) => ({
|
|
34
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
35
|
+
network_id: nid, project_dir: null,
|
|
36
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
37
|
+
});
|
|
38
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
39
|
+
mk('alpha·1'), mk('alpha·2'), mk('alpha·3'),
|
|
40
|
+
] } });
|
|
41
|
+
});
|
|
42
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
43
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
44
|
+
const page = await ctx.newPage();
|
|
45
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
46
|
+
await page.waitForSelector('[data-topo-brand-watermark-wrapper]', { timeout: 15000 });
|
|
47
|
+
await page.waitForTimeout(800);
|
|
48
|
+
|
|
49
|
+
// Phase 1: rest
|
|
50
|
+
const rest = await page.evaluate(() => {
|
|
51
|
+
const w = document.querySelector('[data-topo-brand-watermark-wrapper]');
|
|
52
|
+
const t = document.querySelector('[data-topo-brand-watermark]');
|
|
53
|
+
const animate = t?.querySelector('animate');
|
|
54
|
+
return {
|
|
55
|
+
wOpacity: w?.getAttribute('opacity'),
|
|
56
|
+
wRecede: w?.getAttribute('data-topo-brand-watermark-recede'),
|
|
57
|
+
hasAnimate: !!animate,
|
|
58
|
+
textContent: t?.textContent?.trim() || null,
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Phase 2: trigger focal-recede via hoveredStatus by hovering the
|
|
63
|
+
// legend `idle` row's label. setHoveredStatus is one of the recede
|
|
64
|
+
// gate vars; the label is a stable hover target (HTML+SVG safe per
|
|
65
|
+
// R518 test path).
|
|
66
|
+
await page.hover('[data-legend-row-label="idle"]');
|
|
67
|
+
await page.waitForTimeout(400);
|
|
68
|
+
const hover = await page.evaluate(() => {
|
|
69
|
+
const w = document.querySelector('[data-topo-brand-watermark-wrapper]');
|
|
70
|
+
return {
|
|
71
|
+
wOpacity: w?.getAttribute('opacity'),
|
|
72
|
+
wRecede: w?.getAttribute('data-topo-brand-watermark-recede'),
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Phase 3: physical mouse move far away from any hover target
|
|
77
|
+
await page.mouse.move(900, 50);
|
|
78
|
+
await page.waitForTimeout(400);
|
|
79
|
+
const leave = await page.evaluate(() => {
|
|
80
|
+
const w = document.querySelector('[data-topo-brand-watermark-wrapper]');
|
|
81
|
+
return {
|
|
82
|
+
wOpacity: w?.getAttribute('opacity'),
|
|
83
|
+
wRecede: w?.getAttribute('data-topo-brand-watermark-recede'),
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
await browser.close();
|
|
88
|
+
|
|
89
|
+
// Source regex
|
|
90
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
91
|
+
const sourceWiredOpacity =
|
|
92
|
+
/opacity=\{\(hoveredAlias \|\| hoveredEdgeKey \|\| hoveredGroupLabel \|\|\s*hoveredStatus \|\| hoveredVendor\) && !hoveredHub \? 0\.7 : 1\}/.test(src);
|
|
93
|
+
const sourceWiredAttr =
|
|
94
|
+
/data-topo-brand-watermark-recede=\{\s*\(hoveredAlias \|\| hoveredEdgeKey \|\| hoveredGroupLabel \|\|\s*hoveredStatus \|\| hoveredVendor\) && !hoveredHub \? 'true' : 'false'\s*\}/.test(src);
|
|
95
|
+
|
|
96
|
+
const results = {
|
|
97
|
+
rest_wrapper_opacity_1: rest?.wOpacity === '1',
|
|
98
|
+
rest_recede_false: rest?.wRecede === 'false',
|
|
99
|
+
rest_has_animate: rest?.hasAnimate === true, // R519 SMIL preserved
|
|
100
|
+
rest_text_content: rest?.textContent === 'sleep2agi',
|
|
101
|
+
hover_wrapper_opacity_07: hover?.wOpacity === '0.7',
|
|
102
|
+
hover_recede_true: hover?.wRecede === 'true',
|
|
103
|
+
leave_wrapper_opacity_1: leave?.wOpacity === '1',
|
|
104
|
+
leave_recede_false: leave?.wRecede === 'false',
|
|
105
|
+
source_opacity_wired: sourceWiredOpacity,
|
|
106
|
+
source_attr_wired: sourceWiredAttr,
|
|
107
|
+
};
|
|
108
|
+
const ok = Object.values(results).every(Boolean);
|
|
109
|
+
console.log(`${ok ? '✅' : '❌'} R525 watermark focal-recede:`,
|
|
110
|
+
JSON.stringify(results, null, 2),
|
|
111
|
+
'\n rest:', JSON.stringify(rest),
|
|
112
|
+
'\n hover:', JSON.stringify(hover),
|
|
113
|
+
'\n leave:', JSON.stringify(leave));
|
|
114
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/* Round 722 — watermark becomes the 2ND triple-axis breath surface.
|
|
2
|
+
* R519 SMIL opacity + R712 SMIL letter-spacing joined by R722 CSS
|
|
3
|
+
* text-shadow — all 3 axes at 6 s in phase. Together with R721 kicker
|
|
4
|
+
* they form the "6 s triple-axis PAIR" — the first multi-member
|
|
5
|
+
* triple-axis structural pattern in the family.
|
|
6
|
+
*
|
|
7
|
+
* Tuning vs kicker: blur 8px (vs 6px), alpha 0.20 (vs 0.30) — wider
|
|
8
|
+
* spread + lower alpha to register at the watermark's quieter base
|
|
9
|
+
* opacity (0.4 from R282) without overpowering.
|
|
10
|
+
*
|
|
11
|
+
* Assertions:
|
|
12
|
+
* - CSS keyframes 0%/100% has text-shadow: none
|
|
13
|
+
* - CSS keyframes 50% has text-shadow: 0 0 8px rgba(34, 211, 238, 0.20)
|
|
14
|
+
* - .anet-topo-brand-watermark-glow-breath rule binds 6s cadence
|
|
15
|
+
* - prefers-reduced-motion guard present
|
|
16
|
+
* - runtime watermark <text> has the glow class
|
|
17
|
+
* - runtime glow-breath data-attr = "6s" (or "false" if reducedMotion)
|
|
18
|
+
* - existing R519 SMIL opacity animate child still present (regression)
|
|
19
|
+
* - existing R712 SMIL letter-spacing animate child still present (regression)
|
|
20
|
+
* - R716 catalog watermark entry axes = ["opacity", "letter-spacing", "text-shadow"]
|
|
21
|
+
* - 2 surfaces now triple-axis (kicker + watermark) — 6s triple-axis PAIR
|
|
22
|
+
*/
|
|
23
|
+
import { chromium } from 'playwright';
|
|
24
|
+
import { readFileSync } from 'node:fs';
|
|
25
|
+
|
|
26
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
27
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
28
|
+
|
|
29
|
+
const browser = await chromium.launch({ headless: true });
|
|
30
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
31
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
32
|
+
await ctx.addInitScript(() => {
|
|
33
|
+
try {
|
|
34
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
35
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
36
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
37
|
+
} catch {}
|
|
38
|
+
});
|
|
39
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
40
|
+
const r = await route.fetch();
|
|
41
|
+
const b = await r.json();
|
|
42
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
43
|
+
const mk = (alias) => ({
|
|
44
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
45
|
+
network_id: nid, project_dir: null,
|
|
46
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
47
|
+
});
|
|
48
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
49
|
+
});
|
|
50
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
51
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
52
|
+
const page = await ctx.newPage();
|
|
53
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
54
|
+
await page.waitForSelector('[data-topo-brand-watermark]', { timeout: 15000, state: 'attached' });
|
|
55
|
+
await page.waitForTimeout(300);
|
|
56
|
+
|
|
57
|
+
const runtimeState = await page.evaluate(() => {
|
|
58
|
+
const wm = document.querySelector('[data-topo-brand-watermark]');
|
|
59
|
+
if (!wm) return null;
|
|
60
|
+
const cs = getComputedStyle(wm);
|
|
61
|
+
const smilOpacity = wm.querySelector('animate[attributeName="opacity"]');
|
|
62
|
+
const smilLetterSpace = wm.querySelector('animate[attributeName="letter-spacing"]');
|
|
63
|
+
const svg = document.querySelector('[data-topo-canvas-aria]');
|
|
64
|
+
return {
|
|
65
|
+
has_glow_class: wm.classList.contains('anet-topo-brand-watermark-glow-breath'),
|
|
66
|
+
glow_attr: wm.getAttribute('data-topo-brand-watermark-glow-breath'),
|
|
67
|
+
anim_name: cs.animationName,
|
|
68
|
+
anim_duration: cs.animationDuration,
|
|
69
|
+
smil_opacity_present: !!smilOpacity,
|
|
70
|
+
smil_opacity_dur: smilOpacity?.getAttribute('dur'),
|
|
71
|
+
smil_letter_present: !!smilLetterSpace,
|
|
72
|
+
smil_letter_dur: smilLetterSpace?.getAttribute('dur'),
|
|
73
|
+
catalog: svg?.getAttribute('data-topo-respiratory-dual-axis-surfaces') ?? null,
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
await browser.close();
|
|
78
|
+
|
|
79
|
+
const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
|
|
80
|
+
const cssKfNone = /@keyframes anet-topo-brand-watermark-glow-breath-kf\s*\{[\s\S]*?0%,\s*100%\s*\{[\s\S]*?text-shadow:\s*none/.test(cssSrc);
|
|
81
|
+
const cssKfGlow = /@keyframes anet-topo-brand-watermark-glow-breath-kf\s*\{[\s\S]*?50%\s*\{[\s\S]*?text-shadow:\s*0\s+0\s+8px\s+rgba\(34,\s*211,\s*238,\s*0\.20\)/.test(cssSrc);
|
|
82
|
+
const cssClassBound6s = /\.anet-topo-brand-watermark-glow-breath\s*\{[\s\S]*?animation:\s*anet-topo-brand-watermark-glow-breath-kf\s+6s\s+ease-in-out\s+infinite/.test(cssSrc);
|
|
83
|
+
const cssReducedMotion = /@media\s*\(prefers-reduced-motion:\s*reduce\)\s*\{[\s\S]*?\.anet-topo-brand-watermark-glow-breath\s*\{\s*animation:\s*none/.test(cssSrc);
|
|
84
|
+
|
|
85
|
+
const runtimeAnimOk = runtimeState?.anim_name === 'anet-topo-brand-watermark-glow-breath-kf' || runtimeState?.anim_name === 'none';
|
|
86
|
+
|
|
87
|
+
let catalog = null;
|
|
88
|
+
try { catalog = JSON.parse(runtimeState?.catalog ?? ''); } catch {}
|
|
89
|
+
const wmEntry = Array.isArray(catalog) ? catalog.find(e => e.anchor === 'watermark') : null;
|
|
90
|
+
const wmTripleAxes = !!wmEntry
|
|
91
|
+
&& Array.isArray(wmEntry.axes)
|
|
92
|
+
&& wmEntry.axes.length === 3
|
|
93
|
+
&& JSON.stringify(wmEntry.axes) === JSON.stringify(['opacity', 'letter-spacing', 'text-shadow']);
|
|
94
|
+
|
|
95
|
+
const tripleAxisSurfaces = Array.isArray(catalog)
|
|
96
|
+
? catalog.filter(e => Array.isArray(e.axes) && e.axes.length === 3)
|
|
97
|
+
: [];
|
|
98
|
+
const tripleAxisAnchorsSorted = tripleAxisSurfaces.map(e => e.anchor).sort();
|
|
99
|
+
/* R725 added H2 as a 3rd triple-axis surface at 10 s — the "6 s pair"
|
|
100
|
+
* subset still exists (kicker + watermark @ 6 s), but the catalog
|
|
101
|
+
* has 3 total entries now. Widen the assertion to verify the 6 s
|
|
102
|
+
* pair SUBSET is intact rather than asserting it's the whole set. */
|
|
103
|
+
const sixSecondMembers = tripleAxisSurfaces.filter(e => e.cadence_s === 6);
|
|
104
|
+
const sixSecondAnchorsSorted = sixSecondMembers.map(e => e.anchor).sort();
|
|
105
|
+
const triple6sPair =
|
|
106
|
+
sixSecondMembers.length === 2
|
|
107
|
+
&& JSON.stringify(sixSecondAnchorsSorted) === JSON.stringify(['kicker', 'watermark']);
|
|
108
|
+
|
|
109
|
+
const results = {
|
|
110
|
+
watermark_present: !!runtimeState,
|
|
111
|
+
has_glow_class: runtimeState?.has_glow_class === true,
|
|
112
|
+
glow_attr_6s: runtimeState?.glow_attr === '6s',
|
|
113
|
+
runtime_anim_kf: runtimeAnimOk,
|
|
114
|
+
css_keyframes_norm_none: cssKfNone,
|
|
115
|
+
css_keyframes_mid_glow: cssKfGlow,
|
|
116
|
+
css_class_binds_6s: cssClassBound6s,
|
|
117
|
+
css_reduced_motion_guard: cssReducedMotion,
|
|
118
|
+
r519_smil_opacity_kept: runtimeState?.smil_opacity_present === true && runtimeState?.smil_opacity_dur === '6s',
|
|
119
|
+
r712_smil_letter_kept: runtimeState?.smil_letter_present === true && runtimeState?.smil_letter_dur === '6s',
|
|
120
|
+
catalog_watermark_three_axes: wmTripleAxes,
|
|
121
|
+
triple_axis_pair_6s: triple6sPair,
|
|
122
|
+
};
|
|
123
|
+
const ok = Object.values(results).every(Boolean);
|
|
124
|
+
console.log(`${ok ? '✅' : '❌'} R722 watermark triple-axis breath (2nd triple-axis surface, 6s triple-axis PAIR with kicker):`,
|
|
125
|
+
JSON.stringify(results, null, 2),
|
|
126
|
+
`\n watermark entry: ${JSON.stringify(wmEntry)}`,
|
|
127
|
+
`\n triple-axis surfaces: ${JSON.stringify(tripleAxisAnchorsSorted)}`,
|
|
128
|
+
`\n runtime: ${JSON.stringify({ anim_name: runtimeState?.anim_name, anim_duration: runtimeState?.anim_duration, smil_opacity: runtimeState?.smil_opacity_dur, smil_letter: runtimeState?.smil_letter_dur })}`);
|
|
129
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/* Round 687 — working + online chips extend from 4 hover axes (bg/
|
|
2
|
+
* border swap + translate-y + active scale) to add multi-layer halo
|
|
3
|
+
* paint axis. Per-tier tints — green-400 #4ade80 for working chip,
|
|
4
|
+
* cyan-300 #67e8f9 for online chip — match the existing pinnedStatus
|
|
5
|
+
* boxShadow inset rings. 2+4 stride, alpha 80/40. Sibling extension
|
|
6
|
+
* to R686 active-links chip; closes chip-row left-side trio
|
|
7
|
+
* (working + online + active-links) at halo-axis parity.
|
|
8
|
+
*
|
|
9
|
+
* Source assertions:
|
|
10
|
+
* - working chip filter: pal green-400 #4ade80 80/40 2+4 stride
|
|
11
|
+
* - online chip filter: pal cyan-300 #67e8f9 80/40 2+4 stride
|
|
12
|
+
* - both halo-layers attrs toggle '2' ↔ '0' on respective gates
|
|
13
|
+
*
|
|
14
|
+
* Runtime assertions:
|
|
15
|
+
* - both chips present
|
|
16
|
+
* - rest halo-layers='0' on both
|
|
17
|
+
* - mock sessions ensure both chips are interactive (workingCount + onlineNodes > 0)
|
|
18
|
+
*/
|
|
19
|
+
import { chromium } from 'playwright';
|
|
20
|
+
import { readFileSync } from 'node:fs';
|
|
21
|
+
|
|
22
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
23
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
24
|
+
|
|
25
|
+
const browser = await chromium.launch({ headless: true });
|
|
26
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
27
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
28
|
+
await ctx.addInitScript(() => {
|
|
29
|
+
try {
|
|
30
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
31
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
32
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
33
|
+
} catch {}
|
|
34
|
+
});
|
|
35
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
36
|
+
const r = await route.fetch();
|
|
37
|
+
const b = await r.json();
|
|
38
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
39
|
+
const mk = (alias, status) => ({
|
|
40
|
+
alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
41
|
+
network_id: nid, project_dir: null,
|
|
42
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
43
|
+
});
|
|
44
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
45
|
+
mk('a·1', 'working'),
|
|
46
|
+
mk('a·2', 'idle'),
|
|
47
|
+
mk('a·3', 'idle'),
|
|
48
|
+
] } });
|
|
49
|
+
});
|
|
50
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
51
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
52
|
+
const page = await ctx.newPage();
|
|
53
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
54
|
+
await page.waitForSelector('[data-working-chip]', { timeout: 15000, state: 'attached' });
|
|
55
|
+
await page.waitForTimeout(300);
|
|
56
|
+
|
|
57
|
+
const runtimeState = await page.evaluate(() => {
|
|
58
|
+
const working = document.querySelector('[data-working-chip]');
|
|
59
|
+
const online = document.querySelector('[data-online-chip]');
|
|
60
|
+
return {
|
|
61
|
+
working_present: !!working,
|
|
62
|
+
online_present: !!online,
|
|
63
|
+
working_halo: working?.getAttribute('data-working-chip-halo-layers'),
|
|
64
|
+
online_halo: online?.getAttribute('data-online-chip-halo-layers'),
|
|
65
|
+
working_click: working?.getAttribute('data-working-chip-clickable'),
|
|
66
|
+
online_click: online?.getAttribute('data-online-chip-clickable'),
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
await browser.close();
|
|
71
|
+
|
|
72
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
73
|
+
const sourceWorkingFilter = /filter: hoveredStatus === 'working' && workingCount > 0\s*\?\s*'drop-shadow\(0 0 2px #4ade8080\) drop-shadow\(0 0 4px #4ade8040\)'/.test(src);
|
|
74
|
+
const sourceOnlineFilter = /filter: \(hoveredStatus === 'working' \|\| hoveredStatus === 'idle'\) && onlineNodes\.length > 0\s*\?\s*'drop-shadow\(0 0 2px #67e8f980\) drop-shadow\(0 0 4px #67e8f940\)'/.test(src);
|
|
75
|
+
const sourceWorkingAttr = /data-working-chip-halo-layers=\{hoveredStatus === 'working' && workingCount > 0 \? '2' : '0'\}/.test(src);
|
|
76
|
+
const sourceOnlineAttr = /data-online-chip-halo-layers=\{\(hoveredStatus === 'working' \|\| hoveredStatus === 'idle'\) && onlineNodes\.length > 0 \? '2' : '0'\}/.test(src);
|
|
77
|
+
|
|
78
|
+
const results = {
|
|
79
|
+
working_present: runtimeState.working_present,
|
|
80
|
+
online_present: runtimeState.online_present,
|
|
81
|
+
rest_working_layers_0: runtimeState.working_halo === '0',
|
|
82
|
+
rest_online_layers_0: runtimeState.online_halo === '0',
|
|
83
|
+
working_interactive: runtimeState.working_click === 'true',
|
|
84
|
+
online_interactive: runtimeState.online_click === 'true',
|
|
85
|
+
source_working_filter: sourceWorkingFilter,
|
|
86
|
+
source_online_filter: sourceOnlineFilter,
|
|
87
|
+
source_working_attr: sourceWorkingAttr,
|
|
88
|
+
source_online_attr: sourceOnlineAttr,
|
|
89
|
+
};
|
|
90
|
+
const ok = Object.values(results).every(Boolean);
|
|
91
|
+
console.log(`${ok ? '✅' : '❌'} R687 working+online chip multi-layer halo (closes chip-row left-side trio):`,
|
|
92
|
+
JSON.stringify(results, null, 2),
|
|
93
|
+
`\n runtime: ${JSON.stringify(runtimeState)}`);
|
|
94
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/* Round 596 verification: chrome zoom +/- segmented buttons
|
|
2
|
+
* gain hover:brightness-[1.15] via Tailwind class. 35th + 36th
|
|
3
|
+
* anchors in per-element brightness family (4th + 5th HTML).
|
|
4
|
+
* Paired-anchor round closing the zoom control trio.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. mock nodes → chrome zoom buttons render
|
|
8
|
+
* 2. rest: filter='none' (CSS hover-only, no React state)
|
|
9
|
+
* 3. computed transition-property contains 'filter'
|
|
10
|
+
* 4. source: hover:brightness-[1.15] in className + arbitrary
|
|
11
|
+
* transition-property includes filter
|
|
12
|
+
*/
|
|
13
|
+
import { chromium } from 'playwright';
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
|
|
16
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
17
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
18
|
+
|
|
19
|
+
const browser = await chromium.launch({ headless: true });
|
|
20
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
21
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
22
|
+
await ctx.addInitScript(() => {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
25
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
26
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
27
|
+
} catch {}
|
|
28
|
+
});
|
|
29
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
30
|
+
const r = await route.fetch();
|
|
31
|
+
const b = await r.json();
|
|
32
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
33
|
+
const mk = (alias) => ({
|
|
34
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
35
|
+
network_id: nid, project_dir: null,
|
|
36
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
37
|
+
});
|
|
38
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
39
|
+
});
|
|
40
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
41
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
42
|
+
const page = await ctx.newPage();
|
|
43
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
44
|
+
await page.waitForSelector('[data-topo-chrome-zoom-out]', { timeout: 15000, state: 'attached' });
|
|
45
|
+
await page.waitForTimeout(500);
|
|
46
|
+
|
|
47
|
+
const rest = await page.evaluate(() => {
|
|
48
|
+
const zoomOut = document.querySelector('[data-topo-chrome-zoom-out]');
|
|
49
|
+
const zoomIn = document.querySelector('[data-topo-chrome-zoom-in]');
|
|
50
|
+
if (!zoomOut || !zoomIn) return null;
|
|
51
|
+
return {
|
|
52
|
+
zoomOut: {
|
|
53
|
+
filter: getComputedStyle(zoomOut).filter,
|
|
54
|
+
transitionProperty: getComputedStyle(zoomOut).transitionProperty,
|
|
55
|
+
brightnessHoverAttr: zoomOut.getAttribute('data-topo-chrome-zoom-out-brightness-hover'),
|
|
56
|
+
ariaLabel: zoomOut.getAttribute('aria-label'),
|
|
57
|
+
},
|
|
58
|
+
zoomIn: {
|
|
59
|
+
filter: getComputedStyle(zoomIn).filter,
|
|
60
|
+
transitionProperty: getComputedStyle(zoomIn).transitionProperty,
|
|
61
|
+
brightnessHoverAttr: zoomIn.getAttribute('data-topo-chrome-zoom-in-brightness-hover'),
|
|
62
|
+
ariaLabel: zoomIn.getAttribute('aria-label'),
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
await browser.close();
|
|
68
|
+
|
|
69
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
70
|
+
const sourceOutFilter = /data-topo-chrome-zoom-out[\s\S]*?hover:brightness-\[1\.15\]/.test(src);
|
|
71
|
+
const sourceInFilter = /data-topo-chrome-zoom-in[\s\S]*?hover:brightness-\[1\.15\]/.test(src);
|
|
72
|
+
const sourceOutTransition = /data-topo-chrome-zoom-out[\s\S]*?\[transition-property:color,background-color,transform,filter\]/.test(src);
|
|
73
|
+
const sourceInTransition = /data-topo-chrome-zoom-in[\s\S]*?\[transition-property:color,background-color,transform,filter\]/.test(src);
|
|
74
|
+
|
|
75
|
+
const results = {
|
|
76
|
+
both_buttons_present: !!rest,
|
|
77
|
+
out_rest_filter_none: rest?.zoomOut.filter === 'none',
|
|
78
|
+
in_rest_filter_none: rest?.zoomIn.filter === 'none',
|
|
79
|
+
out_hover_attr: rest?.zoomOut.brightnessHoverAttr === '1.15',
|
|
80
|
+
in_hover_attr: rest?.zoomIn.brightnessHoverAttr === '1.15',
|
|
81
|
+
out_aria_zoom_out: /zoom out/i.test(rest?.zoomOut.ariaLabel || ''),
|
|
82
|
+
in_aria_zoom_in: /zoom in/i.test(rest?.zoomIn.ariaLabel || ''),
|
|
83
|
+
out_transition_filter: /filter/.test(rest?.zoomOut.transitionProperty || ''),
|
|
84
|
+
in_transition_filter: /filter/.test(rest?.zoomIn.transitionProperty || ''),
|
|
85
|
+
source_out_filter: sourceOutFilter,
|
|
86
|
+
source_in_filter: sourceInFilter,
|
|
87
|
+
source_out_transition: sourceOutTransition,
|
|
88
|
+
source_in_transition: sourceInTransition,
|
|
89
|
+
};
|
|
90
|
+
const ok = Object.values(results).every(Boolean);
|
|
91
|
+
console.log(`${ok ? '✅' : '❌'} R596 zoom +/- brightness (35+36th anchors, zoom trio closure):`,
|
|
92
|
+
JSON.stringify(results, null, 2),
|
|
93
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
94
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/* Round 673 — chrome zoom-in + zoom-out buttons gain multi-layer
|
|
2
|
+
* halo on hover via new hoveredZoomIn / hoveredZoomOut state. Pre-
|
|
3
|
+
* R673 these buttons had only Tailwind hover:brightness-[1.15] (R596)
|
|
4
|
+
* — a single-axis paint lift. Post-R673 inline filter uses the same
|
|
5
|
+
* 2+4 stride at pal.legendAccent tint as R667 reset+fullscreen and
|
|
6
|
+
* R668 zoom-level pill. The chrome zoom-strip (zoom-out + zoom-level
|
|
7
|
+
* + zoom-in) is now FULLY halo-extended at all 3 controls.
|
|
8
|
+
*
|
|
9
|
+
* 32nd anchor in multi-layer halo family (paired sibling extension).
|
|
10
|
+
*
|
|
11
|
+
* Source assertions:
|
|
12
|
+
* - useState pair for hoveredZoomIn / hoveredZoomOut
|
|
13
|
+
* - both buttons' onMouseEnter/Leave wired
|
|
14
|
+
* - both inline filters use pal.legendAccent 2+4 stride alpha 80/40
|
|
15
|
+
* - data-topo-chrome-zoom-{in,out}-halo-layers attrs toggle '2'/'0'
|
|
16
|
+
*
|
|
17
|
+
* Runtime assertions:
|
|
18
|
+
* - both buttons present in DOM
|
|
19
|
+
* - rest state: halo-layers='0' on both
|
|
20
|
+
*/
|
|
21
|
+
import { chromium } from 'playwright';
|
|
22
|
+
import { readFileSync } from 'node:fs';
|
|
23
|
+
|
|
24
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
25
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
26
|
+
|
|
27
|
+
const browser = await chromium.launch({ headless: true });
|
|
28
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
29
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
30
|
+
await ctx.addInitScript(() => {
|
|
31
|
+
try {
|
|
32
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
33
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
34
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
35
|
+
} catch {}
|
|
36
|
+
});
|
|
37
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
38
|
+
const r = await route.fetch();
|
|
39
|
+
const b = await r.json();
|
|
40
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
41
|
+
const mk = (alias) => ({
|
|
42
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
43
|
+
network_id: nid, project_dir: null,
|
|
44
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
45
|
+
});
|
|
46
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
47
|
+
});
|
|
48
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
49
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
50
|
+
const page = await ctx.newPage();
|
|
51
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
52
|
+
await page.waitForSelector('[data-topo-chrome-zoom-in-halo-layers]', { timeout: 15000, state: 'attached' });
|
|
53
|
+
await page.waitForTimeout(500);
|
|
54
|
+
|
|
55
|
+
const restState = await page.evaluate(() => {
|
|
56
|
+
const zin = document.querySelector('[data-topo-chrome-zoom-in-halo-layers]');
|
|
57
|
+
const zout = document.querySelector('[data-topo-chrome-zoom-out-halo-layers]');
|
|
58
|
+
return {
|
|
59
|
+
zin_present: !!zin,
|
|
60
|
+
zout_present: !!zout,
|
|
61
|
+
zin_layers: zin?.getAttribute('data-topo-chrome-zoom-in-halo-layers'),
|
|
62
|
+
zout_layers: zout?.getAttribute('data-topo-chrome-zoom-out-halo-layers'),
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
await browser.close();
|
|
67
|
+
|
|
68
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
69
|
+
const sourceState = /const \[hoveredZoomIn, setHoveredZoomIn\] = useState\(false\);/.test(src) &&
|
|
70
|
+
/const \[hoveredZoomOut, setHoveredZoomOut\] = useState\(false\);/.test(src);
|
|
71
|
+
const sourceZinHandler = /onMouseEnter=\{\(\) => setHoveredZoomIn\(true\)\}/.test(src) &&
|
|
72
|
+
/onMouseLeave=\{\(\) => setHoveredZoomIn\(false\)\}/.test(src);
|
|
73
|
+
const sourceZoutHandler = /onMouseEnter=\{\(\) => setHoveredZoomOut\(true\)\}/.test(src) &&
|
|
74
|
+
/onMouseLeave=\{\(\) => setHoveredZoomOut\(false\)\}/.test(src);
|
|
75
|
+
const sourceZinFilter = /filter: hoveredZoomIn \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
|
|
76
|
+
const sourceZoutFilter = /filter: hoveredZoomOut \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
|
|
77
|
+
const sourceZinAttr = /data-topo-chrome-zoom-in-halo-layers=\{hoveredZoomIn \? '2' : '0'\}/.test(src);
|
|
78
|
+
const sourceZoutAttr = /data-topo-chrome-zoom-out-halo-layers=\{hoveredZoomOut \? '2' : '0'\}/.test(src);
|
|
79
|
+
|
|
80
|
+
const results = {
|
|
81
|
+
zin_present: restState.zin_present,
|
|
82
|
+
zout_present: restState.zout_present,
|
|
83
|
+
rest_zin_layers_0: restState.zin_layers === '0',
|
|
84
|
+
rest_zout_layers_0: restState.zout_layers === '0',
|
|
85
|
+
source_state: sourceState,
|
|
86
|
+
source_zin_handler: sourceZinHandler,
|
|
87
|
+
source_zout_handler:sourceZoutHandler,
|
|
88
|
+
source_zin_filter: sourceZinFilter,
|
|
89
|
+
source_zout_filter: sourceZoutFilter,
|
|
90
|
+
source_zin_attr: sourceZinAttr,
|
|
91
|
+
source_zout_attr: sourceZoutAttr,
|
|
92
|
+
};
|
|
93
|
+
const ok = Object.values(results).every(Boolean);
|
|
94
|
+
console.log(`${ok ? '✅' : '❌'} R673 chrome zoom-in/-out multi-layer halo (completes chrome zoom-strip trio):`,
|
|
95
|
+
JSON.stringify(results, null, 2),
|
|
96
|
+
`\n rest: ${JSON.stringify(restState)}`);
|
|
97
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/* Round 703 — chrome zoom-level readout at-rest breath. 9s slot in the
|
|
2
|
+
* respiratory rolodex between 8s panel titles and 10s H2. Hover gate
|
|
3
|
+
* via data-topo-chrome-zoom-level-hover="true" → animation: none, so
|
|
4
|
+
* the existing 4-axis hover lift takes precedence cleanly.
|
|
5
|
+
*/
|
|
6
|
+
import { chromium } from 'playwright';
|
|
7
|
+
import { readFileSync } from 'node:fs';
|
|
8
|
+
|
|
9
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
10
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
11
|
+
|
|
12
|
+
const browser = await chromium.launch({ headless: true });
|
|
13
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
14
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
15
|
+
await ctx.addInitScript(() => {
|
|
16
|
+
try {
|
|
17
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
18
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
19
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
20
|
+
} catch {}
|
|
21
|
+
});
|
|
22
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
23
|
+
const r = await route.fetch();
|
|
24
|
+
const b = await r.json();
|
|
25
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
26
|
+
const mk = (alias) => ({
|
|
27
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
28
|
+
network_id: nid, project_dir: null,
|
|
29
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
30
|
+
});
|
|
31
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
32
|
+
});
|
|
33
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
34
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
35
|
+
const page = await ctx.newPage();
|
|
36
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
37
|
+
await page.waitForSelector('[data-topo-chrome-zoom-level]', { timeout: 15000, state: 'attached' });
|
|
38
|
+
await page.waitForTimeout(300);
|
|
39
|
+
|
|
40
|
+
const runtimeState = await page.evaluate(() => {
|
|
41
|
+
const span = document.querySelector('[data-topo-chrome-zoom-level]');
|
|
42
|
+
if (!span) return null;
|
|
43
|
+
const cs = getComputedStyle(span);
|
|
44
|
+
return {
|
|
45
|
+
has_class: span.classList.contains('anet-topo-chrome-zoom-level-breath'),
|
|
46
|
+
breath_attr: span.getAttribute('data-topo-chrome-zoom-level-breath'),
|
|
47
|
+
hover_attr: span.getAttribute('data-topo-chrome-zoom-level-hover'),
|
|
48
|
+
anim_name: cs.animationName,
|
|
49
|
+
anim_duration: cs.animationDuration,
|
|
50
|
+
anim_iter: cs.animationIterationCount,
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
await browser.close();
|
|
55
|
+
|
|
56
|
+
const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
|
|
57
|
+
const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
58
|
+
|
|
59
|
+
const cssKeyframes = /@keyframes anet-topo-chrome-zoom-level-breath-kf\s*\{[\s\S]*?0%, 100%\s*\{\s*opacity:\s*1;\s*\}[\s\S]*?50%\s*\{\s*opacity:\s*0\.85;/.test(cssSrc);
|
|
60
|
+
const cssRule = /\.anet-topo-chrome-zoom-level-breath\s*\{[\s\S]*?animation:\s*anet-topo-chrome-zoom-level-breath-kf\s+9s\s+ease-in-out\s+infinite/.test(cssSrc);
|
|
61
|
+
const cssHoverGate = /\.anet-topo-chrome-zoom-level-breath\[data-topo-chrome-zoom-level-hover="true"\]\s*\{\s*animation:\s*none/.test(cssSrc);
|
|
62
|
+
const cssReducedMotion = /prefers-reduced-motion:\s*reduce\s*\)\s*\{\s*\.anet-topo-chrome-zoom-level-breath\s*\{\s*animation:\s*none/.test(cssSrc);
|
|
63
|
+
const tsxClass = /anet-topo-chrome-zoom-level-breath px-2 py-1/.test(tsxSrc);
|
|
64
|
+
const tsxAttr = /data-topo-chrome-zoom-level-breath="9s"/.test(tsxSrc);
|
|
65
|
+
|
|
66
|
+
const runtimeAnim = runtimeState?.anim_name === 'anet-topo-chrome-zoom-level-breath-kf' || runtimeState?.anim_name === 'none';
|
|
67
|
+
const runtimeDuration = runtimeState?.anim_duration === '9s' || runtimeState?.anim_name === 'none';
|
|
68
|
+
|
|
69
|
+
const results = {
|
|
70
|
+
span_present: !!runtimeState,
|
|
71
|
+
has_breath_class: runtimeState?.has_class === true,
|
|
72
|
+
breath_attr_9s: runtimeState?.breath_attr === '9s',
|
|
73
|
+
rest_not_hover: runtimeState?.hover_attr === 'false',
|
|
74
|
+
runtime_anim_ok: runtimeAnim,
|
|
75
|
+
runtime_duration_ok: runtimeDuration,
|
|
76
|
+
css_keyframes: cssKeyframes,
|
|
77
|
+
css_rule: cssRule,
|
|
78
|
+
css_hover_gate: cssHoverGate,
|
|
79
|
+
css_reduced_motion: cssReducedMotion,
|
|
80
|
+
tsx_class: tsxClass,
|
|
81
|
+
tsx_breath_attr: tsxAttr,
|
|
82
|
+
};
|
|
83
|
+
const ok = Object.values(results).every(Boolean);
|
|
84
|
+
console.log(`${ok ? '✅' : '❌'} R703 chrome zoom-level readout at-rest breath (9s, hover-gated):`,
|
|
85
|
+
JSON.stringify(results, null, 2),
|
|
86
|
+
`\n runtime: ${JSON.stringify(runtimeState)}`);
|
|
87
|
+
process.exit(ok ? 0 : 1);
|