@sleep2agi/agent-network-dashboard 0.4.6-preview.29 → 0.4.6-preview.290
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 +41 -41
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-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]__03b.f76._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__03b.f76._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0fhoq8i._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0nw~zhp._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +4 -1
- 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_057q.ne._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_057q.ne._.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_0_d45-d._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0_d45-d._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0i3759l._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0xgney8._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_0xgney8._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_10hjgv4._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_10hjgv4._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_1153xeb._.js.map +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_12l4oto._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_12l4oto._.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/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/0-mpa_947ipeq.js +1 -0
- package/.next/static/chunks/01lmbsd37fybu.js +1 -0
- package/.next/static/chunks/03o.h6kvmw4l_.js +1 -0
- package/.next/static/chunks/03~~oirxz7~vc.js +1 -0
- package/.next/static/chunks/05uk96gc~9mni.js +1 -0
- package/.next/static/chunks/08kf-.bgs10ze.js +1 -0
- package/.next/static/chunks/0diz2cstmft9..js +4 -0
- package/.next/static/chunks/0ggj5ummw2a84.js +7 -0
- package/.next/static/chunks/0glmrdj9112tc.js +7 -0
- package/.next/static/chunks/0nmwwa6lzow.6.js +1 -0
- package/.next/static/chunks/0rxrez_cjn.eh.js +1 -0
- package/.next/static/chunks/0uxiwnm1crkum.js +1 -0
- package/.next/static/chunks/0x8x.29hkju5a.js +1 -0
- package/.next/static/chunks/0y.7kwty.hl7h.css +2 -0
- package/.next/static/chunks/174re5ar~kxne.js +1 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/ChatPopover.tsx +38 -2
- package/app/components/CommandPalette.tsx +107 -0
- package/app/components/HelpOverlay.tsx +126 -0
- package/app/components/TopoGraph.tsx +5768 -246
- package/app/components/utils.ts +8 -7
- package/app/globals.css +110 -5
- package/app/lib/time.ts +36 -0
- package/package.json +2 -2
- package/scripts/help-overlay-topo-test.mjs +44 -0
- package/scripts/topo-active-filter-pill-test.mjs +101 -0
- package/scripts/topo-active-links-chip-hover-test.mjs +103 -0
- package/scripts/topo-active-links-chip-nav-test.mjs +117 -0
- package/scripts/topo-active-links-chip-self-hover-test.mjs +171 -0
- package/scripts/topo-active-links-chip-test.mjs +73 -0
- package/scripts/topo-active-links-empty-recede-test.mjs +125 -0
- package/scripts/topo-active-links-freshness-test.mjs +113 -0
- package/scripts/topo-active-links-tooltip-test.mjs +79 -0
- package/scripts/topo-active-pulse-ease-test.mjs +120 -0
- package/scripts/topo-auto-fit-test.mjs +73 -0
- package/scripts/topo-brand-watermark-test.mjs +97 -0
- package/scripts/topo-canvas-aria-test.mjs +108 -0
- package/scripts/topo-chat-target-breath-test.mjs +84 -0
- package/scripts/topo-chat-target-ring-ease-test.mjs +82 -0
- package/scripts/topo-chat-target-ring-fade-test.mjs +124 -0
- package/scripts/topo-chip-empty-recede-test.mjs +116 -0
- package/scripts/topo-chip-focus-test.mjs +95 -0
- package/scripts/topo-chip-pin-mirror-test.mjs +113 -0
- package/scripts/topo-chip-row-semantic-gap-test.mjs +97 -0
- package/scripts/topo-chip-row-tabular-test.mjs +111 -0
- package/scripts/topo-chrome-a11y-test.mjs +107 -0
- package/scripts/topo-chrome-pop-extension-test.mjs +98 -0
- package/scripts/topo-chrome-pop-nodesize-test.mjs +88 -0
- package/scripts/topo-chrome-press-state-test.mjs +135 -0
- package/scripts/topo-chrome-strip-semantic-gap-test.mjs +99 -0
- package/scripts/topo-chrome-strip-theme-ease-test.mjs +99 -0
- package/scripts/topo-chrome-zoom-level-pop-test.mjs +122 -0
- package/scripts/topo-chrome-zoom-pop-test.mjs +130 -0
- package/scripts/topo-click-ripple-ease-test.mjs +94 -0
- package/scripts/topo-cmdk-edge-clear-test.mjs +109 -0
- package/scripts/topo-cmdk-layout-view-test.mjs +108 -0
- package/scripts/topo-cmdk-pin-test.mjs +123 -0
- package/scripts/topo-cmdk-vendor-clear-test.mjs +133 -0
- package/scripts/topo-cmdk-vendor-pin-test.mjs +103 -0
- package/scripts/topo-corner-radius-unify-test.mjs +103 -0
- package/scripts/topo-cwd-tooltip-test.mjs +64 -0
- package/scripts/topo-dblclick-reset-test.mjs +74 -0
- package/scripts/topo-dense-alias-fill-transition-test.mjs +133 -0
- package/scripts/topo-discrete-zoom-smooth-test.mjs +125 -0
- package/scripts/topo-edge-badge-click-pin-test.mjs +94 -0
- package/scripts/topo-edge-badge-crossfade-test.mjs +138 -0
- package/scripts/topo-edge-badge-hot-test.mjs +115 -0
- package/scripts/topo-edge-badge-hover-test.mjs +85 -0
- package/scripts/topo-edge-badge-lift-test.mjs +150 -0
- package/scripts/topo-edge-badge-ripple-test.mjs +111 -0
- package/scripts/topo-edge-badge-stroke-transition-test.mjs +118 -0
- package/scripts/topo-edge-badge-text-pin-test.mjs +121 -0
- package/scripts/topo-edge-badge-theme-ease-test.mjs +89 -0
- package/scripts/topo-edge-count-badge-test.mjs +86 -0
- package/scripts/topo-edge-endpoint-highlight-test.mjs +111 -0
- package/scripts/topo-edge-fadein-test.mjs +106 -0
- package/scripts/topo-edge-focus-test.mjs +113 -0
- package/scripts/topo-edge-hover-test.mjs +93 -0
- package/scripts/topo-edge-pill-hot-test.mjs +129 -0
- package/scripts/topo-edge-pill-test.mjs +105 -0
- package/scripts/topo-edge-ping-pulse-retired-test.mjs +119 -0
- package/scripts/topo-edge-stroke-ease-test.mjs +100 -0
- package/scripts/topo-edge-stroke-transition-test.mjs +132 -0
- package/scripts/topo-edge-tooltip-test.mjs +70 -0
- package/scripts/topo-empty-state-breath-test.mjs +150 -0
- package/scripts/topo-empty-state-crossfade-test.mjs +130 -0
- package/scripts/topo-empty-state-recenter-test.mjs +107 -0
- package/scripts/topo-endpoint-ring-fade-test.mjs +132 -0
- package/scripts/topo-endpoint-ring-test.mjs +93 -0
- package/scripts/topo-endpoint-ring-thicken-test.mjs +112 -0
- package/scripts/topo-esc-clears-pin-test.mjs +98 -0
- package/scripts/topo-filter-pill-aliases-test.mjs +121 -0
- package/scripts/topo-filter-pill-body-click-test.mjs +112 -0
- package/scripts/topo-filter-pill-count-test.mjs +110 -0
- package/scripts/topo-filter-pill-mobile-test.mjs +90 -0
- package/scripts/topo-fit-key-test.mjs +106 -0
- package/scripts/topo-freshness-chip-test.mjs +74 -0
- package/scripts/topo-freshness-chip-transition-test.mjs +80 -0
- package/scripts/topo-freshness-conditional-render-test.mjs +92 -0
- package/scripts/topo-fullscreen-active-test.mjs +115 -0
- package/scripts/topo-group-box-pinned-state-test.mjs +95 -0
- package/scripts/topo-group-count-test.mjs +6 -1
- package/scripts/topo-group-label-a11y-test.mjs +113 -0
- package/scripts/topo-group-label-count-inherit-test.mjs +99 -0
- package/scripts/topo-group-label-hover-test.mjs +119 -0
- package/scripts/topo-group-label-pin-spacing-test.mjs +136 -0
- package/scripts/topo-group-label-tint-test.mjs +99 -0
- package/scripts/topo-group-label-title-test.mjs +83 -0
- package/scripts/topo-group-pin-test.mjs +119 -0
- package/scripts/topo-group-pip-fadein-test.mjs +100 -0
- package/scripts/topo-group-pip-tabular-test.mjs +95 -0
- package/scripts/topo-group-status-pips-test.mjs +103 -0
- package/scripts/topo-groupbox-fadein-test.mjs +95 -0
- package/scripts/topo-groupbox-hover-lift-test.mjs +127 -0
- package/scripts/topo-groupbox-hubcore-ease-test.mjs +106 -0
- package/scripts/topo-groupbox-live-test.mjs +100 -0
- package/scripts/topo-groupbox-march-busyness-test.mjs +155 -0
- package/scripts/topo-groupbox-test.mjs +4 -2
- package/scripts/topo-help-overlay-r109-test.mjs +67 -0
- package/scripts/topo-help-overlay-r118-test.mjs +69 -0
- package/scripts/topo-help-overlay-r123-test.mjs +69 -0
- package/scripts/topo-help-overlay-r134-test.mjs +74 -0
- package/scripts/topo-help-overlay-r137-test.mjs +81 -0
- package/scripts/topo-help-overlay-r141-test.mjs +86 -0
- package/scripts/topo-help-overlay-r153-test.mjs +85 -0
- package/scripts/topo-help-overlay-r59-test.mjs +67 -0
- package/scripts/topo-help-overlay-r65-test.mjs +64 -0
- package/scripts/topo-help-overlay-r70-test.mjs +63 -0
- package/scripts/topo-help-overlay-r78-test.mjs +59 -0
- package/scripts/topo-help-overlay-r81-test.mjs +58 -0
- package/scripts/topo-help-overlay-r87-test.mjs +64 -0
- package/scripts/topo-help-overlay-r91-test.mjs +65 -0
- package/scripts/topo-hot-tail-crossfade-test.mjs +117 -0
- package/scripts/topo-html-overlay-padding-unify-test.mjs +120 -0
- package/scripts/topo-hub-a11y-test.mjs +112 -0
- package/scripts/topo-hub-busyness-test.mjs +100 -0
- package/scripts/topo-hub-center-crossfade-test.mjs +124 -0
- package/scripts/topo-hub-click-fit-test.mjs +137 -0
- package/scripts/topo-hub-digit-scale-test.mjs +129 -0
- package/scripts/topo-hub-fadein-test.mjs +88 -0
- package/scripts/topo-hub-hover-lift-test.mjs +101 -0
- package/scripts/topo-hub-hover-ring-test.mjs +82 -0
- package/scripts/topo-hub-pip-theme-ease-test.mjs +116 -0
- package/scripts/topo-hub-spoke-ease-test.mjs +120 -0
- package/scripts/topo-hub-title-test.mjs +93 -0
- package/scripts/topo-hub-working-count-test.mjs +99 -0
- package/scripts/topo-ingroup-edge-test.mjs +103 -0
- package/scripts/topo-label-card-theme-ease-test.mjs +85 -0
- package/scripts/topo-label-lift-test.mjs +119 -0
- package/scripts/topo-lastseen-tooltip-test.mjs +59 -0
- package/scripts/topo-layout-hover-text-preview-test.mjs +101 -0
- package/scripts/topo-layout-key-test.mjs +91 -0
- package/scripts/topo-layout-switch-crossfade-test.mjs +126 -0
- package/scripts/topo-layout-toggle-border-unify-test.mjs +104 -0
- package/scripts/topo-layout-toggle-test.mjs +131 -0
- package/scripts/topo-legend-compress-test.mjs +107 -0
- package/scripts/topo-legend-count-empty-test.mjs +126 -0
- package/scripts/topo-legend-count-tabular-test.mjs +87 -0
- package/scripts/topo-legend-count-test.mjs +88 -0
- package/scripts/topo-legend-count-tier-fill-test.mjs +121 -0
- package/scripts/topo-legend-header-symmetric-inset-test.mjs +112 -0
- package/scripts/topo-legend-hitbox-swatch-center-test.mjs +93 -0
- package/scripts/topo-legend-hover-test.mjs +113 -0
- package/scripts/topo-legend-offline-delimiter-test.mjs +84 -0
- package/scripts/topo-legend-panel-header-test.mjs +83 -0
- package/scripts/topo-legend-pin-ring-fade-test.mjs +112 -0
- package/scripts/topo-legend-pin-test.mjs +128 -0
- package/scripts/topo-legend-row-hover-lift-test.mjs +109 -0
- package/scripts/topo-legend-row-pin-spacing-test.mjs +124 -0
- package/scripts/topo-legend-row-tint-test.mjs +95 -0
- package/scripts/topo-legend-row-title-test.mjs +102 -0
- package/scripts/topo-legend-swatch-grow-test.mjs +116 -0
- package/scripts/topo-minimap-a11y-test.mjs +101 -0
- package/scripts/topo-minimap-dot-transition-test.mjs +113 -0
- package/scripts/topo-minimap-test.mjs +68 -0
- package/scripts/topo-minimap-viewport-smooth-test.mjs +124 -0
- package/scripts/topo-mobile-chips-test.mjs +103 -0
- package/scripts/topo-monogram-stroke-test.mjs +101 -0
- package/scripts/topo-node-a11y-test.mjs +107 -0
- package/scripts/topo-node-hover-lift-test.mjs +85 -0
- package/scripts/topo-node-label-card-elevation-test.mjs +157 -0
- package/scripts/topo-node-label-card-stroke-test.mjs +135 -0
- package/scripts/topo-node-stroke-transition-test.mjs +103 -0
- package/scripts/topo-node-text-fill-transition-test.mjs +119 -0
- package/scripts/topo-node-title-peers-test.mjs +107 -0
- package/scripts/topo-node-title-test.mjs +101 -0
- package/scripts/topo-nodesize-active-hover-test.mjs +109 -0
- package/scripts/topo-nodesize-crossfade-test.mjs +141 -0
- package/scripts/topo-online-chip-nav-test.mjs +143 -0
- package/scripts/topo-orbit-particles-retired-test.mjs +91 -0
- package/scripts/topo-overlap-test.mjs +32 -5
- package/scripts/topo-panel-elevation-test.mjs +76 -0
- package/scripts/topo-panel-fadein-test.mjs +102 -0
- package/scripts/topo-panel-hot-tail-fade-test.mjs +132 -0
- package/scripts/topo-panel-hover-elevation-test.mjs +118 -0
- package/scripts/topo-panel-theme-ease-test.mjs +85 -0
- package/scripts/topo-panel-title-fill-ease-test.mjs +91 -0
- package/scripts/topo-particle-stagger-test.mjs +82 -0
- package/scripts/topo-pin-intersection-color-ease-test.mjs +111 -0
- package/scripts/topo-pin-intersection-empty-test.mjs +129 -0
- package/scripts/topo-pin-intersection-tabular-test.mjs +96 -0
- package/scripts/topo-pin-intersection-test.mjs +121 -0
- package/scripts/topo-pin-intersection-warning-crossfade-test.mjs +107 -0
- package/scripts/topo-pin-mirror-transition-test.mjs +101 -0
- package/scripts/topo-pin-persistence-test.mjs +105 -0
- package/scripts/topo-popover-meta-test.mjs +78 -0
- package/scripts/topo-prepublish-guard-test.mjs +95 -0
- package/scripts/topo-pressure-bar-test.mjs +69 -0
- package/scripts/topo-pressure-hover-test.mjs +123 -0
- package/scripts/topo-pressure-pin-test.mjs +119 -0
- package/scripts/topo-pressure-seg-self-hover-test.mjs +126 -0
- package/scripts/topo-pressure-seg-tooltip-test.mjs +98 -0
- package/scripts/topo-pressure-seg-transition-test.mjs +107 -0
- package/scripts/topo-pulse-dot-crossfade-test.mjs +122 -0
- package/scripts/topo-pulse-rate-test.mjs +71 -0
- package/scripts/topo-recent-panel-count-freshness-test.mjs +109 -0
- package/scripts/topo-recent-panel-count-test.mjs +72 -0
- package/scripts/topo-recent-panel-footer-breath-test.mjs +142 -0
- package/scripts/topo-recent-panel-hot-header-test.mjs +132 -0
- package/scripts/topo-recent-panel-more-crossfade-test.mjs +124 -0
- package/scripts/topo-recent-panel-more-cyan-hover-test.mjs +151 -0
- package/scripts/topo-recent-panel-more-nav-test.mjs +127 -0
- package/scripts/topo-recent-panel-more-test.mjs +106 -0
- package/scripts/topo-recent-panel-readability-bump-test.mjs +151 -0
- package/scripts/topo-recent-row-count-fill-test.mjs +129 -0
- package/scripts/topo-recent-row-fadein-test.mjs +107 -0
- package/scripts/topo-recent-row-freshness-test.mjs +102 -0
- package/scripts/topo-recent-row-hot-test.mjs +110 -0
- package/scripts/topo-recent-row-hover-lift-test.mjs +128 -0
- package/scripts/topo-recent-row-hover-test.mjs +122 -0
- package/scripts/topo-recent-row-pin-spacing-test.mjs +137 -0
- package/scripts/topo-recent-row-pin-test.mjs +126 -0
- package/scripts/topo-recent-row-tint-test.mjs +91 -0
- package/scripts/topo-recent-row-title-test.mjs +112 -0
- package/scripts/topo-recent-row-ts-alpha-test.mjs +100 -0
- package/scripts/topo-recent-row-ts-test.mjs +95 -0
- package/scripts/topo-recent-row-typography-test.mjs +119 -0
- package/scripts/topo-recent-signal-empty-hint-test.mjs +73 -0
- package/scripts/topo-recent-signal-empty-test.mjs +63 -0
- package/scripts/topo-reduced-motion-test.mjs +77 -0
- package/scripts/topo-reset-spin-test.mjs +120 -0
- package/scripts/topo-runtime-badge-grow-test.mjs +114 -0
- package/scripts/topo-spokes-retired-test.mjs +93 -0
- package/scripts/topo-status-chip-hover-test.mjs +101 -0
- package/scripts/topo-status-chip-tooltip-test.mjs +95 -0
- package/scripts/topo-statusbar-chips-self-hover-test.mjs +177 -0
- package/scripts/topo-svg-focus-test.mjs +112 -0
- package/scripts/topo-sweep-busyness-test.mjs +94 -0
- package/scripts/topo-tabular-nums-sweep-test.mjs +93 -0
- package/scripts/topo-tier-ring-fadein-test.mjs +107 -0
- package/scripts/topo-tier-ring-occupancy-test.mjs +87 -0
- package/scripts/topo-tier-ring-test.mjs +69 -0
- package/scripts/topo-tier-ring-tint-test.mjs +110 -0
- package/scripts/topo-tier-stagger-test.mjs +89 -0
- package/scripts/topo-title-block-tight-leading-test.mjs +95 -0
- package/scripts/topo-toggle-inactive-cyan-hover-test.mjs +110 -0
- package/scripts/topo-top-rail-theme-ease-test.mjs +89 -0
- package/scripts/topo-tz-ghost-test.mjs +69 -0
- package/scripts/topo-vendor-chip-hover-test.mjs +111 -0
- package/scripts/topo-vendor-chip-self-hover-test.mjs +131 -0
- package/scripts/topo-vendor-chip-tabular-test.mjs +92 -0
- package/scripts/topo-vendor-chip-threshold-test.mjs +78 -0
- package/scripts/topo-vendor-letter-tooltip-test.mjs +92 -0
- package/scripts/topo-vendor-pill-test.mjs +125 -0
- package/scripts/topo-vendor-pin-test.mjs +125 -0
- package/scripts/topo-view-smooth-test.mjs +131 -0
- package/scripts/topo-wheel-zoom-test.mjs +79 -0
- package/scripts/topo-working-chip-pin-test.mjs +154 -0
- package/scripts/topo-working-halo-breath-retired-test.mjs +99 -0
- package/scripts/topo-wrapper-flow-arrow-theme-test.mjs +97 -0
- package/scripts/topo-wrapper-shadow-theme-ease-test.mjs +89 -0
- package/scripts/topo-zoom-keys-test.mjs +89 -0
- package/.next/static/chunks/0-7iowzu4.798.js +0 -1
- package/.next/static/chunks/0.v4shwnaii1l.js +0 -1
- package/.next/static/chunks/02hf~nv.u117s.js +0 -1
- package/.next/static/chunks/02t5jr4shh.hy.js +0 -1
- package/.next/static/chunks/09nd.t_hd.y6t.css +0 -2
- package/.next/static/chunks/0_qfg5s5uzs7..js +0 -7
- package/.next/static/chunks/0elalb9n_.~di.js +0 -1
- package/.next/static/chunks/0j_q__o8p6g83.js +0 -1
- package/.next/static/chunks/0jl6_w50zh4l5.js +0 -1
- package/.next/static/chunks/0pl7l_.2im.j0.js +0 -7
- package/.next/static/chunks/0r4q73.-1bkyl.js +0 -1
- package/.next/static/chunks/0r_c8eccg3z2o.js +0 -1
- package/.next/static/chunks/0zh53kf--qs63.js +0 -1
- package/.next/static/chunks/10oi7l-tycgl9.js +0 -1
- package/.next/static/chunks/11uk1izuv3~0t.js +0 -1
- /package/.next/static/{T_govTa_ITLMC4HUegXx1 → TqZ3QU2JtjkUkmHebqLAf}/_buildManifest.js +0 -0
- /package/.next/static/{T_govTa_ITLMC4HUegXx1 → TqZ3QU2JtjkUkmHebqLAf}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{T_govTa_ITLMC4HUegXx1 → TqZ3QU2JtjkUkmHebqLAf}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/* Round 208 verification: runtime badge (CLI/SDK/HTTP icon at the
|
|
2
|
+
* bottom-right of each node avatar) grows r + thickens stroke on
|
|
3
|
+
* parent-node hover. Completes the micro-lift radius-axis family:
|
|
4
|
+
* R177 hub ring r 14 → 17 on hub-hover
|
|
5
|
+
* R197 legend swatch r 5.5 → 7 on row-hover/pin
|
|
6
|
+
* R208 runtime badge r 7 → 8 on node-hover (online)
|
|
7
|
+
* (r 5.5 → 6.5 offline)
|
|
8
|
+
*
|
|
9
|
+
* Test (cyber dark, 4 working sessions with runtime='cli-claude-code'
|
|
10
|
+
* which maps to a runtime identity → badge renders):
|
|
11
|
+
* 1. 4 [data-runtime-badge] badges present (one per node).
|
|
12
|
+
* 2. Idle: all data-runtime-badge-active='false', computed r ≈ 7,
|
|
13
|
+
* strokeWidth ≈ 1.5.
|
|
14
|
+
* 3. Transition includes 'r 150ms' AND 'stroke-width 150ms'.
|
|
15
|
+
* 4. Hover g[data-node="alpha"] → wait past 180ms.
|
|
16
|
+
* 5. alpha badge: active='true', r ≈ 8, strokeWidth ≈ 2.
|
|
17
|
+
* 6. Other (non-hovered) badges stay active='false', r ≈ 7,
|
|
18
|
+
* strokeWidth ≈ 1.5.
|
|
19
|
+
* 7. Move away — alpha badge back to 'false', r ≈ 7.
|
|
20
|
+
*/
|
|
21
|
+
import { chromium } from 'playwright';
|
|
22
|
+
import { readFileSync } from 'node:fs';
|
|
23
|
+
|
|
24
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
25
|
+
const browser = await chromium.launch({ headless: true });
|
|
26
|
+
|
|
27
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
|
|
28
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
29
|
+
await ctx.addInitScript(() => {
|
|
30
|
+
try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
34
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
35
|
+
const r = await route.fetch();
|
|
36
|
+
const b = await r.json();
|
|
37
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
38
|
+
const mk = (alias) => ({
|
|
39
|
+
alias, status: 'working', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
40
|
+
network_id: nid, project_dir: null,
|
|
41
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
42
|
+
});
|
|
43
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
44
|
+
mk('alpha'), mk('beta'), mk('gamma'), mk('delta'),
|
|
45
|
+
] } });
|
|
46
|
+
});
|
|
47
|
+
await ctx.route('**/api/hub/messages*', (r2) => r2.fulfill({ json: { messages: [] } }));
|
|
48
|
+
await ctx.route('**/api/hub/tasks*', (r2) => r2.fulfill({ json: { tasks: [] } }));
|
|
49
|
+
|
|
50
|
+
const page = await ctx.newPage();
|
|
51
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
52
|
+
await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
|
|
53
|
+
// SVG <circle> doesn't pass Playwright's default visibility check the
|
|
54
|
+
// same way HTML elements do — wait for DOM attachment instead.
|
|
55
|
+
await page.waitForSelector('[data-runtime-badge]', { timeout: 10000, state: 'attached' });
|
|
56
|
+
await page.waitForTimeout(300);
|
|
57
|
+
|
|
58
|
+
const probeAll = async () => page.evaluate(() => {
|
|
59
|
+
return [...document.querySelectorAll('[data-runtime-badge]')].map(el => {
|
|
60
|
+
const cs = getComputedStyle(el);
|
|
61
|
+
return {
|
|
62
|
+
alias: el.getAttribute('data-runtime-badge'),
|
|
63
|
+
active: el.getAttribute('data-runtime-badge-active'),
|
|
64
|
+
r: parseFloat(cs.r),
|
|
65
|
+
strokeWidth: parseFloat(cs.strokeWidth),
|
|
66
|
+
transition: el.style.transition,
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const idle = await probeAll();
|
|
72
|
+
|
|
73
|
+
await page.hover('g[data-node="alpha"]');
|
|
74
|
+
await page.waitForTimeout(200);
|
|
75
|
+
const hovered = await probeAll();
|
|
76
|
+
|
|
77
|
+
await page.mouse.move(0, 0);
|
|
78
|
+
await page.waitForTimeout(200);
|
|
79
|
+
const settled = await probeAll();
|
|
80
|
+
|
|
81
|
+
await browser.close();
|
|
82
|
+
|
|
83
|
+
const idleAlpha = idle.find(b => b.alias === 'alpha');
|
|
84
|
+
const idleBeta = idle.find(b => b.alias === 'beta');
|
|
85
|
+
const hoverAlpha = hovered.find(b => b.alias === 'alpha');
|
|
86
|
+
const hoverBeta = hovered.find(b => b.alias === 'beta');
|
|
87
|
+
const settledAlpha = settled.find(b => b.alias === 'alpha');
|
|
88
|
+
|
|
89
|
+
const near = (got, want, tol = 0.4) => Math.abs(got - want) < tol;
|
|
90
|
+
|
|
91
|
+
const results = {
|
|
92
|
+
four_badges_present: idle.length === 4,
|
|
93
|
+
idle_all_inactive: idle.every(b => b.active === 'false'),
|
|
94
|
+
idle_all_r_7: idle.every(b => near(b.r, 7)),
|
|
95
|
+
idle_all_stroke_1p5: idle.every(b => near(b.strokeWidth, 1.5)),
|
|
96
|
+
transition_has_r: idle.every(b => /\br\s+(?:150ms|0\.15s)/.test(b.transition || '')),
|
|
97
|
+
transition_has_stroke_width: idle.every(b => /stroke-width\s+(?:150ms|0\.15s)/.test(b.transition || '')),
|
|
98
|
+
|
|
99
|
+
hover_alpha_active: hoverAlpha?.active === 'true',
|
|
100
|
+
hover_alpha_r_grown: near(hoverAlpha?.r ?? 0, 8),
|
|
101
|
+
hover_alpha_stroke_thicker: near(hoverAlpha?.strokeWidth ?? 0, 2),
|
|
102
|
+
hover_beta_stays_inactive: hoverBeta?.active === 'false',
|
|
103
|
+
hover_beta_r_unchanged: near(hoverBeta?.r ?? 0, 7),
|
|
104
|
+
hover_beta_stroke_unchanged: near(hoverBeta?.strokeWidth ?? 0, 1.5),
|
|
105
|
+
|
|
106
|
+
settled_alpha_inactive: settledAlpha?.active === 'false',
|
|
107
|
+
settled_alpha_r_back: near(settledAlpha?.r ?? 0, 7),
|
|
108
|
+
};
|
|
109
|
+
const ok = Object.values(results).every(Boolean);
|
|
110
|
+
console.log(`${ok ? '✅' : '❌'} runtime badge grow:`, JSON.stringify(results),
|
|
111
|
+
`\n idle:`, idle,
|
|
112
|
+
`\n hovered:`, hovered,
|
|
113
|
+
`\n settled:`, settled);
|
|
114
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/* Round 280 verification: backdrop spokes retired (R93 + R240 family)
|
|
2
|
+
* — 减法 cut #6.
|
|
3
|
+
*
|
|
4
|
+
* Pre-R280 the canvas rendered 6 <line> elements at angles 0, 30, 60,
|
|
5
|
+
* 90, 120, 150° through hub center — 12 rays of a "radar" star
|
|
6
|
+
* pattern, stroke opacity 0.18 (cyber) / 0.35 (light), tint shift to
|
|
7
|
+
* pal.legendAccent when any pin is active (R240).
|
|
8
|
+
*
|
|
9
|
+
* The radial-gradient backdrop (`topo-radar`) already provides soft
|
|
10
|
+
* hub-centered glow; the explicit line spokes were decorative density
|
|
11
|
+
* without structural signal — the topology IS hub-and-spoke, the
|
|
12
|
+
* actual hub-to-node connecting strokes already render the structure.
|
|
13
|
+
*
|
|
14
|
+
* Post-R280: spokes block gated with `false &&`. The 6 lines no
|
|
15
|
+
* longer render; radial-gradient backdrop remains.
|
|
16
|
+
*
|
|
17
|
+
* Test scope:
|
|
18
|
+
* 1. No element matches `[data-topo-spoke-angle]`.
|
|
19
|
+
* 2. R278 working halo <animate> count still 0 (regression).
|
|
20
|
+
* 3. R279 ping/pulse still absent (regression).
|
|
21
|
+
* 4. R277 legend height 88 (regression).
|
|
22
|
+
* 5. R275 freshness chip absent (regression).
|
|
23
|
+
*/
|
|
24
|
+
import { chromium } from 'playwright';
|
|
25
|
+
import { readFileSync } from 'node:fs';
|
|
26
|
+
|
|
27
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
28
|
+
const browser = await chromium.launch({ headless: true });
|
|
29
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
|
|
30
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
31
|
+
await ctx.addInitScript(() => {
|
|
32
|
+
try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
|
|
33
|
+
});
|
|
34
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
35
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
36
|
+
const r = await route.fetch();
|
|
37
|
+
const b = await r.json();
|
|
38
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
39
|
+
const mk = (alias) => ({
|
|
40
|
+
alias, status: 'working', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
41
|
+
network_id: nid, project_dir: null,
|
|
42
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
43
|
+
});
|
|
44
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
45
|
+
mk('alpha'), mk('beta'), mk('gamma'), mk('delta'),
|
|
46
|
+
] } });
|
|
47
|
+
});
|
|
48
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
49
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
50
|
+
|
|
51
|
+
const page = await ctx.newPage();
|
|
52
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
53
|
+
await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
|
|
54
|
+
await page.waitForSelector('[data-topo-panel="legend"]', { timeout: 10000 });
|
|
55
|
+
await page.waitForTimeout(300);
|
|
56
|
+
|
|
57
|
+
const probe = await page.evaluate(() => {
|
|
58
|
+
const spokes = document.querySelectorAll('[data-topo-spoke-angle]');
|
|
59
|
+
const ping = document.querySelectorAll('[data-arrival-ping]');
|
|
60
|
+
const pulse = document.querySelectorAll('[data-dispatch-pulse]');
|
|
61
|
+
const freshnessChip = document.querySelector('[data-freshness-chip]');
|
|
62
|
+
const legendG = document.querySelector('[data-topo-panel="legend"]');
|
|
63
|
+
const legendH = legendG?.querySelector('rect')?.getAttribute('height') ?? null;
|
|
64
|
+
const halos = document.querySelectorAll('[data-node-halo-breath="on"]');
|
|
65
|
+
let haloAnimateCount = 0;
|
|
66
|
+
halos.forEach((h) => { haloAnimateCount += h.querySelectorAll('animate').length; });
|
|
67
|
+
return {
|
|
68
|
+
spokeCount: spokes.length,
|
|
69
|
+
pingCount: ping.length,
|
|
70
|
+
pulseCount: pulse.length,
|
|
71
|
+
freshnessPresent: freshnessChip !== null,
|
|
72
|
+
legendHeight: legendH,
|
|
73
|
+
haloAnimateCount,
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
await browser.close();
|
|
77
|
+
|
|
78
|
+
const results = {
|
|
79
|
+
spokes_absent: probe.spokeCount === 0,
|
|
80
|
+
r279_ping_absent: probe.pingCount === 0,
|
|
81
|
+
r279_pulse_absent: probe.pulseCount === 0,
|
|
82
|
+
r275_freshness_absent: probe.freshnessPresent === false,
|
|
83
|
+
r277_legend_height_88: probe.legendHeight === '88',
|
|
84
|
+
r278_halo_animate_count_zero: probe.haloAnimateCount === 0,
|
|
85
|
+
};
|
|
86
|
+
const ok = Object.values(results).every(Boolean);
|
|
87
|
+
console.log(`${ok ? '✅' : '❌'} backdrop spokes retired:`, JSON.stringify(results),
|
|
88
|
+
'\n spoke count (expect 0):', probe.spokeCount,
|
|
89
|
+
'\n ping/pulse:', probe.pingCount, probe.pulseCount,
|
|
90
|
+
'\n freshness absent:', !probe.freshnessPresent,
|
|
91
|
+
'\n legend height:', probe.legendHeight,
|
|
92
|
+
'\n halo animate count (expect 0):', probe.haloAnimateCount);
|
|
93
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/* Round 79 verification: header working + online count chips become
|
|
2
|
+
* hover affordances (sister to R77 active-links chip).
|
|
3
|
+
* - Hover "N working" → setHoveredStatus('working') → idle + offline
|
|
4
|
+
* nodes dim, working stays bright. Same outcome as R55 legend row
|
|
5
|
+
* hover, just from the chip surface.
|
|
6
|
+
* - Hover "N online" with working present → same as above.
|
|
7
|
+
* - Mouseleave restores baseline.
|
|
8
|
+
*
|
|
9
|
+
* Fleet: 1 working (wkr), 2 idle (idl1, idl2), 1 offline (off).
|
|
10
|
+
*/
|
|
11
|
+
import { chromium } from 'playwright';
|
|
12
|
+
import { readFileSync } from 'node:fs';
|
|
13
|
+
|
|
14
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
15
|
+
const browser = await chromium.launch({ headless: true });
|
|
16
|
+
|
|
17
|
+
const ctx = await browser.newContext({ viewport: { width: 1400, height: 1500 } });
|
|
18
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
19
|
+
await ctx.addInitScript(() => {
|
|
20
|
+
try {
|
|
21
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
22
|
+
localStorage.setItem('anet-topo-layout', 'ring');
|
|
23
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
24
|
+
sessionStorage.removeItem('anet-topo-pinned-status');
|
|
25
|
+
sessionStorage.removeItem('anet-topo-pinned-group');
|
|
26
|
+
} catch {}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
30
|
+
const stale = new Date(Date.now() - 30 * 60 * 1000).toISOString();
|
|
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 sessions = [
|
|
36
|
+
{ alias: 'wkr', status: 'working', network_id: nid, project_dir: null, created_at: fresh, updated_at: fresh, last_seen_at: fresh },
|
|
37
|
+
{ alias: 'idl1', status: 'idle', network_id: nid, project_dir: null, created_at: fresh, updated_at: fresh, last_seen_at: fresh },
|
|
38
|
+
{ alias: 'idl2', status: 'idle', network_id: nid, project_dir: null, created_at: fresh, updated_at: fresh, last_seen_at: fresh },
|
|
39
|
+
{ alias: 'off', status: 'offline', network_id: nid, project_dir: null, created_at: stale, updated_at: stale, last_seen_at: stale },
|
|
40
|
+
];
|
|
41
|
+
await route.fulfill({ response: r, json: { ...b, sessions } });
|
|
42
|
+
});
|
|
43
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
44
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
45
|
+
const page = await ctx.newPage();
|
|
46
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
47
|
+
await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
|
|
48
|
+
await page.waitForTimeout(500);
|
|
49
|
+
|
|
50
|
+
const opacities = () => page.evaluate(() => {
|
|
51
|
+
const o = {};
|
|
52
|
+
for (const a of ['wkr', 'idl1', 'idl2', 'off']) {
|
|
53
|
+
const g = document.querySelector(`g[data-node="${a}"]`);
|
|
54
|
+
o[a] = g ? +(g.style.opacity || '1') : null;
|
|
55
|
+
}
|
|
56
|
+
return o;
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const before = await opacities();
|
|
60
|
+
|
|
61
|
+
// Hover working chip
|
|
62
|
+
await page.locator('[data-working-chip]').hover();
|
|
63
|
+
await page.waitForTimeout(250);
|
|
64
|
+
const onWorking = await opacities();
|
|
65
|
+
|
|
66
|
+
// Move away
|
|
67
|
+
await page.mouse.move(10, 10);
|
|
68
|
+
await page.waitForTimeout(250);
|
|
69
|
+
const afterWorking = await opacities();
|
|
70
|
+
|
|
71
|
+
// Hover online chip (working present → routes to 'working')
|
|
72
|
+
await page.locator('[data-online-chip]').hover();
|
|
73
|
+
await page.waitForTimeout(250);
|
|
74
|
+
const onOnline = await opacities();
|
|
75
|
+
|
|
76
|
+
await page.mouse.move(10, 10);
|
|
77
|
+
await page.waitForTimeout(250);
|
|
78
|
+
const afterOnline = await opacities();
|
|
79
|
+
|
|
80
|
+
await browser.close();
|
|
81
|
+
|
|
82
|
+
const bright = (v) => v != null && v >= 0.55;
|
|
83
|
+
const dim = (v) => v != null && v < 0.4;
|
|
84
|
+
const results = {
|
|
85
|
+
before_baseline: bright(before.wkr) && bright(before.idl1) && bright(before.idl2),
|
|
86
|
+
working_keepsWkrBright: bright(onWorking.wkr),
|
|
87
|
+
working_dimsIdle: dim(onWorking.idl1) && dim(onWorking.idl2),
|
|
88
|
+
working_dimsOffline: dim(onWorking.off),
|
|
89
|
+
workingLeave_restoresAll: bright(afterWorking.wkr) && bright(afterWorking.idl1),
|
|
90
|
+
online_keepsWkrBright: bright(onOnline.wkr), // routes to working filter
|
|
91
|
+
online_dimsIdle: dim(onOnline.idl1) && dim(onOnline.idl2),
|
|
92
|
+
onlineLeave_restoresAll: bright(afterOnline.wkr) && bright(afterOnline.idl1),
|
|
93
|
+
};
|
|
94
|
+
const ok = Object.values(results).every(Boolean);
|
|
95
|
+
console.log(`${ok ? '✅' : '❌'} status-chip hover:`, JSON.stringify(results),
|
|
96
|
+
`\n before=`, before,
|
|
97
|
+
`\n onWorking=`, onWorking,
|
|
98
|
+
`\n afterWorking=`, afterWorking,
|
|
99
|
+
`\n onOnline=`, onOnline,
|
|
100
|
+
`\n afterOnline=`, afterOnline);
|
|
101
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/* Round 113 verification: chip-row "N working" + "N online" tooltips
|
|
2
|
+
* list matched aliases. Closes the last hover surfaces in the chip-
|
|
3
|
+
* row that had generic "Hover to highlight" titles. Same R97-R102 /
|
|
4
|
+
* R101 alias-list pattern.
|
|
5
|
+
*
|
|
6
|
+
* Fleet: 2 working (wkr1/2) + 2 idle (idl1/2) + 1 offline (off1).
|
|
7
|
+
* working chip title contains wkr1, wkr2; data-working-chip-aliases CSV matches
|
|
8
|
+
* online chip title contains all online aliases (4); data-online-chip-aliases matches
|
|
9
|
+
* pin state flips the action hint
|
|
10
|
+
*/
|
|
11
|
+
import { chromium } from 'playwright';
|
|
12
|
+
import { readFileSync } from 'node:fs';
|
|
13
|
+
|
|
14
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
15
|
+
const browser = await chromium.launch({ headless: true });
|
|
16
|
+
|
|
17
|
+
const ctx = await browser.newContext({ viewport: { width: 1400, height: 1500 } });
|
|
18
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
19
|
+
await ctx.addInitScript(() => {
|
|
20
|
+
try {
|
|
21
|
+
localStorage.setItem('anet-theme', 'cyber');
|
|
22
|
+
sessionStorage.setItem('anet_v3_auth', '1');
|
|
23
|
+
sessionStorage.removeItem('anet-topo-pinned-status');
|
|
24
|
+
} catch {}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
28
|
+
const stale10 = new Date(Date.now() - 10 * 60 * 1000).toISOString();
|
|
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, ts) => ({
|
|
34
|
+
alias, status, model: 'claude-opus-4', runtime: 'cli-claude-code',
|
|
35
|
+
network_id: nid, project_dir: null,
|
|
36
|
+
created_at: ts, updated_at: ts, last_seen_at: ts,
|
|
37
|
+
});
|
|
38
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
39
|
+
mk('wkr1', 'working', fresh),
|
|
40
|
+
mk('wkr2', 'working', fresh),
|
|
41
|
+
mk('idl1', 'idle', fresh),
|
|
42
|
+
mk('idl2', 'idle', fresh),
|
|
43
|
+
mk('off1', 'offline', stale10),
|
|
44
|
+
] } });
|
|
45
|
+
});
|
|
46
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
47
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
48
|
+
const page = await ctx.newPage();
|
|
49
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
50
|
+
await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 5, { timeout: 30000 });
|
|
51
|
+
await page.waitForTimeout(400);
|
|
52
|
+
|
|
53
|
+
const read = (sel) => page.evaluate((s) => {
|
|
54
|
+
const el = document.querySelector(s);
|
|
55
|
+
if (!el) return null;
|
|
56
|
+
return {
|
|
57
|
+
title: el.getAttribute('title') || '',
|
|
58
|
+
aliases: el.getAttribute('data-working-chip-aliases') || el.getAttribute('data-online-chip-aliases') || '',
|
|
59
|
+
};
|
|
60
|
+
}, sel);
|
|
61
|
+
|
|
62
|
+
const workingBefore = await read('[data-working-chip]');
|
|
63
|
+
const onlineBefore = await read('[data-online-chip]');
|
|
64
|
+
|
|
65
|
+
// Pin working status — action hint should flip.
|
|
66
|
+
await page.evaluate(() => {
|
|
67
|
+
sessionStorage.setItem('anet-topo-pinned-status', 'working');
|
|
68
|
+
window.dispatchEvent(new CustomEvent('anet:topo-pin', { detail: { kind: 'status', value: 'working' } }));
|
|
69
|
+
});
|
|
70
|
+
await page.waitForTimeout(300);
|
|
71
|
+
const workingPinned = await read('[data-working-chip]');
|
|
72
|
+
|
|
73
|
+
await browser.close();
|
|
74
|
+
|
|
75
|
+
const sameSet = (csv, expected) => {
|
|
76
|
+
const got = new Set(csv.split(',').filter(Boolean));
|
|
77
|
+
const exp = new Set(expected);
|
|
78
|
+
return got.size === exp.size && [...exp].every(x => got.has(x));
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const results = {
|
|
82
|
+
workingBefore_aliasesMatch: sameSet(workingBefore?.aliases || '', ['wkr1', 'wkr2']),
|
|
83
|
+
workingBefore_titleListsThem: /wkr1.*wkr2|wkr2.*wkr1/.test(workingBefore?.title || ''),
|
|
84
|
+
workingBefore_titleClickHint: /click to pin/.test(workingBefore?.title || ''),
|
|
85
|
+
onlineBefore_aliasesMatch: sameSet(onlineBefore?.aliases || '', ['wkr1', 'wkr2', 'idl1', 'idl2']),
|
|
86
|
+
onlineBefore_titleListsThem: /wkr1/.test(onlineBefore?.title || '') && /idl1/.test(onlineBefore?.title || ''),
|
|
87
|
+
pinnedWorking_aliasesStable: sameSet(workingPinned?.aliases || '', ['wkr1', 'wkr2']),
|
|
88
|
+
pinnedWorking_titleHintFlipped:/pinned, Esc to clear/.test(workingPinned?.title || ''),
|
|
89
|
+
};
|
|
90
|
+
const ok = Object.values(results).every(Boolean);
|
|
91
|
+
console.log(`${ok ? '✅' : '❌'} status-chip tooltip:`, JSON.stringify(results),
|
|
92
|
+
`\n workingBefore=`, workingBefore,
|
|
93
|
+
`\n onlineBefore=`, onlineBefore,
|
|
94
|
+
`\n workingPinned=`, workingPinned);
|
|
95
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/* Round 201 verification: the chip-row "N working" / "N online" chips
|
|
2
|
+
* adopt deeper versions of their own identity colour on hover,
|
|
3
|
+
* mirroring R193 active-links chip pattern.
|
|
4
|
+
*
|
|
5
|
+
* Pre-R201 hover working chip → R55 canvas dim + chip-row highlight,
|
|
6
|
+
* but chip itself stayed at bg-{color}-500/10 — cause silent, effect
|
|
7
|
+
* loud. R201 deepens 10→15 bg and 20→30 border on hover (only when
|
|
8
|
+
* the chip has a target count > 0). The inline transition list is
|
|
9
|
+
* extended to cover background-color + border-color so the swap
|
|
10
|
+
* eases instead of snapping (Tailwind transition-colors on the
|
|
11
|
+
* className alone would be overridden by the existing R180 inline
|
|
12
|
+
* box-shadow transition).
|
|
13
|
+
*
|
|
14
|
+
* Test (cyber dark, 4 working sessions):
|
|
15
|
+
* 1. Working chip: clickable='true', className has hover:bg-green-500/15
|
|
16
|
+
* + hover:border-green-500/30, transition includes 'background-color'
|
|
17
|
+
* + 'border-color' (both 200ms), inline still has 'box-shadow 150ms'.
|
|
18
|
+
* 2. Online chip: same shape with cyan hue.
|
|
19
|
+
* 3. Hover the working chip — wait past 220ms → computed bg
|
|
20
|
+
* shifts to a more-saturated/darker green (RGB-or-OKLab signal).
|
|
21
|
+
* 4. Move away — bg returns to idle (with margin past 220ms).
|
|
22
|
+
* 5. The chip's R55 canvas-effect setHoveredStatus still fires —
|
|
23
|
+
* verified via hoveredStatus change reflected on the working
|
|
24
|
+
* legend row's data-legend-row-lifted attribute.
|
|
25
|
+
*/
|
|
26
|
+
import { chromium } from 'playwright';
|
|
27
|
+
import { readFileSync } from 'node:fs';
|
|
28
|
+
|
|
29
|
+
const TOKEN = JSON.parse(readFileSync('/home/vansin/.anet/config.json', 'utf8')).token;
|
|
30
|
+
const browser = await chromium.launch({ headless: true });
|
|
31
|
+
|
|
32
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
|
|
33
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
34
|
+
await ctx.addInitScript(() => {
|
|
35
|
+
try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const fresh = new Date(Date.now() - 60 * 1000).toISOString();
|
|
39
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
40
|
+
const r = await route.fetch();
|
|
41
|
+
const b = await r.json();
|
|
42
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
43
|
+
const mk = (alias) => ({
|
|
44
|
+
alias, status: 'working', model: 'claude-opus-4', runtime: 'cli-claude-code',
|
|
45
|
+
network_id: nid, project_dir: null,
|
|
46
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
47
|
+
});
|
|
48
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
49
|
+
mk('alpha'), mk('beta'), mk('gamma'), mk('delta'),
|
|
50
|
+
] } });
|
|
51
|
+
});
|
|
52
|
+
await ctx.route('**/api/hub/messages*', (route) => route.fulfill({ json: { messages: [] } }));
|
|
53
|
+
await ctx.route('**/api/hub/tasks*', (route) => route.fulfill({ json: { tasks: [] } }));
|
|
54
|
+
|
|
55
|
+
const page = await ctx.newPage();
|
|
56
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
57
|
+
await page.waitForFunction(() => document.querySelectorAll('g[data-node]').length === 4, { timeout: 30000 });
|
|
58
|
+
await page.waitForSelector('[data-working-chip]', { timeout: 10000 });
|
|
59
|
+
await page.waitForTimeout(300);
|
|
60
|
+
|
|
61
|
+
const probeChip = async (selector) => page.evaluate((sel) => {
|
|
62
|
+
const el = document.querySelector(sel);
|
|
63
|
+
if (!el) return null;
|
|
64
|
+
const cs = getComputedStyle(el);
|
|
65
|
+
return {
|
|
66
|
+
className: el.getAttribute('class') || '',
|
|
67
|
+
clickable: el.getAttribute('data-working-chip-clickable') ||
|
|
68
|
+
el.getAttribute('data-online-chip-clickable'),
|
|
69
|
+
bg: cs.backgroundColor,
|
|
70
|
+
borderColor: cs.borderTopColor,
|
|
71
|
+
transition: el.style.transition,
|
|
72
|
+
};
|
|
73
|
+
}, selector);
|
|
74
|
+
|
|
75
|
+
const idleWorking = await probeChip('[data-working-chip]');
|
|
76
|
+
const idleOnline = await probeChip('[data-online-chip]');
|
|
77
|
+
|
|
78
|
+
await page.hover('[data-working-chip]');
|
|
79
|
+
await page.waitForTimeout(250);
|
|
80
|
+
const hoverWorking = await probeChip('[data-working-chip]');
|
|
81
|
+
|
|
82
|
+
// Confirm R55 canvas effect still fires — hoveredStatus='working'
|
|
83
|
+
// lifts the legend working row.
|
|
84
|
+
const workingRowLifted = await page.evaluate(() =>
|
|
85
|
+
document.querySelector('[data-legend-status="working"]')
|
|
86
|
+
?.getAttribute('data-legend-row-lifted'));
|
|
87
|
+
|
|
88
|
+
await page.mouse.move(0, 0);
|
|
89
|
+
await page.waitForTimeout(280);
|
|
90
|
+
const settledWorking = await probeChip('[data-working-chip]');
|
|
91
|
+
|
|
92
|
+
await page.hover('[data-online-chip]');
|
|
93
|
+
await page.waitForTimeout(250);
|
|
94
|
+
const hoverOnline = await probeChip('[data-online-chip]');
|
|
95
|
+
|
|
96
|
+
await page.mouse.move(0, 0);
|
|
97
|
+
await page.waitForTimeout(280);
|
|
98
|
+
const settledOnline = await probeChip('[data-online-chip]');
|
|
99
|
+
|
|
100
|
+
await browser.close();
|
|
101
|
+
|
|
102
|
+
// Tailwind 4 emits oklab/oklch / color-mix forms. Just check the bg
|
|
103
|
+
// string actually differs idle vs hover, and a brief parser confirms
|
|
104
|
+
// the channel that should grow (green for working, blue/green for cyan).
|
|
105
|
+
// Parse colors including alpha. R201's Tailwind /10 → /15 emits same
|
|
106
|
+
// OKLab L/a/b with stepped-up alpha (0.1 → 0.15); R193's gray→cyan
|
|
107
|
+
// pattern emits a different hue at any alpha. Both are "more saturated
|
|
108
|
+
// against the canvas" from the user's POV. Capture alpha and treat
|
|
109
|
+
// alpha-increase as a valid saturation signal alongside chroma growth.
|
|
110
|
+
function parseColor(s) {
|
|
111
|
+
if (!s) return null;
|
|
112
|
+
let m = s.match(/rgba?\(\s*(\d+)\s*,?\s*(\d+)\s*,?\s*(\d+)(?:\s*[,/]\s*([\d.]+))?/);
|
|
113
|
+
if (m) return { kind: 'rgb', r: +m[1], g: +m[2], b: +m[3], a: m[4] != null ? +m[4] : 1 };
|
|
114
|
+
m = s.match(/oklab\(\s*([\-\d.]+)\s+([\-\d.]+)\s+([\-\d.]+)(?:\s*\/\s*([\d.]+))?/);
|
|
115
|
+
if (m) return { kind: 'oklab', L: +m[1], a: +m[2], b: +m[3], alpha: m[4] != null ? +m[4] : 1 };
|
|
116
|
+
m = s.match(/oklch\(\s*([\-\d.]+)\s+([\-\d.]+)\s+([\-\d.]+)(?:\s*\/\s*([\d.]+))?/);
|
|
117
|
+
if (m) return { kind: 'oklch', L: +m[1], C: +m[2], h: +m[3], alpha: m[4] != null ? +m[4] : 1 };
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// "More saturated against the canvas" = either chroma/hue distance
|
|
122
|
+
// from gray grew OR alpha grew (Tailwind /10 → /15 deepens by alpha).
|
|
123
|
+
const moreSaturated = (idle, hov) => {
|
|
124
|
+
if (!idle || !hov) return false;
|
|
125
|
+
if (idle.kind === 'rgb' && hov.kind === 'rgb') {
|
|
126
|
+
const chromaIdle = Math.max(idle.r, idle.g, idle.b) - Math.min(idle.r, idle.g, idle.b);
|
|
127
|
+
const chromaHov = Math.max(hov.r, hov.g, hov.b) - Math.min(hov.r, hov.g, hov.b);
|
|
128
|
+
return chromaHov > chromaIdle || hov.a > idle.a + 0.01;
|
|
129
|
+
}
|
|
130
|
+
if (idle.kind === 'oklab' && hov.kind === 'oklab') {
|
|
131
|
+
const dIdle = Math.hypot(idle.a, idle.b);
|
|
132
|
+
const dHov = Math.hypot(hov.a, hov.b);
|
|
133
|
+
return dHov > dIdle + 0.005 || hov.alpha > idle.alpha + 0.01;
|
|
134
|
+
}
|
|
135
|
+
if (idle.kind === 'oklch' && hov.kind === 'oklch') {
|
|
136
|
+
return hov.C > idle.C + 0.005 || hov.alpha > idle.alpha + 0.01;
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
const idleWorkingC = parseColor(idleWorking?.bg);
|
|
142
|
+
const hoverWorkingC = parseColor(hoverWorking?.bg);
|
|
143
|
+
const idleOnlineC = parseColor(idleOnline?.bg);
|
|
144
|
+
const hoverOnlineC = parseColor(hoverOnline?.bg);
|
|
145
|
+
|
|
146
|
+
const results = {
|
|
147
|
+
working_clickable: idleWorking?.clickable === 'true',
|
|
148
|
+
working_className_has_hover: idleWorking?.className.includes('hover:bg-green-500/15')
|
|
149
|
+
&& idleWorking?.className.includes('hover:border-green-500/30'),
|
|
150
|
+
working_transition_includes_bg: /background-color\s+(?:200ms|0\.2s)/.test(idleWorking?.transition || ''),
|
|
151
|
+
working_transition_includes_border: /border-color\s+(?:200ms|0\.2s)/.test(idleWorking?.transition || ''),
|
|
152
|
+
working_transition_keeps_boxshadow: /box-shadow\s+(?:150ms|0\.15s)/.test(idleWorking?.transition || ''),
|
|
153
|
+
working_hover_bg_changed: idleWorking?.bg !== hoverWorking?.bg,
|
|
154
|
+
working_hover_more_saturated: moreSaturated(idleWorkingC, hoverWorkingC),
|
|
155
|
+
working_settles_back: settledWorking?.bg === idleWorking?.bg,
|
|
156
|
+
// R55 canvas-effect still fires from the chip — hovering the
|
|
157
|
+
// working chip lifts the legend working row.
|
|
158
|
+
working_canvas_effect_fires: workingRowLifted === 'true',
|
|
159
|
+
|
|
160
|
+
online_clickable: idleOnline?.clickable === 'true',
|
|
161
|
+
online_className_has_hover: idleOnline?.className.includes('hover:bg-cyan-500/15')
|
|
162
|
+
&& idleOnline?.className.includes('hover:border-cyan-500/30'),
|
|
163
|
+
online_transition_includes_bg: /background-color\s+(?:200ms|0\.2s)/.test(idleOnline?.transition || ''),
|
|
164
|
+
online_transition_includes_border: /border-color\s+(?:200ms|0\.2s)/.test(idleOnline?.transition || ''),
|
|
165
|
+
online_hover_bg_changed: idleOnline?.bg !== hoverOnline?.bg,
|
|
166
|
+
online_hover_more_saturated: moreSaturated(idleOnlineC, hoverOnlineC),
|
|
167
|
+
online_settles_back: settledOnline?.bg === idleOnline?.bg,
|
|
168
|
+
};
|
|
169
|
+
const ok = Object.values(results).every(Boolean);
|
|
170
|
+
console.log(`${ok ? '✅' : '❌'} status-bar chips self-hover:`, JSON.stringify(results),
|
|
171
|
+
`\n idleWorking:`, idleWorking,
|
|
172
|
+
`\n hoverWorking:`, hoverWorking,
|
|
173
|
+
`\n settledWorking:`, settledWorking,
|
|
174
|
+
`\n idleOnline:`, idleOnline,
|
|
175
|
+
`\n hoverOnline:`, hoverOnline,
|
|
176
|
+
`\n settledOnline:`, settledOnline);
|
|
177
|
+
process.exit(ok ? 0 : 1);
|