@sleep2agi/agent-network-dashboard 0.5.3-preview.26 → 0.5.3-preview.260
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/[root-of-the-server]__0tx8s8i._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0tx8s8i._.js.map +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/083elibefsefi.js +4 -0
- package/.next/static/chunks/{05uydm8okqgqe.js → 0p142v5va508~.js} +1 -1
- package/.next/static/chunks/0u8v68gl7g6j1.js +1 -0
- package/.next/static/chunks/11sahbo6ikg8g.js +1 -0
- package/.next/static/chunks/16-7qr7qx9zrz.css +2 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/api/hub/servers/route.ts +3 -29
- package/app/components/TopoGraph.tsx +6143 -180
- package/app/globals.css +897 -7
- package/app/lib/serverDedupe.ts +122 -0
- package/package.json +1 -1
- package/scripts/p157-rc2-dedup-test.mjs +110 -0
- package/scripts/topo-a11y-titles-catalog-test.mjs +132 -0
- 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-animation-temporal-modes-catalog-test.mjs +144 -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-canvas-desc-a11y-test.mjs +87 -0
- package/scripts/topo-canvas-entrance-animation-test.mjs +117 -0
- package/scripts/topo-canvas-scan-beam-diagonal-test.mjs +148 -0
- package/scripts/topo-canvas-scan-beam-test.mjs +109 -0
- package/scripts/topo-canvas-scan-beam-vertical-test.mjs +123 -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-strip-entrance-animation-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-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-a11y-title-test.mjs +95 -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-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-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-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-panel-titles-triple-axis-breath-test.mjs +161 -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-scan-beam-pair-pattern-test.mjs +100 -0
- package/scripts/topo-r717-triple-axis-pair-pattern-test.mjs +113 -0
- package/scripts/topo-r717-triple-axis-tier-pattern-test.mjs +117 -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-axis-count-stats-test.mjs +154 -0
- package/scripts/topo-respiratory-patterns-catalog-test.mjs +112 -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-svg-title-a11y-r731-test.mjs +93 -0
- package/scripts/topo-svg-title-a11y-test.mjs +88 -0
- package/scripts/topo-title-block-entrance-animation-test.mjs +127 -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 +148 -0
- package/.next/static/chunks/0b57cx-~yee9s.js +0 -1
- package/.next/static/chunks/0c5ux9rrl-j.a.js +0 -4
- package/.next/static/chunks/0ixrbcha76lse.js +0 -1
- package/.next/static/chunks/0m.1mvl~t.avc.css +0 -2
- /package/.next/static/{fAHTff4Obp5vYwjZIWEvA → wz1T-LhLDalz691PpN3E7}/_buildManifest.js +0 -0
- /package/.next/static/{fAHTff4Obp5vYwjZIWEvA → wz1T-LhLDalz691PpN3E7}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{fAHTff4Obp5vYwjZIWEvA → wz1T-LhLDalz691PpN3E7}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* Round 600 milestone — node vendor avatar gains hover-rotate-3
|
|
2
|
+
* via CSS individual `rotate` property. 6th anchor in hover-
|
|
3
|
+
* rotate idiom. Brings per-node hover signature to 11 axes.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. mock 2 idle nodes → avatar <image> renders
|
|
7
|
+
* 2. rest: rotate='0deg' or 'none', rotate-attr='0'
|
|
8
|
+
* 3. computed transition-property contains 'rotate'
|
|
9
|
+
* 4. transform-origin set to node center coords
|
|
10
|
+
* 5. source: rotate conditional + data-attr + transition extension
|
|
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'), mk('a·2')] } });
|
|
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-node-avatar-rotate]', { timeout: 15000, state: 'attached' });
|
|
44
|
+
await page.waitForTimeout(500);
|
|
45
|
+
|
|
46
|
+
const rest = await page.evaluate(() => {
|
|
47
|
+
const el = document.querySelector('[data-node-avatar-rotate]');
|
|
48
|
+
if (!el) return null;
|
|
49
|
+
const cs = getComputedStyle(el);
|
|
50
|
+
return {
|
|
51
|
+
rotate: cs.rotate,
|
|
52
|
+
transformOrigin: cs.transformOrigin,
|
|
53
|
+
transitionProperty: cs.transitionProperty,
|
|
54
|
+
rotateAttr: el.getAttribute('data-node-avatar-rotate'),
|
|
55
|
+
hoveredAttr: el.getAttribute('data-node-avatar-hovered'),
|
|
56
|
+
alias: el.getAttribute('data-node-avatar'),
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
await browser.close();
|
|
61
|
+
|
|
62
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
63
|
+
const sourceRotate = /rotate: isAvatarHovered \? '3deg' : '0deg'/.test(src);
|
|
64
|
+
const sourceAttr = /data-node-avatar-rotate=\{isAvatarHovered \? '3' : '0'\}/.test(src);
|
|
65
|
+
const sourceTransformOrigin = /transformOrigin: `\$\{pos\.x\}px \$\{pos\.y\}px`/.test(src);
|
|
66
|
+
const sourceTransition = /transition: 'filter 200ms ease-out, rotate 200ms ease-out'/.test(src);
|
|
67
|
+
|
|
68
|
+
const results = {
|
|
69
|
+
avatar_present: !!rest,
|
|
70
|
+
rest_rotate_zero: rest?.rotate === 'none' || rest?.rotate === '0deg',
|
|
71
|
+
rest_rotate_attr: rest?.rotateAttr === '0',
|
|
72
|
+
rest_hovered_false: rest?.hoveredAttr === 'false',
|
|
73
|
+
has_transform_origin: !!rest?.transformOrigin && rest.transformOrigin !== '',
|
|
74
|
+
has_alias: !!rest?.alias,
|
|
75
|
+
transition_has_rotate: /rotate/.test(rest?.transitionProperty || ''),
|
|
76
|
+
source_rotate: sourceRotate,
|
|
77
|
+
source_attr: sourceAttr,
|
|
78
|
+
source_transform_origin: sourceTransformOrigin,
|
|
79
|
+
source_transition: sourceTransition,
|
|
80
|
+
};
|
|
81
|
+
const ok = Object.values(results).every(Boolean);
|
|
82
|
+
console.log(`${ok ? '✅' : '❌'} R600 MILESTONE — node avatar rotate (6th hover-rotate anchor, 11-axis per-node):`,
|
|
83
|
+
JSON.stringify(results, null, 2),
|
|
84
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
85
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/* Round 602 — per-node avatar gains hover-scale-1.05 across
|
|
2
|
+
* all 3 branches (image + monogram + fallback). Avatar now
|
|
3
|
+
* has 3-axis hover signature: rotate (R600/R601) + brightness
|
|
4
|
+
* (R501/R558) + scale (R602). Mirrors R548 brand 书生 logo
|
|
5
|
+
* scale-105 idiom at the per-node tier.
|
|
6
|
+
*
|
|
7
|
+
* Test phases:
|
|
8
|
+
* 1. mock 2 idle nodes → avatar renders
|
|
9
|
+
* 2. rest: scale='none' or '1', scale-attr='1'
|
|
10
|
+
* 3. computed transition-property contains 'scale'
|
|
11
|
+
* 4. source: scale conditional + data-attr + transition extension
|
|
12
|
+
* on all 3 branches
|
|
13
|
+
*/
|
|
14
|
+
import { chromium } from 'playwright';
|
|
15
|
+
import { readFileSync } from 'node:fs';
|
|
16
|
+
|
|
17
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
18
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
19
|
+
|
|
20
|
+
const browser = await chromium.launch({ headless: true });
|
|
21
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
22
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
23
|
+
await ctx.addInitScript(() => {
|
|
24
|
+
try {
|
|
25
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
26
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
27
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
28
|
+
} catch {}
|
|
29
|
+
});
|
|
30
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
31
|
+
const r = await route.fetch();
|
|
32
|
+
const b = await r.json();
|
|
33
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
34
|
+
const mk = (alias) => ({
|
|
35
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
36
|
+
network_id: nid, project_dir: null,
|
|
37
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
38
|
+
});
|
|
39
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
40
|
+
});
|
|
41
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
42
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
43
|
+
const page = await ctx.newPage();
|
|
44
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
45
|
+
await page.waitForSelector('[data-node-avatar-scale]', { timeout: 15000, state: 'attached' });
|
|
46
|
+
await page.waitForTimeout(500);
|
|
47
|
+
|
|
48
|
+
const rest = await page.evaluate(() => {
|
|
49
|
+
const el = document.querySelector('[data-node-avatar-scale]');
|
|
50
|
+
if (!el) return null;
|
|
51
|
+
const cs = getComputedStyle(el);
|
|
52
|
+
return {
|
|
53
|
+
scale: cs.scale,
|
|
54
|
+
transitionProperty: cs.transitionProperty,
|
|
55
|
+
scaleAttr: el.getAttribute('data-node-avatar-scale'),
|
|
56
|
+
rotateAttr: el.getAttribute('data-node-avatar-rotate'),
|
|
57
|
+
hoveredAttr: el.getAttribute('data-node-avatar-hovered'),
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
await browser.close();
|
|
62
|
+
|
|
63
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
64
|
+
const sourceImageScale = /data-node-avatar-scale=\{isAvatarHovered \? '1\.05' : '1'\}/.test(src);
|
|
65
|
+
const sourceMonogramScale = /data-node-avatar-monogram-scale=\{isAvatarFallbackHovered \? '1\.05' : '1'\}/.test(src);
|
|
66
|
+
const sourceFallbackScale = /data-node-avatar-fallback-scale=\{isAvatarFallbackHovered \? '1\.05' : '1'\}/.test(src);
|
|
67
|
+
const sourceBothBranchesScale = (src.match(/scale: isAvatarFallbackHovered \? '1\.05' : '1'/g) || []).length >= 2;
|
|
68
|
+
const sourceImageBranchScale = /scale: isAvatarHovered \? '1\.05' : '1'/.test(src);
|
|
69
|
+
const sourceAllTransitions = (src.match(/transition: 'filter 200ms ease-out, rotate 200ms ease-out, scale 200ms ease-out'/g) || []).length >= 3;
|
|
70
|
+
|
|
71
|
+
const results = {
|
|
72
|
+
avatar_present: !!rest,
|
|
73
|
+
// CSS scale at rest = 'none' or '1' depending on browser
|
|
74
|
+
rest_scale_one: rest?.scale === 'none' || rest?.scale === '1',
|
|
75
|
+
rest_scale_attr: rest?.scaleAttr === '1',
|
|
76
|
+
rest_hovered_false: rest?.hoveredAttr === 'false',
|
|
77
|
+
transition_has_scale: /scale/.test(rest?.transitionProperty || ''),
|
|
78
|
+
source_image_attr: sourceImageScale,
|
|
79
|
+
source_monogram_attr: sourceMonogramScale,
|
|
80
|
+
source_fallback_attr: sourceFallbackScale,
|
|
81
|
+
source_image_branch: sourceImageBranchScale,
|
|
82
|
+
source_both_fallback: sourceBothBranchesScale,
|
|
83
|
+
source_all_3_transitions: sourceAllTransitions,
|
|
84
|
+
};
|
|
85
|
+
const ok = Object.values(results).every(Boolean);
|
|
86
|
+
console.log(`${ok ? '✅' : '❌'} R602 avatar scale (3/3 branches, 3-axis hover signature):`,
|
|
87
|
+
JSON.stringify(results, null, 2),
|
|
88
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
89
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/* Round 620 — extend runtime badge isNodeActive gate to include
|
|
2
|
+
* chatAlias === session.alias. Single conceptual change cascades
|
|
3
|
+
* across ALL 6 badge axes (r/sw/icon-sw/drop-shadow/brightness/
|
|
4
|
+
* rotate). 6th anchor in chat-target-gated brightness family.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. mock 2 idle nodes → runtime badge renders
|
|
8
|
+
* 2. rest (no hover, no chat): badge attrs reflect idle state
|
|
9
|
+
* 3. source: isNodeActive declaration uses gate union
|
|
10
|
+
* (hoveredAlias || chatAlias)
|
|
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'), mk('a·2')] } });
|
|
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-runtime-badge]', { timeout: 15000, state: 'attached' });
|
|
44
|
+
await page.waitForTimeout(500);
|
|
45
|
+
|
|
46
|
+
const rest = await page.evaluate(() => {
|
|
47
|
+
const el = document.querySelector('[data-runtime-badge]');
|
|
48
|
+
if (!el) return null;
|
|
49
|
+
return {
|
|
50
|
+
activeAttr: el.getAttribute('data-runtime-badge-active'),
|
|
51
|
+
glowAttr: document.querySelector('[data-runtime-badge-glow]')?.getAttribute('data-runtime-badge-glow'),
|
|
52
|
+
brightnessAttr: document.querySelector('[data-runtime-badge-brightness]')?.getAttribute('data-runtime-badge-brightness'),
|
|
53
|
+
rotateAttr: document.querySelector('[data-runtime-badge-rotate]')?.getAttribute('data-runtime-badge-rotate'),
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
await browser.close();
|
|
58
|
+
|
|
59
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
60
|
+
const sourceGate = /const isNodeActive = !reducedMotion && \(hoveredAlias === session\.alias \|\| chatAlias === session\.alias\)/.test(src);
|
|
61
|
+
|
|
62
|
+
const results = {
|
|
63
|
+
badge_present: !!rest,
|
|
64
|
+
rest_active_false: rest?.activeAttr === 'false',
|
|
65
|
+
rest_glow_false: rest?.glowAttr === 'false',
|
|
66
|
+
rest_brightness_1: rest?.brightnessAttr === '1',
|
|
67
|
+
rest_rotate_zero: rest?.rotateAttr === '0',
|
|
68
|
+
source_gate_or: sourceGate,
|
|
69
|
+
};
|
|
70
|
+
const ok = Object.values(results).every(Boolean);
|
|
71
|
+
console.log(`${ok ? '✅' : '❌'} R620 runtime badge chat-target gate (chat-gated family 6th anchor):`,
|
|
72
|
+
JSON.stringify(results, null, 2),
|
|
73
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
74
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/* Round 604 — brand 书生 logo gains hover:drop-shadow-[0_0_8px_
|
|
2
|
+
* currentColor] as 5th axis (scale + rotate + brightness +
|
|
3
|
+
* breath + drop-shadow). Tailwind v4 filter utilities stack
|
|
4
|
+
* via CSS-var system, so drop-shadow composes with brightness.
|
|
5
|
+
*
|
|
6
|
+
* Test phases:
|
|
7
|
+
* 1. dashboard mounts → brand logo renders in title block
|
|
8
|
+
* 2. rest: filter does NOT contain drop-shadow (no hover)
|
|
9
|
+
* 3. computed transition-property contains 'filter'
|
|
10
|
+
* 4. source: hover:drop-shadow-[0_0_8px_currentColor] in
|
|
11
|
+
* className + data-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
|
+
|
|
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
|
+
const page = await ctx.newPage();
|
|
29
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
30
|
+
await page.waitForSelector('[data-topo-brand-logo]', { timeout: 15000, state: 'attached' });
|
|
31
|
+
await page.waitForTimeout(500);
|
|
32
|
+
|
|
33
|
+
const rest = await page.evaluate(() => {
|
|
34
|
+
const el = document.querySelector('[data-topo-brand-logo]');
|
|
35
|
+
if (!el) return null;
|
|
36
|
+
const cs = getComputedStyle(el);
|
|
37
|
+
return {
|
|
38
|
+
filter: cs.filter,
|
|
39
|
+
transitionProperty: cs.transitionProperty,
|
|
40
|
+
dropShadowAttr: el.getAttribute('data-topo-brand-logo-hover-drop-shadow'),
|
|
41
|
+
brightnessAttr: el.getAttribute('data-topo-brand-logo-hover-brightness'),
|
|
42
|
+
scaleAttr: el.getAttribute('data-topo-brand-logo-hover-scale'),
|
|
43
|
+
rotateAttr: el.getAttribute('data-topo-brand-logo-hover-rotate'),
|
|
44
|
+
breathAttr: el.getAttribute('data-topo-brand-logo-breath'),
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
await browser.close();
|
|
49
|
+
|
|
50
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
51
|
+
const sourceClass = /hover:drop-shadow-\[0_0_8px_currentColor\]/.test(src);
|
|
52
|
+
const sourceAttr = /data-topo-brand-logo-hover-drop-shadow="0_0_8px_currentColor"/.test(src);
|
|
53
|
+
|
|
54
|
+
const results = {
|
|
55
|
+
logo_present: !!rest,
|
|
56
|
+
// At rest, no hover so no drop-shadow filter active
|
|
57
|
+
rest_no_drop_shadow: !/drop-shadow/.test(rest?.filter || ''),
|
|
58
|
+
has_drop_shadow_attr: rest?.dropShadowAttr === '0_0_8px_currentColor',
|
|
59
|
+
has_brightness_attr: rest?.brightnessAttr === '1.1',
|
|
60
|
+
has_scale_attr: rest?.scaleAttr === '1.05',
|
|
61
|
+
has_rotate_attr: rest?.rotateAttr === '6deg',
|
|
62
|
+
has_breath_attr: rest?.breathAttr === 'true' || rest?.breathAttr === 'false',
|
|
63
|
+
transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
|
|
64
|
+
source_class: sourceClass,
|
|
65
|
+
source_attr: sourceAttr,
|
|
66
|
+
};
|
|
67
|
+
const ok = Object.values(results).every(Boolean);
|
|
68
|
+
console.log(`${ok ? '✅' : '❌'} R604 brand logo drop-shadow (5-axis hover signature):`,
|
|
69
|
+
JSON.stringify(results, null, 2),
|
|
70
|
+
`\n rest: ${JSON.stringify(rest)}`);
|
|
71
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/* Round 553 verification: title-block brand logo gains subtle idle
|
|
2
|
+
* opacity breath (0.92 ↔ 1, 5s cycle). 5th anchor in the 呼吸感
|
|
3
|
+
* breath family.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. brand-logo className contains 'anet-topo-brand-logo-breath'
|
|
7
|
+
* 2. data-topo-brand-logo-breath="true" attr present
|
|
8
|
+
* 3. computed animation-name === 'anet-topo-brand-logo-breath-kf'
|
|
9
|
+
* (paused or running)
|
|
10
|
+
* 4. computed animation-duration === '5s'
|
|
11
|
+
* 5. source-side regex confirms keyframe + class + componentJSX
|
|
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')] } });
|
|
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-brand-logo]', { timeout: 15000 });
|
|
45
|
+
await page.waitForTimeout(500);
|
|
46
|
+
|
|
47
|
+
const sel = '[data-topo-brand-logo]';
|
|
48
|
+
const probe = await page.evaluate((s) => {
|
|
49
|
+
const el = document.querySelector(s);
|
|
50
|
+
if (!el) return null;
|
|
51
|
+
const cs = getComputedStyle(el);
|
|
52
|
+
return {
|
|
53
|
+
breathAttr: el.getAttribute('data-topo-brand-logo-breath'),
|
|
54
|
+
hasBreathClass: el.classList.contains('anet-topo-brand-logo-breath'),
|
|
55
|
+
animationName: cs.animationName,
|
|
56
|
+
animationDuration: cs.animationDuration,
|
|
57
|
+
animationIterationCount: cs.animationIterationCount,
|
|
58
|
+
animationTimingFunction: cs.animationTimingFunction,
|
|
59
|
+
// Sample opacity twice across ~1.5s to confirm it's actually changing
|
|
60
|
+
opacityNow: parseFloat(cs.opacity),
|
|
61
|
+
};
|
|
62
|
+
}, sel);
|
|
63
|
+
|
|
64
|
+
// Sample opacity at 3 timepoints across the 5s breath cycle
|
|
65
|
+
await page.waitForTimeout(500);
|
|
66
|
+
const opacity_t1 = await page.evaluate((s) => parseFloat(getComputedStyle(document.querySelector(s)).opacity), sel);
|
|
67
|
+
await page.waitForTimeout(900);
|
|
68
|
+
const opacity_t2 = await page.evaluate((s) => parseFloat(getComputedStyle(document.querySelector(s)).opacity), sel);
|
|
69
|
+
await page.waitForTimeout(900);
|
|
70
|
+
const opacity_t3 = await page.evaluate((s) => parseFloat(getComputedStyle(document.querySelector(s)).opacity), sel);
|
|
71
|
+
|
|
72
|
+
await browser.close();
|
|
73
|
+
|
|
74
|
+
const css = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
|
|
75
|
+
const tsx = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
76
|
+
const sourceKeyframe = /@keyframes anet-topo-brand-logo-breath-kf/.test(css);
|
|
77
|
+
const sourceClass = /\.anet-topo-brand-logo-breath\s*\{[^}]*animation: anet-topo-brand-logo-breath-kf 5s ease-in-out infinite/.test(css);
|
|
78
|
+
const sourceComponent = /\!reducedMotion \? ' anet-topo-brand-logo-breath' : ''/.test(tsx);
|
|
79
|
+
const sourceAttr = /data-topo-brand-logo-breath=\{!reducedMotion \? 'true' : 'false'\}/.test(tsx);
|
|
80
|
+
|
|
81
|
+
// Opacity should oscillate; not all 3 samples identical
|
|
82
|
+
const opacityVaries = new Set([opacity_t1, opacity_t2, opacity_t3].map(o => o.toFixed(3))).size > 1;
|
|
83
|
+
|
|
84
|
+
const results = {
|
|
85
|
+
breath_attr: probe?.breathAttr === 'true',
|
|
86
|
+
has_breath_class: probe?.hasBreathClass === true,
|
|
87
|
+
animation_name_match: probe?.animationName === 'anet-topo-brand-logo-breath-kf',
|
|
88
|
+
animation_duration_5s: probe?.animationDuration === '5s',
|
|
89
|
+
animation_iteration_infinite: probe?.animationIterationCount === 'infinite',
|
|
90
|
+
animation_timing_ease_in_out: probe?.animationTimingFunction === 'ease-in-out',
|
|
91
|
+
opacity_varies_over_time: opacityVaries,
|
|
92
|
+
source_keyframe: sourceKeyframe,
|
|
93
|
+
source_class: sourceClass,
|
|
94
|
+
source_component: sourceComponent,
|
|
95
|
+
source_attr: sourceAttr,
|
|
96
|
+
};
|
|
97
|
+
const ok = Object.values(results).every(Boolean);
|
|
98
|
+
console.log(`${ok ? '✅' : '❌'} R553 brand-logo idle breath (5th anchor in 呼吸感 family):`,
|
|
99
|
+
JSON.stringify(results, null, 2),
|
|
100
|
+
'\n probe:', JSON.stringify(probe),
|
|
101
|
+
`\n opacity samples: ${opacity_t1.toFixed(3)} → ${opacity_t2.toFixed(3)} → ${opacity_t3.toFixed(3)}`);
|
|
102
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* Round 683 — brand 书生 logo extends single-layer drop-shadow hover
|
|
2
|
+
* (R604, Tailwind `hover:drop-shadow-[0_0_8px_currentColor]`) to the
|
|
3
|
+
* multi-layer halo family by replacing the Tailwind utility with a
|
|
4
|
+
* custom CSS class `.anet-topo-brand-logo-mark` that applies near 8px
|
|
5
|
+
* + far 16px (2× blur stride) drop-shadow at currentColor (inherits
|
|
6
|
+
* teal #0d9488 / cyan #67e8f9 per inline style.color) + brightness(1.10)
|
|
7
|
+
* via `:hover` pseudo-class — no React state needed.
|
|
8
|
+
*
|
|
9
|
+
* Source assertions:
|
|
10
|
+
* - globals.css: .anet-topo-brand-logo-mark:hover with 2 drop-shadow
|
|
11
|
+
* - TopoGraph.tsx: className includes anet-topo-brand-logo-mark
|
|
12
|
+
* - TopoGraph.tsx: hover:drop-shadow / hover:brightness REMOVED from
|
|
13
|
+
* the className (replaced by the CSS class)
|
|
14
|
+
*
|
|
15
|
+
* Runtime assertions:
|
|
16
|
+
* - brand logo SVG present in /login or root (renders pre-auth too)
|
|
17
|
+
* - className contains anet-topo-brand-logo-mark
|
|
18
|
+
* - data-topo-brand-logo-halo-layers="2" attr present
|
|
19
|
+
*/
|
|
20
|
+
import { chromium } from 'playwright';
|
|
21
|
+
import { readFileSync } from 'node:fs';
|
|
22
|
+
|
|
23
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
24
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
25
|
+
|
|
26
|
+
const browser = await chromium.launch({ headless: true });
|
|
27
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
28
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
29
|
+
await ctx.addInitScript(() => {
|
|
30
|
+
try {
|
|
31
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
32
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
33
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
34
|
+
} catch {}
|
|
35
|
+
});
|
|
36
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
37
|
+
const r = await route.fetch();
|
|
38
|
+
const b = await r.json();
|
|
39
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
40
|
+
const mk = (alias) => ({
|
|
41
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
42
|
+
network_id: nid, project_dir: null,
|
|
43
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
44
|
+
});
|
|
45
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1'), mk('a·2')] } });
|
|
46
|
+
});
|
|
47
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
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-topo-brand-logo]', { timeout: 15000, state: 'attached' });
|
|
52
|
+
await page.waitForTimeout(300);
|
|
53
|
+
|
|
54
|
+
const runtimeState = await page.evaluate(() => {
|
|
55
|
+
const el = document.querySelector('[data-topo-brand-logo]');
|
|
56
|
+
return el ? {
|
|
57
|
+
haloLayers: el.getAttribute('data-topo-brand-logo-halo-layers'),
|
|
58
|
+
classes: el.getAttribute('class'),
|
|
59
|
+
} : null;
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
await browser.close();
|
|
63
|
+
|
|
64
|
+
const tsxSrc = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
65
|
+
const cssSrc = readFileSync('/home/vansin/agent-network-dashboard/app/globals.css', 'utf8');
|
|
66
|
+
|
|
67
|
+
const cssClassDefined = /\.anet-topo-brand-logo-mark:hover\s*\{[\s\S]*?drop-shadow\(0 0 8px currentColor\)[\s\S]*?drop-shadow\(0 0 16px currentColor\)[\s\S]*?brightness\(1\.10\)/.test(cssSrc);
|
|
68
|
+
const tsxClassAdded = /className=\{`anet-topo-brand-logo-mark/.test(tsxSrc);
|
|
69
|
+
const tailwindRemoved = !/hover:brightness-110 hover:drop-shadow-\[0_0_8px_currentColor\]/.test(tsxSrc);
|
|
70
|
+
const hasHaloAttr = /data-topo-brand-logo-halo-layers="2"/.test(tsxSrc);
|
|
71
|
+
|
|
72
|
+
const results = {
|
|
73
|
+
brand_logo_present: !!runtimeState,
|
|
74
|
+
has_class_runtime: !!runtimeState?.classes && /anet-topo-brand-logo-mark/.test(runtimeState.classes),
|
|
75
|
+
halo_layers_runtime: runtimeState?.haloLayers === '2',
|
|
76
|
+
css_class_defined: cssClassDefined,
|
|
77
|
+
tsx_class_added: tsxClassAdded,
|
|
78
|
+
tsx_tailwind_removed: tailwindRemoved,
|
|
79
|
+
tsx_halo_attr: hasHaloAttr,
|
|
80
|
+
};
|
|
81
|
+
const ok = Object.values(results).every(Boolean);
|
|
82
|
+
console.log(`${ok ? '✅' : '❌'} R683 brand logo multi-layer halo (first brand-mark anchor):`,
|
|
83
|
+
JSON.stringify(results, null, 2),
|
|
84
|
+
`\n runtime: ${JSON.stringify(runtimeState)}`);
|
|
85
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/* Round 557 verification: title-block brand logo gains 4th hover
|
|
2
|
+
* axis — hover:brightness-110 (filter). Composes with R548 scale +
|
|
3
|
+
* R549 rotate + R553 idle breath.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. rest: filter = 'none' (no brightness on idle, breath uses opacity)
|
|
7
|
+
* 2. hover: filter contains 'brightness(1.1)' (or similar)
|
|
8
|
+
* 3. data-attr present
|
|
9
|
+
* 4. source: className contains hover:brightness-110 and
|
|
10
|
+
* transition-[transform,filter]
|
|
11
|
+
*
|
|
12
|
+
* R553 breath uses opacity, NOT filter — so filter stays clean at
|
|
13
|
+
* rest. On hover, Tailwind adds filter: brightness(1.1).
|
|
14
|
+
*/
|
|
15
|
+
import { chromium } from 'playwright';
|
|
16
|
+
import { readFileSync } from 'node:fs';
|
|
17
|
+
|
|
18
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
19
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
20
|
+
|
|
21
|
+
const browser = await chromium.launch({ headless: true });
|
|
22
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
23
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
24
|
+
await ctx.addInitScript(() => {
|
|
25
|
+
try {
|
|
26
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
27
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
28
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
29
|
+
} catch {}
|
|
30
|
+
});
|
|
31
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
32
|
+
const r = await route.fetch();
|
|
33
|
+
const b = await r.json();
|
|
34
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
35
|
+
const mk = (alias) => ({
|
|
36
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
37
|
+
network_id: nid, project_dir: null,
|
|
38
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
39
|
+
});
|
|
40
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1')] } });
|
|
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-logo]', { timeout: 15000 });
|
|
47
|
+
await page.waitForTimeout(500);
|
|
48
|
+
|
|
49
|
+
const sel = '[data-topo-brand-logo]';
|
|
50
|
+
const rest = await page.evaluate((s) => {
|
|
51
|
+
const el = document.querySelector(s);
|
|
52
|
+
if (!el) return null;
|
|
53
|
+
const cs = getComputedStyle(el);
|
|
54
|
+
return {
|
|
55
|
+
filter: cs.filter,
|
|
56
|
+
transitionProperty: cs.transitionProperty,
|
|
57
|
+
transitionDuration: cs.transitionDuration,
|
|
58
|
+
hoverBrightnessAttr: el.getAttribute('data-topo-brand-logo-hover-brightness'),
|
|
59
|
+
};
|
|
60
|
+
}, sel);
|
|
61
|
+
|
|
62
|
+
await page.hover(sel);
|
|
63
|
+
await page.waitForTimeout(400);
|
|
64
|
+
const hover = await page.evaluate((s) => {
|
|
65
|
+
const el = document.querySelector(s);
|
|
66
|
+
if (!el) return null;
|
|
67
|
+
const cs = getComputedStyle(el);
|
|
68
|
+
return {
|
|
69
|
+
filter: cs.filter,
|
|
70
|
+
scale: cs.scale,
|
|
71
|
+
rotate: cs.rotate,
|
|
72
|
+
};
|
|
73
|
+
}, sel);
|
|
74
|
+
|
|
75
|
+
await browser.close();
|
|
76
|
+
|
|
77
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
78
|
+
const sourceClassname = /hover:brightness-110/.test(src);
|
|
79
|
+
const sourceTransition = /transition-\[transform,filter\] duration-200 ease-out hover:scale-105 hover:rotate-6 hover:brightness-110/.test(src);
|
|
80
|
+
const sourceAttr = /data-topo-brand-logo-hover-brightness="1\.1"/.test(src);
|
|
81
|
+
|
|
82
|
+
const results = {
|
|
83
|
+
rest_filter_none: rest?.filter === 'none',
|
|
84
|
+
rest_brightness_attr: rest?.hoverBrightnessAttr === '1.1',
|
|
85
|
+
// Computed filter on hover should contain brightness(1.1) — handle
|
|
86
|
+
// both raw and serialized forms.
|
|
87
|
+
hover_filter_brightness: /brightness\(1\.1\)/.test(hover?.filter || ''),
|
|
88
|
+
hover_scale_still_105: hover?.scale === '1.05',
|
|
89
|
+
hover_rotate_still_6: hover?.rotate === '6deg',
|
|
90
|
+
transition_has_transform: /transform/.test(rest?.transitionProperty || ''),
|
|
91
|
+
transition_has_filter: /filter/.test(rest?.transitionProperty || ''),
|
|
92
|
+
// 3 axes (color + transform + filter) → '0.2s, 0.2s, 0.2s'
|
|
93
|
+
transition_duration: /^0\.2s(,\s*0\.2s)*$/.test(rest?.transitionDuration || ''),
|
|
94
|
+
source_classname: sourceClassname,
|
|
95
|
+
source_transition_list: sourceTransition,
|
|
96
|
+
source_attr: sourceAttr,
|
|
97
|
+
};
|
|
98
|
+
const ok = Object.values(results).every(Boolean);
|
|
99
|
+
console.log(`${ok ? '✅' : '❌'} R557 brand-logo hover:brightness-110 (4th axis):`,
|
|
100
|
+
JSON.stringify(results, null, 2),
|
|
101
|
+
`\n rest filter: ${rest?.filter}`,
|
|
102
|
+
`\n hover filter: ${hover?.filter}`,
|
|
103
|
+
`\n hover scale: ${hover?.scale}, rotate: ${hover?.rotate}`,
|
|
104
|
+
`\n transition: ${rest?.transitionProperty}`);
|
|
105
|
+
process.exit(ok ? 0 : 1);
|