@sleep2agi/agent-network-dashboard 0.5.3-preview.22 → 0.5.3-preview.221
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/{0l440-mv.tqcj.js → 01y2e_k826-.6.js} +1 -1
- package/.next/static/chunks/0l2u50d_2k5uz.js +4 -0
- package/.next/static/chunks/0u-m.q18hv~8~.js +1 -0
- package/.next/static/chunks/10~rut8fhur6w.css +2 -0
- package/.next/static/chunks/14_qeodw_r83j.js +1 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/TopoGraph.tsx +5425 -177
- package/app/globals.css +405 -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-layout-trailer-breath-test.mjs +86 -0
- package/scripts/topo-chrome-wrapper-halo-test.mjs +83 -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-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-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-fill-transition-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-highlight-theme-fill-test.mjs +83 -0
- 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-halo-layers-test.mjs +82 -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-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-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-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-envelope-breath-test.mjs +88 -0
- package/scripts/topo-watermark-recede-test.mjs +114 -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-halo-layers-test.mjs +78 -0
- package/.next/static/chunks/0g2t4ytep_laz.js +0 -4
- package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
- package/.next/static/chunks/0zm6yg97ubkp5.js +0 -1
- package/.next/static/chunks/1867gm.v~vka2.js +0 -1
- /package/.next/static/{oGQapRVlgbDN-Wxb5B4gq → 1PfQhDLU997pzw51rqEG8}/_buildManifest.js +0 -0
- /package/.next/static/{oGQapRVlgbDN-Wxb5B4gq → 1PfQhDLU997pzw51rqEG8}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{oGQapRVlgbDN-Wxb5B4gq → 1PfQhDLU997pzw51rqEG8}/_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
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
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,379 @@ 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
|
+
@keyframes anet-topo-kicker-breath-kf {
|
|
1289
|
+
0%, 100% { opacity: 1; }
|
|
1290
|
+
50% { opacity: 0.78; }
|
|
1291
|
+
}
|
|
1292
|
+
.anet-topo-kicker-breath {
|
|
1293
|
+
animation: anet-topo-kicker-breath-kf 6s ease-in-out infinite;
|
|
1294
|
+
}
|
|
1295
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1296
|
+
.anet-topo-kicker-breath { animation: none; }
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
/* Round 702 — H2 "Command mesh" at-rest breathing fade, completing the
|
|
1300
|
+
title-block respiratory trio (brand-logo 5 s / kicker 6 s / H2 10 s).
|
|
1301
|
+
Tighter alpha range (0.88 ↔ 1, ~12%) vs the kicker (0.78 ↔ 1, ~22%):
|
|
1302
|
+
H2 carries more visual weight, so a gentler breath keeps it from
|
|
1303
|
+
looking flickery. Slowest in the trio — 10 s reads as calm anchoring,
|
|
1304
|
+
not anxious. prefers-reduced-motion: reduce → animation: none,
|
|
1305
|
+
sibling to the R699 kicker guard. */
|
|
1306
|
+
@keyframes anet-topo-section-title-breath-kf {
|
|
1307
|
+
0%, 100% { opacity: 1; }
|
|
1308
|
+
50% { opacity: 0.88; }
|
|
1309
|
+
}
|
|
1310
|
+
.anet-topo-section-title-breath {
|
|
1311
|
+
animation: anet-topo-section-title-breath-kf 10s ease-in-out infinite;
|
|
1312
|
+
}
|
|
1313
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1314
|
+
.anet-topo-section-title-breath { animation: none; }
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
/* Round 703 — chrome zoom-level readout at-rest breath. 9 s cadence sits
|
|
1318
|
+
between the 8 s panel titles and the 10 s H2 in the respiratory
|
|
1319
|
+
rolodex. Tighter alpha range (0.85 ↔ 1, ~15%) than the kicker —
|
|
1320
|
+
readout carries tabular numeric data, so it shouldn't drift too far
|
|
1321
|
+
from full opacity. Hover gate via the data attribute: when
|
|
1322
|
+
data-topo-chrome-zoom-level-hover="true", animation: none, and the
|
|
1323
|
+
existing R347 ls + R420 fw + R517 color + R593 brightness + R668
|
|
1324
|
+
halo 4-axis lift takes precedence cleanly. prefers-reduced-motion:
|
|
1325
|
+
reduce neutralizes, sibling to R699/R702 guards. */
|
|
1326
|
+
@keyframes anet-topo-chrome-zoom-level-breath-kf {
|
|
1327
|
+
0%, 100% { opacity: 1; }
|
|
1328
|
+
50% { opacity: 0.85; }
|
|
1329
|
+
}
|
|
1330
|
+
.anet-topo-chrome-zoom-level-breath {
|
|
1331
|
+
animation: anet-topo-chrome-zoom-level-breath-kf 9s ease-in-out infinite;
|
|
1332
|
+
}
|
|
1333
|
+
.anet-topo-chrome-zoom-level-breath[data-topo-chrome-zoom-level-hover="true"] {
|
|
1334
|
+
animation: none;
|
|
1335
|
+
}
|
|
1336
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1337
|
+
.anet-topo-chrome-zoom-level-breath { animation: none; }
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1340
|
+
/* Round 704 — brand watermark WRAPPER envelope breath at 15 s — slowest
|
|
1341
|
+
tier in the respiratory rolodex. Inner "sleep2agi" text already
|
|
1342
|
+
breathes at 6 s (R519); this adds an outer wrapper envelope so the
|
|
1343
|
+
brand area has nested respiration (fast inner / slow outer). 0.85 ↔ 1
|
|
1344
|
+
alpha range (~15%) matches the R703 tabular/decorative surface band
|
|
1345
|
+
— heavy visual register shouldn't drift too far from full opacity.
|
|
1346
|
+
|
|
1347
|
+
Focal-recede gate via data-attr selector — when the wrapper's
|
|
1348
|
+
data-topo-brand-watermark-recede attr flips to "true" (user is
|
|
1349
|
+
hovering a node/edge/group on the canvas), animation: none gates
|
|
1350
|
+
off so the R525 inline opacity={0.7} attr takes effect cleanly.
|
|
1351
|
+
Pattern sibling to R703 zoom-level data-attr selector gate.
|
|
1352
|
+
prefers-reduced-motion: reduce also neutralizes. */
|
|
1353
|
+
@keyframes anet-topo-brand-watermark-envelope-breath-kf {
|
|
1354
|
+
0%, 100% { opacity: 1; }
|
|
1355
|
+
50% { opacity: 0.85; }
|
|
1356
|
+
}
|
|
1357
|
+
.anet-topo-brand-watermark-envelope-breath {
|
|
1358
|
+
animation: anet-topo-brand-watermark-envelope-breath-kf 15s ease-in-out infinite;
|
|
1359
|
+
}
|
|
1360
|
+
.anet-topo-brand-watermark-envelope-breath[data-topo-brand-watermark-recede="true"] {
|
|
1361
|
+
animation: none;
|
|
1362
|
+
}
|
|
1363
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1364
|
+
.anet-topo-brand-watermark-envelope-breath { animation: none; }
|
|
1365
|
+
}
|
|
1366
|
+
|
|
1367
|
+
/* Round 705 — canvas crescent wrapper envelope breath at 13 s. Mirror
|
|
1368
|
+
to R704 watermark wrapper, closing canvas-brand-pair envelope
|
|
1369
|
+
symmetry. Cadence 13 s coprime with R704 (15 s) so the two never
|
|
1370
|
+
beat together when both visible. Tighter alpha range (0.30 ↔ 0.35,
|
|
1371
|
+
~14%) deliberately hugs the existing inline 0.35 baseline — preserves
|
|
1372
|
+
the visible-state intent while adding nested respiration.
|
|
1373
|
+
|
|
1374
|
+
Two gate-off rules instead of one (R704 had a single recede gate):
|
|
1375
|
+
- visible="false" → animation: none, so inline opacity={0} holds when
|
|
1376
|
+
the recent panel is shown (crescent must be invisible).
|
|
1377
|
+
- recede="true" → animation: none, so inline opacity={0.245} holds
|
|
1378
|
+
when canvas attention is elsewhere.
|
|
1379
|
+
Either gate flips → CSS releases control to inline opacity attr.
|
|
1380
|
+
prefers-reduced-motion: reduce also neutralizes. */
|
|
1381
|
+
@keyframes anet-topo-brand-canvas-mark-envelope-breath-kf {
|
|
1382
|
+
0%, 100% { opacity: 0.35; }
|
|
1383
|
+
50% { opacity: 0.30; }
|
|
1384
|
+
}
|
|
1385
|
+
.anet-topo-brand-canvas-mark-envelope-breath {
|
|
1386
|
+
animation: anet-topo-brand-canvas-mark-envelope-breath-kf 13s ease-in-out infinite;
|
|
1387
|
+
}
|
|
1388
|
+
.anet-topo-brand-canvas-mark-envelope-breath[data-topo-brand-canvas-mark-visible="false"] {
|
|
1389
|
+
animation: none;
|
|
1390
|
+
}
|
|
1391
|
+
.anet-topo-brand-canvas-mark-envelope-breath[data-topo-brand-canvas-mark-recede="true"] {
|
|
1392
|
+
animation: none;
|
|
1393
|
+
}
|
|
1394
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1395
|
+
.anet-topo-brand-canvas-mark-envelope-breath { animation: none; }
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
/* Round 706 — title-block wrapper envelope breath at 11s. Mirrors the
|
|
1399
|
+
canvas-brand-pair nested-envelope pattern (R704/R705) at the title-
|
|
1400
|
+
block scope. 11s coprime with all 3 inner trio cadences (5, 6, 10) —
|
|
1401
|
+
no common factor → no phase lock with inner anchors. Tighter alpha
|
|
1402
|
+
range (0.92 ↔ 1, ~8%) than canvas-brand-pair envelopes because the
|
|
1403
|
+
title-block carries primary text identity; even subtle dimming on
|
|
1404
|
+
the H2 + kicker headline reads as flicker if too aggressive. 8%
|
|
1405
|
+
range = "barely-perceptible aliveness". prefers-reduced-motion:
|
|
1406
|
+
reduce neutralizes. */
|
|
1407
|
+
@keyframes anet-topo-title-block-envelope-breath-kf {
|
|
1408
|
+
0%, 100% { opacity: 1; }
|
|
1409
|
+
50% { opacity: 0.92; }
|
|
1410
|
+
}
|
|
1411
|
+
.anet-topo-title-block-envelope-breath {
|
|
1412
|
+
animation: anet-topo-title-block-envelope-breath-kf 11s ease-in-out infinite;
|
|
1413
|
+
}
|
|
1414
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1415
|
+
.anet-topo-title-block-envelope-breath { animation: none; }
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
/* Round 707 — chrome Layout wrapper at-rest breath at 17 s. Slowest tier
|
|
1419
|
+
among HTML chrome respiratory anchors (sibling to R703 zoom-level 9 s
|
|
1420
|
+
in the chrome strip's data tier; this 17 s lands in the chrome strip's
|
|
1421
|
+
control tier). 17 is prime → coprime with every other cadence in the
|
|
1422
|
+
rolodex (3/4/5/6/7/8/9/10/11/13/15). Never phase-locks with any other
|
|
1423
|
+
anchor.
|
|
1424
|
+
|
|
1425
|
+
Tightest alpha range yet (0.94 ↔ 1, ~6%) — the Layout buttons are
|
|
1426
|
+
interactive controls with active-state cyan tint; even ~10% dimming
|
|
1427
|
+
on the inner button color would feel jarring. 6% = "barely-perceptible
|
|
1428
|
+
aliveness" on a control group.
|
|
1429
|
+
|
|
1430
|
+
Hover gate via :has() selector — when user hovers any inner Ring/Grid
|
|
1431
|
+
button, the R697 wrapper-level halo (cyan filter) takes precedence;
|
|
1432
|
+
animation: none on hover pauses the breath so the halo reads crisp
|
|
1433
|
+
without underlying alpha drift. Third gate-off mechanism in the family
|
|
1434
|
+
vocabulary, sibling to R703 hover data-attr gate + R704/R705 recede
|
|
1435
|
+
gates. */
|
|
1436
|
+
@keyframes anet-topo-chrome-layout-trailer-breath-kf {
|
|
1437
|
+
0%, 100% { opacity: 1; }
|
|
1438
|
+
50% { opacity: 0.94; }
|
|
1439
|
+
}
|
|
1440
|
+
.anet-topo-chrome-layout-trailer-breath {
|
|
1441
|
+
animation: anet-topo-chrome-layout-trailer-breath-kf 17s ease-in-out infinite;
|
|
1442
|
+
}
|
|
1443
|
+
.anet-topo-chrome-layout-trailer-breath:has(button:hover) {
|
|
1444
|
+
animation: none;
|
|
1445
|
+
}
|
|
1446
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1447
|
+
.anet-topo-chrome-layout-trailer-breath { animation: none; }
|
|
1448
|
+
}
|
|
1449
|
+
|
|
1052
1450
|
/* ─────────────────────────────────────────────────────────────────────
|
|
1053
1451
|
Round 29 — prefers-reduced-motion a11y sweep
|
|
1054
1452
|
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sleep2agi/agent-network-dashboard",
|
|
3
|
-
"version": "0.5.3-preview.
|
|
4
|
-
"description": "Agent Network Dashboard
|
|
3
|
+
"version": "0.5.3-preview.221",
|
|
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
|
|
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);
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/* Round 686 — active-links chip extends from 4+ hover axes (bg/text/
|
|
2
|
+
* border swap + translate-y) to add multi-layer halo paint axis.
|
|
3
|
+
* Inline filter conditional on hoveredActiveLinks state (existing,
|
|
4
|
+
* line 1098) gates 2-layer drop-shadow at pal.legendAccent tint with
|
|
5
|
+
* 2+4 stride, alpha 80/40. 45th anchor — first active-links anchor.
|
|
6
|
+
*
|
|
7
|
+
* Source assertions:
|
|
8
|
+
* - filter chain uses pal.legendAccent at 80/40 with 2+4 stride,
|
|
9
|
+
* gated on hoveredActiveLinks && isInteractive
|
|
10
|
+
* - data-active-links-chip-halo-layers attr toggles '2' ↔ '0'
|
|
11
|
+
*
|
|
12
|
+
* Runtime assertions:
|
|
13
|
+
* - active-links chip present (renders when sessions exist)
|
|
14
|
+
* - rest halo-layers='0'
|
|
15
|
+
* - chip is interactive when flowLinks > 0 (mock messages create flows)
|
|
16
|
+
*/
|
|
17
|
+
import { chromium } from 'playwright';
|
|
18
|
+
import { readFileSync } from 'node:fs';
|
|
19
|
+
|
|
20
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
21
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
22
|
+
|
|
23
|
+
const browser = await chromium.launch({ headless: true });
|
|
24
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
25
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
26
|
+
await ctx.addInitScript(() => {
|
|
27
|
+
try {
|
|
28
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
29
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
30
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
31
|
+
} catch {}
|
|
32
|
+
});
|
|
33
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
34
|
+
const r = await route.fetch();
|
|
35
|
+
const b = await r.json();
|
|
36
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
37
|
+
const mk = (alias) => ({
|
|
38
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
39
|
+
network_id: nid, project_dir: null,
|
|
40
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
41
|
+
});
|
|
42
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2'), mk('a·3')] } });
|
|
43
|
+
});
|
|
44
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [
|
|
45
|
+
{ id: 'm1', from_alias: 'a·1', to_alias: 'a·2', kind: 'message', content: 'p', network_id: 'default', created_at: fresh },
|
|
46
|
+
{ id: 'm2', from_alias: 'a·2', to_alias: 'a·3', kind: 'task', content: 'p2', network_id: 'default', created_at: fresh },
|
|
47
|
+
] } }));
|
|
48
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
49
|
+
const page = await ctx.newPage();
|
|
50
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
51
|
+
await page.waitForSelector('[data-active-links-chip]', { timeout: 15000, state: 'attached' });
|
|
52
|
+
await page.waitForTimeout(300);
|
|
53
|
+
|
|
54
|
+
const runtimeState = await page.evaluate(() => {
|
|
55
|
+
const chip = document.querySelector('[data-active-links-chip]');
|
|
56
|
+
return chip ? {
|
|
57
|
+
halo_layers: chip.getAttribute('data-active-links-chip-halo-layers'),
|
|
58
|
+
interactive: chip.getAttribute('data-active-links-clickable'),
|
|
59
|
+
flow_count: chip.getAttribute('data-active-links-flow-count'),
|
|
60
|
+
} : null;
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
await browser.close();
|
|
64
|
+
|
|
65
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
66
|
+
const sourceFilter = /filter: hoveredActiveLinks && isInteractive\s*\?\s*`drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\)`\s*: undefined/.test(src);
|
|
67
|
+
const sourceAttr = /data-active-links-chip-halo-layers=\{hoveredActiveLinks && isInteractive \? '2' : '0'\}/.test(src);
|
|
68
|
+
|
|
69
|
+
const results = {
|
|
70
|
+
chip_present: !!runtimeState,
|
|
71
|
+
rest_layers_zero: runtimeState?.halo_layers === '0',
|
|
72
|
+
is_interactive: runtimeState?.interactive === 'true',
|
|
73
|
+
has_flows: runtimeState && parseInt(runtimeState.flow_count, 10) >= 1,
|
|
74
|
+
source_filter: sourceFilter,
|
|
75
|
+
source_layers_attr: sourceAttr,
|
|
76
|
+
};
|
|
77
|
+
const ok = Object.values(results).every(Boolean);
|
|
78
|
+
console.log(`${ok ? '✅' : '❌'} R686 active-links chip multi-layer halo (first active-links anchor):`,
|
|
79
|
+
JSON.stringify(results, null, 2),
|
|
80
|
+
`\n runtime: ${JSON.stringify(runtimeState)}`);
|
|
81
|
+
process.exit(ok ? 0 : 1);
|