claude-mpm 4.2.2__py3-none-any.whl → 4.2.3__py3-none-any.whl
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.
- claude_mpm/VERSION +1 -1
- claude_mpm/cli/commands/monitor.py +1 -1
- claude_mpm/core/config.py +2 -2
- claude_mpm/dashboard/static/css/code-tree.css +220 -1
- claude_mpm/dashboard/static/css/dashboard.css +286 -0
- claude_mpm/dashboard/static/js/components/code-tree.js +1821 -88
- claude_mpm/dashboard/static/js/socket-client.js +5 -2
- claude_mpm/dashboard/templates/index.html +41 -40
- claude_mpm/services/agents/deployment/agent_template_builder.py +17 -4
- claude_mpm/services/dashboard/stable_server.py +389 -0
- claude_mpm/services/socketio/client_proxy.py +16 -0
- claude_mpm/services/socketio/handlers/code_analysis.py +27 -5
- claude_mpm/services/socketio/monitor_server.py +2 -2
- claude_mpm/tools/code_tree_analyzer.py +95 -17
- {claude_mpm-4.2.2.dist-info → claude_mpm-4.2.3.dist-info}/METADATA +1 -1
- {claude_mpm-4.2.2.dist-info → claude_mpm-4.2.3.dist-info}/RECORD +20 -19
- {claude_mpm-4.2.2.dist-info → claude_mpm-4.2.3.dist-info}/WHEEL +0 -0
- {claude_mpm-4.2.2.dist-info → claude_mpm-4.2.3.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.2.2.dist-info → claude_mpm-4.2.3.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.2.2.dist-info → claude_mpm-4.2.3.dist-info}/top_level.txt +0 -0
claude_mpm/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
4.2.
|
|
1
|
+
4.2.3
|
|
@@ -73,7 +73,7 @@ class MonitorCommand(BaseCommand):
|
|
|
73
73
|
|
|
74
74
|
def _start_monitor(self, args) -> CommandResult:
|
|
75
75
|
"""Start the monitor server."""
|
|
76
|
-
port = getattr(args, "port",
|
|
76
|
+
port = getattr(args, "port", 8765) # Default to 8765 for monitor
|
|
77
77
|
host = getattr(args, "host", "localhost")
|
|
78
78
|
background = getattr(
|
|
79
79
|
args, "background", True
|
claude_mpm/core/config.py
CHANGED
|
@@ -530,7 +530,7 @@ class Config:
|
|
|
530
530
|
# Monitor server configuration (decoupled from dashboard)
|
|
531
531
|
"monitor_server": {
|
|
532
532
|
"host": "localhost",
|
|
533
|
-
"port":
|
|
533
|
+
"port": 8765, # Default monitor port (shared with dashboard)
|
|
534
534
|
"enable_health_monitoring": True,
|
|
535
535
|
"auto_start": False, # Don't auto-start with dashboard by default
|
|
536
536
|
"event_buffer_size": 2000, # Larger buffer for monitor server
|
|
@@ -541,7 +541,7 @@ class Config:
|
|
|
541
541
|
"host": "localhost",
|
|
542
542
|
"port": 8765, # Dashboard UI port
|
|
543
543
|
"monitor_host": "localhost", # Monitor server host to connect to
|
|
544
|
-
"monitor_port":
|
|
544
|
+
"monitor_port": 8765, # Monitor server port to connect to
|
|
545
545
|
"auto_connect_monitor": True, # Automatically connect to monitor
|
|
546
546
|
"monitor_reconnect": True, # Auto-reconnect to monitor if disconnected
|
|
547
547
|
"fallback_standalone": True, # Run in standalone mode if monitor unavailable
|
|
@@ -459,7 +459,7 @@
|
|
|
459
459
|
border-radius: 8px;
|
|
460
460
|
padding: 20px;
|
|
461
461
|
position: relative;
|
|
462
|
-
overflow:
|
|
462
|
+
overflow: hidden;
|
|
463
463
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
|
|
464
464
|
border-left: 1px solid #e2e8f0;
|
|
465
465
|
}
|
|
@@ -828,6 +828,8 @@
|
|
|
828
828
|
.code-node text {
|
|
829
829
|
font: 12px sans-serif;
|
|
830
830
|
pointer-events: none;
|
|
831
|
+
/* Smooth transitions for zoom-based text scaling */
|
|
832
|
+
transition: font-size 0.2s ease;
|
|
831
833
|
}
|
|
832
834
|
|
|
833
835
|
.code-node.module circle {
|
|
@@ -974,6 +976,8 @@
|
|
|
974
976
|
text-anchor: middle;
|
|
975
977
|
dominant-baseline: central;
|
|
976
978
|
font-weight: 500;
|
|
979
|
+
/* Smooth transitions for zoom-based scaling */
|
|
980
|
+
transition: font-size 0.2s ease;
|
|
977
981
|
}
|
|
978
982
|
|
|
979
983
|
.code-node.directory:hover .item-count-badge {
|
|
@@ -1405,4 +1409,219 @@
|
|
|
1405
1409
|
transform: translateX(0);
|
|
1406
1410
|
opacity: 1;
|
|
1407
1411
|
}
|
|
1412
|
+
}
|
|
1413
|
+
|
|
1414
|
+
/* Back Button for Focused Directory View */
|
|
1415
|
+
.tree-control-btn.back-btn {
|
|
1416
|
+
background: #3182ce !important;
|
|
1417
|
+
color: white !important;
|
|
1418
|
+
border: 1px solid #2c5aa0 !important;
|
|
1419
|
+
font-weight: 600;
|
|
1420
|
+
margin-right: 10px;
|
|
1421
|
+
}
|
|
1422
|
+
|
|
1423
|
+
.tree-control-btn.back-btn:hover {
|
|
1424
|
+
background: #2c5aa0 !important;
|
|
1425
|
+
transform: translateY(-1px);
|
|
1426
|
+
box-shadow: 0 4px 8px rgba(49, 130, 206, 0.3);
|
|
1427
|
+
}
|
|
1428
|
+
|
|
1429
|
+
/* Focused Directory View Styling */
|
|
1430
|
+
.code-tree-container.focused {
|
|
1431
|
+
border: 2px solid #3182ce;
|
|
1432
|
+
border-radius: 8px;
|
|
1433
|
+
background: linear-gradient(135deg, #f7fafc 0%, #edf2f7 100%);
|
|
1434
|
+
}
|
|
1435
|
+
|
|
1436
|
+
.code-tree-container.focused .tree-controls-toolbar {
|
|
1437
|
+
background: #e6fffa;
|
|
1438
|
+
border-bottom: 1px solid #81e6d9;
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1441
|
+
/* Corner Controls Styling */
|
|
1442
|
+
.tree-corner-controls {
|
|
1443
|
+
position: absolute;
|
|
1444
|
+
z-index: 1000;
|
|
1445
|
+
background: rgba(255, 255, 255, 0.95);
|
|
1446
|
+
border: 1px solid #e2e8f0;
|
|
1447
|
+
border-radius: 6px;
|
|
1448
|
+
padding: 8px 12px;
|
|
1449
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
1450
|
+
backdrop-filter: blur(4px);
|
|
1451
|
+
font-size: 12px;
|
|
1452
|
+
}
|
|
1453
|
+
|
|
1454
|
+
.tree-corner-controls.top-left {
|
|
1455
|
+
top: 10px;
|
|
1456
|
+
left: 10px;
|
|
1457
|
+
}
|
|
1458
|
+
|
|
1459
|
+
.tree-corner-controls.top-right {
|
|
1460
|
+
top: 10px;
|
|
1461
|
+
right: 10px;
|
|
1462
|
+
}
|
|
1463
|
+
|
|
1464
|
+
.tree-corner-controls.bottom-left {
|
|
1465
|
+
bottom: 10px;
|
|
1466
|
+
left: 10px;
|
|
1467
|
+
display: flex;
|
|
1468
|
+
flex-direction: column;
|
|
1469
|
+
align-items: flex-start;
|
|
1470
|
+
gap: 4px;
|
|
1471
|
+
}
|
|
1472
|
+
|
|
1473
|
+
.tree-corner-controls.bottom-right {
|
|
1474
|
+
bottom: 10px;
|
|
1475
|
+
right: 10px;
|
|
1476
|
+
}
|
|
1477
|
+
|
|
1478
|
+
.tree-corner-controls .control-group {
|
|
1479
|
+
display: flex;
|
|
1480
|
+
align-items: center;
|
|
1481
|
+
gap: 8px;
|
|
1482
|
+
flex-wrap: wrap;
|
|
1483
|
+
}
|
|
1484
|
+
|
|
1485
|
+
.tree-corner-controls .control-label {
|
|
1486
|
+
font-weight: 600;
|
|
1487
|
+
color: #4a5568;
|
|
1488
|
+
white-space: nowrap;
|
|
1489
|
+
}
|
|
1490
|
+
|
|
1491
|
+
.tree-corner-controls .checkbox-group {
|
|
1492
|
+
display: flex;
|
|
1493
|
+
gap: 12px;
|
|
1494
|
+
flex-wrap: wrap;
|
|
1495
|
+
}
|
|
1496
|
+
|
|
1497
|
+
.tree-corner-controls .checkbox-label {
|
|
1498
|
+
display: flex;
|
|
1499
|
+
align-items: center;
|
|
1500
|
+
gap: 4px;
|
|
1501
|
+
font-size: 11px;
|
|
1502
|
+
color: #4a5568;
|
|
1503
|
+
cursor: pointer;
|
|
1504
|
+
white-space: nowrap;
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
.tree-corner-controls .checkbox-label input[type="checkbox"] {
|
|
1508
|
+
margin: 0;
|
|
1509
|
+
transform: scale(0.9);
|
|
1510
|
+
}
|
|
1511
|
+
|
|
1512
|
+
.tree-corner-controls .select-compact,
|
|
1513
|
+
.tree-corner-controls .search-compact,
|
|
1514
|
+
.tree-corner-controls .input-compact {
|
|
1515
|
+
font-size: 11px;
|
|
1516
|
+
padding: 4px 8px;
|
|
1517
|
+
border: 1px solid #d1d5db;
|
|
1518
|
+
border-radius: 4px;
|
|
1519
|
+
background: white;
|
|
1520
|
+
}
|
|
1521
|
+
|
|
1522
|
+
.tree-corner-controls .search-compact {
|
|
1523
|
+
width: 120px;
|
|
1524
|
+
}
|
|
1525
|
+
|
|
1526
|
+
.tree-corner-controls .input-compact {
|
|
1527
|
+
width: 140px;
|
|
1528
|
+
}
|
|
1529
|
+
|
|
1530
|
+
.tree-corner-controls .stats-display {
|
|
1531
|
+
font-size: 11px;
|
|
1532
|
+
color: #6b7280;
|
|
1533
|
+
font-weight: 500;
|
|
1534
|
+
margin-bottom: 4px;
|
|
1535
|
+
}
|
|
1536
|
+
|
|
1537
|
+
.tree-corner-controls .status-display {
|
|
1538
|
+
font-size: 10px;
|
|
1539
|
+
color: #4b5563;
|
|
1540
|
+
font-style: italic;
|
|
1541
|
+
opacity: 0.8;
|
|
1542
|
+
max-width: 200px;
|
|
1543
|
+
overflow: hidden;
|
|
1544
|
+
text-overflow: ellipsis;
|
|
1545
|
+
white-space: nowrap;
|
|
1546
|
+
}
|
|
1547
|
+
|
|
1548
|
+
.tree-corner-controls .status-display .breadcrumb-ticker {
|
|
1549
|
+
display: block;
|
|
1550
|
+
}
|
|
1551
|
+
|
|
1552
|
+
.tree-corner-controls .status-display #breadcrumb-content {
|
|
1553
|
+
display: inline-block;
|
|
1554
|
+
animation: none; /* Disable any existing animations for corner display */
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1557
|
+
/* Hide corner controls when in focused mode to avoid clutter */
|
|
1558
|
+
.code-tree-container.focused .tree-corner-controls {
|
|
1559
|
+
opacity: 0.7;
|
|
1560
|
+
}
|
|
1561
|
+
|
|
1562
|
+
.code-tree-container.focused .tree-corner-controls:hover {
|
|
1563
|
+
opacity: 1;
|
|
1564
|
+
}
|
|
1565
|
+
|
|
1566
|
+
/* Force horizontal text for specific nodes */
|
|
1567
|
+
.node-label.horizontal-text {
|
|
1568
|
+
writing-mode: horizontal-tb !important;
|
|
1569
|
+
text-orientation: mixed !important;
|
|
1570
|
+
transform: rotate(0deg) !important;
|
|
1571
|
+
}
|
|
1572
|
+
|
|
1573
|
+
/* Zoom controls styling */
|
|
1574
|
+
.zoom-level-display {
|
|
1575
|
+
display: inline-block;
|
|
1576
|
+
padding: 2px 6px;
|
|
1577
|
+
background: rgba(0, 0, 0, 0.05);
|
|
1578
|
+
border-radius: 3px;
|
|
1579
|
+
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
|
1580
|
+
font-size: 11px !important;
|
|
1581
|
+
color: #718096 !important;
|
|
1582
|
+
margin-left: 8px !important;
|
|
1583
|
+
vertical-align: middle;
|
|
1584
|
+
min-width: 35px;
|
|
1585
|
+
text-align: center;
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
/* Enhanced tree control buttons for zoom */
|
|
1589
|
+
.tree-control-btn {
|
|
1590
|
+
background: #f8f9fa;
|
|
1591
|
+
border: 1px solid #e2e8f0;
|
|
1592
|
+
border-radius: 4px;
|
|
1593
|
+
padding: 6px 8px;
|
|
1594
|
+
margin: 0 2px;
|
|
1595
|
+
cursor: pointer;
|
|
1596
|
+
font-size: 12px;
|
|
1597
|
+
color: #4a5568;
|
|
1598
|
+
transition: all 0.2s;
|
|
1599
|
+
display: inline-block;
|
|
1600
|
+
vertical-align: middle;
|
|
1601
|
+
}
|
|
1602
|
+
|
|
1603
|
+
.tree-control-btn:hover {
|
|
1604
|
+
background: #e2e8f0;
|
|
1605
|
+
border-color: #cbd5e0;
|
|
1606
|
+
color: #2d3748;
|
|
1607
|
+
}
|
|
1608
|
+
|
|
1609
|
+
.tree-control-btn:active {
|
|
1610
|
+
background: #cbd5e0;
|
|
1611
|
+
transform: translateY(1px);
|
|
1612
|
+
}
|
|
1613
|
+
|
|
1614
|
+
/* Zoom-specific button styling */
|
|
1615
|
+
.tree-control-btn[title*="Zoom"] {
|
|
1616
|
+
font-family: system-ui, -apple-system, sans-serif;
|
|
1617
|
+
font-weight: 500;
|
|
1618
|
+
}
|
|
1619
|
+
|
|
1620
|
+
/* Pan cursor when dragging */
|
|
1621
|
+
.code-tree-container svg {
|
|
1622
|
+
cursor: grab;
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1625
|
+
.code-tree-container svg:active {
|
|
1626
|
+
cursor: grabbing;
|
|
1408
1627
|
}
|
|
@@ -1575,6 +1575,292 @@ button:active {
|
|
|
1575
1575
|
padding: 12px;
|
|
1576
1576
|
}
|
|
1577
1577
|
|
|
1578
|
+
/* AST Data Viewer Items */
|
|
1579
|
+
.ast-data-viewer-item {
|
|
1580
|
+
border-bottom: 1px solid #f1f5f9;
|
|
1581
|
+
padding: 12px 16px;
|
|
1582
|
+
cursor: pointer;
|
|
1583
|
+
transition: background-color 0.2s;
|
|
1584
|
+
background: white;
|
|
1585
|
+
margin-bottom: 2px;
|
|
1586
|
+
border-radius: 4px;
|
|
1587
|
+
}
|
|
1588
|
+
|
|
1589
|
+
.ast-data-viewer-item:hover {
|
|
1590
|
+
background: #f8fafc;
|
|
1591
|
+
}
|
|
1592
|
+
|
|
1593
|
+
.ast-data-viewer-item:last-child {
|
|
1594
|
+
border-bottom: none;
|
|
1595
|
+
}
|
|
1596
|
+
|
|
1597
|
+
.ast-data-viewer-item.selected {
|
|
1598
|
+
background: #ebf8ff;
|
|
1599
|
+
border-left: 3px solid #3182ce;
|
|
1600
|
+
}
|
|
1601
|
+
|
|
1602
|
+
.ast-data-item-header {
|
|
1603
|
+
display: flex;
|
|
1604
|
+
align-items: center;
|
|
1605
|
+
justify-content: space-between;
|
|
1606
|
+
margin-bottom: 4px;
|
|
1607
|
+
}
|
|
1608
|
+
|
|
1609
|
+
.ast-data-item-name {
|
|
1610
|
+
font-weight: 600;
|
|
1611
|
+
color: #2d3748;
|
|
1612
|
+
font-size: 14px;
|
|
1613
|
+
display: flex;
|
|
1614
|
+
align-items: center;
|
|
1615
|
+
gap: 6px;
|
|
1616
|
+
}
|
|
1617
|
+
|
|
1618
|
+
.ast-data-item-type {
|
|
1619
|
+
font-size: 11px;
|
|
1620
|
+
padding: 2px 6px;
|
|
1621
|
+
border-radius: 10px;
|
|
1622
|
+
background: #e2e8f0;
|
|
1623
|
+
color: #4a5568;
|
|
1624
|
+
text-transform: uppercase;
|
|
1625
|
+
font-weight: 500;
|
|
1626
|
+
}
|
|
1627
|
+
|
|
1628
|
+
.ast-data-item-type.class { background: #fed7d7; color: #c53030; }
|
|
1629
|
+
.ast-data-item-type.function { background: #c6f6d5; color: #2f855a; }
|
|
1630
|
+
.ast-data-item-type.method { background: #bee3f8; color: #2b6cb0; }
|
|
1631
|
+
.ast-data-item-type.variable { background: #feebc8; color: #c05621; }
|
|
1632
|
+
.ast-data-item-type.import { background: #e9d8fd; color: #6b46c1; }
|
|
1633
|
+
|
|
1634
|
+
.ast-data-item-details {
|
|
1635
|
+
font-size: 12px;
|
|
1636
|
+
color: #718096;
|
|
1637
|
+
line-height: 1.4;
|
|
1638
|
+
}
|
|
1639
|
+
|
|
1640
|
+
.ast-data-item-line {
|
|
1641
|
+
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
|
1642
|
+
background: #f7fafc;
|
|
1643
|
+
padding: 2px 4px;
|
|
1644
|
+
border-radius: 3px;
|
|
1645
|
+
margin-right: 8px;
|
|
1646
|
+
}
|
|
1647
|
+
|
|
1648
|
+
.ast-data-item-complexity {
|
|
1649
|
+
display: inline-flex;
|
|
1650
|
+
align-items: center;
|
|
1651
|
+
gap: 4px;
|
|
1652
|
+
}
|
|
1653
|
+
|
|
1654
|
+
.ast-complexity-indicator {
|
|
1655
|
+
width: 8px;
|
|
1656
|
+
height: 8px;
|
|
1657
|
+
border-radius: 50%;
|
|
1658
|
+
background: #e2e8f0;
|
|
1659
|
+
}
|
|
1660
|
+
|
|
1661
|
+
.ast-complexity-indicator.low { background: #48bb78; }
|
|
1662
|
+
.ast-complexity-indicator.medium { background: #ed8936; }
|
|
1663
|
+
.ast-complexity-indicator.high { background: #e53e3e; }
|
|
1664
|
+
|
|
1665
|
+
.ast-data-placeholder {
|
|
1666
|
+
display: flex;
|
|
1667
|
+
flex-direction: column;
|
|
1668
|
+
align-items: center;
|
|
1669
|
+
justify-content: center;
|
|
1670
|
+
height: 200px;
|
|
1671
|
+
color: #a0aec0;
|
|
1672
|
+
text-align: center;
|
|
1673
|
+
padding: 20px;
|
|
1674
|
+
}
|
|
1675
|
+
|
|
1676
|
+
.ast-placeholder-icon {
|
|
1677
|
+
font-size: 48px;
|
|
1678
|
+
margin-bottom: 12px;
|
|
1679
|
+
opacity: 0.5;
|
|
1680
|
+
}
|
|
1681
|
+
|
|
1682
|
+
.ast-placeholder-text {
|
|
1683
|
+
font-size: 14px;
|
|
1684
|
+
line-height: 1.5;
|
|
1685
|
+
}
|
|
1686
|
+
|
|
1687
|
+
/* Hierarchical Source Viewer */
|
|
1688
|
+
.source-viewer {
|
|
1689
|
+
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
|
1690
|
+
font-size: 12px;
|
|
1691
|
+
line-height: 1.4;
|
|
1692
|
+
background: #f8fafc;
|
|
1693
|
+
border-radius: 6px;
|
|
1694
|
+
overflow: hidden;
|
|
1695
|
+
}
|
|
1696
|
+
|
|
1697
|
+
.source-viewer-header {
|
|
1698
|
+
background: #e2e8f0;
|
|
1699
|
+
padding: 8px 12px;
|
|
1700
|
+
border-bottom: 1px solid #cbd5e0;
|
|
1701
|
+
font-weight: 600;
|
|
1702
|
+
color: #2d3748;
|
|
1703
|
+
display: flex;
|
|
1704
|
+
align-items: center;
|
|
1705
|
+
justify-content: space-between;
|
|
1706
|
+
}
|
|
1707
|
+
|
|
1708
|
+
.source-viewer-controls {
|
|
1709
|
+
display: flex;
|
|
1710
|
+
gap: 4px;
|
|
1711
|
+
}
|
|
1712
|
+
|
|
1713
|
+
.source-control-btn {
|
|
1714
|
+
background: none;
|
|
1715
|
+
border: none;
|
|
1716
|
+
padding: 2px 6px;
|
|
1717
|
+
border-radius: 3px;
|
|
1718
|
+
cursor: pointer;
|
|
1719
|
+
font-size: 11px;
|
|
1720
|
+
color: #718096;
|
|
1721
|
+
transition: all 0.2s;
|
|
1722
|
+
}
|
|
1723
|
+
|
|
1724
|
+
.source-control-btn:hover {
|
|
1725
|
+
background: #cbd5e0;
|
|
1726
|
+
color: #4a5568;
|
|
1727
|
+
}
|
|
1728
|
+
|
|
1729
|
+
.source-viewer-content {
|
|
1730
|
+
max-height: 600px;
|
|
1731
|
+
overflow-y: auto;
|
|
1732
|
+
background: white;
|
|
1733
|
+
}
|
|
1734
|
+
|
|
1735
|
+
/* Source Lines */
|
|
1736
|
+
.source-line {
|
|
1737
|
+
display: flex;
|
|
1738
|
+
align-items: flex-start;
|
|
1739
|
+
padding: 2px 0;
|
|
1740
|
+
border-left: 3px solid transparent;
|
|
1741
|
+
transition: all 0.2s;
|
|
1742
|
+
}
|
|
1743
|
+
|
|
1744
|
+
.source-line:hover {
|
|
1745
|
+
background: #f7fafc;
|
|
1746
|
+
}
|
|
1747
|
+
|
|
1748
|
+
.source-line.highlighted {
|
|
1749
|
+
background: #ebf8ff;
|
|
1750
|
+
border-left-color: #3182ce;
|
|
1751
|
+
}
|
|
1752
|
+
|
|
1753
|
+
.source-line.collapsible {
|
|
1754
|
+
cursor: pointer;
|
|
1755
|
+
}
|
|
1756
|
+
|
|
1757
|
+
.source-line.collapsible:hover {
|
|
1758
|
+
background: #edf2f7;
|
|
1759
|
+
}
|
|
1760
|
+
|
|
1761
|
+
.line-number {
|
|
1762
|
+
width: 40px;
|
|
1763
|
+
text-align: right;
|
|
1764
|
+
color: #a0aec0;
|
|
1765
|
+
padding-right: 8px;
|
|
1766
|
+
user-select: none;
|
|
1767
|
+
flex-shrink: 0;
|
|
1768
|
+
}
|
|
1769
|
+
|
|
1770
|
+
.line-content {
|
|
1771
|
+
flex: 1;
|
|
1772
|
+
padding-right: 12px;
|
|
1773
|
+
white-space: pre;
|
|
1774
|
+
overflow-x: auto;
|
|
1775
|
+
}
|
|
1776
|
+
|
|
1777
|
+
.collapse-indicator {
|
|
1778
|
+
width: 16px;
|
|
1779
|
+
text-align: center;
|
|
1780
|
+
color: #718096;
|
|
1781
|
+
cursor: pointer;
|
|
1782
|
+
user-select: none;
|
|
1783
|
+
flex-shrink: 0;
|
|
1784
|
+
}
|
|
1785
|
+
|
|
1786
|
+
.collapse-indicator:hover {
|
|
1787
|
+
color: #4a5568;
|
|
1788
|
+
}
|
|
1789
|
+
|
|
1790
|
+
.collapse-indicator.expanded::before {
|
|
1791
|
+
content: '▼';
|
|
1792
|
+
}
|
|
1793
|
+
|
|
1794
|
+
.collapse-indicator.collapsed::before {
|
|
1795
|
+
content: '▶';
|
|
1796
|
+
}
|
|
1797
|
+
|
|
1798
|
+
.collapse-indicator.none::before {
|
|
1799
|
+
content: '';
|
|
1800
|
+
}
|
|
1801
|
+
|
|
1802
|
+
/* Collapsed Content */
|
|
1803
|
+
.collapsed-content {
|
|
1804
|
+
display: none;
|
|
1805
|
+
}
|
|
1806
|
+
|
|
1807
|
+
.collapsed-placeholder {
|
|
1808
|
+
color: #a0aec0;
|
|
1809
|
+
font-style: italic;
|
|
1810
|
+
padding-left: 16px;
|
|
1811
|
+
}
|
|
1812
|
+
|
|
1813
|
+
/* Syntax Highlighting */
|
|
1814
|
+
.source-line .keyword {
|
|
1815
|
+
color: #805ad5;
|
|
1816
|
+
font-weight: 600;
|
|
1817
|
+
}
|
|
1818
|
+
|
|
1819
|
+
.source-line .string {
|
|
1820
|
+
color: #38a169;
|
|
1821
|
+
}
|
|
1822
|
+
|
|
1823
|
+
.source-line .comment {
|
|
1824
|
+
color: #718096;
|
|
1825
|
+
font-style: italic;
|
|
1826
|
+
}
|
|
1827
|
+
|
|
1828
|
+
.source-line .function-def {
|
|
1829
|
+
color: #3182ce;
|
|
1830
|
+
font-weight: 600;
|
|
1831
|
+
}
|
|
1832
|
+
|
|
1833
|
+
.source-line .class-def {
|
|
1834
|
+
color: #d69e2e;
|
|
1835
|
+
font-weight: 600;
|
|
1836
|
+
}
|
|
1837
|
+
|
|
1838
|
+
.source-line .decorator {
|
|
1839
|
+
color: #805ad5;
|
|
1840
|
+
}
|
|
1841
|
+
|
|
1842
|
+
/* AST Integration */
|
|
1843
|
+
.source-line.ast-element {
|
|
1844
|
+
position: relative;
|
|
1845
|
+
}
|
|
1846
|
+
|
|
1847
|
+
.source-line.ast-element::after {
|
|
1848
|
+
content: '';
|
|
1849
|
+
position: absolute;
|
|
1850
|
+
right: 8px;
|
|
1851
|
+
top: 50%;
|
|
1852
|
+
transform: translateY(-50%);
|
|
1853
|
+
width: 6px;
|
|
1854
|
+
height: 6px;
|
|
1855
|
+
border-radius: 50%;
|
|
1856
|
+
background: #48bb78;
|
|
1857
|
+
}
|
|
1858
|
+
|
|
1859
|
+
.source-line.ast-element.selected::after {
|
|
1860
|
+
background: #3182ce;
|
|
1861
|
+
box-shadow: 0 0 0 2px rgba(49, 130, 206, 0.3);
|
|
1862
|
+
}
|
|
1863
|
+
|
|
1578
1864
|
.structured-field {
|
|
1579
1865
|
margin-bottom: 8px;
|
|
1580
1866
|
font-size: 13px;
|