aifastdb-devplan 1.6.1 → 1.6.3
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/dist/dev-plan-document-store.d.ts +13 -1
- package/dist/dev-plan-document-store.d.ts.map +1 -1
- package/dist/dev-plan-document-store.js +119 -0
- package/dist/dev-plan-document-store.js.map +1 -1
- package/dist/dev-plan-factory.d.ts.map +1 -1
- package/dist/dev-plan-factory.js +3 -1
- package/dist/dev-plan-factory.js.map +1 -1
- package/dist/dev-plan-graph-store.d.ts +341 -9
- package/dist/dev-plan-graph-store.d.ts.map +1 -1
- package/dist/dev-plan-graph-store.js +2414 -210
- package/dist/dev-plan-graph-store.js.map +1 -1
- package/dist/dev-plan-interface.d.ts +119 -1
- package/dist/dev-plan-interface.d.ts.map +1 -1
- package/dist/dev-plan-migrate.d.ts +1 -0
- package/dist/dev-plan-migrate.d.ts.map +1 -1
- package/dist/dev-plan-migrate.js +28 -2
- package/dist/dev-plan-migrate.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/index.js +652 -0
- package/dist/mcp-server/index.js.map +1 -1
- package/dist/shard-config.d.ts +64 -0
- package/dist/shard-config.d.ts.map +1 -0
- package/dist/shard-config.js +109 -0
- package/dist/shard-config.js.map +1 -0
- package/dist/types.d.ts +305 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/visualize/graph-canvas/api-compat.d.ts.map +1 -1
- package/dist/visualize/graph-canvas/api-compat.js +22 -12
- package/dist/visualize/graph-canvas/api-compat.js.map +1 -1
- package/dist/visualize/graph-canvas/core.d.ts.map +1 -1
- package/dist/visualize/graph-canvas/core.js +296 -4
- package/dist/visualize/graph-canvas/core.js.map +1 -1
- package/dist/visualize/graph-canvas/interaction.d.ts.map +1 -1
- package/dist/visualize/graph-canvas/interaction.js +11 -0
- package/dist/visualize/graph-canvas/interaction.js.map +1 -1
- package/dist/visualize/graph-canvas/layout-worker.d.ts.map +1 -1
- package/dist/visualize/graph-canvas/layout-worker.js +45 -9
- package/dist/visualize/graph-canvas/layout-worker.js.map +1 -1
- package/dist/visualize/graph-canvas/renderer.d.ts.map +1 -1
- package/dist/visualize/graph-canvas/renderer.js +164 -33
- package/dist/visualize/graph-canvas/renderer.js.map +1 -1
- package/dist/visualize/graph-canvas/styles.d.ts.map +1 -1
- package/dist/visualize/graph-canvas/styles.js +146 -121
- package/dist/visualize/graph-canvas/styles.js.map +1 -1
- package/dist/visualize/graph-canvas/viewport.d.ts.map +1 -1
- package/dist/visualize/graph-canvas/viewport.js +10 -0
- package/dist/visualize/graph-canvas/viewport.js.map +1 -1
- package/dist/visualize/server.js +371 -32
- package/dist/visualize/server.js.map +1 -1
- package/dist/visualize/template-core.d.ts +9 -0
- package/dist/visualize/template-core.d.ts.map +1 -0
- package/dist/visualize/template-core.js +721 -0
- package/dist/visualize/template-core.js.map +1 -0
- package/dist/visualize/template-data-loading.d.ts +7 -0
- package/dist/visualize/template-data-loading.d.ts.map +1 -0
- package/dist/visualize/template-data-loading.js +677 -0
- package/dist/visualize/template-data-loading.js.map +1 -0
- package/dist/visualize/template-detail-panel.d.ts +14 -0
- package/dist/visualize/template-detail-panel.d.ts.map +1 -0
- package/dist/visualize/template-detail-panel.js +624 -0
- package/dist/visualize/template-detail-panel.js.map +1 -0
- package/dist/visualize/template-graph-3d.d.ts +7 -0
- package/dist/visualize/template-graph-3d.d.ts.map +1 -0
- package/dist/visualize/template-graph-3d.js +1114 -0
- package/dist/visualize/template-graph-3d.js.map +1 -0
- package/dist/visualize/template-graph-vis.d.ts +8 -0
- package/dist/visualize/template-graph-vis.d.ts.map +1 -0
- package/dist/visualize/template-graph-vis.js +1215 -0
- package/dist/visualize/template-graph-vis.js.map +1 -0
- package/dist/visualize/template-html.d.ts +9 -0
- package/dist/visualize/template-html.d.ts.map +1 -0
- package/dist/visualize/template-html.js +635 -0
- package/dist/visualize/template-html.js.map +1 -0
- package/dist/visualize/template-md-viewer.d.ts +11 -0
- package/dist/visualize/template-md-viewer.d.ts.map +1 -0
- package/dist/visualize/template-md-viewer.js +806 -0
- package/dist/visualize/template-md-viewer.js.map +1 -0
- package/dist/visualize/template-pages.d.ts +7 -0
- package/dist/visualize/template-pages.d.ts.map +1 -0
- package/dist/visualize/template-pages.js +1892 -0
- package/dist/visualize/template-pages.js.map +1 -0
- package/dist/visualize/template-stats-modal.d.ts +7 -0
- package/dist/visualize/template-stats-modal.d.ts.map +1 -0
- package/dist/visualize/template-stats-modal.js +466 -0
- package/dist/visualize/template-stats-modal.js.map +1 -0
- package/dist/visualize/template-styles.d.ts +9 -0
- package/dist/visualize/template-styles.d.ts.map +1 -0
- package/dist/visualize/template-styles.js +623 -0
- package/dist/visualize/template-styles.js.map +1 -0
- package/dist/visualize/template.d.ts +15 -3
- package/dist/visualize/template.d.ts.map +1 -1
- package/dist/visualize/template.js +44 -3475
- package/dist/visualize/template.js.map +1 -1
- package/package.json +2 -2
|
@@ -122,8 +122,11 @@ RenderPipeline.prototype._fullRender = function(ctx) {
|
|
|
122
122
|
}
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
-
// ── 6. Draw edges (
|
|
126
|
-
|
|
125
|
+
// ── 6. Draw edges (skip during zoom/drag for performance — T11.8) ──
|
|
126
|
+
var skipEdges = engine._isZooming || (engine._interaction && engine._interaction._isDraggingCanvas);
|
|
127
|
+
if (!skipEdges) {
|
|
128
|
+
this._drawEdges(ctx, lodLevel);
|
|
129
|
+
}
|
|
127
130
|
|
|
128
131
|
// ── 7. Draw nodes ──
|
|
129
132
|
this._drawNodes(ctx, lodLevel);
|
|
@@ -314,21 +317,40 @@ RenderPipeline.prototype._drawEdges = function(ctx, lodLevel) {
|
|
|
314
317
|
|
|
315
318
|
ctx.beginPath();
|
|
316
319
|
|
|
320
|
+
// Compute control point for quadratic Bezier curve (LOD >= 1)
|
|
321
|
+
var cpX = null, cpY = null;
|
|
317
322
|
if (lodLevel === 0) {
|
|
318
323
|
// LOD 0: straight lines only (maximum performance)
|
|
319
324
|
ctx.moveTo(fromNode.x, fromNode.y);
|
|
320
325
|
ctx.lineTo(toNode.x, toNode.y);
|
|
321
326
|
} else {
|
|
322
|
-
// LOD 1-2:
|
|
323
|
-
|
|
324
|
-
|
|
327
|
+
// LOD 1-2: smooth quadratic Bezier curve (T11.4)
|
|
328
|
+
var edgeDx = toNode.x - fromNode.x;
|
|
329
|
+
var edgeDy = toNode.y - fromNode.y;
|
|
330
|
+
var edgeLen = Math.sqrt(edgeDx * edgeDx + edgeDy * edgeDy);
|
|
331
|
+
if (edgeLen < 1) {
|
|
332
|
+
ctx.moveTo(fromNode.x, fromNode.y);
|
|
333
|
+
ctx.lineTo(toNode.x, toNode.y);
|
|
334
|
+
} else {
|
|
335
|
+
// Compute control point: perpendicular offset from midpoint
|
|
336
|
+
var roundness = style.roundness || 0.15;
|
|
337
|
+
var midX = (fromNode.x + toNode.x) / 2;
|
|
338
|
+
var midY = (fromNode.y + toNode.y) / 2;
|
|
339
|
+
var perpX = -edgeDy / edgeLen;
|
|
340
|
+
var perpY = edgeDx / edgeLen;
|
|
341
|
+
var offset = roundness * edgeLen * 0.15;
|
|
342
|
+
cpX = midX + perpX * offset;
|
|
343
|
+
cpY = midY + perpY * offset;
|
|
344
|
+
ctx.moveTo(fromNode.x, fromNode.y);
|
|
345
|
+
ctx.quadraticCurveTo(cpX, cpY, toNode.x, toNode.y);
|
|
346
|
+
}
|
|
325
347
|
}
|
|
326
348
|
|
|
327
349
|
ctx.stroke();
|
|
328
350
|
|
|
329
351
|
// ── Arrow head (LOD >= 1) ──
|
|
330
352
|
if (lodLevel >= 1 && style.arrows) {
|
|
331
|
-
this._drawArrowHead(ctx, fromNode, toNode, style);
|
|
353
|
+
this._drawArrowHead(ctx, fromNode, toNode, style, cpX, cpY);
|
|
332
354
|
}
|
|
333
355
|
}
|
|
334
356
|
|
|
@@ -336,20 +358,40 @@ RenderPipeline.prototype._drawEdges = function(ctx, lodLevel) {
|
|
|
336
358
|
ctx.setLineDash([]);
|
|
337
359
|
};
|
|
338
360
|
|
|
339
|
-
RenderPipeline.prototype._drawArrowHead = function(ctx, fromNode, toNode, style) {
|
|
361
|
+
RenderPipeline.prototype._drawArrowHead = function(ctx, fromNode, toNode, style, cpX, cpY) {
|
|
340
362
|
var scale = this._engine._viewport.getScale();
|
|
341
363
|
var arrowSize = Math.max(4, 8 / scale);
|
|
342
|
-
var dx = toNode.x - fromNode.x;
|
|
343
|
-
var dy = toNode.y - fromNode.y;
|
|
344
|
-
var len = Math.sqrt(dx * dx + dy * dy);
|
|
345
|
-
if (len < 1) return;
|
|
346
|
-
|
|
347
|
-
// Arrow at edge of target node
|
|
348
364
|
var toR = toNode._radius || 10;
|
|
349
|
-
var
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
365
|
+
var angle;
|
|
366
|
+
|
|
367
|
+
if (cpX != null && cpY != null) {
|
|
368
|
+
// T11.4: Arrow direction along Bezier curve tangent at endpoint
|
|
369
|
+
// For quadratic Bezier B(t) = (1-t)^2*P0 + 2(1-t)t*CP + t^2*P1
|
|
370
|
+
// Tangent at t=1: B'(1) = 2*(P1 - CP)
|
|
371
|
+
var tdx = toNode.x - cpX;
|
|
372
|
+
var tdy = toNode.y - cpY;
|
|
373
|
+
var tlen = Math.sqrt(tdx * tdx + tdy * tdy);
|
|
374
|
+
if (tlen < 0.1) {
|
|
375
|
+
tdx = toNode.x - fromNode.x;
|
|
376
|
+
tdy = toNode.y - fromNode.y;
|
|
377
|
+
tlen = Math.sqrt(tdx * tdx + tdy * tdy);
|
|
378
|
+
}
|
|
379
|
+
if (tlen < 0.1) return;
|
|
380
|
+
angle = Math.atan2(tdy, tdx);
|
|
381
|
+
// Arrow position: step back from toNode by toR along tangent direction
|
|
382
|
+
var ax = toNode.x - (tdx / tlen) * toR;
|
|
383
|
+
var ay = toNode.y - (tdy / tlen) * toR;
|
|
384
|
+
} else {
|
|
385
|
+
// Straight line: use direct vector
|
|
386
|
+
var dx = toNode.x - fromNode.x;
|
|
387
|
+
var dy = toNode.y - fromNode.y;
|
|
388
|
+
var len = Math.sqrt(dx * dx + dy * dy);
|
|
389
|
+
if (len < 1) return;
|
|
390
|
+
angle = Math.atan2(dy, dx);
|
|
391
|
+
var ratio = (len - toR) / len;
|
|
392
|
+
var ax = fromNode.x + dx * ratio;
|
|
393
|
+
var ay = fromNode.y + dy * ratio;
|
|
394
|
+
}
|
|
353
395
|
|
|
354
396
|
ctx.fillStyle = ctx.strokeStyle;
|
|
355
397
|
ctx.beginPath();
|
|
@@ -371,6 +413,7 @@ RenderPipeline.prototype._drawArrowHead = function(ctx, fromNode, toNode, style)
|
|
|
371
413
|
RenderPipeline.prototype._drawNodes = function(ctx, lodLevel) {
|
|
372
414
|
var nodes = this._visibleNodes;
|
|
373
415
|
var styles = this._engine._styles;
|
|
416
|
+
var enableShadow = (lodLevel >= 2);
|
|
374
417
|
|
|
375
418
|
for (var i = 0; i < nodes.length; i++) {
|
|
376
419
|
var n = nodes[i];
|
|
@@ -378,14 +421,50 @@ RenderPipeline.prototype._drawNodes = function(ctx, lodLevel) {
|
|
|
378
421
|
var r = n._radius || style.radius || 10;
|
|
379
422
|
n._radius = r; // cache for hit-test
|
|
380
423
|
|
|
381
|
-
// ── Selection / hover glow ──
|
|
424
|
+
// ── Selection / hover glow (T11.3 enhanced) ──
|
|
382
425
|
if (n._selected || n._hovered) {
|
|
383
|
-
|
|
426
|
+
var glowR = r * (n._selected ? 1.15 : 1.08);
|
|
427
|
+
var glowPad = (n._selected ? 8 : 5) / this._engine._viewport.getScale();
|
|
428
|
+
// Outer glow
|
|
429
|
+
ctx.globalAlpha = n._selected ? 0.35 : 0.2;
|
|
384
430
|
ctx.fillStyle = n._selected ? '#6366f1' : '#818cf8';
|
|
385
431
|
ctx.beginPath();
|
|
386
|
-
ctx.arc(n.x, n.y,
|
|
432
|
+
ctx.arc(n.x, n.y, glowR + glowPad, 0, Math.PI * 2);
|
|
387
433
|
ctx.fill();
|
|
434
|
+
// White border ring
|
|
435
|
+
ctx.globalAlpha = n._selected ? 0.9 : 0.6;
|
|
436
|
+
ctx.strokeStyle = '#ffffff';
|
|
437
|
+
ctx.lineWidth = (n._selected ? 2.5 : 1.5) / this._engine._viewport.getScale();
|
|
438
|
+
ctx.beginPath();
|
|
439
|
+
ctx.arc(n.x, n.y, glowR + 1 / this._engine._viewport.getScale(), 0, Math.PI * 2);
|
|
440
|
+
ctx.stroke();
|
|
388
441
|
ctx.globalAlpha = 1;
|
|
442
|
+
// Apply slight scale to the rendered radius for selected nodes
|
|
443
|
+
if (n._selected) r = glowR;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// ── Shadow (LOD >= 2 only) ──
|
|
447
|
+
if (enableShadow) {
|
|
448
|
+
ctx.shadowColor = 'rgba(0,0,0,0.3)';
|
|
449
|
+
ctx.shadowBlur = 5;
|
|
450
|
+
ctx.shadowOffsetX = 0;
|
|
451
|
+
ctx.shadowOffsetY = 2;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// ── Compute box dimensions for 'box' shape (text-adaptive) ──
|
|
455
|
+
var shape = style.shape || 'circle';
|
|
456
|
+
if ((shape === 'box' || shape === 'square') && n.label && lodLevel >= 1) {
|
|
457
|
+
var boxFontSize = (style.fontSize || 12) / this._engine._viewport.getScale();
|
|
458
|
+
ctx.font = Math.max(boxFontSize, 2) + 'px -apple-system, sans-serif';
|
|
459
|
+
if (!n._textWidth || n._textWidthScale !== this._engine._viewport.getScale()) {
|
|
460
|
+
var maxChars = lodLevel >= 2 ? 30 : 15;
|
|
461
|
+
var displayLabel = n.label.length > maxChars ? n.label.substring(0, maxChars) + '\u2026' : n.label;
|
|
462
|
+
n._textWidth = ctx.measureText(displayLabel).width;
|
|
463
|
+
n._textWidthScale = this._engine._viewport.getScale();
|
|
464
|
+
}
|
|
465
|
+
var pad = 8 / this._engine._viewport.getScale();
|
|
466
|
+
n._boxW = Math.max(n._textWidth + pad * 2, r * 2);
|
|
467
|
+
n._boxH = boxFontSize + pad * 2;
|
|
389
468
|
}
|
|
390
469
|
|
|
391
470
|
// ── Node shape ──
|
|
@@ -393,14 +472,22 @@ RenderPipeline.prototype._drawNodes = function(ctx, lodLevel) {
|
|
|
393
472
|
ctx.strokeStyle = style.borderColor || '#4b5563';
|
|
394
473
|
ctx.lineWidth = (style.borderWidth || 1) / this._engine._viewport.getScale();
|
|
395
474
|
|
|
396
|
-
this._drawShape(ctx, n.x, n.y, r,
|
|
475
|
+
this._drawShape(ctx, n.x, n.y, r, shape, n);
|
|
397
476
|
|
|
398
477
|
ctx.fill();
|
|
399
478
|
if (lodLevel >= 1) ctx.stroke();
|
|
479
|
+
|
|
480
|
+
// ── Reset shadow ──
|
|
481
|
+
if (enableShadow) {
|
|
482
|
+
ctx.shadowColor = 'transparent';
|
|
483
|
+
ctx.shadowBlur = 0;
|
|
484
|
+
ctx.shadowOffsetX = 0;
|
|
485
|
+
ctx.shadowOffsetY = 0;
|
|
486
|
+
}
|
|
400
487
|
}
|
|
401
488
|
};
|
|
402
489
|
|
|
403
|
-
RenderPipeline.prototype._drawShape = function(ctx, x, y, r, shape) {
|
|
490
|
+
RenderPipeline.prototype._drawShape = function(ctx, x, y, r, shape, node) {
|
|
404
491
|
ctx.beginPath();
|
|
405
492
|
|
|
406
493
|
switch (shape) {
|
|
@@ -416,7 +503,33 @@ RenderPipeline.prototype._drawShape = function(ctx, x, y, r, shape) {
|
|
|
416
503
|
break;
|
|
417
504
|
case 'box':
|
|
418
505
|
case 'square':
|
|
419
|
-
|
|
506
|
+
// Text-adaptive rounded rectangle (T11.2)
|
|
507
|
+
if (node && node._boxW && node._boxH) {
|
|
508
|
+
var bw = node._boxW;
|
|
509
|
+
var bh = node._boxH;
|
|
510
|
+
var br = 4 / this._engine._viewport.getScale(); // border radius
|
|
511
|
+
if (ctx.roundRect) {
|
|
512
|
+
ctx.roundRect(x - bw / 2, y - bh / 2, bw, bh, br);
|
|
513
|
+
} else {
|
|
514
|
+
// Fallback for browsers without roundRect
|
|
515
|
+
var rx = x - bw / 2, ry = y - bh / 2;
|
|
516
|
+
ctx.moveTo(rx + br, ry);
|
|
517
|
+
ctx.lineTo(rx + bw - br, ry);
|
|
518
|
+
ctx.quadraticCurveTo(rx + bw, ry, rx + bw, ry + br);
|
|
519
|
+
ctx.lineTo(rx + bw, ry + bh - br);
|
|
520
|
+
ctx.quadraticCurveTo(rx + bw, ry + bh, rx + bw - br, ry + bh);
|
|
521
|
+
ctx.lineTo(rx + br, ry + bh);
|
|
522
|
+
ctx.quadraticCurveTo(rx, ry + bh, rx, ry + bh - br);
|
|
523
|
+
ctx.lineTo(rx, ry + br);
|
|
524
|
+
ctx.quadraticCurveTo(rx, ry, rx + br, ry);
|
|
525
|
+
ctx.closePath();
|
|
526
|
+
}
|
|
527
|
+
// Update node radius for hit-test (use half of the larger dimension)
|
|
528
|
+
node._radius = Math.max(bw, bh) / 2;
|
|
529
|
+
} else {
|
|
530
|
+
// Fallback: fixed-size box (LOD 0 or no label)
|
|
531
|
+
ctx.rect(x - r, y - r * 0.7, r * 2, r * 1.4);
|
|
532
|
+
}
|
|
420
533
|
break;
|
|
421
534
|
case 'triangle':
|
|
422
535
|
ctx.moveTo(x, y - r);
|
|
@@ -471,30 +584,46 @@ RenderPipeline.prototype._drawLabels = function(ctx, lodLevel) {
|
|
|
471
584
|
var style = n._style || styles.getNodeStyle(n);
|
|
472
585
|
var fontSize = (style.fontSize || 12) / scale;
|
|
473
586
|
|
|
474
|
-
// LOD 1: only show labels for larger nodes
|
|
587
|
+
// LOD 1: only show labels for larger nodes + skip sub-task/document (T11.10)
|
|
475
588
|
if (lodLevel === 1) {
|
|
476
589
|
var screenSize = (n._radius || 10) * scale;
|
|
477
590
|
if (screenSize < 6) continue; // too small on screen
|
|
591
|
+
var nodeType = n.type || '';
|
|
592
|
+
if (nodeType === 'sub-task' || nodeType === 'document') continue;
|
|
478
593
|
}
|
|
479
594
|
|
|
480
595
|
// Truncate long labels
|
|
481
596
|
var label = n.label;
|
|
482
597
|
var maxChars = lodLevel >= 2 ? 30 : 15;
|
|
483
|
-
if (label.length > maxChars) label = label.substring(0, maxChars) + '
|
|
598
|
+
if (label.length > maxChars) label = label.substring(0, maxChars) + '\u2026';
|
|
484
599
|
|
|
485
600
|
ctx.font = Math.max(fontSize, 2) + 'px -apple-system, sans-serif';
|
|
486
|
-
ctx.fillStyle = style.fontColor || '#e5e7eb';
|
|
487
601
|
ctx.textAlign = 'center';
|
|
488
602
|
ctx.textBaseline = 'middle';
|
|
489
603
|
|
|
490
604
|
var shape = style.shape || 'circle';
|
|
491
605
|
if (shape === 'box' || shape === 'square') {
|
|
492
|
-
// Label inside box
|
|
606
|
+
// Label inside box (text-adaptive box already drawn in _drawNodes)
|
|
607
|
+
ctx.fillStyle = style.fontColor || '#e5e7eb';
|
|
493
608
|
ctx.fillText(label, n.x, n.y);
|
|
494
609
|
} else {
|
|
495
|
-
// Label below node
|
|
610
|
+
// Label below node with semi-transparent background (T11.5)
|
|
496
611
|
var r = n._radius || 10;
|
|
497
|
-
|
|
612
|
+
var labelY = n.y + r + fontSize * 0.8;
|
|
613
|
+
var tw = ctx.measureText(label).width;
|
|
614
|
+
var bgPadH = 3 / scale;
|
|
615
|
+
var bgPadV = 2 / scale;
|
|
616
|
+
// Draw background rectangle
|
|
617
|
+
ctx.fillStyle = 'rgba(17, 24, 39, 0.75)';
|
|
618
|
+
ctx.fillRect(
|
|
619
|
+
n.x - tw / 2 - bgPadH,
|
|
620
|
+
labelY - fontSize / 2 - bgPadV,
|
|
621
|
+
tw + bgPadH * 2,
|
|
622
|
+
fontSize + bgPadV * 2
|
|
623
|
+
);
|
|
624
|
+
// Draw label text
|
|
625
|
+
ctx.fillStyle = style.fontColor || '#e5e7eb';
|
|
626
|
+
ctx.fillText(label, n.x, labelY);
|
|
498
627
|
}
|
|
499
628
|
}
|
|
500
629
|
};
|
|
@@ -567,11 +696,13 @@ RenderPipeline.prototype._drawStatusPie = function(ctx, cluster) {
|
|
|
567
696
|
var breakdown = cluster.statusBreakdown;
|
|
568
697
|
if (!breakdown) return;
|
|
569
698
|
|
|
699
|
+
// 从统一配置读取状态颜色
|
|
700
|
+
var _uniSC = (typeof getUnifiedNodeStyle === 'function') ? getUnifiedNodeStyle().statusGeneric : null;
|
|
570
701
|
var STATUS_COLORS = {
|
|
571
|
-
completed: '#059669',
|
|
572
|
-
in_progress: '#7c3aed',
|
|
573
|
-
pending: '#4b5563',
|
|
574
|
-
cancelled: '#92400e',
|
|
702
|
+
completed: _uniSC ? _uniSC.completed.bg : '#059669',
|
|
703
|
+
in_progress: _uniSC ? _uniSC.in_progress.bg : '#7c3aed',
|
|
704
|
+
pending: _uniSC ? _uniSC.pending.bg : '#4b5563',
|
|
705
|
+
cancelled: _uniSC ? _uniSC.cancelled.bg : '#92400e',
|
|
575
706
|
};
|
|
576
707
|
|
|
577
708
|
var total = cluster.count;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/renderer.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAEH,
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/renderer.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAEH,8CA8xBC;AA9xBD,SAAgB,iBAAiB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4xBR,CAAC;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wBAAgB,eAAe,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,wBAAgB,eAAe,IAAI,MAAM,CAoJxC"}
|
|
@@ -11,127 +11,152 @@
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.getStylesScript = getStylesScript;
|
|
13
13
|
function getStylesScript() {
|
|
14
|
-
return `
|
|
15
|
-
// ============================================================================
|
|
16
|
-
// StyleManager — Node & Edge Styles
|
|
17
|
-
// ============================================================================
|
|
18
|
-
|
|
19
|
-
function StyleManager() {
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
'
|
|
40
|
-
'
|
|
41
|
-
'
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
'
|
|
49
|
-
'
|
|
50
|
-
'document':
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
'
|
|
57
|
-
'
|
|
58
|
-
'
|
|
59
|
-
'
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
var
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
var
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
};
|
|
14
|
+
return `
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// StyleManager — Node & Edge Styles
|
|
17
|
+
// ============================================================================
|
|
18
|
+
|
|
19
|
+
function StyleManager() {
|
|
20
|
+
// 从统一配置加载颜色 (如果 getUnifiedNodeStyle 可用)
|
|
21
|
+
var _uni = (typeof getUnifiedNodeStyle === 'function') ? getUnifiedNodeStyle() : null;
|
|
22
|
+
|
|
23
|
+
// Status colors
|
|
24
|
+
this.STATUS_COLORS = _uni ? _uni.statusGeneric : {
|
|
25
|
+
completed: { bg: '#059669', border: '#047857', font: '#d1fae5' },
|
|
26
|
+
in_progress: { bg: '#7c3aed', border: '#6d28d9', font: '#ddd6fe' },
|
|
27
|
+
pending: { bg: '#4b5563', border: '#374151', font: '#d1d5db' },
|
|
28
|
+
cancelled: { bg: '#92400e', border: '#78350f', font: '#fde68a' },
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// 统一样式缓存 (供 getNodeStyle 使用)
|
|
32
|
+
this._uniStyle = _uni;
|
|
33
|
+
|
|
34
|
+
// Node sizing rules by type
|
|
35
|
+
this.NODE_SIZE_RULES = {
|
|
36
|
+
'project': { min: 35, max: 65, baseFont: 16, maxFont: 22, scale: 3.5 },
|
|
37
|
+
'module': { min: 20, max: 45, baseFont: 12, maxFont: 16, scale: 2.8 },
|
|
38
|
+
'main-task': { min: 14, max: 38, baseFont: 11, maxFont: 15, scale: 2.2 },
|
|
39
|
+
'sub-task': { min: 7, max: 18, baseFont: 8, maxFont: 11, scale: 1.5 },
|
|
40
|
+
'document': { min: 12, max: 30, baseFont: 9, maxFont: 13, scale: 1.8 },
|
|
41
|
+
'memory': { min: 6, max: 20, baseFont: 7, maxFont: 11, scale: 1.2 },
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// Node type shapes
|
|
45
|
+
this.NODE_SHAPES = {
|
|
46
|
+
'project': 'star',
|
|
47
|
+
'module': 'diamond',
|
|
48
|
+
'main-task': 'circle',
|
|
49
|
+
'sub-task': 'circle',
|
|
50
|
+
'document': 'box',
|
|
51
|
+
'memory': 'hexagon',
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// Node type colors (for non-status-based types) — 从统一配置读取
|
|
55
|
+
this.NODE_COLORS = _uni ? {
|
|
56
|
+
'project': _uni.project,
|
|
57
|
+
'module': _uni.module,
|
|
58
|
+
'document': _uni.document,
|
|
59
|
+
'memory': _uni.memory,
|
|
60
|
+
} : {
|
|
61
|
+
'project': { bg: '#f59e0b', border: '#d97706', font: '#fff' },
|
|
62
|
+
'module': { bg: '#ff6600', border: '#cc5200', font: '#fff3e0' },
|
|
63
|
+
'document': { bg: '#2563eb', border: '#1d4ed8', font: '#dbeafe' },
|
|
64
|
+
'memory': { bg: '#e879f9', border: '#a21caf', font: '#fdf4ff' },
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// Edge styles by label
|
|
68
|
+
this.EDGE_STYLES = {
|
|
69
|
+
'has_main_task': { width: 2, color: '#4b5563', highlightColor: '#93c5fd', dashes: null, arrows: true },
|
|
70
|
+
'has_sub_task': { width: 1, color: '#4b5563', highlightColor: '#818cf8', dashes: null, arrows: true },
|
|
71
|
+
'has_document': { width: 1, color: '#4b5563', highlightColor: '#60a5fa', dashes: [5, 5], arrows: true },
|
|
72
|
+
'module_has_task':{ width: 1.5, color: '#4b5563', highlightColor: '#ff8533', dashes: [2, 4], arrows: true },
|
|
73
|
+
'task_has_doc': { width: 1.5, color: '#4b5563', highlightColor: '#f59e0b', dashes: [4, 3], arrows: true },
|
|
74
|
+
'doc_has_child': { width: 1.5, color: '#4b5563', highlightColor: '#c084fc', dashes: [6, 3], arrows: true },
|
|
75
|
+
'has_memory': { width: 1, color: '#581c87', highlightColor: '#e879f9', dashes: [3, 3], arrows: true },
|
|
76
|
+
'memory_relates': { width: 1.5, color: '#86198f', highlightColor: '#f0abfc', dashes: null, arrows: false },
|
|
77
|
+
'memory_from_task':{ width: 1, color: '#581c87', highlightColor: '#c084fc', dashes: [4, 2], arrows: true },
|
|
78
|
+
'memory_from_doc':{ width: 1, color: '#581c87', highlightColor: '#a78bfa', dashes: [2, 3], arrows: true },
|
|
79
|
+
'module_memory': { width: 1, color: '#581c87', highlightColor: '#d946ef', dashes: [3, 2], arrows: true },
|
|
80
|
+
'memory_supersedes':{ width: 1, color: '#701a75', highlightColor: '#f472b6', dashes: [6, 2], arrows: true },
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
this.EDGE_DEFAULT = { width: 1, color: '#4b5563', highlightColor: '#9ca3af', dashes: null, arrows: false };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Compute node size and font size based on type and degree.
|
|
88
|
+
*/
|
|
89
|
+
StyleManager.prototype._calcNodeSize = function(type, degree) {
|
|
90
|
+
var rule = this.NODE_SIZE_RULES[type] || { min: 10, max: 22, baseFont: 10, maxFont: 13, scale: 1.0 };
|
|
91
|
+
var size = rule.min + rule.scale * Math.sqrt(degree || 0);
|
|
92
|
+
size = Math.max(rule.min, Math.min(size, rule.max));
|
|
93
|
+
var sizeRatio = (size - rule.min) / (rule.max - rule.min || 1);
|
|
94
|
+
var fontSize = Math.round(rule.baseFont + sizeRatio * (rule.maxFont - rule.baseFont));
|
|
95
|
+
return { size: Math.round(size), fontSize: fontSize };
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Get style for a node.
|
|
100
|
+
* @param {Object} node
|
|
101
|
+
* @returns {Object} { shape, radius, bgColor, borderColor, borderWidth, fontColor, fontSize }
|
|
102
|
+
*/
|
|
103
|
+
StyleManager.prototype.getNodeStyle = function(node) {
|
|
104
|
+
var type = node.type || 'default';
|
|
105
|
+
var props = node.properties || {};
|
|
106
|
+
var status = props.status || 'pending';
|
|
107
|
+
var degree = node.degree || 0;
|
|
108
|
+
|
|
109
|
+
var ns = this._calcNodeSize(type, degree);
|
|
110
|
+
var shape = this.NODE_SHAPES[type] || 'circle';
|
|
111
|
+
|
|
112
|
+
// Determine colors — 从统一配置读取
|
|
113
|
+
var colors;
|
|
114
|
+
if (type === 'project' || type === 'module' || type === 'document') {
|
|
115
|
+
colors = this.NODE_COLORS[type] || this.STATUS_COLORS.pending;
|
|
116
|
+
} else if (type === 'main-task') {
|
|
117
|
+
// 主任务: 从统一配置读取状态颜色
|
|
118
|
+
var _mt = this._uniStyle ? this._uniStyle.mainTask : null;
|
|
119
|
+
colors = (_mt && _mt[status]) || (_mt && _mt.pending) || this.STATUS_COLORS[status] || this.STATUS_COLORS.pending;
|
|
120
|
+
} else {
|
|
121
|
+
// 子任务: 从统一配置读取状态颜色 (completed=亮绿色)
|
|
122
|
+
var _st = this._uniStyle ? this._uniStyle.subTask : null;
|
|
123
|
+
colors = (_st && _st[status]) || (_st && _st.pending) || this.STATUS_COLORS[status] || this.STATUS_COLORS.pending;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
shape: shape,
|
|
128
|
+
radius: ns.size,
|
|
129
|
+
bgColor: colors.bg,
|
|
130
|
+
borderColor: colors.border,
|
|
131
|
+
borderWidth: type === 'project' ? 3 : (type === 'sub-task' ? 1 : 2),
|
|
132
|
+
fontColor: colors.font,
|
|
133
|
+
fontSize: ns.fontSize,
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Get style for an edge.
|
|
139
|
+
* @param {Object} edge
|
|
140
|
+
* @returns {Object} { width, color, highlightColor, dashes, arrows }
|
|
141
|
+
*/
|
|
142
|
+
StyleManager.prototype.getEdgeStyle = function(edge) {
|
|
143
|
+
var label = edge.label || edge._label || '';
|
|
144
|
+
return this.EDGE_STYLES[label] || this.EDGE_DEFAULT;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Apply styles to all nodes and edges (batch).
|
|
149
|
+
*/
|
|
150
|
+
StyleManager.prototype.applyAllStyles = function(nodes, edges) {
|
|
151
|
+
for (var i = 0; i < nodes.length; i++) {
|
|
152
|
+
var style = this.getNodeStyle(nodes[i]);
|
|
153
|
+
nodes[i]._style = style;
|
|
154
|
+
nodes[i]._radius = style.radius;
|
|
155
|
+
}
|
|
156
|
+
for (var i = 0; i < edges.length; i++) {
|
|
157
|
+
edges[i]._style = this.getEdgeStyle(edges[i]);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
135
160
|
`;
|
|
136
161
|
}
|
|
137
162
|
//# sourceMappingURL=styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/styles.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAEH,
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/styles.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAEH,0CAoJC;AApJD,SAAgB,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkJR,CAAC;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/viewport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,wBAAgB,iBAAiB,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/viewport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,wBAAgB,iBAAiB,IAAI,MAAM,CA6W1C"}
|
|
@@ -316,6 +316,16 @@ ViewportManager.prototype._bindEvents = function() {
|
|
|
316
316
|
var delta = -e.deltaY;
|
|
317
317
|
var factor = 1 + delta * self._zoomSpeed;
|
|
318
318
|
factor = Math.max(0.5, Math.min(factor, 2)); // clamp per-event
|
|
319
|
+
|
|
320
|
+
// T11.8: Flag zooming state to skip edge rendering during rapid zoom
|
|
321
|
+
var engine = self._engine;
|
|
322
|
+
engine._isZooming = true;
|
|
323
|
+
if (engine._zoomTimer) clearTimeout(engine._zoomTimer);
|
|
324
|
+
engine._zoomTimer = setTimeout(function() {
|
|
325
|
+
engine._isZooming = false;
|
|
326
|
+
engine.markDirty(); // Redraw with edges after zoom stops
|
|
327
|
+
}, 150);
|
|
328
|
+
|
|
319
329
|
self.zoom(factor, x, y);
|
|
320
330
|
}, { passive: false });
|
|
321
331
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewport.js","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/viewport.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AAEH,
|
|
1
|
+
{"version":3,"file":"viewport.js","sourceRoot":"","sources":["../../../src/visualize/graph-canvas/viewport.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AAEH,8CA6WC;AA7WD,SAAgB,iBAAiB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2WR,CAAC;AACF,CAAC"}
|