@sleep2agi/agent-network-dashboard 0.5.3-preview.2 → 0.5.3-preview.200
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 +32 -32
- 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 +12 -12
- package/.next/server/app/_not-found.segments/_full.segment.rsc +12 -12
- package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/server/app/_not-found.segments/_index.segment.rsc +7 -7
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/admin.segments/_full.segment.rsc +14 -14
- package/.next/server/app/admin.segments/_head.segment.rsc +4 -4
- package/.next/server/app/admin.segments/_index.segment.rsc +7 -7
- package/.next/server/app/admin.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/admin.segments/admin.segment.rsc +3 -3
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +14 -14
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.segments/_full.segment.rsc +14 -14
- package/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/server/app/index.segments/_index.segment.rsc +7 -7
- 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 +14 -14
- package/.next/server/app/login.segments/_full.segment.rsc +14 -14
- package/.next/server/app/login.segments/_head.segment.rsc +4 -4
- package/.next/server/app/login.segments/_index.segment.rsc +7 -7
- package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/login.segments/login.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/logs.segments/_full.segment.rsc +14 -14
- package/.next/server/app/logs.segments/_head.segment.rsc +4 -4
- package/.next/server/app/logs.segments/_index.segment.rsc +7 -7
- package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/logs.segments/logs.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/messages.segments/_full.segment.rsc +14 -14
- package/.next/server/app/messages.segments/_head.segment.rsc +4 -4
- package/.next/server/app/messages.segments/_index.segment.rsc +7 -7
- package/.next/server/app/messages.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/messages.segments/messages.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/node.segments/_full.segment.rsc +14 -14
- package/.next/server/app/node.segments/_head.segment.rsc +4 -4
- package/.next/server/app/node.segments/_index.segment.rsc +7 -7
- package/.next/server/app/node.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/node.segments/node.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/nodes.segments/_full.segment.rsc +14 -14
- package/.next/server/app/nodes.segments/_head.segment.rsc +4 -4
- package/.next/server/app/nodes.segments/_index.segment.rsc +7 -7
- package/.next/server/app/nodes.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/nodes.segments/nodes.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/server-logs.segments/_full.segment.rsc +14 -14
- package/.next/server/app/server-logs.segments/_head.segment.rsc +4 -4
- package/.next/server/app/server-logs.segments/_index.segment.rsc +7 -7
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/server-logs.segments/server-logs.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +14 -14
- package/.next/server/app/settings/networks.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/networks.segments/_index.segment.rsc +7 -7
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +3 -3
- package/.next/server/app/settings/networks.segments/settings.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +14 -14
- package/.next/server/app/settings/tokens.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings/tokens.segments/_index.segment.rsc +7 -7
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +3 -3
- package/.next/server/app/settings/tokens.segments/settings.segment.rsc +3 -3
- package/.next/server/app/settings.html +2 -2
- package/.next/server/app/settings.rsc +14 -14
- package/.next/server/app/settings.segments/_full.segment.rsc +14 -14
- package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
- package/.next/server/app/settings.segments/_index.segment.rsc +7 -7
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/settings.segments/settings.segment.rsc +3 -3
- 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 +14 -14
- package/.next/server/app/tasks.segments/_full.segment.rsc +14 -14
- package/.next/server/app/tasks.segments/_head.segment.rsc +4 -4
- package/.next/server/app/tasks.segments/_index.segment.rsc +7 -7
- package/.next/server/app/tasks.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/tasks.segments/tasks.segment.rsc +3 -3
- 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/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_components_0mvyi-4._.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/{05zlv0iopwd40.js → 01he.jfmupx6b.js} +1 -1
- package/.next/static/chunks/047xfmz-_yklx.js +1 -0
- package/.next/static/chunks/08.zg.lu3fwqw.js +4 -0
- package/.next/static/chunks/0_c5~297u5j0p.js +1 -0
- package/.next/static/chunks/{03a4--7ncekmk.js → 0v4-5tng.uh.7.js} +2 -2
- package/.next/static/chunks/17if82x7mcn4j.css +2 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/ServersDrawer.tsx +16 -3
- package/app/components/TopoGraph.tsx +5343 -182
- package/app/globals.css +228 -6
- package/package.json +4 -4
- package/scripts/p157-servers-copy-test.mjs +95 -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-glow-test.mjs +121 -0
- package/scripts/topo-alias-text-halo-layers-test.mjs +98 -0
- package/scripts/topo-avatar-brightness-test.mjs +116 -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-row-digit-ls-test.mjs +135 -0
- package/scripts/topo-chip-row-member-alias-lit-test.mjs +154 -0
- package/scripts/topo-chip-row-press-test.mjs +93 -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-press-fullstrip-test.mjs +105 -0
- package/scripts/topo-chrome-press-scale-test.mjs +100 -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-recede-test.mjs +111 -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-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-filter-pills-press-test.mjs +96 -0
- package/scripts/topo-fleet-density-tier-test.mjs +84 -0
- package/scripts/topo-flow-arrow-brightness-test.mjs +82 -0
- package/scripts/topo-flow-rail-brightness-test.mjs +80 -0
- package/scripts/topo-focus-outline-transition-test.mjs +107 -0
- package/scripts/topo-freshness-chip-fade-test.mjs +105 -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-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 +144 -0
- 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 +109 -0
- package/scripts/topo-hub-recede-test.mjs +124 -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-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-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-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-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-box-dash-test.mjs +89 -0
- package/scripts/topo-orphan-fill-opacity-test.mjs +91 -0
- package/scripts/topo-orphan-label-italic-test.mjs +90 -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-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-pinned-aspect-test.mjs +89 -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-hot-pulse-test.mjs +102 -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-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-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-focus-transition-test.mjs +105 -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-activelinks-press-test.mjs +100 -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-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-recede-test.mjs +114 -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-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/0a4hmfvj-81x5.css +0 -2
- package/.next/static/chunks/0a~3lmgl2.3sm.js +0 -4
- package/.next/static/chunks/0w_zjois27-bj.js +0 -1
- package/.next/static/chunks/11vp-~kvgz81f.js +0 -1
- /package/.next/static/{AQG7LOsK4d0T0j2nFonEh → N193Pg2TkoL0c6mKNfKm_}/_buildManifest.js +0 -0
- /package/.next/static/{AQG7LOsK4d0T0j2nFonEh → N193Pg2TkoL0c6mKNfKm_}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{AQG7LOsK4d0T0j2nFonEh → N193Pg2TkoL0c6mKNfKm_}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/* Round 494 verification: chip-row working + online chips gain
|
|
2
|
+
* `active:scale-95` press feedback, gated on the clickable branch
|
|
3
|
+
* (workingCount > 0 / onlineNodes.length > 0). Extends the chrome-
|
|
4
|
+
* strip press family (R492 Ring/Grid + R493 5 chrome buttons) into
|
|
5
|
+
* the chip-row scope.
|
|
6
|
+
*
|
|
7
|
+
* Verifies per chip:
|
|
8
|
+
* - DOM element resolvable (data-working-chip / data-online-chip)
|
|
9
|
+
* - className contains `active:scale-95` (since fixture has both chips
|
|
10
|
+
* with > 0 count → clickable branch active)
|
|
11
|
+
* - computed transition-property includes `transform`
|
|
12
|
+
* - source-file regex confirms class string wired
|
|
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, status) => ({
|
|
35
|
+
alias, status, 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
|
+
// Need both working and online > 0 so both chip variants enter clickable branch
|
|
40
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
41
|
+
mk('alpha·a1', 'working'),
|
|
42
|
+
mk('alpha·a2', 'idle'),
|
|
43
|
+
] } });
|
|
44
|
+
});
|
|
45
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
46
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
47
|
+
const page = await ctx.newPage();
|
|
48
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
49
|
+
await page.waitForSelector('[data-working-chip]', { timeout: 15000 });
|
|
50
|
+
await page.waitForTimeout(1000);
|
|
51
|
+
|
|
52
|
+
const probe = async (sel) => {
|
|
53
|
+
return await page.evaluate((s) => {
|
|
54
|
+
const el = document.querySelector(s);
|
|
55
|
+
if (!el) return null;
|
|
56
|
+
const cs = window.getComputedStyle(el);
|
|
57
|
+
return {
|
|
58
|
+
cls: el.className || '',
|
|
59
|
+
cls_has_scale95: /active:scale-95/.test(el.className || ''),
|
|
60
|
+
cls_has_translate: /hover:-translate-y-px/.test(el.className || ''),
|
|
61
|
+
tp: cs.transitionProperty,
|
|
62
|
+
td: cs.transitionDuration,
|
|
63
|
+
tp_has_transform: /transform/i.test(cs.transitionProperty || ''),
|
|
64
|
+
};
|
|
65
|
+
}, sel);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const wInfo = await probe('[data-working-chip]');
|
|
69
|
+
const oInfo = await probe('[data-online-chip]');
|
|
70
|
+
|
|
71
|
+
await browser.close();
|
|
72
|
+
|
|
73
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
74
|
+
const sWorking = /workingCount > 0\s*\?\s*'bg-green-500\/10 text-green-300 border-green-500\/20 hover:bg-green-500\/15 hover:border-green-500\/30 hover:-translate-y-px active:scale-95'/.test(src);
|
|
75
|
+
const sOnline = /onlineNodes\.length > 0\s*\?\s*'bg-cyan-500\/10 text-cyan-300 border-cyan-500\/20 hover:bg-cyan-500\/15 hover:border-cyan-500\/30 hover:-translate-y-px active:scale-95'/.test(src);
|
|
76
|
+
|
|
77
|
+
const results = {
|
|
78
|
+
working_dom_found: !!wInfo,
|
|
79
|
+
working_has_scale95: wInfo && wInfo.cls_has_scale95,
|
|
80
|
+
working_has_lift: wInfo && wInfo.cls_has_translate,
|
|
81
|
+
working_tp_transform: wInfo && wInfo.tp_has_transform,
|
|
82
|
+
online_dom_found: !!oInfo,
|
|
83
|
+
online_has_scale95: oInfo && oInfo.cls_has_scale95,
|
|
84
|
+
online_has_lift: oInfo && oInfo.cls_has_translate,
|
|
85
|
+
online_tp_transform: oInfo && oInfo.tp_has_transform,
|
|
86
|
+
source_working_wired: sWorking,
|
|
87
|
+
source_online_wired: sOnline,
|
|
88
|
+
};
|
|
89
|
+
const ok = Object.values(results).every(Boolean);
|
|
90
|
+
console.log(`${ok ? '✅' : '❌'} chip-row working+online active:scale-95 (R494):`, JSON.stringify(results),
|
|
91
|
+
'\n working tp:', wInfo && wInfo.tp,
|
|
92
|
+
'\n online tp:', oInfo && oInfo.tp);
|
|
93
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/* Round 578 verification: chip-row tier-color glow trio gains
|
|
2
|
+
* stacked brightness:
|
|
3
|
+
* R537 legend swatch + R578 brightness(1.15)
|
|
4
|
+
* R541 vendor chip + R578 brightness(1.15)
|
|
5
|
+
* R542 pressure-seg (already had brightness(1.2) — pre-existing)
|
|
6
|
+
*
|
|
7
|
+
* Test phases:
|
|
8
|
+
* 1. rest: legend swatch filter='none', brightness-attr='1'
|
|
9
|
+
* 2. source: legend swatch stacked filter expression
|
|
10
|
+
* 3. source: vendor chip stacked filter expression (pin + hover branches)
|
|
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, status) => ({
|
|
33
|
+
alias, status, 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: [
|
|
38
|
+
mk('alpha·1', 'working'),
|
|
39
|
+
] } });
|
|
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-legend-swatch="working"]', { timeout: 15000 });
|
|
46
|
+
await page.waitForTimeout(500);
|
|
47
|
+
|
|
48
|
+
const restSwatch = await page.evaluate(() => {
|
|
49
|
+
const el = document.querySelector('[data-legend-swatch="working"]');
|
|
50
|
+
if (!el) return null;
|
|
51
|
+
const cs = getComputedStyle(el);
|
|
52
|
+
return {
|
|
53
|
+
filter: cs.filter,
|
|
54
|
+
brightnessAttr: el.getAttribute('data-legend-swatch-brightness'),
|
|
55
|
+
glowAttr: el.getAttribute('data-legend-swatch-glow'),
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// Click pressure-seg working → pinnedStatus='working' → legend swatch lifts
|
|
60
|
+
await page.click('[data-pressure-seg="working"]');
|
|
61
|
+
await page.waitForTimeout(400);
|
|
62
|
+
const pinnedSwatch = await page.evaluate(() => {
|
|
63
|
+
const el = document.querySelector('[data-legend-swatch="working"]');
|
|
64
|
+
if (!el) return null;
|
|
65
|
+
const cs = getComputedStyle(el);
|
|
66
|
+
return {
|
|
67
|
+
filter: cs.filter,
|
|
68
|
+
brightnessAttr: el.getAttribute('data-legend-swatch-brightness'),
|
|
69
|
+
glowAttr: el.getAttribute('data-legend-swatch-glow'),
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
await browser.close();
|
|
74
|
+
|
|
75
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
76
|
+
const sourceSwatchFilter = /filter: isSwatchLifted\s*\?\s*`drop-shadow\(0 0 3px \$\{row\.fill\}99\) brightness\(1\.15\)`/.test(src);
|
|
77
|
+
const sourceSwatchAttr = /data-legend-swatch-brightness=\{isSwatchLifted \? '1\.15' : '1'\}/.test(src);
|
|
78
|
+
const sourceVendorPin = /`drop-shadow\(0 0 3px color-mix\(in srgb, \$\{v\.color\} 60%, transparent\)\) brightness\(1\.15\)`/.test(src);
|
|
79
|
+
const sourceVendorHover = /`drop-shadow\(0 0 3px color-mix\(in srgb, \$\{v\.color\} 40%, transparent\)\) brightness\(1\.15\)`/.test(src);
|
|
80
|
+
|
|
81
|
+
const results = {
|
|
82
|
+
rest_swatch_filter_none: restSwatch?.filter === 'none',
|
|
83
|
+
rest_swatch_brightness_1: restSwatch?.brightnessAttr === '1',
|
|
84
|
+
rest_swatch_glow_false: restSwatch?.glowAttr === 'false',
|
|
85
|
+
pinned_swatch_brightness_1_15: pinnedSwatch?.brightnessAttr === '1.15',
|
|
86
|
+
pinned_swatch_glow_true: pinnedSwatch?.glowAttr === 'true',
|
|
87
|
+
pinned_swatch_has_dropshadow: /drop-shadow\(/.test(pinnedSwatch?.filter || ''),
|
|
88
|
+
pinned_swatch_has_brightness: /brightness\(1\.15\)/.test(pinnedSwatch?.filter || ''),
|
|
89
|
+
source_swatch_filter: sourceSwatchFilter,
|
|
90
|
+
source_swatch_attr: sourceSwatchAttr,
|
|
91
|
+
source_vendor_pin_filter: sourceVendorPin,
|
|
92
|
+
source_vendor_hover_filter: sourceVendorHover,
|
|
93
|
+
};
|
|
94
|
+
const ok = Object.values(results).every(Boolean);
|
|
95
|
+
console.log(`${ok ? '✅' : '❌'} R578 chip-row tier-color glow trio stacked brightness (legend swatch + vendor chip):`,
|
|
96
|
+
JSON.stringify(results, null, 2),
|
|
97
|
+
'\n rest swatch:', JSON.stringify(restSwatch),
|
|
98
|
+
'\n pinned swatch:', JSON.stringify(pinnedSwatch));
|
|
99
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/* Round 560 verification: chip-row chip UNIT spans + filter-pill
|
|
2
|
+
* prefix/count + vendor-letter count suffix gain group-hover:
|
|
3
|
+
* tracking-wide. Coordinated 7-occurrence replace_all swap
|
|
4
|
+
* extends the hover-letter-spacing family across the small
|
|
5
|
+
* data-label-spans-with-opacity-70 cohort.
|
|
6
|
+
*
|
|
7
|
+
* Test phases:
|
|
8
|
+
* 1. rest: letter-spacing ≈ 'normal' (0px) on working-chip-unit
|
|
9
|
+
* 2. hover the chip wrapper (group) → unit letter-spacing lifts
|
|
10
|
+
* to ≈ 0.025em ≈ 0.3px on a 12px font
|
|
11
|
+
* 3. transition-property contains BOTH 'opacity' and
|
|
12
|
+
* 'letter-spacing'
|
|
13
|
+
* 4. source-side regex confirms the new className substring
|
|
14
|
+
* appears 7 times (replace_all touched all sites)
|
|
15
|
+
*/
|
|
16
|
+
import { chromium } from 'playwright';
|
|
17
|
+
import { readFileSync } from 'node:fs';
|
|
18
|
+
|
|
19
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
20
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
21
|
+
|
|
22
|
+
const browser = await chromium.launch({ headless: true });
|
|
23
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
24
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
25
|
+
await ctx.addInitScript(() => {
|
|
26
|
+
try {
|
|
27
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
28
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
29
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
30
|
+
} catch {}
|
|
31
|
+
});
|
|
32
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
33
|
+
const r = await route.fetch();
|
|
34
|
+
const b = await r.json();
|
|
35
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
36
|
+
const mk = (alias, status = 'working') => ({
|
|
37
|
+
alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
38
|
+
network_id: nid, project_dir: null,
|
|
39
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
40
|
+
});
|
|
41
|
+
// Working sessions so the working chip is clickable / hoverable.
|
|
42
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
43
|
+
mk('a·1', 'working'), mk('a·2', 'working'), mk('a·3', 'idle'),
|
|
44
|
+
] } });
|
|
45
|
+
});
|
|
46
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
47
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
48
|
+
const page = await ctx.newPage();
|
|
49
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
50
|
+
await page.waitForSelector('[data-working-chip-unit]', { timeout: 15000 });
|
|
51
|
+
await page.waitForTimeout(500);
|
|
52
|
+
|
|
53
|
+
const unitSel = '[data-working-chip-unit]';
|
|
54
|
+
// Hover the parent chip (the <span> wrapping digit+unit) — group-hover.
|
|
55
|
+
// Walk up until we find the role='button' chip wrapper.
|
|
56
|
+
const chipWrapperHandle = await page.evaluateHandle((s) => {
|
|
57
|
+
let el = document.querySelector(s);
|
|
58
|
+
while (el && el.parentElement) {
|
|
59
|
+
el = el.parentElement;
|
|
60
|
+
if (el.getAttribute('role') === 'button' || el.getAttribute('aria-pressed') !== null) {
|
|
61
|
+
return el;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return el;
|
|
65
|
+
}, unitSel);
|
|
66
|
+
|
|
67
|
+
const parsePx = (s) => parseFloat((s || '').replace(/px$/, ''));
|
|
68
|
+
|
|
69
|
+
const rest = await page.evaluate((s) => {
|
|
70
|
+
const el = document.querySelector(s);
|
|
71
|
+
if (!el) return null;
|
|
72
|
+
const cs = getComputedStyle(el);
|
|
73
|
+
return {
|
|
74
|
+
letterSpacing: cs.letterSpacing,
|
|
75
|
+
transitionProperty: cs.transitionProperty,
|
|
76
|
+
transitionDuration: cs.transitionDuration,
|
|
77
|
+
fontSize: cs.fontSize,
|
|
78
|
+
opacity: cs.opacity,
|
|
79
|
+
};
|
|
80
|
+
}, unitSel);
|
|
81
|
+
|
|
82
|
+
// Hover the chip wrapper
|
|
83
|
+
await chipWrapperHandle.hover();
|
|
84
|
+
await page.waitForTimeout(400);
|
|
85
|
+
const hover = await page.evaluate((s) => {
|
|
86
|
+
const el = document.querySelector(s);
|
|
87
|
+
if (!el) return null;
|
|
88
|
+
const cs = getComputedStyle(el);
|
|
89
|
+
return {
|
|
90
|
+
letterSpacing: cs.letterSpacing,
|
|
91
|
+
opacity: cs.opacity,
|
|
92
|
+
};
|
|
93
|
+
}, unitSel);
|
|
94
|
+
|
|
95
|
+
await browser.close();
|
|
96
|
+
|
|
97
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
98
|
+
// Count occurrences of the new className
|
|
99
|
+
const occurrences = (src.match(/opacity-70 transition-\[opacity,letter-spacing\] duration-200 group-hover:opacity-100 group-hover:tracking-wide/g) || []).length;
|
|
100
|
+
|
|
101
|
+
// At text-xs (12px in chip-row context), tracking-wide = 0.025em = 0.3px
|
|
102
|
+
// At rest, letter-spacing = 'normal' which most browsers report as '0px'
|
|
103
|
+
// or 'normal'.
|
|
104
|
+
const restPx = parsePx(rest?.letterSpacing) || 0;
|
|
105
|
+
const hoverPx = parsePx(hover?.letterSpacing);
|
|
106
|
+
|
|
107
|
+
const results = {
|
|
108
|
+
rest_letter_spacing_zero: rest?.letterSpacing === 'normal' || Math.abs(restPx) < 0.01,
|
|
109
|
+
hover_letter_spacing_wide: Math.abs(hoverPx - 0.3) < 0.1, // tracking-wide @ 12px ≈ 0.3px
|
|
110
|
+
hover_ls_greater_than_rest: hoverPx > restPx + 0.1,
|
|
111
|
+
rest_opacity_0_7: Math.abs(parseFloat(rest?.opacity || '0') - 0.7) < 0.01,
|
|
112
|
+
hover_opacity_1: Math.abs(parseFloat(hover?.opacity || '0') - 1.0) < 0.01,
|
|
113
|
+
transition_has_opacity: /opacity/.test(rest?.transitionProperty || ''),
|
|
114
|
+
transition_has_ls: /letter-spacing/.test(rest?.transitionProperty || ''),
|
|
115
|
+
transition_duration: rest?.transitionDuration === '0.2s' || /^0\.2s/.test(rest?.transitionDuration || ''),
|
|
116
|
+
source_7_occurrences: occurrences === 7,
|
|
117
|
+
};
|
|
118
|
+
const ok = Object.values(results).every(Boolean);
|
|
119
|
+
console.log(`${ok ? '✅' : '❌'} R560 chip-row unit + filter-pill spans hover-tracking (7 anchors via replace_all):`,
|
|
120
|
+
JSON.stringify(results, null, 2),
|
|
121
|
+
`\n rest: ${JSON.stringify(rest)}`,
|
|
122
|
+
`\n hover: ${JSON.stringify(hover)}`,
|
|
123
|
+
`\n source replace_all occurrences: ${occurrences}`);
|
|
124
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/* Round 667 — chrome reset + fullscreen buttons gain 2-layer drop-
|
|
2
|
+
* shadow halo on hover. 26th anchor in multi-layer halo family —
|
|
3
|
+
* 1st chrome-control anchor.
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync } from 'node:fs';
|
|
6
|
+
|
|
7
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
8
|
+
const sourceResetFilter = /hoveredReset \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
|
|
9
|
+
const sourceFullscreenFilter = /hoveredFullscreen \? `drop-shadow\(0 0 2px \$\{pal\.legendAccent\}80\) drop-shadow\(0 0 4px \$\{pal\.legendAccent\}40\) brightness\(1\.15\)` : undefined/.test(src);
|
|
10
|
+
const sourceResetAttr = /data-topo-chrome-reset-halo-layers=\{hoveredReset \? '2' : '0'\}/.test(src);
|
|
11
|
+
const sourceFullscreenAttr = /data-topo-chrome-fullscreen-halo-layers=\{hoveredFullscreen \? '2' : '0'\}/.test(src);
|
|
12
|
+
|
|
13
|
+
const results = {
|
|
14
|
+
source_reset_filter: sourceResetFilter,
|
|
15
|
+
source_fullscreen_filter: sourceFullscreenFilter,
|
|
16
|
+
source_reset_attr: sourceResetAttr,
|
|
17
|
+
source_fullscreen_attr: sourceFullscreenAttr,
|
|
18
|
+
};
|
|
19
|
+
const ok = Object.values(results).every(Boolean);
|
|
20
|
+
console.log(`${ok ? '✅' : '❌'} R667 chrome controls multi-layer halo (reset + fullscreen sibling pair):`,
|
|
21
|
+
JSON.stringify(results, null, 2));
|
|
22
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/* Round 493 verification: chrome-strip active:scale-95 press feedback
|
|
2
|
+
* family rolls out from Ring/Grid (R492) to the remaining 5 chrome
|
|
3
|
+
* buttons: nodeSize S/M/L (1 selector per .map call — 3 buttons),
|
|
4
|
+
* zoom-out, zoom-in, reset, fullscreen.
|
|
5
|
+
*
|
|
6
|
+
* Total chrome strip active:scale-95 coverage after R493 = 7 buttons
|
|
7
|
+
* (R306-era 7-button family unified on press feedback).
|
|
8
|
+
*
|
|
9
|
+
* Verifies per button:
|
|
10
|
+
* - DOM element resolvable
|
|
11
|
+
* - className contains `active:scale-95`
|
|
12
|
+
* - computed transition-property includes `transform`
|
|
13
|
+
* - computed transition-duration is 0.2s (200ms)
|
|
14
|
+
* - source-file regex confirms the class string wired
|
|
15
|
+
*/
|
|
16
|
+
import { chromium } from 'playwright';
|
|
17
|
+
import { readFileSync } from 'node:fs';
|
|
18
|
+
|
|
19
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
20
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
21
|
+
|
|
22
|
+
const browser = await chromium.launch({ headless: true });
|
|
23
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1200 } });
|
|
24
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
25
|
+
await ctx.addInitScript(() => {
|
|
26
|
+
try {
|
|
27
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
28
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
29
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
30
|
+
} catch {}
|
|
31
|
+
});
|
|
32
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
33
|
+
const r = await route.fetch();
|
|
34
|
+
const b = await r.json();
|
|
35
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
36
|
+
const mk = (alias, status) => ({
|
|
37
|
+
alias, status, model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
38
|
+
network_id: nid, project_dir: null,
|
|
39
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
40
|
+
});
|
|
41
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [mk('a·1', 'working')] } });
|
|
42
|
+
});
|
|
43
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
44
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
45
|
+
const page = await ctx.newPage();
|
|
46
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
47
|
+
await page.waitForSelector('[data-topo-chrome-fullscreen]', { timeout: 15000 });
|
|
48
|
+
await page.waitForTimeout(1000);
|
|
49
|
+
|
|
50
|
+
const probe = async (selector, label) => {
|
|
51
|
+
const data = await page.evaluate((s) => {
|
|
52
|
+
const els = Array.from(document.querySelectorAll(s));
|
|
53
|
+
if (!els.length) return { found: 0 };
|
|
54
|
+
return {
|
|
55
|
+
found: els.length,
|
|
56
|
+
samples: els.slice(0, 3).map((el) => {
|
|
57
|
+
const cs = window.getComputedStyle(el);
|
|
58
|
+
return {
|
|
59
|
+
cls_has_scale95: /active:scale-95/.test(el.className || ''),
|
|
60
|
+
tp_has_transform: /transform/i.test(cs.transitionProperty || ''),
|
|
61
|
+
td_includes_200: /\b0\.2s\b/.test(cs.transitionDuration || ''),
|
|
62
|
+
tp: cs.transitionProperty,
|
|
63
|
+
td: cs.transitionDuration,
|
|
64
|
+
};
|
|
65
|
+
}),
|
|
66
|
+
};
|
|
67
|
+
}, selector);
|
|
68
|
+
return { label, ...data };
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const nodeSizeBtns = await probe('button[data-topo-chrome-node-size]', 'nodeSize');
|
|
72
|
+
// node-size buttons may use a different attr; fall back to nth child selector
|
|
73
|
+
const zoomOutBtn = await probe('button[title^="Zoom out"]', 'zoomOut');
|
|
74
|
+
const zoomInBtn = await probe('button[title^="Zoom in"]', 'zoomIn');
|
|
75
|
+
const resetBtn = await probe('button[data-topo-chrome-reset-hover-lift]', 'reset');
|
|
76
|
+
const fullBtn = await probe('button[data-topo-chrome-fullscreen]', 'fullscreen');
|
|
77
|
+
|
|
78
|
+
await browser.close();
|
|
79
|
+
|
|
80
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
81
|
+
// 5 source-side regex anchors (one per button class string)
|
|
82
|
+
const sNodeSize = /px-2 py-1 transition-colors transition-transform duration-200 ease-out transform-gpu active:scale-95/.test(src);
|
|
83
|
+
const sZoom = /group px-2 py-1 hover:bg-white\/5 active:bg-white\/10 transition-colors transition-transform duration-200 ease-out transform-gpu active:scale-95/.test(src);
|
|
84
|
+
const sReset = /p-1\.5 rounded-md border hover:bg-white\/5 active:bg-white\/10 hover:-translate-y-px active:scale-95 transition-colors transition-transform duration-200/.test(src);
|
|
85
|
+
const sFullscreen= /group p-1\.5 rounded-md border hover:-translate-y-px active:scale-95 transition-colors transition-transform duration-200/.test(src);
|
|
86
|
+
|
|
87
|
+
const allButtonsPressReady = (info) =>
|
|
88
|
+
info.found > 0 && info.samples.every((s) => s.cls_has_scale95 && s.tp_has_transform && s.td_includes_200);
|
|
89
|
+
|
|
90
|
+
const results = {
|
|
91
|
+
zoom_out_press_ready: allButtonsPressReady(zoomOutBtn),
|
|
92
|
+
zoom_in_press_ready: allButtonsPressReady(zoomInBtn),
|
|
93
|
+
reset_press_ready: allButtonsPressReady(resetBtn),
|
|
94
|
+
fullscreen_press_ready:allButtonsPressReady(fullBtn),
|
|
95
|
+
source_nodesize_wired: sNodeSize,
|
|
96
|
+
source_zoom_wired: sZoom,
|
|
97
|
+
source_reset_wired: sReset,
|
|
98
|
+
source_fullscreen_wired: sFullscreen,
|
|
99
|
+
};
|
|
100
|
+
const ok = Object.values(results).every(Boolean);
|
|
101
|
+
console.log(`${ok ? '✅' : '❌'} chrome-strip 5-button press feedback (R493):`, JSON.stringify(results),
|
|
102
|
+
'\n zoomOut found:', zoomOutBtn.found, ' zoomIn:', zoomInBtn.found,
|
|
103
|
+
'\n reset:', resetBtn.found, ' fullscreen:', fullBtn.found,
|
|
104
|
+
'\n nodeSize found:', nodeSizeBtns.found);
|
|
105
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/* Round 492 verification: chrome-strip Ring/Grid buttons gain
|
|
2
|
+
* `active:scale-95` press feedback alongside R196's `active:bg-cyan-
|
|
3
|
+
* 500/25` color-deepen. Adds haptic-like compression on click,
|
|
4
|
+
* synced with bg/color via inline `transform 150ms ease-out`.
|
|
5
|
+
*
|
|
6
|
+
* Verifies (per Ring + Grid button):
|
|
7
|
+
* 1. button DOM element present
|
|
8
|
+
* 2. className contains 'active:scale-95' and 'transform-gpu'
|
|
9
|
+
* 3. inline style transition string includes 'transform 150ms ease-out'
|
|
10
|
+
* 4. baseline transform resolves to none/matrix-identity (not pressed)
|
|
11
|
+
* 5. source-file regex confirms both buttons wired
|
|
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, status) => ({
|
|
34
|
+
alias, status, 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', 'working')] } });
|
|
39
|
+
});
|
|
40
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
41
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
42
|
+
const page = await ctx.newPage();
|
|
43
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' });
|
|
44
|
+
await page.waitForSelector('[data-topo-chrome-layout="ring"]', { timeout: 15000 });
|
|
45
|
+
await page.waitForTimeout(800);
|
|
46
|
+
|
|
47
|
+
const probe = async (selector) => {
|
|
48
|
+
const el = await page.$(selector);
|
|
49
|
+
if (!el) return null;
|
|
50
|
+
const data = await page.evaluate((selector) => {
|
|
51
|
+
const el = document.querySelector(selector);
|
|
52
|
+
if (!el) return null;
|
|
53
|
+
const cs = window.getComputedStyle(el);
|
|
54
|
+
return {
|
|
55
|
+
className: el.className || '',
|
|
56
|
+
transition_property: cs.transitionProperty,
|
|
57
|
+
transition_duration: cs.transitionDuration,
|
|
58
|
+
transition_timing_func: cs.transitionTimingFunction,
|
|
59
|
+
transform_baseline: cs.transform,
|
|
60
|
+
};
|
|
61
|
+
}, selector);
|
|
62
|
+
return data;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const ringInfo = await probe('[data-topo-chrome-layout="ring"]');
|
|
66
|
+
const gridInfo = await probe('[data-topo-chrome-layout="grid"]');
|
|
67
|
+
|
|
68
|
+
await browser.close();
|
|
69
|
+
|
|
70
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
71
|
+
const sourceRingActive = /data-topo-chrome-layout="ring"[\s\S]{0,8000}active:scale-95 transform-gpu/.test(src);
|
|
72
|
+
const sourceGridActive = /data-topo-chrome-layout="grid"[\s\S]{0,8000}active:scale-95 transform-gpu/.test(src);
|
|
73
|
+
const sourceRingTransform = /background-color 150ms ease, color 150ms ease, letter-spacing 200ms ease-out, transform 150ms ease-out/.test(src);
|
|
74
|
+
const sourceGridTransform = /border-color 200ms ease-out, letter-spacing 200ms ease-out, transform 150ms ease-out/.test(src);
|
|
75
|
+
|
|
76
|
+
const hasActiveScale = (cls) => /active:scale-95/.test(cls) && /transform-gpu/.test(cls);
|
|
77
|
+
const hasTransformInTransition = (info) =>
|
|
78
|
+
info && /transform/i.test(info.transition_property || '') && /\b0\.15s\b/.test(info.transition_duration || '');
|
|
79
|
+
const isBaselineIdentity = (info) =>
|
|
80
|
+
info && (info.transform_baseline === 'none' || info.transform_baseline === 'matrix(1, 0, 0, 1, 0, 0)');
|
|
81
|
+
|
|
82
|
+
const results = {
|
|
83
|
+
ring_dom_found: !!ringInfo,
|
|
84
|
+
ring_class_active: ringInfo && hasActiveScale(ringInfo.className),
|
|
85
|
+
ring_transform_tr: hasTransformInTransition(ringInfo),
|
|
86
|
+
ring_baseline_id: isBaselineIdentity(ringInfo),
|
|
87
|
+
grid_dom_found: !!gridInfo,
|
|
88
|
+
grid_class_active: gridInfo && hasActiveScale(gridInfo.className),
|
|
89
|
+
grid_transform_tr: hasTransformInTransition(gridInfo),
|
|
90
|
+
grid_baseline_id: isBaselineIdentity(gridInfo),
|
|
91
|
+
source_ring_active: sourceRingActive,
|
|
92
|
+
source_grid_active: sourceGridActive,
|
|
93
|
+
source_ring_tr: sourceRingTransform,
|
|
94
|
+
source_grid_tr: sourceGridTransform,
|
|
95
|
+
};
|
|
96
|
+
const ok = Object.values(results).every(Boolean);
|
|
97
|
+
console.log(`${ok ? '✅' : '❌'} chrome-strip Ring/Grid active:scale-95 (R492):`, JSON.stringify(results),
|
|
98
|
+
'\n ring:', ringInfo && { tp: ringInfo.transition_property, td: ringInfo.transition_duration, tx: ringInfo.transform_baseline },
|
|
99
|
+
'\n grid:', gridInfo && { tp: gridInfo.transition_property, td: gridInfo.transition_duration, tx: gridInfo.transform_baseline });
|
|
100
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/* Round 608 — click-ripple gains drop-shadow glow that matches
|
|
2
|
+
* the ripple's stroke color. Expanding feedback ring now reads
|
|
3
|
+
* as a "lit pulse" rather than a plain stroke line.
|
|
4
|
+
*
|
|
5
|
+
* Test phases:
|
|
6
|
+
* 1. mock 2 idle nodes → click first node → ripple renders
|
|
7
|
+
* 2. ripple element present with data-click-ripple attr
|
|
8
|
+
* 3. computed filter contains 'drop-shadow'
|
|
9
|
+
* 4. data-click-ripple-glow attr present with valid format
|
|
10
|
+
* 5. source: filter inline + data-attr 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
|
+
// Click hub group (role=button aria-label="Network hub...") to fire setClickRipple
|
|
44
|
+
await page.waitForSelector('[data-topo-hub-fade-delay]', { timeout: 15000, state: 'attached' });
|
|
45
|
+
const hubBox = await page.evaluate(() => {
|
|
46
|
+
const el = document.querySelector('[data-topo-hub-fade-delay]');
|
|
47
|
+
if (!el) return null;
|
|
48
|
+
const r = el.getBoundingClientRect();
|
|
49
|
+
return { x: r.left + r.width / 2, y: r.top + r.height / 2 };
|
|
50
|
+
});
|
|
51
|
+
if (!hubBox) throw new Error('hub not found');
|
|
52
|
+
await page.mouse.click(hubBox.x, hubBox.y);
|
|
53
|
+
// Wait briefly so the ripple mounts but doesn't fully fade
|
|
54
|
+
await page.waitForSelector('[data-click-ripple]', { timeout: 5000, state: 'attached' });
|
|
55
|
+
await page.waitForTimeout(100);
|
|
56
|
+
|
|
57
|
+
const rippleState = await page.evaluate(() => {
|
|
58
|
+
const el = document.querySelector('[data-click-ripple]');
|
|
59
|
+
if (!el) return null;
|
|
60
|
+
const cs = getComputedStyle(el);
|
|
61
|
+
return {
|
|
62
|
+
filter: cs.filter,
|
|
63
|
+
glowAttr: el.getAttribute('data-click-ripple-glow'),
|
|
64
|
+
stroke: el.getAttribute('stroke'),
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
await browser.close();
|
|
69
|
+
|
|
70
|
+
const src = readFileSync('/home/vansin/agent-network-dashboard/app/components/TopoGraph.tsx', 'utf8');
|
|
71
|
+
const sourceFilter = /filter: `drop-shadow\(0 0 4px \$\{clickRipple\.color\}99\)`/.test(src);
|
|
72
|
+
const sourceAttr = /data-click-ripple-glow=\{`0 0 4px \$\{clickRipple\.color\}99`\}/.test(src);
|
|
73
|
+
|
|
74
|
+
const results = {
|
|
75
|
+
ripple_present: !!rippleState,
|
|
76
|
+
has_drop_shadow: /drop-shadow/.test(rippleState?.filter || ''),
|
|
77
|
+
glow_attr_format: /^0 0 4px /.test(rippleState?.glowAttr || ''),
|
|
78
|
+
has_stroke: !!rippleState?.stroke,
|
|
79
|
+
source_filter: sourceFilter,
|
|
80
|
+
source_attr: sourceAttr,
|
|
81
|
+
};
|
|
82
|
+
const ok = Object.values(results).every(Boolean);
|
|
83
|
+
console.log(`${ok ? '✅' : '❌'} R608 click-ripple drop-shadow glow (click feedback enhancement):`,
|
|
84
|
+
JSON.stringify(results, null, 2),
|
|
85
|
+
`\n ripple: ${JSON.stringify(rippleState)}`);
|
|
86
|
+
process.exit(ok ? 0 : 1);
|