@sleep2agi/agent-network-dashboard 0.5.1-preview.81 → 0.5.1-preview.83
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 +4 -4
- 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.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/admin.html +1 -1
- package/.next/server/app/admin.rsc +1 -1
- package/.next/server/app/admin.segments/_full.segment.rsc +1 -1
- package/.next/server/app/admin.segments/_head.segment.rsc +1 -1
- package/.next/server/app/admin.segments/_index.segment.rsc +1 -1
- package/.next/server/app/admin.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/admin.segments/admin/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/admin.segments/admin.segment.rsc +1 -1
- package/.next/server/app/index.html +2 -2
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- 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 +2 -2
- package/.next/server/app/login.segments/_full.segment.rsc +2 -2
- package/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/.next/server/app/login.segments/_index.segment.rsc +1 -1
- package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/.next/server/app/logs.html +1 -1
- package/.next/server/app/logs.rsc +1 -1
- package/.next/server/app/logs.segments/_full.segment.rsc +1 -1
- package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/logs.segments/_index.segment.rsc +1 -1
- package/.next/server/app/logs.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
- package/.next/server/app/messages.html +1 -1
- package/.next/server/app/messages.rsc +1 -1
- package/.next/server/app/messages.segments/_full.segment.rsc +1 -1
- package/.next/server/app/messages.segments/_head.segment.rsc +1 -1
- package/.next/server/app/messages.segments/_index.segment.rsc +1 -1
- package/.next/server/app/messages.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/messages.segments/messages/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/messages.segments/messages.segment.rsc +1 -1
- package/.next/server/app/node.html +1 -1
- package/.next/server/app/node.rsc +1 -1
- package/.next/server/app/node.segments/_full.segment.rsc +1 -1
- package/.next/server/app/node.segments/_head.segment.rsc +1 -1
- package/.next/server/app/node.segments/_index.segment.rsc +1 -1
- package/.next/server/app/node.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/node.segments/node/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/node.segments/node.segment.rsc +1 -1
- package/.next/server/app/nodes.html +1 -1
- package/.next/server/app/nodes.rsc +1 -1
- package/.next/server/app/nodes.segments/_full.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/_head.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/_index.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/nodes/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/nodes.segments/nodes.segment.rsc +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/server-logs.html +1 -1
- package/.next/server/app/server-logs.rsc +1 -1
- package/.next/server/app/server-logs.segments/_full.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/_index.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/server-logs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/server-logs.segments/server-logs.segment.rsc +1 -1
- package/.next/server/app/settings/networks.html +1 -1
- package/.next/server/app/settings/networks.rsc +1 -1
- package/.next/server/app/settings/networks.segments/_full.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/_index.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings/networks/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings/networks.segment.rsc +1 -1
- package/.next/server/app/settings/networks.segments/settings.segment.rsc +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/tokens.html +1 -1
- package/.next/server/app/settings/tokens.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/_full.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/_index.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings/tokens/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings/tokens.segment.rsc +1 -1
- package/.next/server/app/settings/tokens.segments/settings.segment.rsc +1 -1
- package/.next/server/app/settings.html +2 -2
- package/.next/server/app/settings.rsc +2 -2
- package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/tasks.html +1 -1
- package/.next/server/app/tasks.rsc +1 -1
- package/.next/server/app/tasks.segments/_full.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/_head.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/_index.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/tasks/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/tasks.segments/tasks.segment.rsc +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_09kk21a._.js +1 -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_09d29my._.js +1 -1
- package/.next/server/chunks/ssr/agent-network-dashboard_app_09d29my._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/static/chunks/{0bm3odi3zwrl_.js → 0hxgywtrgkmle.js} +1 -1
- package/.next/static/chunks/{00-1ykc0vbxty.js → 0y-pzg4of_9hn.js} +1 -1
- package/.next/static/chunks/1534ww6w6e98h.js +4 -0
- package/.next/trace +2 -2
- package/.next/trace-build +1 -1
- package/app/components/TopoGraph.tsx +26 -3
- package/package.json +1 -1
- package/scripts/topo-edge-particle-radius-test.mjs +76 -0
- package/scripts/topo-minimap-online-hover-opacity-test.mjs +92 -0
- package/.next/static/chunks/06v9r0n6tmq02.js +0 -4
- /package/.next/static/{7M-H85_nP8uV0ksA_U7g_ → XiEPdHJ8H00xVXb_CyEOm}/_buildManifest.js +0 -0
- /package/.next/static/{7M-H85_nP8uV0ksA_U7g_ → XiEPdHJ8H00xVXb_CyEOm}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{7M-H85_nP8uV0ksA_U7g_ → XiEPdHJ8H00xVXb_CyEOm}/_ssgManifest.js +0 -0
|
@@ -4839,12 +4839,23 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
|
|
|
4839
4839
|
multiple). Edge order is stable (sorted by recent
|
|
4840
4840
|
activity), so the offsets feel calm rather than
|
|
4841
4841
|
reshuffling each refresh. */
|
|
4842
|
+
/* Round 422 / Loop: edge flow particle radius 4 → 4.5.
|
|
4843
|
+
Visual-weight bump family (15th anchor) — particles
|
|
4844
|
+
riding along the edge animateMotion path get +0.5px
|
|
4845
|
+
radius lift, increasing visual area by ~27%
|
|
4846
|
+
(π·4.5² / π·4² = 1.27). Sibling magnitude to R383
|
|
4847
|
+
recent-row pip 1.8 → 2.0 (+25% area), R384 minimap
|
|
4848
|
+
online dot 1.7 → 1.9 (+25% area). R251 fill +
|
|
4849
|
+
R252 transitions + R103 phase-stagger animateMotion
|
|
4850
|
+
all preserved. data-edge-particle-radius attr
|
|
4851
|
+
exposes the value for tests. */
|
|
4842
4852
|
<circle
|
|
4843
|
-
r="4"
|
|
4853
|
+
r="4.5"
|
|
4844
4854
|
fill={pal.flowParticle}
|
|
4845
4855
|
filter={isLight ? undefined : 'url(#topo-glow)'}
|
|
4846
4856
|
opacity={Math.min(1, fresh * edgeOpacityMul)}
|
|
4847
4857
|
data-edge-particle={link.key}
|
|
4858
|
+
data-edge-particle-radius="4.5"
|
|
4848
4859
|
/* Round 252 / Loop: particle picks up fill +
|
|
4849
4860
|
opacity transition for theme-toggle smoothing.
|
|
4850
4861
|
Pre-R252 pal.flowParticle (cyber #fef08a yellow
|
|
@@ -9221,12 +9232,24 @@ export function TopoGraph({ sessions, sseSessions, renameSignal }: TopoGraphProp
|
|
|
9221
9232
|
list + R384 r=1.9 + R372 offline 0.6 all
|
|
9222
9233
|
preserved. data-topo-minimap-dot-opacity attr
|
|
9223
9234
|
bumps to '0.95' for tests. */
|
|
9235
|
+
/* Round 421 / Loop: online dot opacity 0.95 → 1.0
|
|
9236
|
+
on minimap container hover. Sibling to R346
|
|
9237
|
+
viewport rect strokeWidth/opacity hover tween.
|
|
9238
|
+
When the user hovers the minimap container,
|
|
9239
|
+
the live-fleet anchors brighten from R392
|
|
9240
|
+
baseline (0.95) to full opacity in concert
|
|
9241
|
+
with the R346 viewport rect lift. Offline
|
|
9242
|
+
stays at R372 0.6 — hover state focuses
|
|
9243
|
+
attention on the ACTIVE anchors, not the
|
|
9244
|
+
stale ones. data-topo-minimap-dot-opacity
|
|
9245
|
+
attr (R392) reflects the resolved hover-
|
|
9246
|
+
state value for tests. */
|
|
9224
9247
|
r={isOn ? 1.9 : 1.2}
|
|
9225
9248
|
fill={st.primary}
|
|
9226
|
-
opacity={isOn ? 0.95 : 0.6}
|
|
9249
|
+
opacity={isOn ? (hoveredMinimap ? 1 : 0.95) : 0.6}
|
|
9227
9250
|
data-topo-minimap-dot={s.alias}
|
|
9228
9251
|
data-topo-minimap-dot-online={isOn ? 'true' : 'false'}
|
|
9229
|
-
data-topo-minimap-dot-opacity={isOn ? 0.95 : 0.6}
|
|
9252
|
+
data-topo-minimap-dot-opacity={isOn ? (hoveredMinimap ? 1 : 0.95) : 0.6}
|
|
9230
9253
|
data-topo-minimap-dot-radius={isOn ? 1.9 : 1.2}
|
|
9231
9254
|
style={{
|
|
9232
9255
|
transition: 'opacity 200ms ease-out, fill 200ms ease-out, r 200ms ease-out',
|
package/package.json
CHANGED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/* Round 422 verification: edge flow particle radius 4 → 4.5.
|
|
2
|
+
* Visual-weight bump family 15th anchor — particles riding along
|
|
3
|
+
* edge animateMotion paths get +0.5px lift (~27% area increase).
|
|
4
|
+
*
|
|
5
|
+
* Contract:
|
|
6
|
+
* - Seed a flow alpha→beta so an edge mounts → particle mounts
|
|
7
|
+
* - The <circle data-edge-particle> has:
|
|
8
|
+
* * r attr === '4.5'
|
|
9
|
+
* * data-edge-particle-radius === '4.5'
|
|
10
|
+
* - Pre-R422 invariants preserved:
|
|
11
|
+
* * R251 fill present (pal.flowParticle)
|
|
12
|
+
* * R252 transition list (fill 200ms + opacity 200ms)
|
|
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: 1500 } });
|
|
22
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
23
|
+
await ctx.addInitScript(() => {
|
|
24
|
+
try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
|
|
25
|
+
});
|
|
26
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
27
|
+
const r = await route.fetch();
|
|
28
|
+
const b = await r.json();
|
|
29
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
30
|
+
const mk = (alias) => ({
|
|
31
|
+
alias, status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli',
|
|
32
|
+
network_id: nid, project_dir: null,
|
|
33
|
+
created_at: fresh, updated_at: fresh, last_seen_at: fresh,
|
|
34
|
+
});
|
|
35
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [ mk('alpha'), mk('beta'), mk('gamma') ] } });
|
|
36
|
+
});
|
|
37
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({
|
|
38
|
+
json: { messages: [
|
|
39
|
+
{ id: 'm1', from_alias: 'alpha', to_alias: 'beta', content: 'ping', created_at: fresh, network_id: 'default' },
|
|
40
|
+
] },
|
|
41
|
+
}));
|
|
42
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
43
|
+
|
|
44
|
+
const page = await ctx.newPage();
|
|
45
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
46
|
+
await page.waitForSelector('[data-edge-particle]', { timeout: 15000 });
|
|
47
|
+
await page.waitForTimeout(500);
|
|
48
|
+
|
|
49
|
+
const probe = await page.evaluate(() => {
|
|
50
|
+
const particle = document.querySelector('[data-edge-particle]');
|
|
51
|
+
if (!particle) return null;
|
|
52
|
+
return {
|
|
53
|
+
rAttr: particle.getAttribute('r'),
|
|
54
|
+
rData: particle.getAttribute('data-edge-particle-radius'),
|
|
55
|
+
fill: particle.getAttribute('fill'),
|
|
56
|
+
fillPresent: !!particle.getAttribute('fill'),
|
|
57
|
+
styleAttr: particle.getAttribute('style') || '',
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
await browser.close();
|
|
62
|
+
|
|
63
|
+
const results = {
|
|
64
|
+
// R422 wire
|
|
65
|
+
r_attr_4_5: probe?.rAttr === '4.5',
|
|
66
|
+
r_data_4_5: probe?.rData === '4.5',
|
|
67
|
+
// R251 fill invariant
|
|
68
|
+
fill_present: probe?.fillPresent === true,
|
|
69
|
+
// R252 transition invariant
|
|
70
|
+
transition_fill: probe?.styleAttr.includes('fill') === true,
|
|
71
|
+
transition_opacity: probe?.styleAttr.includes('opacity') === true,
|
|
72
|
+
};
|
|
73
|
+
const ok = Object.values(results).every(Boolean);
|
|
74
|
+
console.log(`${ok ? '✅' : '❌'} edge flow particle radius 4 → 4.5:`, JSON.stringify(results),
|
|
75
|
+
'\n probe:', probe);
|
|
76
|
+
process.exit(ok ? 0 : 1);
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/* Round 421 verification: minimap online dot opacity 0.95 → 1.0 on
|
|
2
|
+
* minimap container hover. Sibling to R346 viewport rect tween.
|
|
3
|
+
* Live-fleet anchors brighten when user hovers the minimap.
|
|
4
|
+
*
|
|
5
|
+
* Contract:
|
|
6
|
+
* - Minimap mounts on non-default view → zoom-in twice
|
|
7
|
+
* - Rest state: online dot opacity '0.95' (R392 invariant)
|
|
8
|
+
* - Hover state (page.hover on minimap container):
|
|
9
|
+
* * online dot opacity '1' + data '1'
|
|
10
|
+
* * R346 viewport strokeWidth '1.75'
|
|
11
|
+
* - Offline dot stays at R372 '0.6' in both states
|
|
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
|
+
const stale = new Date(Date.now() - 30 * 60 * 1000).toISOString();
|
|
19
|
+
|
|
20
|
+
const browser = await chromium.launch({ headless: true });
|
|
21
|
+
const ctx = await browser.newContext({ viewport: { width: 1500, height: 1500 } });
|
|
22
|
+
await ctx.addCookies([{ name: 'anet_dashboard_session', value: `v3:${TOKEN}`, domain: '127.0.0.1', path: '/' }]);
|
|
23
|
+
await ctx.addInitScript(() => {
|
|
24
|
+
try { localStorage.setItem('anet-theme', 'cyber'); sessionStorage.setItem('anet_v3_auth', '1'); } catch {}
|
|
25
|
+
});
|
|
26
|
+
await ctx.route('**/api/hub/status*', async (route) => {
|
|
27
|
+
const r = await route.fetch();
|
|
28
|
+
const b = await r.json();
|
|
29
|
+
const nid = (b.sessions || [])[0]?.network_id || 'default';
|
|
30
|
+
await route.fulfill({ response: r, json: { ...b, sessions: [
|
|
31
|
+
{ alias: 'alpha', status: 'idle', model: 'claude-opus-4', runtime: 'claude-code-cli', network_id: nid, project_dir: null, created_at: fresh, updated_at: fresh, last_seen_at: fresh },
|
|
32
|
+
{ alias: 'ghost', status: 'offline', model: 'claude-opus-4', runtime: 'claude-code-cli', network_id: nid, project_dir: null, created_at: stale, updated_at: stale, last_seen_at: stale },
|
|
33
|
+
] } });
|
|
34
|
+
});
|
|
35
|
+
await ctx.route('**/api/hub/messages*', (r) => r.fulfill({ json: { messages: [] } }));
|
|
36
|
+
await ctx.route('**/api/hub/tasks*', (r) => r.fulfill({ json: { tasks: [] } }));
|
|
37
|
+
|
|
38
|
+
const page = await ctx.newPage();
|
|
39
|
+
await page.goto('http://127.0.0.1:3000/', { waitUntil: 'domcontentloaded' });
|
|
40
|
+
await page.waitForSelector('g[data-node]', { timeout: 15000 });
|
|
41
|
+
await page.waitForTimeout(300);
|
|
42
|
+
|
|
43
|
+
await page.click('[data-topo-chrome-zoom-in]');
|
|
44
|
+
await page.click('[data-topo-chrome-zoom-in]');
|
|
45
|
+
await page.waitForSelector('[data-topo-minimap-dot]', { timeout: 5000 });
|
|
46
|
+
await page.waitForTimeout(400);
|
|
47
|
+
|
|
48
|
+
const restProbe = await page.evaluate(() => {
|
|
49
|
+
const dots = Array.from(document.querySelectorAll('[data-topo-minimap-dot]'));
|
|
50
|
+
const on = dots.find((d) => d.getAttribute('data-topo-minimap-dot-online') === 'true');
|
|
51
|
+
const off = dots.find((d) => d.getAttribute('data-topo-minimap-dot-online') === 'false');
|
|
52
|
+
return {
|
|
53
|
+
online: on ? { opacity: on.getAttribute('opacity'), data: on.getAttribute('data-topo-minimap-dot-opacity') } : null,
|
|
54
|
+
offline: off ? { opacity: off.getAttribute('opacity'), data: off.getAttribute('data-topo-minimap-dot-opacity') } : null,
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
await page.hover('[data-topo-minimap]');
|
|
59
|
+
await page.waitForTimeout(400);
|
|
60
|
+
|
|
61
|
+
const hoverProbe = await page.evaluate(() => {
|
|
62
|
+
const dots = Array.from(document.querySelectorAll('[data-topo-minimap-dot]'));
|
|
63
|
+
const on = dots.find((d) => d.getAttribute('data-topo-minimap-dot-online') === 'true');
|
|
64
|
+
const off = dots.find((d) => d.getAttribute('data-topo-minimap-dot-online') === 'false');
|
|
65
|
+
const view = document.querySelector('[data-topo-minimap-viewport]');
|
|
66
|
+
return {
|
|
67
|
+
online: on ? { opacity: on.getAttribute('opacity'), data: on.getAttribute('data-topo-minimap-dot-opacity') } : null,
|
|
68
|
+
offline: off ? { opacity: off.getAttribute('opacity'), data: off.getAttribute('data-topo-minimap-dot-opacity') } : null,
|
|
69
|
+
viewportSw: view?.getAttribute('stroke-width') ?? null,
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
await browser.close();
|
|
74
|
+
|
|
75
|
+
const results = {
|
|
76
|
+
// Rest state (R392 baseline)
|
|
77
|
+
rest_online_0_95: restProbe.online?.opacity === '0.95',
|
|
78
|
+
rest_online_data_0_95: restProbe.online?.data === '0.95',
|
|
79
|
+
rest_offline_0_6: restProbe.offline?.opacity === '0.6',
|
|
80
|
+
// Hover state (R421 lift)
|
|
81
|
+
hover_online_1: hoverProbe.online?.opacity === '1',
|
|
82
|
+
hover_online_data_1: hoverProbe.online?.data === '1',
|
|
83
|
+
// R372 offline invariant: stays at 0.6 in both states
|
|
84
|
+
hover_offline_0_6: hoverProbe.offline?.opacity === '0.6',
|
|
85
|
+
// R346 viewport lift on hover (invariant)
|
|
86
|
+
hover_viewport_sw_1_75: hoverProbe.viewportSw === '1.75',
|
|
87
|
+
};
|
|
88
|
+
const ok = Object.values(results).every(Boolean);
|
|
89
|
+
console.log(`${ok ? '✅' : '❌'} minimap online dot hover opacity 0.95 → 1.0:`, JSON.stringify(results),
|
|
90
|
+
'\n rest: ', restProbe,
|
|
91
|
+
'\n hover:', hoverProbe);
|
|
92
|
+
process.exit(ok ? 0 : 1);
|