@memberjunction/ng-dashboards 5.11.0 → 5.13.0
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/AI/components/agents/agent-configuration.component.d.ts +34 -2
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +586 -223
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +2 -2
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +8 -0
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +85 -52
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.d.ts +1 -0
- package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.js +27 -5
- package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.d.ts +5 -0
- package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.js +23 -8
- package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +2 -2
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +2 -2
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +2 -2
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +2 -2
- package/dist/AI/components/prompts/prompt-management.component.js +3 -3
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +2 -2
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +83 -0
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js +547 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -0
- package/dist/AI/components/system/system-config-filter-panel.component.js +2 -2
- package/dist/AI/components/system/system-configuration.component.js +2 -2
- package/dist/AI/components/widgets/kpi-card.component.js +7 -7
- package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
- package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -1
- package/dist/AI/components/widgets/live-execution-widget.component.js +6 -6
- package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
- package/dist/AI/index.d.ts +1 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +2 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +3 -3
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +3 -3
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-list.component.js +3 -3
- package/dist/APIKeys/api-key-list.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +1 -1
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +2 -2
- package/dist/APIKeys/api-usage-panel.component.js +2 -2
- package/dist/Actions/components/actions-overview.component.js +2 -2
- package/dist/Actions/components/execution-monitoring.component.js +2 -2
- package/dist/Actions/components/explorer/action-breadcrumb.component.js +2 -2
- package/dist/Actions/components/explorer/action-card.component.js +2 -2
- package/dist/Actions/components/explorer/action-explorer.component.js +2 -2
- package/dist/Actions/components/explorer/action-list-item.component.js +2 -2
- package/dist/Actions/components/explorer/action-toolbar.component.js +2 -2
- package/dist/Actions/components/explorer/action-tree-panel.component.js +2 -2
- package/dist/Actions/components/explorer/new-action-panel.component.js +2 -2
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +2 -2
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +2 -2
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +3 -3
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +5 -5
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +3 -3
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +3 -3
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +2 -2
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +2 -2
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +2 -2
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/browser/component-browser.component.js +2 -2
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +2 -2
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +2 -2
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js +2 -2
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/spec-editor.component.js +2 -2
- package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/text-import-dialog.component.js +2 -2
- package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +2 -2
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +2 -2
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +9 -9
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +11 -3
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +2 -2
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +12 -11
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +9 -9
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +2 -2
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +2 -2
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +2 -2
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +2 -2
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +2 -2
- package/dist/DataExplorer/data-explorer-dashboard.component.js +4 -4
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/Integration/components/activity/activity.component.d.ts +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +5 -5
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts +31 -2
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +753 -412
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +3 -3
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts +0 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +3 -6
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +3 -3
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts +20 -0
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +97 -5
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/components/visual-editor/visual-editor.component.js +2 -2
- package/dist/Integration/components/widgets/integration-card.component.d.ts.map +1 -1
- package/dist/Integration/components/widgets/integration-card.component.js +5 -1
- package/dist/Integration/components/widgets/integration-card.component.js.map +1 -1
- package/dist/Integration/components/widgets/run-history-panel.component.js +2 -2
- package/dist/Integration/components/widgets/run-history-panel.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +2 -1
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +7 -3
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/Integration/services/integration-data.service.d.ts +27 -2
- package/dist/Integration/services/integration-data.service.d.ts.map +1 -1
- package/dist/Integration/services/integration-data.service.js +107 -4
- package/dist/Integration/services/integration-data.service.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +25 -24
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +2 -2
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +26 -25
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +2 -2
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js +3 -3
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +2 -2
- package/dist/MCP/components/mcp-log-detail-panel.component.js +2 -2
- package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
- package/dist/MCP/components/mcp-test-tool-dialog.component.js +2 -2
- package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +2 -2
- package/dist/MCP/mcp-filter-panel.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js +7 -7
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/index.d.ts +0 -1
- package/dist/Scheduling/components/index.d.ts.map +1 -1
- package/dist/Scheduling/components/index.js +0 -1
- package/dist/Scheduling/components/index.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +2 -2
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts +6 -9
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +118 -110
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +3 -3
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +2 -2
- package/dist/SystemDiagnostics/system-diagnostics.component.js +4 -4
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +2 -2
- package/dist/Testing/components/testing-analytics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +4 -4
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +2 -2
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +5 -5
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +2 -2
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +2 -2
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
- package/dist/Testing/components/widgets/suite-tree.component.js +4 -4
- package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js +2 -2
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +2 -2
- package/dist/VersionHistory/components/diff-resource.component.js +2 -2
- package/dist/VersionHistory/components/graph-resource.component.js +2 -2
- package/dist/VersionHistory/components/labels-resource.component.js +3 -3
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +3 -3
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/__tests__/integration-data-service.test.js +1 -0
- package/dist/__tests__/integration-data-service.test.js.map +1 -1
- package/dist/module.d.ts +52 -49
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +25 -6
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +1 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +42 -40
- package/dist/Scheduling/components/job-slideout.component.d.ts +0 -45
- package/dist/Scheduling/components/job-slideout.component.d.ts.map +0 -1
- package/dist/Scheduling/components/job-slideout.component.js +0 -459
- package/dist/Scheduling/components/job-slideout.component.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"venn-diagram.component.js","sourceRoot":"","sources":["../../../../src/Lists/components/venn-diagram/venn-diagram.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnChanges,\n SimpleChanges,\n OnDestroy,\n ChangeDetectorRef\n} from '@angular/core';\nimport * as d3 from 'd3';\nimport { VennData, VennSet, VennIntersection } from '../../services/list-set-operations.service';\n\n/**\n * Event emitted when a Venn region is clicked\n */\nexport interface VennRegionClickEvent {\n intersection: VennIntersection;\n recordIds: string[];\n}\n\n/**\n * Interactive D3-based Venn diagram component for visualizing list overlaps.\n *\n * Features:\n * - Proportional circle sizing based on list size\n * - Animated transitions\n * - Hover highlighting\n * - Click to select regions\n * - Responsive sizing\n */\n@Component({\n standalone: false,\n selector: 'mj-venn-diagram',\n template: `\n <div class=\"venn-container\" #vennContainer>\n <svg #vennSvg class=\"venn-svg\"></svg>\n \n <!-- Tooltip -->\n <div class=\"venn-tooltip\" [class.visible]=\"tooltipVisible\"\n [style.left.px]=\"tooltipX\" [style.top.px]=\"tooltipY\">\n <div class=\"tooltip-title\">{{ tooltipTitle }}</div>\n <div class=\"tooltip-count\">{{ tooltipCount }} records</div>\n </div>\n \n <!-- Legend -->\n @if (data && data.sets.length > 0) {\n <div class=\"venn-legend\">\n @for (set of data.sets; track set) {\n <div class=\"legend-item\">\n <div class=\"legend-color\" [style.background-color]=\"set.color\"></div>\n <div class=\"legend-info\">\n <span class=\"legend-name\">{{ set.listName }}</span>\n <span class=\"legend-count\">{{ set.size }} items</span>\n </div>\n </div>\n }\n </div>\n }\n \n <!-- Empty state -->\n @if (!data || data.sets.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n <p>Add lists to visualize their overlaps</p>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .venn-container {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 300px;\n background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .venn-svg {\n width: 100%;\n height: 100%;\n }\n\n .venn-tooltip {\n position: absolute;\n background: rgba(0, 0, 0, 0.85);\n color: white;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 13px;\n pointer-events: none;\n opacity: 0;\n transform: translateY(8px);\n transition: opacity 0.15s, transform 0.15s;\n z-index: 100;\n white-space: nowrap;\n }\n\n .venn-tooltip.visible {\n opacity: 1;\n transform: translateY(0);\n }\n\n .tooltip-title {\n font-weight: 600;\n margin-bottom: 2px;\n }\n\n .tooltip-count {\n color: rgba(255, 255, 255, 0.8);\n font-size: 12px;\n }\n\n .venn-legend {\n position: absolute;\n bottom: 16px;\n left: 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n background: rgba(255, 255, 255, 0.95);\n padding: 12px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .legend-item {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .legend-color {\n width: 16px;\n height: 16px;\n border-radius: 4px;\n flex-shrink: 0;\n }\n\n .legend-info {\n display: flex;\n flex-direction: column;\n }\n\n .legend-name {\n font-size: 13px;\n font-weight: 500;\n color: #333;\n }\n\n .legend-count {\n font-size: 11px;\n color: #999;\n }\n\n .empty-state {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n text-align: center;\n color: #999;\n }\n\n .empty-state i {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n }\n\n .empty-state p {\n font-size: 14px;\n margin: 0;\n }\n\n /* SVG styles */\n :host ::ng-deep .venn-circle {\n cursor: pointer;\n transition: opacity 0.2s;\n }\n\n :host ::ng-deep .venn-circle:hover {\n opacity: 0.9;\n }\n\n :host ::ng-deep .venn-label {\n font-size: 12px;\n font-weight: 600;\n fill: white;\n text-anchor: middle;\n pointer-events: none;\n }\n\n :host ::ng-deep .intersection-region {\n cursor: pointer;\n transition: all 0.2s;\n }\n\n :host ::ng-deep .intersection-region:hover {\n fill: rgba(0,0,0,0.75);\n }\n\n :host ::ng-deep .intersection-region.selected {\n fill: rgba(156, 39, 176, 0.9);\n stroke: #7B1FA2;\n stroke-width: 2;\n }\n\n :host ::ng-deep .intersection-label-group {\n transition: transform 0.15s ease;\n }\n\n :host ::ng-deep .intersection-label-group:hover {\n transform: scale(1.05);\n }\n `]\n})\nexport class VennDiagramComponent implements AfterViewInit, OnChanges, OnDestroy {\n @ViewChild('vennContainer') containerRef!: ElementRef<HTMLDivElement>;\n @ViewChild('vennSvg') svgRef!: ElementRef<SVGSVGElement>;\n\n @Input() data: VennData | null = null;\n @Input() selectedRegion: VennIntersection | null = null;\n\n @Output() regionClick = new EventEmitter<VennRegionClickEvent>();\n @Output() regionHover = new EventEmitter<VennIntersection | null>();\n\n // Tooltip state\n tooltipVisible = false;\n tooltipX = 0;\n tooltipY = 0;\n tooltipTitle = '';\n tooltipCount = 0;\n\n // Track if hovering an intersection label (to suppress circle tooltips)\n private isHoveringIntersectionLabel = false;\n\n private svg: d3.Selection<SVGSVGElement, unknown, null, undefined> | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private width = 0;\n private height = 0;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngAfterViewInit(): void {\n this.initializeSvg();\n this.setupResizeObserver();\n this.render();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ((changes['data'] || changes['selectedRegion']) && this.svg) {\n this.render();\n }\n }\n\n ngOnDestroy(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n }\n\n private initializeSvg(): void {\n if (!this.svgRef) return;\n\n this.svg = d3.select(this.svgRef.nativeElement);\n this.updateDimensions();\n }\n\n private setupResizeObserver(): void {\n if (!this.containerRef) return;\n\n this.resizeObserver = new ResizeObserver(() => {\n this.updateDimensions();\n this.render();\n });\n\n this.resizeObserver.observe(this.containerRef.nativeElement);\n }\n\n private updateDimensions(): void {\n if (!this.containerRef) return;\n\n const rect = this.containerRef.nativeElement.getBoundingClientRect();\n this.width = rect.width;\n this.height = rect.height;\n }\n\n private render(): void {\n if (!this.svg || !this.data || this.data.sets.length === 0) {\n if (this.svg) {\n this.svg.selectAll('*').remove();\n }\n return;\n }\n\n // Clear previous content\n this.svg.selectAll('*').remove();\n\n const margin = { top: 40, right: 40, bottom: 80, left: 40 };\n const drawWidth = this.width - margin.left - margin.right;\n const drawHeight = this.height - margin.top - margin.bottom;\n\n if (drawWidth <= 0 || drawHeight <= 0) return;\n\n const g = this.svg\n .append('g')\n .attr('transform', `translate(${margin.left}, ${margin.top})`);\n\n // Render based on number of sets\n const sets = this.data.sets;\n\n if (sets.length === 1) {\n this.renderSingleSet(g, sets[0], drawWidth, drawHeight);\n } else if (sets.length === 2) {\n this.renderTwoSets(g, sets, drawWidth, drawHeight);\n } else if (sets.length === 3) {\n this.renderThreeSets(g, sets, drawWidth, drawHeight);\n } else if (sets.length === 4) {\n this.renderFourSets(g, sets, drawWidth, drawHeight);\n } else {\n this.renderMultipleSets(g, sets, drawWidth, drawHeight);\n }\n }\n\n private renderSingleSet(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n set: VennSet,\n width: number,\n height: number\n ): void {\n const cx = width / 2;\n const cy = height / 2;\n const radius = Math.min(width, height) * 0.35;\n\n // Draw circle\n g.append('circle')\n .attr('class', 'venn-circle')\n .attr('cx', cx)\n .attr('cy', cy)\n .attr('r', radius)\n .attr('fill', set.color)\n .attr('opacity', 0.6)\n .on('mouseenter', (event: MouseEvent) => this.showCircleTooltip(event, set.listName, set.size))\n .on('mousemove', (event: MouseEvent) => this.moveTooltip(event))\n .on('mouseleave', () => this.hideTooltip())\n .on('click', () => this.onCircleClick(set));\n\n // Draw label\n g.append('text')\n .attr('class', 'venn-label')\n .attr('x', cx)\n .attr('y', cy)\n .text(set.size.toString());\n }\n\n private renderTwoSets(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n sets: VennSet[],\n width: number,\n height: number\n ): void {\n const cy = height / 2;\n\n // Calculate proportional radii based on list sizes\n const { radii, baseRadius } = this.calculateProportionalRadii(sets, width, height, 2);\n const r1 = radii[0];\n const r2 = radii[1];\n\n // Calculate overlap to ensure visual intersection\n const avgRadius = (r1 + r2) / 2;\n const overlap = avgRadius * 0.5;\n\n const positions = [\n { cx: width / 2 - r1 + overlap / 2, r: r1, set: sets[0] },\n { cx: width / 2 + r2 - overlap / 2, r: r2, set: sets[1] }\n ];\n\n // Draw circles\n for (const pos of positions) {\n g.append('circle')\n .attr('class', 'venn-circle')\n .attr('cx', pos.cx)\n .attr('cy', cy)\n .attr('r', pos.r)\n .attr('fill', pos.set.color)\n .attr('opacity', 0.5)\n .on('mouseenter', (event: MouseEvent) => this.showCircleTooltip(event, pos.set.listName, pos.set.size))\n .on('mousemove', (event: MouseEvent) => this.moveTooltip(event))\n .on('mouseleave', () => this.hideTooltip())\n .on('click', () => this.onCircleClick(pos.set));\n }\n\n // Find intersection data\n const intersection = this.data?.intersections.find(\n i => i.setIds.length === 2 && i.setIds.includes(sets[0].listId) && i.setIds.includes(sets[1].listId)\n );\n\n // Draw intersection labels\n const leftOnlyIntersection = this.data?.intersections.find(\n i => i.setIds.length === 1 && i.setIds[0] === sets[0].listId\n );\n const rightOnlyIntersection = this.data?.intersections.find(\n i => i.setIds.length === 1 && i.setIds[0] === sets[1].listId\n );\n\n // Left only - clickable region\n if (leftOnlyIntersection) {\n this.addClickableLabel(g, positions[0].cx - positions[0].r * 0.3, cy, leftOnlyIntersection);\n }\n\n // Right only - clickable region\n if (rightOnlyIntersection) {\n this.addClickableLabel(g, positions[1].cx + positions[1].r * 0.3, cy, rightOnlyIntersection);\n }\n\n // Intersection - clickable region (center between the two circles)\n if (intersection && intersection.size > 0) {\n this.addClickableLabel(g, width / 2, cy, intersection);\n }\n }\n\n /**\n * Add a clickable label with background for intersection regions\n */\n private addClickableLabel(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n x: number,\n y: number,\n intersection: VennIntersection\n ): void {\n const labelGroup = g.append('g')\n .attr('class', 'intersection-label-group')\n .style('cursor', 'pointer');\n\n // Add background circle/pill for better click target\n const text = intersection.size.toString();\n const padding = 8;\n const fontSize = intersection.setIds.length >= 3 ? 14 : 12;\n const rectWidth = Math.max(text.length * fontSize * 0.7 + padding * 2, 32);\n\n // The rect is the main hover/click target\n const rect = labelGroup.append('rect')\n .attr('x', x - rectWidth / 2)\n .attr('y', y - fontSize / 2 - padding / 2)\n .attr('width', rectWidth)\n .attr('height', fontSize + padding)\n .attr('rx', (fontSize + padding) / 2)\n .attr('ry', (fontSize + padding) / 2)\n .attr('fill', 'rgba(0,0,0,0.6)')\n .attr('class', this.isRegionSelected(intersection) ? 'intersection-region selected' : 'intersection-region');\n\n // Text has pointer-events: none to prevent hover flickering\n labelGroup.append('text')\n .attr('class', 'venn-label')\n .attr('x', x)\n .attr('y', y + fontSize * 0.35)\n .style('font-size', `${fontSize}px`)\n .style('pointer-events', 'none')\n .text(text);\n\n // Attach events to the rect (the main clickable area)\n // Show tooltip for intersection labels with proper event handling to prevent flickering\n rect\n .on('mouseenter', (event: MouseEvent) => {\n event.stopPropagation();\n // Set flag to suppress circle tooltips and prevent their mousemove from calling detectChanges\n this.isHoveringIntersectionLabel = true;\n // Hide any existing tooltip immediately without triggering detectChanges\n this.tooltipVisible = false;\n // Show the label's tooltip\n this.showLabelTooltip(event, intersection);\n })\n .on('mousemove', (event: MouseEvent) => {\n event.stopPropagation();\n // Update tooltip position without calling detectChanges (avoid flicker)\n this.moveLabelTooltipPosition(event);\n })\n .on('mouseleave', (event: MouseEvent) => {\n event.stopPropagation();\n this.isHoveringIntersectionLabel = false;\n this.tooltipVisible = false;\n this.cdr.detectChanges();\n })\n .on('click', (event: MouseEvent) => {\n event.stopPropagation();\n this.onIntersectionClick(intersection);\n });\n }\n\n /**\n * Check if a region is currently selected\n */\n private isRegionSelected(intersection: VennIntersection): boolean {\n if (!this.selectedRegion) return false;\n return this.selectedRegion.setIds.length === intersection.setIds.length &&\n this.selectedRegion.setIds.every(id => intersection.setIds.includes(id));\n }\n\n /**\n * Calculate proportional radii using a small/medium/large approach\n * This avoids extreme size differences (e.g., 1000 vs 10 items)\n */\n private calculateProportionalRadii(\n sets: VennSet[],\n width: number,\n height: number,\n numSets: number\n ): { radii: number[]; baseRadius: number } {\n // Determine base radius based on number of sets\n let baseRadius: number;\n if (numSets === 1) {\n baseRadius = Math.min(width, height) * 0.35;\n } else if (numSets === 2) {\n baseRadius = Math.min(width / 2.5, height / 2) * 0.8;\n } else if (numSets === 3) {\n baseRadius = Math.min(width, height) * 0.28;\n } else {\n const cols = Math.ceil(Math.sqrt(numSets));\n const cellSize = Math.min(width / cols, height / cols);\n baseRadius = cellSize * 0.35;\n }\n\n // Find the size range\n const sizes = sets.map(s => s.size);\n const maxSize = Math.max(...sizes, 1);\n const minSize = Math.min(...sizes, 1);\n\n // If all same size or very close, use same radius\n if (maxSize === minSize || maxSize / minSize < 1.5) {\n return {\n radii: sets.map(() => baseRadius),\n baseRadius\n };\n }\n\n // Use logarithmic scaling with bounds for visual balance\n // Scale factor ranges from 0.7 to 1.0 based on relative size\n const minScale = 0.7;\n const maxScale = 1.0;\n\n const radii = sets.map(set => {\n // Use log scale for smoother visual representation\n const logMin = Math.log(minSize + 1);\n const logMax = Math.log(maxSize + 1);\n const logSize = Math.log(set.size + 1);\n\n // Normalize to 0-1 range\n const normalized = (logSize - logMin) / (logMax - logMin);\n\n // Scale to minScale-maxScale range\n const scale = minScale + normalized * (maxScale - minScale);\n\n return baseRadius * scale;\n });\n\n return { radii, baseRadius };\n }\n\n private renderThreeSets(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n sets: VennSet[],\n width: number,\n height: number\n ): void {\n const cx = width / 2;\n const cy = height / 2;\n\n // Calculate proportional radii based on list sizes\n const { radii, baseRadius } = this.calculateProportionalRadii(sets, width, height, 3);\n const avgRadius = radii.reduce((a, b) => a + b, 0) / radii.length;\n const offset = avgRadius * 0.65; // Distance from center\n\n // Position circles in a triangle with individual radii\n const positions = [\n { cx: cx, cy: cy - offset * 0.8, r: radii[0], set: sets[0] }, // Top\n { cx: cx - offset * 0.9, cy: cy + offset * 0.5, r: radii[1], set: sets[1] }, // Bottom left\n { cx: cx + offset * 0.9, cy: cy + offset * 0.5, r: radii[2], set: sets[2] } // Bottom right\n ];\n\n // Draw circles\n for (const pos of positions) {\n g.append('circle')\n .attr('class', 'venn-circle')\n .attr('cx', pos.cx)\n .attr('cy', pos.cy)\n .attr('r', pos.r)\n .attr('fill', pos.set.color)\n .attr('opacity', 0.5)\n .on('mouseenter', (event: MouseEvent) => this.showCircleTooltip(event, pos.set.listName, pos.set.size))\n .on('mousemove', (event: MouseEvent) => this.moveTooltip(event))\n .on('mouseleave', () => this.hideTooltip())\n .on('click', () => this.onCircleClick(pos.set));\n }\n\n // Draw clickable intersection labels\n for (const intersection of this.data?.intersections || []) {\n const labelPos = this.getIntersectionLabelPosition(intersection, positions, cx, cy, avgRadius);\n if (labelPos && intersection.size > 0) {\n this.addClickableLabel(g, labelPos.x, labelPos.y, intersection);\n }\n }\n }\n\n private getIntersectionLabelPosition(\n intersection: VennIntersection,\n positions: Array<{ cx: number; cy: number; r?: number; set: VennSet }>,\n cx: number,\n cy: number,\n radius: number\n ): { x: number; y: number } | null {\n const n = intersection.setIds.length;\n\n if (n === 1) {\n // Find the single set position\n const pos = positions.find(p => p.set.listId === intersection.setIds[0]);\n if (!pos) return null;\n\n // Use individual radius if available, otherwise use provided radius\n const r = pos.r || radius;\n\n // Move label towards the outer edge, away from center\n const dx = pos.cx - cx;\n const dy = pos.cy - cy;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const offsetFactor = 0.6;\n\n return {\n x: pos.cx + (dx / dist) * r * offsetFactor,\n y: pos.cy + (dy / dist) * r * offsetFactor\n };\n } else if (n === 2) {\n // Average of two positions\n const pos1 = positions.find(p => p.set.listId === intersection.setIds[0]);\n const pos2 = positions.find(p => p.set.listId === intersection.setIds[1]);\n if (!pos1 || !pos2) return null;\n\n return {\n x: (pos1.cx + pos2.cx) / 2,\n y: (pos1.cy + pos2.cy) / 2\n };\n } else if (n === 3) {\n // Center of all three\n return { x: cx, y: cy };\n }\n\n return null;\n }\n\n /**\n * Render a 4-set Venn diagram using overlapping ellipses.\n * This is a simplified approach - true 4-set Venn diagrams use complex curves.\n * We use two pairs of rotated ellipses to create all 15 possible regions.\n */\n private renderFourSets(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n sets: VennSet[],\n width: number,\n height: number\n ): void {\n const cx = width / 2;\n const cy = height / 2;\n\n // Use ellipses for 4-set Venn\n const baseSize = Math.min(width, height) * 0.35;\n const rx = baseSize * 1.2; // Ellipse horizontal radius\n const ry = baseSize * 0.7; // Ellipse vertical radius\n\n // Position ellipses with rotations to create overlapping regions\n // Two ellipses rotated ~45 degrees and two rotated ~-45 degrees\n const positions = [\n { cx: cx - baseSize * 0.3, cy: cy - baseSize * 0.15, rx, ry, rotation: 45, set: sets[0] },\n { cx: cx + baseSize * 0.3, cy: cy - baseSize * 0.15, rx, ry, rotation: -45, set: sets[1] },\n { cx: cx - baseSize * 0.3, cy: cy + baseSize * 0.15, rx, ry, rotation: -45, set: sets[2] },\n { cx: cx + baseSize * 0.3, cy: cy + baseSize * 0.15, rx, ry, rotation: 45, set: sets[3] }\n ];\n\n // Draw ellipses\n for (const pos of positions) {\n g.append('ellipse')\n .attr('class', 'venn-circle')\n .attr('cx', pos.cx)\n .attr('cy', pos.cy)\n .attr('rx', pos.rx)\n .attr('ry', pos.ry)\n .attr('transform', `rotate(${pos.rotation}, ${pos.cx}, ${pos.cy})`)\n .attr('fill', pos.set.color)\n .attr('opacity', 0.4)\n .on('mouseenter', (event: MouseEvent) => this.showCircleTooltip(event, pos.set.listName, pos.set.size))\n .on('mousemove', (event: MouseEvent) => this.moveTooltip(event))\n .on('mouseleave', () => this.hideTooltip())\n .on('click', () => this.onCircleClick(pos.set));\n }\n\n // Draw clickable intersection labels\n // For 4 sets, we need to calculate positions for all 15 regions\n for (const intersection of this.data?.intersections || []) {\n const labelPos = this.getFourSetIntersectionPosition(intersection, positions, cx, cy, baseSize);\n if (labelPos && intersection.size > 0) {\n this.addClickableLabel(g, labelPos.x, labelPos.y, intersection);\n }\n }\n }\n\n /**\n * Calculate label position for 4-set Venn intersections\n */\n private getFourSetIntersectionPosition(\n intersection: VennIntersection,\n positions: Array<{ cx: number; cy: number; set: VennSet }>,\n cx: number,\n cy: number,\n baseSize: number\n ): { x: number; y: number } | null {\n const n = intersection.setIds.length;\n const setIndices = intersection.setIds.map(id =>\n positions.findIndex(p => p.set.listId === id)\n ).filter(i => i >= 0);\n\n if (setIndices.length !== n) return null;\n\n if (n === 1) {\n // Single set - position at outer edge\n const pos = positions[setIndices[0]];\n const dx = pos.cx - cx;\n const dy = pos.cy - cy;\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\n return {\n x: pos.cx + (dx / dist) * baseSize * 0.6,\n y: pos.cy + (dy / dist) * baseSize * 0.6\n };\n } else if (n === 2) {\n // Two sets - average position, offset from center\n const pos1 = positions[setIndices[0]];\n const pos2 = positions[setIndices[1]];\n const avgX = (pos1.cx + pos2.cx) / 2;\n const avgY = (pos1.cy + pos2.cy) / 2;\n // Offset slightly from the center\n const dx = avgX - cx;\n const dy = avgY - cy;\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\n return {\n x: avgX + (dx / dist) * baseSize * 0.2,\n y: avgY + (dy / dist) * baseSize * 0.2\n };\n } else if (n === 3) {\n // Three sets - find the set NOT in the intersection\n const missingIndex = [0, 1, 2, 3].find(i => !setIndices.includes(i));\n if (missingIndex === undefined) return { x: cx, y: cy };\n\n // Position opposite to the missing set\n const missingPos = positions[missingIndex];\n const dx = cx - missingPos.cx;\n const dy = cy - missingPos.cy;\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\n return {\n x: cx + (dx / dist) * baseSize * 0.25,\n y: cy + (dy / dist) * baseSize * 0.25\n };\n } else if (n === 4) {\n // All four sets - center\n return { x: cx, y: cy };\n }\n\n return null;\n }\n\n private renderMultipleSets(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n sets: VennSet[],\n width: number,\n height: number\n ): void {\n // For more than 3 sets, use a grid layout\n const cols = Math.ceil(Math.sqrt(sets.length));\n const rows = Math.ceil(sets.length / cols);\n const cellWidth = width / cols;\n const cellHeight = height / rows;\n const radius = Math.min(cellWidth, cellHeight) * 0.35;\n\n sets.forEach((set, i) => {\n const col = i % cols;\n const row = Math.floor(i / cols);\n const cx = cellWidth * col + cellWidth / 2;\n const cy = cellHeight * row + cellHeight / 2;\n\n g.append('circle')\n .attr('class', 'venn-circle')\n .attr('cx', cx)\n .attr('cy', cy)\n .attr('r', radius)\n .attr('fill', set.color)\n .attr('opacity', 0.6)\n .on('mouseenter', (event: MouseEvent) => this.showCircleTooltip(event, set.listName, set.size))\n .on('mousemove', (event: MouseEvent) => this.moveTooltip(event))\n .on('mouseleave', () => this.hideTooltip())\n .on('click', () => this.onCircleClick(set));\n\n g.append('text')\n .attr('class', 'venn-label')\n .attr('x', cx)\n .attr('y', cy)\n .text(set.size.toString());\n\n // Add list name below\n g.append('text')\n .attr('x', cx)\n .attr('y', cy + radius + 16)\n .attr('text-anchor', 'middle')\n .attr('fill', '#666')\n .attr('font-size', '11px')\n .text(set.listName.length > 15 ? set.listName.substring(0, 15) + '...' : set.listName);\n });\n }\n\n /**\n * Show tooltip for circle/ellipse elements.\n * This is suppressed when hovering an intersection label.\n */\n private showCircleTooltip(event: MouseEvent, title: string, count: number): void {\n // Don't show circle tooltip if hovering an intersection label\n if (this.isHoveringIntersectionLabel) {\n return;\n }\n this.showTooltip(event, title, count);\n }\n\n private showTooltip(event: MouseEvent, title: string, count: number): void {\n this.tooltipTitle = title;\n this.tooltipCount = count;\n this.tooltipVisible = true;\n this.moveTooltip(event);\n this.cdr.detectChanges();\n }\n\n private moveTooltip(event: MouseEvent): void {\n // Skip updating if hovering an intersection label (prevents flicker from circle mousemove events)\n if (this.isHoveringIntersectionLabel) {\n return;\n }\n\n const container = this.containerRef?.nativeElement;\n if (!container) return;\n\n const rect = container.getBoundingClientRect();\n this.tooltipX = event.clientX - rect.left + 10;\n this.tooltipY = event.clientY - rect.top - 30;\n this.cdr.detectChanges();\n }\n\n /**\n * Show tooltip for intersection label with proper intersection name\n */\n private showLabelTooltip(event: MouseEvent, intersection: VennIntersection): void {\n // Build the tooltip title from the intersection\n const setNames = intersection.setIds.map(id => {\n const set = this.data?.sets.find(s => s.listId === id);\n return set?.listName || 'Unknown';\n });\n\n if (intersection.setIds.length === 1) {\n this.tooltipTitle = `Only in ${setNames[0]}`;\n } else {\n this.tooltipTitle = setNames.join(' ∩ ');\n }\n this.tooltipCount = intersection.size;\n this.tooltipVisible = true;\n this.moveLabelTooltipPosition(event);\n this.cdr.detectChanges();\n }\n\n /**\n * Update tooltip position for label without triggering extra change detection\n */\n private moveLabelTooltipPosition(event: MouseEvent): void {\n const container = this.containerRef?.nativeElement;\n if (!container) return;\n\n const rect = container.getBoundingClientRect();\n this.tooltipX = event.clientX - rect.left + 10;\n this.tooltipY = event.clientY - rect.top - 30;\n // Don't call detectChanges here - we call it once in showLabelTooltip\n // and the Angular zone will handle the position updates\n }\n\n private hideTooltip(): void {\n // Don't hide tooltip if we're hovering an intersection label\n if (this.isHoveringIntersectionLabel) {\n return;\n }\n this.tooltipVisible = false;\n this.cdr.detectChanges();\n }\n\n private onCircleClick(set: VennSet): void {\n // Find the \"only in this set\" intersection\n const intersection = this.data?.intersections.find(\n i => i.setIds.length === 1 && i.setIds[0] === set.listId\n );\n\n if (intersection) {\n this.regionClick.emit({\n intersection,\n recordIds: intersection.recordIds\n });\n }\n }\n\n private onIntersectionClick(intersection: VennIntersection): void {\n this.regionClick.emit({\n intersection,\n recordIds: intersection.recordIds\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"venn-diagram.component.js","sourceRoot":"","sources":["../../../../src/Lists/components/venn-diagram/venn-diagram.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnChanges,\n SimpleChanges,\n OnDestroy,\n ChangeDetectorRef\n} from '@angular/core';\nimport * as d3 from 'd3';\nimport { VennData, VennSet, VennIntersection } from '../../services/list-set-operations.service';\n\n/**\n * Event emitted when a Venn region is clicked\n */\nexport interface VennRegionClickEvent {\n intersection: VennIntersection;\n recordIds: string[];\n}\n\n/**\n * Interactive D3-based Venn diagram component for visualizing list overlaps.\n *\n * Features:\n * - Proportional circle sizing based on list size\n * - Animated transitions\n * - Hover highlighting\n * - Click to select regions\n * - Responsive sizing\n */\n@Component({\n standalone: false,\n selector: 'mj-venn-diagram',\n template: `\n <div class=\"venn-container\" #vennContainer>\n <svg #vennSvg class=\"venn-svg\"></svg>\n \n <!-- Tooltip -->\n <div class=\"venn-tooltip\" [class.visible]=\"tooltipVisible\"\n [style.left.px]=\"tooltipX\" [style.top.px]=\"tooltipY\">\n <div class=\"tooltip-title\">{{ tooltipTitle }}</div>\n <div class=\"tooltip-count\">{{ tooltipCount }} records</div>\n </div>\n \n <!-- Legend -->\n @if (data && data.sets.length > 0) {\n <div class=\"venn-legend\">\n @for (set of data.sets; track set) {\n <div class=\"legend-item\">\n <div class=\"legend-color\" [style.background-color]=\"set.color\"></div>\n <div class=\"legend-info\">\n <span class=\"legend-name\">{{ set.listName }}</span>\n <span class=\"legend-count\">{{ set.size }} items</span>\n </div>\n </div>\n }\n </div>\n }\n \n <!-- Empty state -->\n @if (!data || data.sets.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-diagram-project\"></i>\n <p>Add lists to visualize their overlaps</p>\n </div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .venn-container {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 300px;\n background: linear-gradient(135deg, var(--mj-bg-surface-sunken) 0%, var(--mj-bg-surface-card) 100%);\n border-radius: 8px;\n overflow: hidden;\n }\n\n .venn-svg {\n width: 100%;\n height: 100%;\n }\n\n .venn-tooltip {\n position: absolute;\n background: rgba(0, 0, 0, 0.85);\n color: white;\n padding: 8px 12px;\n border-radius: 6px;\n font-size: 13px;\n pointer-events: none;\n opacity: 0;\n transform: translateY(8px);\n transition: opacity 0.15s, transform 0.15s;\n z-index: 100;\n white-space: nowrap;\n }\n\n .venn-tooltip.visible {\n opacity: 1;\n transform: translateY(0);\n }\n\n .tooltip-title {\n font-weight: 600;\n margin-bottom: 2px;\n }\n\n .tooltip-count {\n color: rgba(255, 255, 255, 0.8);\n font-size: 12px;\n }\n\n .venn-legend {\n position: absolute;\n bottom: 16px;\n left: 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n background: var(--mj-bg-surface-card);\n padding: 12px;\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n .legend-item {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .legend-color {\n width: 16px;\n height: 16px;\n border-radius: 4px;\n flex-shrink: 0;\n }\n\n .legend-info {\n display: flex;\n flex-direction: column;\n }\n\n .legend-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .legend-count {\n font-size: 11px;\n color: var(--mj-text-muted);\n }\n\n .empty-state {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n text-align: center;\n color: var(--mj-text-muted);\n }\n\n .empty-state i {\n font-size: 48px;\n margin-bottom: 16px;\n opacity: 0.5;\n }\n\n .empty-state p {\n font-size: 14px;\n margin: 0;\n }\n\n /* SVG styles */\n :host ::ng-deep .venn-circle {\n cursor: pointer;\n transition: opacity 0.2s;\n }\n\n :host ::ng-deep .venn-circle:hover {\n opacity: 0.9;\n }\n\n :host ::ng-deep .venn-label {\n font-size: 12px;\n font-weight: 600;\n fill: white;\n text-anchor: middle;\n pointer-events: none;\n }\n\n :host ::ng-deep .intersection-region {\n cursor: pointer;\n transition: all 0.2s;\n }\n\n :host ::ng-deep .intersection-region:hover {\n fill: rgba(0,0,0,0.75);\n }\n\n :host ::ng-deep .intersection-region.selected {\n fill: rgba(156, 39, 176, 0.9);\n stroke: #7B1FA2;\n stroke-width: 2;\n }\n\n :host ::ng-deep .intersection-label-group {\n transition: transform 0.15s ease;\n }\n\n :host ::ng-deep .intersection-label-group:hover {\n transform: scale(1.05);\n }\n `]\n})\nexport class VennDiagramComponent implements AfterViewInit, OnChanges, OnDestroy {\n @ViewChild('vennContainer') containerRef!: ElementRef<HTMLDivElement>;\n @ViewChild('vennSvg') svgRef!: ElementRef<SVGSVGElement>;\n\n @Input() data: VennData | null = null;\n @Input() selectedRegion: VennIntersection | null = null;\n\n @Output() regionClick = new EventEmitter<VennRegionClickEvent>();\n @Output() regionHover = new EventEmitter<VennIntersection | null>();\n\n // Tooltip state\n tooltipVisible = false;\n tooltipX = 0;\n tooltipY = 0;\n tooltipTitle = '';\n tooltipCount = 0;\n\n // Track if hovering an intersection label (to suppress circle tooltips)\n private isHoveringIntersectionLabel = false;\n\n private svg: d3.Selection<SVGSVGElement, unknown, null, undefined> | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private width = 0;\n private height = 0;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngAfterViewInit(): void {\n this.initializeSvg();\n this.setupResizeObserver();\n this.render();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if ((changes['data'] || changes['selectedRegion']) && this.svg) {\n this.render();\n }\n }\n\n ngOnDestroy(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n }\n\n private initializeSvg(): void {\n if (!this.svgRef) return;\n\n this.svg = d3.select(this.svgRef.nativeElement);\n this.updateDimensions();\n }\n\n private setupResizeObserver(): void {\n if (!this.containerRef) return;\n\n this.resizeObserver = new ResizeObserver(() => {\n this.updateDimensions();\n this.render();\n });\n\n this.resizeObserver.observe(this.containerRef.nativeElement);\n }\n\n private updateDimensions(): void {\n if (!this.containerRef) return;\n\n const rect = this.containerRef.nativeElement.getBoundingClientRect();\n this.width = rect.width;\n this.height = rect.height;\n }\n\n private render(): void {\n if (!this.svg || !this.data || this.data.sets.length === 0) {\n if (this.svg) {\n this.svg.selectAll('*').remove();\n }\n return;\n }\n\n // Clear previous content\n this.svg.selectAll('*').remove();\n\n const margin = { top: 40, right: 40, bottom: 80, left: 40 };\n const drawWidth = this.width - margin.left - margin.right;\n const drawHeight = this.height - margin.top - margin.bottom;\n\n if (drawWidth <= 0 || drawHeight <= 0) return;\n\n const g = this.svg\n .append('g')\n .attr('transform', `translate(${margin.left}, ${margin.top})`);\n\n // Render based on number of sets\n const sets = this.data.sets;\n\n if (sets.length === 1) {\n this.renderSingleSet(g, sets[0], drawWidth, drawHeight);\n } else if (sets.length === 2) {\n this.renderTwoSets(g, sets, drawWidth, drawHeight);\n } else if (sets.length === 3) {\n this.renderThreeSets(g, sets, drawWidth, drawHeight);\n } else if (sets.length === 4) {\n this.renderFourSets(g, sets, drawWidth, drawHeight);\n } else {\n this.renderMultipleSets(g, sets, drawWidth, drawHeight);\n }\n }\n\n private renderSingleSet(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n set: VennSet,\n width: number,\n height: number\n ): void {\n const cx = width / 2;\n const cy = height / 2;\n const radius = Math.min(width, height) * 0.35;\n\n // Draw circle\n g.append('circle')\n .attr('class', 'venn-circle')\n .attr('cx', cx)\n .attr('cy', cy)\n .attr('r', radius)\n .attr('fill', set.color)\n .attr('opacity', 0.6)\n .on('mouseenter', (event: MouseEvent) => this.showCircleTooltip(event, set.listName, set.size))\n .on('mousemove', (event: MouseEvent) => this.moveTooltip(event))\n .on('mouseleave', () => this.hideTooltip())\n .on('click', () => this.onCircleClick(set));\n\n // Draw label\n g.append('text')\n .attr('class', 'venn-label')\n .attr('x', cx)\n .attr('y', cy)\n .text(set.size.toString());\n }\n\n private renderTwoSets(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n sets: VennSet[],\n width: number,\n height: number\n ): void {\n const cy = height / 2;\n\n // Calculate proportional radii based on list sizes\n const { radii, baseRadius } = this.calculateProportionalRadii(sets, width, height, 2);\n const r1 = radii[0];\n const r2 = radii[1];\n\n // Calculate overlap to ensure visual intersection\n const avgRadius = (r1 + r2) / 2;\n const overlap = avgRadius * 0.5;\n\n const positions = [\n { cx: width / 2 - r1 + overlap / 2, r: r1, set: sets[0] },\n { cx: width / 2 + r2 - overlap / 2, r: r2, set: sets[1] }\n ];\n\n // Draw circles\n for (const pos of positions) {\n g.append('circle')\n .attr('class', 'venn-circle')\n .attr('cx', pos.cx)\n .attr('cy', cy)\n .attr('r', pos.r)\n .attr('fill', pos.set.color)\n .attr('opacity', 0.5)\n .on('mouseenter', (event: MouseEvent) => this.showCircleTooltip(event, pos.set.listName, pos.set.size))\n .on('mousemove', (event: MouseEvent) => this.moveTooltip(event))\n .on('mouseleave', () => this.hideTooltip())\n .on('click', () => this.onCircleClick(pos.set));\n }\n\n // Find intersection data\n const intersection = this.data?.intersections.find(\n i => i.setIds.length === 2 && i.setIds.includes(sets[0].listId) && i.setIds.includes(sets[1].listId)\n );\n\n // Draw intersection labels\n const leftOnlyIntersection = this.data?.intersections.find(\n i => i.setIds.length === 1 && i.setIds[0] === sets[0].listId\n );\n const rightOnlyIntersection = this.data?.intersections.find(\n i => i.setIds.length === 1 && i.setIds[0] === sets[1].listId\n );\n\n // Left only - clickable region\n if (leftOnlyIntersection) {\n this.addClickableLabel(g, positions[0].cx - positions[0].r * 0.3, cy, leftOnlyIntersection);\n }\n\n // Right only - clickable region\n if (rightOnlyIntersection) {\n this.addClickableLabel(g, positions[1].cx + positions[1].r * 0.3, cy, rightOnlyIntersection);\n }\n\n // Intersection - clickable region (center between the two circles)\n if (intersection && intersection.size > 0) {\n this.addClickableLabel(g, width / 2, cy, intersection);\n }\n }\n\n /**\n * Add a clickable label with background for intersection regions\n */\n private addClickableLabel(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n x: number,\n y: number,\n intersection: VennIntersection\n ): void {\n const labelGroup = g.append('g')\n .attr('class', 'intersection-label-group')\n .style('cursor', 'pointer');\n\n // Add background circle/pill for better click target\n const text = intersection.size.toString();\n const padding = 8;\n const fontSize = intersection.setIds.length >= 3 ? 14 : 12;\n const rectWidth = Math.max(text.length * fontSize * 0.7 + padding * 2, 32);\n\n // The rect is the main hover/click target\n const rect = labelGroup.append('rect')\n .attr('x', x - rectWidth / 2)\n .attr('y', y - fontSize / 2 - padding / 2)\n .attr('width', rectWidth)\n .attr('height', fontSize + padding)\n .attr('rx', (fontSize + padding) / 2)\n .attr('ry', (fontSize + padding) / 2)\n .attr('fill', 'rgba(0,0,0,0.6)')\n .attr('class', this.isRegionSelected(intersection) ? 'intersection-region selected' : 'intersection-region');\n\n // Text has pointer-events: none to prevent hover flickering\n labelGroup.append('text')\n .attr('class', 'venn-label')\n .attr('x', x)\n .attr('y', y + fontSize * 0.35)\n .style('font-size', `${fontSize}px`)\n .style('pointer-events', 'none')\n .text(text);\n\n // Attach events to the rect (the main clickable area)\n // Show tooltip for intersection labels with proper event handling to prevent flickering\n rect\n .on('mouseenter', (event: MouseEvent) => {\n event.stopPropagation();\n // Set flag to suppress circle tooltips and prevent their mousemove from calling detectChanges\n this.isHoveringIntersectionLabel = true;\n // Hide any existing tooltip immediately without triggering detectChanges\n this.tooltipVisible = false;\n // Show the label's tooltip\n this.showLabelTooltip(event, intersection);\n })\n .on('mousemove', (event: MouseEvent) => {\n event.stopPropagation();\n // Update tooltip position without calling detectChanges (avoid flicker)\n this.moveLabelTooltipPosition(event);\n })\n .on('mouseleave', (event: MouseEvent) => {\n event.stopPropagation();\n this.isHoveringIntersectionLabel = false;\n this.tooltipVisible = false;\n this.cdr.detectChanges();\n })\n .on('click', (event: MouseEvent) => {\n event.stopPropagation();\n this.onIntersectionClick(intersection);\n });\n }\n\n /**\n * Check if a region is currently selected\n */\n private isRegionSelected(intersection: VennIntersection): boolean {\n if (!this.selectedRegion) return false;\n return this.selectedRegion.setIds.length === intersection.setIds.length &&\n this.selectedRegion.setIds.every(id => intersection.setIds.includes(id));\n }\n\n /**\n * Calculate proportional radii using a small/medium/large approach\n * This avoids extreme size differences (e.g., 1000 vs 10 items)\n */\n private calculateProportionalRadii(\n sets: VennSet[],\n width: number,\n height: number,\n numSets: number\n ): { radii: number[]; baseRadius: number } {\n // Determine base radius based on number of sets\n let baseRadius: number;\n if (numSets === 1) {\n baseRadius = Math.min(width, height) * 0.35;\n } else if (numSets === 2) {\n baseRadius = Math.min(width / 2.5, height / 2) * 0.8;\n } else if (numSets === 3) {\n baseRadius = Math.min(width, height) * 0.28;\n } else {\n const cols = Math.ceil(Math.sqrt(numSets));\n const cellSize = Math.min(width / cols, height / cols);\n baseRadius = cellSize * 0.35;\n }\n\n // Find the size range\n const sizes = sets.map(s => s.size);\n const maxSize = Math.max(...sizes, 1);\n const minSize = Math.min(...sizes, 1);\n\n // If all same size or very close, use same radius\n if (maxSize === minSize || maxSize / minSize < 1.5) {\n return {\n radii: sets.map(() => baseRadius),\n baseRadius\n };\n }\n\n // Use logarithmic scaling with bounds for visual balance\n // Scale factor ranges from 0.7 to 1.0 based on relative size\n const minScale = 0.7;\n const maxScale = 1.0;\n\n const radii = sets.map(set => {\n // Use log scale for smoother visual representation\n const logMin = Math.log(minSize + 1);\n const logMax = Math.log(maxSize + 1);\n const logSize = Math.log(set.size + 1);\n\n // Normalize to 0-1 range\n const normalized = (logSize - logMin) / (logMax - logMin);\n\n // Scale to minScale-maxScale range\n const scale = minScale + normalized * (maxScale - minScale);\n\n return baseRadius * scale;\n });\n\n return { radii, baseRadius };\n }\n\n private renderThreeSets(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n sets: VennSet[],\n width: number,\n height: number\n ): void {\n const cx = width / 2;\n const cy = height / 2;\n\n // Calculate proportional radii based on list sizes\n const { radii, baseRadius } = this.calculateProportionalRadii(sets, width, height, 3);\n const avgRadius = radii.reduce((a, b) => a + b, 0) / radii.length;\n const offset = avgRadius * 0.65; // Distance from center\n\n // Position circles in a triangle with individual radii\n const positions = [\n { cx: cx, cy: cy - offset * 0.8, r: radii[0], set: sets[0] }, // Top\n { cx: cx - offset * 0.9, cy: cy + offset * 0.5, r: radii[1], set: sets[1] }, // Bottom left\n { cx: cx + offset * 0.9, cy: cy + offset * 0.5, r: radii[2], set: sets[2] } // Bottom right\n ];\n\n // Draw circles\n for (const pos of positions) {\n g.append('circle')\n .attr('class', 'venn-circle')\n .attr('cx', pos.cx)\n .attr('cy', pos.cy)\n .attr('r', pos.r)\n .attr('fill', pos.set.color)\n .attr('opacity', 0.5)\n .on('mouseenter', (event: MouseEvent) => this.showCircleTooltip(event, pos.set.listName, pos.set.size))\n .on('mousemove', (event: MouseEvent) => this.moveTooltip(event))\n .on('mouseleave', () => this.hideTooltip())\n .on('click', () => this.onCircleClick(pos.set));\n }\n\n // Draw clickable intersection labels\n for (const intersection of this.data?.intersections || []) {\n const labelPos = this.getIntersectionLabelPosition(intersection, positions, cx, cy, avgRadius);\n if (labelPos && intersection.size > 0) {\n this.addClickableLabel(g, labelPos.x, labelPos.y, intersection);\n }\n }\n }\n\n private getIntersectionLabelPosition(\n intersection: VennIntersection,\n positions: Array<{ cx: number; cy: number; r?: number; set: VennSet }>,\n cx: number,\n cy: number,\n radius: number\n ): { x: number; y: number } | null {\n const n = intersection.setIds.length;\n\n if (n === 1) {\n // Find the single set position\n const pos = positions.find(p => p.set.listId === intersection.setIds[0]);\n if (!pos) return null;\n\n // Use individual radius if available, otherwise use provided radius\n const r = pos.r || radius;\n\n // Move label towards the outer edge, away from center\n const dx = pos.cx - cx;\n const dy = pos.cy - cy;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const offsetFactor = 0.6;\n\n return {\n x: pos.cx + (dx / dist) * r * offsetFactor,\n y: pos.cy + (dy / dist) * r * offsetFactor\n };\n } else if (n === 2) {\n // Average of two positions\n const pos1 = positions.find(p => p.set.listId === intersection.setIds[0]);\n const pos2 = positions.find(p => p.set.listId === intersection.setIds[1]);\n if (!pos1 || !pos2) return null;\n\n return {\n x: (pos1.cx + pos2.cx) / 2,\n y: (pos1.cy + pos2.cy) / 2\n };\n } else if (n === 3) {\n // Center of all three\n return { x: cx, y: cy };\n }\n\n return null;\n }\n\n /**\n * Render a 4-set Venn diagram using overlapping ellipses.\n * This is a simplified approach - true 4-set Venn diagrams use complex curves.\n * We use two pairs of rotated ellipses to create all 15 possible regions.\n */\n private renderFourSets(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n sets: VennSet[],\n width: number,\n height: number\n ): void {\n const cx = width / 2;\n const cy = height / 2;\n\n // Use ellipses for 4-set Venn\n const baseSize = Math.min(width, height) * 0.35;\n const rx = baseSize * 1.2; // Ellipse horizontal radius\n const ry = baseSize * 0.7; // Ellipse vertical radius\n\n // Position ellipses with rotations to create overlapping regions\n // Two ellipses rotated ~45 degrees and two rotated ~-45 degrees\n const positions = [\n { cx: cx - baseSize * 0.3, cy: cy - baseSize * 0.15, rx, ry, rotation: 45, set: sets[0] },\n { cx: cx + baseSize * 0.3, cy: cy - baseSize * 0.15, rx, ry, rotation: -45, set: sets[1] },\n { cx: cx - baseSize * 0.3, cy: cy + baseSize * 0.15, rx, ry, rotation: -45, set: sets[2] },\n { cx: cx + baseSize * 0.3, cy: cy + baseSize * 0.15, rx, ry, rotation: 45, set: sets[3] }\n ];\n\n // Draw ellipses\n for (const pos of positions) {\n g.append('ellipse')\n .attr('class', 'venn-circle')\n .attr('cx', pos.cx)\n .attr('cy', pos.cy)\n .attr('rx', pos.rx)\n .attr('ry', pos.ry)\n .attr('transform', `rotate(${pos.rotation}, ${pos.cx}, ${pos.cy})`)\n .attr('fill', pos.set.color)\n .attr('opacity', 0.4)\n .on('mouseenter', (event: MouseEvent) => this.showCircleTooltip(event, pos.set.listName, pos.set.size))\n .on('mousemove', (event: MouseEvent) => this.moveTooltip(event))\n .on('mouseleave', () => this.hideTooltip())\n .on('click', () => this.onCircleClick(pos.set));\n }\n\n // Draw clickable intersection labels\n // For 4 sets, we need to calculate positions for all 15 regions\n for (const intersection of this.data?.intersections || []) {\n const labelPos = this.getFourSetIntersectionPosition(intersection, positions, cx, cy, baseSize);\n if (labelPos && intersection.size > 0) {\n this.addClickableLabel(g, labelPos.x, labelPos.y, intersection);\n }\n }\n }\n\n /**\n * Calculate label position for 4-set Venn intersections\n */\n private getFourSetIntersectionPosition(\n intersection: VennIntersection,\n positions: Array<{ cx: number; cy: number; set: VennSet }>,\n cx: number,\n cy: number,\n baseSize: number\n ): { x: number; y: number } | null {\n const n = intersection.setIds.length;\n const setIndices = intersection.setIds.map(id =>\n positions.findIndex(p => p.set.listId === id)\n ).filter(i => i >= 0);\n\n if (setIndices.length !== n) return null;\n\n if (n === 1) {\n // Single set - position at outer edge\n const pos = positions[setIndices[0]];\n const dx = pos.cx - cx;\n const dy = pos.cy - cy;\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\n return {\n x: pos.cx + (dx / dist) * baseSize * 0.6,\n y: pos.cy + (dy / dist) * baseSize * 0.6\n };\n } else if (n === 2) {\n // Two sets - average position, offset from center\n const pos1 = positions[setIndices[0]];\n const pos2 = positions[setIndices[1]];\n const avgX = (pos1.cx + pos2.cx) / 2;\n const avgY = (pos1.cy + pos2.cy) / 2;\n // Offset slightly from the center\n const dx = avgX - cx;\n const dy = avgY - cy;\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\n return {\n x: avgX + (dx / dist) * baseSize * 0.2,\n y: avgY + (dy / dist) * baseSize * 0.2\n };\n } else if (n === 3) {\n // Three sets - find the set NOT in the intersection\n const missingIndex = [0, 1, 2, 3].find(i => !setIndices.includes(i));\n if (missingIndex === undefined) return { x: cx, y: cy };\n\n // Position opposite to the missing set\n const missingPos = positions[missingIndex];\n const dx = cx - missingPos.cx;\n const dy = cy - missingPos.cy;\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\n return {\n x: cx + (dx / dist) * baseSize * 0.25,\n y: cy + (dy / dist) * baseSize * 0.25\n };\n } else if (n === 4) {\n // All four sets - center\n return { x: cx, y: cy };\n }\n\n return null;\n }\n\n private renderMultipleSets(\n g: d3.Selection<SVGGElement, unknown, null, undefined>,\n sets: VennSet[],\n width: number,\n height: number\n ): void {\n // For more than 3 sets, use a grid layout\n const cols = Math.ceil(Math.sqrt(sets.length));\n const rows = Math.ceil(sets.length / cols);\n const cellWidth = width / cols;\n const cellHeight = height / rows;\n const radius = Math.min(cellWidth, cellHeight) * 0.35;\n\n sets.forEach((set, i) => {\n const col = i % cols;\n const row = Math.floor(i / cols);\n const cx = cellWidth * col + cellWidth / 2;\n const cy = cellHeight * row + cellHeight / 2;\n\n g.append('circle')\n .attr('class', 'venn-circle')\n .attr('cx', cx)\n .attr('cy', cy)\n .attr('r', radius)\n .attr('fill', set.color)\n .attr('opacity', 0.6)\n .on('mouseenter', (event: MouseEvent) => this.showCircleTooltip(event, set.listName, set.size))\n .on('mousemove', (event: MouseEvent) => this.moveTooltip(event))\n .on('mouseleave', () => this.hideTooltip())\n .on('click', () => this.onCircleClick(set));\n\n g.append('text')\n .attr('class', 'venn-label')\n .attr('x', cx)\n .attr('y', cy)\n .text(set.size.toString());\n\n // Add list name below\n g.append('text')\n .attr('x', cx)\n .attr('y', cy + radius + 16)\n .attr('text-anchor', 'middle')\n .attr('fill', 'var(--mj-text-secondary)')\n .attr('font-size', '11px')\n .text(set.listName.length > 15 ? set.listName.substring(0, 15) + '...' : set.listName);\n });\n }\n\n /**\n * Show tooltip for circle/ellipse elements.\n * This is suppressed when hovering an intersection label.\n */\n private showCircleTooltip(event: MouseEvent, title: string, count: number): void {\n // Don't show circle tooltip if hovering an intersection label\n if (this.isHoveringIntersectionLabel) {\n return;\n }\n this.showTooltip(event, title, count);\n }\n\n private showTooltip(event: MouseEvent, title: string, count: number): void {\n this.tooltipTitle = title;\n this.tooltipCount = count;\n this.tooltipVisible = true;\n this.moveTooltip(event);\n this.cdr.detectChanges();\n }\n\n private moveTooltip(event: MouseEvent): void {\n // Skip updating if hovering an intersection label (prevents flicker from circle mousemove events)\n if (this.isHoveringIntersectionLabel) {\n return;\n }\n\n const container = this.containerRef?.nativeElement;\n if (!container) return;\n\n const rect = container.getBoundingClientRect();\n this.tooltipX = event.clientX - rect.left + 10;\n this.tooltipY = event.clientY - rect.top - 30;\n this.cdr.detectChanges();\n }\n\n /**\n * Show tooltip for intersection label with proper intersection name\n */\n private showLabelTooltip(event: MouseEvent, intersection: VennIntersection): void {\n // Build the tooltip title from the intersection\n const setNames = intersection.setIds.map(id => {\n const set = this.data?.sets.find(s => s.listId === id);\n return set?.listName || 'Unknown';\n });\n\n if (intersection.setIds.length === 1) {\n this.tooltipTitle = `Only in ${setNames[0]}`;\n } else {\n this.tooltipTitle = setNames.join(' ∩ ');\n }\n this.tooltipCount = intersection.size;\n this.tooltipVisible = true;\n this.moveLabelTooltipPosition(event);\n this.cdr.detectChanges();\n }\n\n /**\n * Update tooltip position for label without triggering extra change detection\n */\n private moveLabelTooltipPosition(event: MouseEvent): void {\n const container = this.containerRef?.nativeElement;\n if (!container) return;\n\n const rect = container.getBoundingClientRect();\n this.tooltipX = event.clientX - rect.left + 10;\n this.tooltipY = event.clientY - rect.top - 30;\n // Don't call detectChanges here - we call it once in showLabelTooltip\n // and the Angular zone will handle the position updates\n }\n\n private hideTooltip(): void {\n // Don't hide tooltip if we're hovering an intersection label\n if (this.isHoveringIntersectionLabel) {\n return;\n }\n this.tooltipVisible = false;\n this.cdr.detectChanges();\n }\n\n private onCircleClick(set: VennSet): void {\n // Find the \"only in this set\" intersection\n const intersection = this.data?.intersections.find(\n i => i.setIds.length === 1 && i.setIds[0] === set.listId\n );\n\n if (intersection) {\n this.regionClick.emit({\n intersection,\n recordIds: intersection.recordIds\n });\n }\n }\n\n private onIntersectionClick(intersection: VennIntersection): void {\n this.regionClick.emit({\n intersection,\n recordIds: intersection.recordIds\n });\n }\n}\n"]}
|
|
@@ -503,11 +503,11 @@ export class MCPConnectionDialogComponent {
|
|
|
503
503
|
i0.ɵɵconditional(ctx.visible ? 0 : -1);
|
|
504
504
|
i0.ɵɵadvance();
|
|
505
505
|
i0.ɵɵconditional(ctx.ShowCredentialDialog ? 1 : -1);
|
|
506
|
-
} }, dependencies: [i1.ɵNgNoValidate, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.NgControlStatus, i1.NgControlStatusGroup, i1.FormGroupDirective, i1.FormControlName, i2.ButtonComponent, i3.DialogComponent, i3.DialogActionsComponent, i4.ItemTemplateDirective, i4.DropDownListComponent, i5.TextBoxDirective, i5.NumericTextBoxComponent, i5.TextAreaDirective, i5.CheckBoxDirective, i6.CredentialDialogComponent], styles: [".connection-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.error-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background:
|
|
506
|
+
} }, dependencies: [i1.ɵNgNoValidate, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.NgControlStatus, i1.NgControlStatusGroup, i1.FormGroupDirective, i1.FormControlName, i2.ButtonComponent, i3.DialogComponent, i3.DialogActionsComponent, i4.ItemTemplateDirective, i4.DropDownListComponent, i5.TextBoxDirective, i5.NumericTextBoxComponent, i5.TextAreaDirective, i5.CheckBoxDirective, i6.CredentialDialogComponent], styles: [".connection-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.error-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-error);\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n}\n\n.form-section[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n}\n\n.form-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.form-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.form-group[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.form-group[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.form-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.form-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] .required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.form-group[_ngcontent-%COMP%] input[_ngcontent-%COMP%], \n.form-group[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.form-group[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%] {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.form-group[_ngcontent-%COMP%] .error-text[_ngcontent-%COMP%] {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--mj-status-error);\n}\n\n.server-option[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n}\n\n.server-name[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.server-transport[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding: 2px 8px;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.loading-credentials[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 6px;\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.credential-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.credential-row[_ngcontent-%COMP%] kendo-dropdownlist[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.credential-row[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n white-space: nowrap;\n}\n\n.checkbox-group[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.checkbox-group[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.checkbox-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.checkbox-group[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%] {\n display: block;\n margin-top: 4px;\n margin-left: 24px;\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.logging-options[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding: 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 6px;\n transition: opacity 0.2s ease;\n}\n\n.logging-options.disabled[_ngcontent-%COMP%] {\n opacity: 0.5;\n pointer-events: none;\n}\n\n\n\n[_nghost-%COMP%] .k-dialog-actions {\n padding: 16px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n[_nghost-%COMP%] .k-dialog-content {\n padding: 20px;\n max-height: 70vh;\n overflow-y: auto;\n}\n\n[_nghost-%COMP%] .k-textbox, \n[_nghost-%COMP%] .k-textarea, \n[_nghost-%COMP%] .k-numerictextbox, \n[_nghost-%COMP%] .k-dropdownlist {\n width: 100%;\n}"] });
|
|
507
507
|
}
|
|
508
508
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MCPConnectionDialogComponent, [{
|
|
509
509
|
type: Component,
|
|
510
|
-
args: [{ standalone: false, selector: 'mj-mcp-connection-dialog', template: "@if (visible) {\n <kendo-dialog\n [title]=\"DialogTitle\"\n (close)=\"cancel()\"\n [width]=\"600\"\n [minWidth]=\"400\">\n <form [formGroup]=\"connectionForm\" class=\"connection-form\">\n <!-- Error Message -->\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ ErrorMessage }}\n </div>\n }\n <!-- Basic Info Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-info-circle\"></i> Basic Information</h3>\n <div class=\"form-group\">\n <label for=\"server\">MCP Server <span class=\"required\">*</span></label>\n <kendo-dropdownlist\n id=\"server\"\n formControlName=\"MCPServerID\"\n [data]=\"ActiveServers\"\n textField=\"Name\"\n valueField=\"ID\"\n [valuePrimitive]=\"true\"\n [defaultItem]=\"{ Name: 'Select a server...', ID: '' }\"\n (valueChange)=\"onServerChange()\">\n <ng-template kendoDropDownListItemTemplate let-dataItem>\n <div class=\"server-option\">\n <span class=\"server-name\">{{ dataItem.Name }}</span>\n @if (dataItem.TransportType) {\n <span class=\"server-transport\">{{ dataItem.TransportType }}</span>\n }\n </div>\n </ng-template>\n </kendo-dropdownlist>\n @if (hasError('MCPServerID', 'required')) {\n <span class=\"error-text\">Server selection is required</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"name\">Connection Name <span class=\"required\">*</span></label>\n <input kendoTextBox\n id=\"name\"\n formControlName=\"Name\"\n placeholder=\"e.g., Production GitHub Connection\" />\n @if (hasError('Name', 'required')) {\n <span class=\"error-text\">Name is required</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"description\">Description</label>\n <textarea kendoTextArea\n id=\"description\"\n formControlName=\"Description\"\n placeholder=\"Optional description of this connection\"\n [rows]=\"3\"></textarea>\n </div>\n <div class=\"form-group\">\n <label for=\"status\">Status</label>\n <kendo-dropdownlist\n id=\"status\"\n formControlName=\"Status\"\n [data]=\"['Active', 'Inactive']\"\n [valuePrimitive]=\"true\">\n </kendo-dropdownlist>\n </div>\n <div class=\"form-group\">\n <label for=\"company\">Company</label>\n <kendo-dropdownlist\n id=\"company\"\n formControlName=\"CompanyID\"\n [data]=\"companies\"\n textField=\"Name\"\n valueField=\"ID\"\n [valuePrimitive]=\"true\"\n [defaultItem]=\"{ Name: 'Global (all companies)', ID: '' }\">\n </kendo-dropdownlist>\n <span class=\"hint\">Leave as Global to make this connection available to all companies</span>\n </div>\n </div>\n <!-- Authentication Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-key\"></i> Authentication</h3>\n <div class=\"form-group\">\n <label for=\"credential\">Credential</label>\n @if (IsLoadingDropdowns) {\n <div class=\"loading-credentials\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading credentials...\n </div>\n } @else {\n <div class=\"credential-row\">\n <kendo-dropdownlist\n id=\"credential\"\n formControlName=\"CredentialID\"\n [data]=\"credentials\"\n textField=\"Name\"\n valueField=\"ID\"\n [valuePrimitive]=\"true\"\n [defaultItem]=\"{ Name: 'No credential (anonymous)', ID: '' }\">\n </kendo-dropdownlist>\n <button kendoButton\n type=\"button\"\n fillMode=\"outline\"\n (click)=\"openCredentialDialog()\"\n title=\"Create New Credential\">\n <i class=\"fa-solid fa-plus\"></i>\n New\n </button>\n </div>\n <span class=\"hint\">Select an existing credential or create a new one</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"customHeader\">Custom Header Name</label>\n <input kendoTextBox\n id=\"customHeader\"\n formControlName=\"CustomHeaderName\"\n placeholder=\"e.g., X-Custom-API-Key\" />\n <span class=\"hint\">Override the default header name for API key authentication</span>\n </div>\n </div>\n <!-- Behavior Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Behavior</h3>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox formControlName=\"AutoSyncTools\" />\n <span>Auto-sync tools on connect</span>\n </label>\n <span class=\"hint\">Automatically discover and sync available tools when connecting</span>\n </div>\n </div>\n <!-- Logging Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-file-lines\"></i> Logging</h3>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox formControlName=\"LogToolCalls\" />\n <span>Enable tool call logging</span>\n </label>\n <span class=\"hint\">Log all tool executions to the database</span>\n </div>\n <div class=\"logging-options\" [class.disabled]=\"!connectionForm.get('LogToolCalls')?.value\">\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox formControlName=\"LogInputParameters\" />\n <span>Log input parameters</span>\n </label>\n </div>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox formControlName=\"LogOutputContent\" />\n <span>Log output content</span>\n </label>\n </div>\n <div class=\"form-group\">\n <label for=\"maxOutputSize\">Max Output Log Size (bytes)</label>\n <kendo-numerictextbox\n id=\"maxOutputSize\"\n formControlName=\"MaxOutputLogSize\"\n [min]=\"0\"\n [max]=\"10485760\"\n [step]=\"10240\"\n [format]=\"'n0'\">\n </kendo-numerictextbox>\n <span class=\"hint\">Maximum size of output content to log (0 = unlimited, max 10MB)</span>\n </div>\n </div>\n </div>\n <!-- Advanced Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-gear\"></i> Advanced</h3>\n <div class=\"form-group\">\n <label for=\"envVars\">Environment Variables (JSON)</label>\n <textarea kendoTextArea\n id=\"envVars\"\n formControlName=\"EnvironmentVars\"\n placeholder='{\"VAR_NAME\": \"value\"}'\n [rows]=\"3\"></textarea>\n <span class=\"hint\">Additional environment variables for Stdio transport (JSON object)</span>\n </div>\n </div>\n </form>\n <kendo-dialog-actions>\n <button kendoButton (click)=\"save()\" themeColor=\"primary\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ IsEditMode ? 'Update' : 'Create' }}\n </button>\n <button kendoButton (click)=\"cancel()\">Cancel</button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n\n<!-- Credential Creation Dialog -->\n@if (ShowCredentialDialog) {\n <mj-credential-dialog\n #credentialDialog\n [Visible]=\"ShowCredentialDialog\"\n (close)=\"onCredentialDialogClose($event)\">\n </mj-credential-dialog>\n}\n", styles: [".connection-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.error-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: #ffebee;\n border: 1px solid #f44336;\n border-radius: 6px;\n color: #c62828;\n font-size: 14px;\n}\n\n.form-section {\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n padding: 16px;\n}\n\n.form-section h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.form-section h3 i {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.form-group {\n margin-bottom: 16px;\n}\n\n.form-group:last-child {\n margin-bottom: 0;\n}\n\n.form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-color, #333);\n}\n\n.form-group label .required {\n color: #f44336;\n}\n\n.form-group input,\n.form-group textarea {\n width: 100%;\n}\n\n.form-group .hint {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: #999;\n}\n\n.form-group .error-text {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: #f44336;\n}\n\n.server-option {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n}\n\n.server-name {\n font-weight: 500;\n}\n\n.server-transport {\n font-size: 12px;\n color: #666;\n padding: 2px 8px;\n background: #f5f5f5;\n border-radius: 4px;\n}\n\n.loading-credentials {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: #f5f5f5;\n border-radius: 6px;\n color: #666;\n font-size: 14px;\n}\n\n.credential-row {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.credential-row kendo-dropdownlist {\n flex: 1;\n}\n\n.credential-row button {\n white-space: nowrap;\n}\n\n.checkbox-group {\n margin-bottom: 12px;\n}\n\n.checkbox-group:last-child {\n margin-bottom: 0;\n}\n\n.checkbox-label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.checkbox-group .hint {\n display: block;\n margin-top: 4px;\n margin-left: 24px;\n font-size: 12px;\n color: #999;\n}\n\n.logging-options {\n margin-top: 16px;\n padding: 12px;\n background: #fafafa;\n border-radius: 6px;\n transition: opacity 0.2s ease;\n}\n\n.logging-options.disabled {\n opacity: 0.5;\n pointer-events: none;\n}\n\n/* Kendo overrides */\n:host ::ng-deep .k-dialog-actions {\n padding: 16px;\n border-top: 1px solid #e0e0e0;\n}\n\n:host ::ng-deep .k-dialog-content {\n padding: 20px;\n max-height: 70vh;\n overflow-y: auto;\n}\n\n:host ::ng-deep .k-textbox,\n:host ::ng-deep .k-textarea,\n:host ::ng-deep .k-numerictextbox,\n:host ::ng-deep .k-dropdownlist {\n width: 100%;\n}\n"] }]
|
|
510
|
+
args: [{ standalone: false, selector: 'mj-mcp-connection-dialog', template: "@if (visible) {\n <kendo-dialog\n [title]=\"DialogTitle\"\n (close)=\"cancel()\"\n [width]=\"600\"\n [minWidth]=\"400\">\n <form [formGroup]=\"connectionForm\" class=\"connection-form\">\n <!-- Error Message -->\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ ErrorMessage }}\n </div>\n }\n <!-- Basic Info Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-info-circle\"></i> Basic Information</h3>\n <div class=\"form-group\">\n <label for=\"server\">MCP Server <span class=\"required\">*</span></label>\n <kendo-dropdownlist\n id=\"server\"\n formControlName=\"MCPServerID\"\n [data]=\"ActiveServers\"\n textField=\"Name\"\n valueField=\"ID\"\n [valuePrimitive]=\"true\"\n [defaultItem]=\"{ Name: 'Select a server...', ID: '' }\"\n (valueChange)=\"onServerChange()\">\n <ng-template kendoDropDownListItemTemplate let-dataItem>\n <div class=\"server-option\">\n <span class=\"server-name\">{{ dataItem.Name }}</span>\n @if (dataItem.TransportType) {\n <span class=\"server-transport\">{{ dataItem.TransportType }}</span>\n }\n </div>\n </ng-template>\n </kendo-dropdownlist>\n @if (hasError('MCPServerID', 'required')) {\n <span class=\"error-text\">Server selection is required</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"name\">Connection Name <span class=\"required\">*</span></label>\n <input kendoTextBox\n id=\"name\"\n formControlName=\"Name\"\n placeholder=\"e.g., Production GitHub Connection\" />\n @if (hasError('Name', 'required')) {\n <span class=\"error-text\">Name is required</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"description\">Description</label>\n <textarea kendoTextArea\n id=\"description\"\n formControlName=\"Description\"\n placeholder=\"Optional description of this connection\"\n [rows]=\"3\"></textarea>\n </div>\n <div class=\"form-group\">\n <label for=\"status\">Status</label>\n <kendo-dropdownlist\n id=\"status\"\n formControlName=\"Status\"\n [data]=\"['Active', 'Inactive']\"\n [valuePrimitive]=\"true\">\n </kendo-dropdownlist>\n </div>\n <div class=\"form-group\">\n <label for=\"company\">Company</label>\n <kendo-dropdownlist\n id=\"company\"\n formControlName=\"CompanyID\"\n [data]=\"companies\"\n textField=\"Name\"\n valueField=\"ID\"\n [valuePrimitive]=\"true\"\n [defaultItem]=\"{ Name: 'Global (all companies)', ID: '' }\">\n </kendo-dropdownlist>\n <span class=\"hint\">Leave as Global to make this connection available to all companies</span>\n </div>\n </div>\n <!-- Authentication Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-key\"></i> Authentication</h3>\n <div class=\"form-group\">\n <label for=\"credential\">Credential</label>\n @if (IsLoadingDropdowns) {\n <div class=\"loading-credentials\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading credentials...\n </div>\n } @else {\n <div class=\"credential-row\">\n <kendo-dropdownlist\n id=\"credential\"\n formControlName=\"CredentialID\"\n [data]=\"credentials\"\n textField=\"Name\"\n valueField=\"ID\"\n [valuePrimitive]=\"true\"\n [defaultItem]=\"{ Name: 'No credential (anonymous)', ID: '' }\">\n </kendo-dropdownlist>\n <button kendoButton\n type=\"button\"\n fillMode=\"outline\"\n (click)=\"openCredentialDialog()\"\n title=\"Create New Credential\">\n <i class=\"fa-solid fa-plus\"></i>\n New\n </button>\n </div>\n <span class=\"hint\">Select an existing credential or create a new one</span>\n }\n </div>\n <div class=\"form-group\">\n <label for=\"customHeader\">Custom Header Name</label>\n <input kendoTextBox\n id=\"customHeader\"\n formControlName=\"CustomHeaderName\"\n placeholder=\"e.g., X-Custom-API-Key\" />\n <span class=\"hint\">Override the default header name for API key authentication</span>\n </div>\n </div>\n <!-- Behavior Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-sliders\"></i> Behavior</h3>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox formControlName=\"AutoSyncTools\" />\n <span>Auto-sync tools on connect</span>\n </label>\n <span class=\"hint\">Automatically discover and sync available tools when connecting</span>\n </div>\n </div>\n <!-- Logging Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-file-lines\"></i> Logging</h3>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox formControlName=\"LogToolCalls\" />\n <span>Enable tool call logging</span>\n </label>\n <span class=\"hint\">Log all tool executions to the database</span>\n </div>\n <div class=\"logging-options\" [class.disabled]=\"!connectionForm.get('LogToolCalls')?.value\">\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox formControlName=\"LogInputParameters\" />\n <span>Log input parameters</span>\n </label>\n </div>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" kendoCheckBox formControlName=\"LogOutputContent\" />\n <span>Log output content</span>\n </label>\n </div>\n <div class=\"form-group\">\n <label for=\"maxOutputSize\">Max Output Log Size (bytes)</label>\n <kendo-numerictextbox\n id=\"maxOutputSize\"\n formControlName=\"MaxOutputLogSize\"\n [min]=\"0\"\n [max]=\"10485760\"\n [step]=\"10240\"\n [format]=\"'n0'\">\n </kendo-numerictextbox>\n <span class=\"hint\">Maximum size of output content to log (0 = unlimited, max 10MB)</span>\n </div>\n </div>\n </div>\n <!-- Advanced Section -->\n <div class=\"form-section\">\n <h3><i class=\"fa-solid fa-gear\"></i> Advanced</h3>\n <div class=\"form-group\">\n <label for=\"envVars\">Environment Variables (JSON)</label>\n <textarea kendoTextArea\n id=\"envVars\"\n formControlName=\"EnvironmentVars\"\n placeholder='{\"VAR_NAME\": \"value\"}'\n [rows]=\"3\"></textarea>\n <span class=\"hint\">Additional environment variables for Stdio transport (JSON object)</span>\n </div>\n </div>\n </form>\n <kendo-dialog-actions>\n <button kendoButton (click)=\"save()\" themeColor=\"primary\" [disabled]=\"IsSaving\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n {{ IsEditMode ? 'Update' : 'Create' }}\n </button>\n <button kendoButton (click)=\"cancel()\">Cancel</button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n\n<!-- Credential Creation Dialog -->\n@if (ShowCredentialDialog) {\n <mj-credential-dialog\n #credentialDialog\n [Visible]=\"ShowCredentialDialog\"\n (close)=\"onCredentialDialogClose($event)\">\n </mj-credential-dialog>\n}\n", styles: [".connection-form {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.error-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-error);\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n}\n\n.form-section {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 16px;\n}\n\n.form-section h3 {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.form-section h3 i {\n color: var(--mj-brand-primary);\n}\n\n.form-group {\n margin-bottom: 16px;\n}\n\n.form-group:last-child {\n margin-bottom: 0;\n}\n\n.form-group label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.form-group label .required {\n color: var(--mj-status-error);\n}\n\n.form-group input,\n.form-group textarea {\n width: 100%;\n}\n\n.form-group .hint {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.form-group .error-text {\n display: block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--mj-status-error);\n}\n\n.server-option {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n}\n\n.server-name {\n font-weight: 500;\n}\n\n.server-transport {\n font-size: 12px;\n color: var(--mj-text-muted);\n padding: 2px 8px;\n background: var(--mj-bg-surface-card);\n border-radius: 4px;\n}\n\n.loading-credentials {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 6px;\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.credential-row {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.credential-row kendo-dropdownlist {\n flex: 1;\n}\n\n.credential-row button {\n white-space: nowrap;\n}\n\n.checkbox-group {\n margin-bottom: 12px;\n}\n\n.checkbox-group:last-child {\n margin-bottom: 0;\n}\n\n.checkbox-label {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n font-size: 14px;\n}\n\n.checkbox-group .hint {\n display: block;\n margin-top: 4px;\n margin-left: 24px;\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.logging-options {\n margin-top: 16px;\n padding: 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 6px;\n transition: opacity 0.2s ease;\n}\n\n.logging-options.disabled {\n opacity: 0.5;\n pointer-events: none;\n}\n\n/* Kendo overrides */\n:host ::ng-deep .k-dialog-actions {\n padding: 16px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n:host ::ng-deep .k-dialog-content {\n padding: 20px;\n max-height: 70vh;\n overflow-y: auto;\n}\n\n:host ::ng-deep .k-textbox,\n:host ::ng-deep .k-textarea,\n:host ::ng-deep .k-numerictextbox,\n:host ::ng-deep .k-dropdownlist {\n width: 100%;\n}\n"] }]
|
|
511
511
|
}], () => [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }], { credentialDialog: [{
|
|
512
512
|
type: ViewChild,
|
|
513
513
|
args: ['credentialDialog']
|
|
@@ -486,7 +486,7 @@ export class MCPLogDetailPanelComponent {
|
|
|
486
486
|
i0.ɵɵconditional(ctx.Visible ? 0 : -1);
|
|
487
487
|
i0.ɵɵadvance();
|
|
488
488
|
i0.ɵɵconditional(ctx.Visible && ctx.Log ? 1 : -1);
|
|
489
|
-
} }, dependencies: [i1.NgClass, i2.NgControlStatus, i2.NgModel, i3.ButtonComponent, i4.CodeEditorComponent], styles: ["\n\n\n\n\n\n\n.panel-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 1000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n\n\n.slide-out-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n background:
|
|
489
|
+
} }, dependencies: [i1.NgClass, i2.NgControlStatus, i2.NgModel, i3.ButtonComponent, i4.CodeEditorComponent], styles: ["\n\n\n\n\n\n\n.panel-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 1000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n\n\n.slide-out-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.slide-out-panel.mobile[_ngcontent-%COMP%] {\n width: 100% !important;\n left: 0;\n}\n\n.slide-out-panel.resizing[_ngcontent-%COMP%] {\n user-select: none;\n transition: none;\n}\n\n\n\n\n\n.resize-handle[_ngcontent-%COMP%] {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n background: transparent;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover, \n.resize-handle.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.resize-grip[_ngcontent-%COMP%] {\n width: 3px;\n height: 40px;\n background: var(--mj-border-strong);\n border-radius: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover .resize-grip[_ngcontent-%COMP%], \n.resize-handle.active[_ngcontent-%COMP%] .resize-grip[_ngcontent-%COMP%] {\n opacity: 1;\n background: var(--mj-brand-primary);\n}\n\n\n\n\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.close-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n.close-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n\n\n\n\n.panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n\n\n\n\n.status-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-radius: 8px;\n margin-bottom: 20px;\n font-weight: 600;\n font-size: 16px;\n}\n\n.status-banner.status-success[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.status-banner.status-success[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-status-success);\n}\n\n.status-banner.status-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-banner.status-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-status-error);\n}\n\n.status-banner.status-running[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-banner.status-running[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-brand-primary);\n}\n\n.status-banner[_ngcontent-%COMP%] .status-text[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.status-banner[_ngcontent-%COMP%] .duration[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: normal;\n background: rgba(0, 0, 0, 0.05);\n padding: 4px 10px;\n border-radius: 4px;\n}\n\n\n\n\n\n.info-section[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n}\n\n.section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-brand-primary);\n}\n\n.section-title.error[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.section-title.error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n\n\n.expandable-section[_ngcontent-%COMP%] .section-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.expandable-section[_ngcontent-%COMP%] .section-header.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n padding: 8px 12px;\n margin: -8px -12px 12px -12px;\n border-radius: 6px;\n transition: background 0.15s ease;\n}\n\n.expandable-section[_ngcontent-%COMP%] .section-header.clickable[_ngcontent-%COMP%]:hover {\n background: rgba(0, 0, 0, 0.03);\n}\n\n.section-title-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n\n\n\n\n.info-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n padding: 12px 16px;\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n font-size: 14px;\n}\n\n.info-row[_ngcontent-%COMP%]:not(:last-child) {\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.info-label[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.info-value.tool-name[_ngcontent-%COMP%] {\n font-family: 'Consolas', 'Monaco', monospace;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n padding: 2px 8px;\n border-radius: 4px;\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n.error-card[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 20%, transparent);\n border-radius: 8px;\n padding: 16px;\n}\n\n.error-message[_ngcontent-%COMP%] {\n margin: 0;\n font-family: monospace;\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-status-error);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n\n\n\n\n.code-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n height: 200px;\n}\n\n.code-card[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n}\n\n\n\n\n\n.panel-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.panel-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n min-width: 100px;\n}\n\n.panel-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n}\n\n\n\n\n\n@media (max-width: 768px) {\n .slide-out-panel[_ngcontent-%COMP%] {\n width: 100% !important;\n left: 0;\n }\n\n .resize-handle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .panel-content[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .status-banner[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .panel-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .panel-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 80px;\n }\n\n .code-card[_ngcontent-%COMP%] {\n height: 150px;\n }\n}"], data: { animation: [
|
|
490
490
|
trigger('slideIn', [
|
|
491
491
|
transition(':enter', [
|
|
492
492
|
style({ transform: 'translateX(100%)', opacity: 0 }),
|
|
@@ -510,7 +510,7 @@ export class MCPLogDetailPanelComponent {
|
|
|
510
510
|
animate('200ms ease-in', style({ transform: 'translateX(100%)', opacity: 0 }))
|
|
511
511
|
])
|
|
512
512
|
])
|
|
513
|
-
], template: "<!-- Backdrop -->\n@if (Visible) {\n <div class=\"panel-backdrop\" (click)=\"closePanel()\"></div>\n}\n\n<!-- Slide-out Panel -->\n@if (Visible && Log) {\n <div class=\"slide-out-panel\"\n @slideIn\n [style.width.px]=\"IsMobileMode ? null : PanelWidth\"\n [class.mobile]=\"IsMobileMode\"\n [class.resizing]=\"IsResizing\">\n <!-- Resize Handle -->\n @if (!IsMobileMode) {\n <div class=\"resize-handle\"\n (mousedown)=\"onResizeStart($event)\"\n [class.active]=\"IsResizing\"\n title=\"Drag to resize\">\n <div class=\"resize-grip\"></div>\n </div>\n }\n <!-- Panel Header -->\n <div class=\"panel-header\">\n <h2 class=\"panel-title\">\n <i class=\"fa-solid fa-list-check\"></i>\n Execution Details\n </h2>\n <button class=\"close-btn\" (click)=\"closePanel()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Panel Content -->\n <div class=\"panel-content\">\n <!-- Status Banner -->\n <div class=\"status-banner\" [ngClass]=\"getStatusClass(Log.Status)\">\n <i [class]=\"getStatusIcon(Log.Status)\"></i>\n <span class=\"status-text\">{{ Log.Status }}</span>\n @if (Log.DurationMs) {\n <span class=\"duration\">{{ formatDuration(Log.DurationMs) }}</span>\n }\n </div>\n <!-- Tool Info -->\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-wrench\"></i>\n Tool\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">Name</span>\n <span class=\"info-value tool-name\">{{ Log.ToolName }}</span>\n </div>\n @if (Log.ServerName) {\n <div class=\"info-row\">\n <span class=\"info-label\">Server</span>\n <span class=\"info-value\">{{ Log.ServerName }}</span>\n </div>\n }\n <div class=\"info-row\">\n <span class=\"info-label\">Connection</span>\n <span class=\"info-value\">{{ Log.ConnectionName }}</span>\n </div>\n </div>\n </div>\n <!-- Timing Info -->\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock\"></i>\n Timing\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">Started</span>\n <span class=\"info-value\">{{ formatDate(Log.StartedAt) }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Completed</span>\n <span class=\"info-value\">{{ formatDate(Log.CompletedAt) }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Duration</span>\n <span class=\"info-value\">{{ formatDuration(Log.DurationMs) }}</span>\n </div>\n </div>\n </div>\n <!-- Error Message (if any) -->\n @if (Log.ErrorMessage) {\n <div class=\"info-section error-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(ErrorSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"ErrorSection.expanded\"></i>\n <h3 class=\"section-title error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n Error\n </h3>\n </div>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"copyError(); $event.stopPropagation()\" title=\"Copy error\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (ErrorSection.expanded) {\n <div class=\"error-card\">\n <pre class=\"error-message\">{{ Log.ErrorMessage }}</pre>\n </div>\n }\n </div>\n }\n <!-- Input Arguments -->\n @if (Log.InputArgs) {\n <div class=\"info-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(InputArgsSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"InputArgsSection.expanded\"></i>\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-arrow-right-to-bracket\"></i>\n Input Arguments\n </h3>\n </div>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"copyInputArgs(); $event.stopPropagation()\" title=\"Copy input arguments\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (InputArgsSection.expanded) {\n <div class=\"code-card\">\n <mj-code-editor\n [ngModel]=\"FormattedInputArgs\"\n [language]=\"'json'\"\n [readonly]=\"true\">\n </mj-code-editor>\n </div>\n }\n </div>\n }\n <!-- Result -->\n @if (Log.Result) {\n <div class=\"info-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(ResultSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"ResultSection.expanded\"></i>\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i>\n Result\n </h3>\n </div>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"copyResult(); $event.stopPropagation()\" title=\"Copy result\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (ResultSection.expanded) {\n <div class=\"code-card\">\n <mj-code-editor\n [ngModel]=\"FormattedResult\"\n [language]=\"'json'\"\n [readonly]=\"true\">\n </mj-code-editor>\n </div>\n }\n </div>\n }\n <!-- User Info -->\n @if (Log.UserName) {\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-user\"></i>\n Executed By\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">User</span>\n <span class=\"info-value\">{{ Log.UserName }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n <!-- Panel Actions -->\n <div class=\"panel-actions\">\n @if (Log.ToolID) {\n <button kendoButton themeColor=\"primary\" (click)=\"onRunAgain()\">\n <i class=\"fa-solid fa-play\"></i>\n Run Again\n </button>\n }\n <button kendoButton fillMode=\"flat\" (click)=\"closePanel()\">Close</button>\n </div>\n </div>\n}\n", styles: ["/* MCP Log Detail Panel Styles */\n\n/* ========================================\n Backdrop\n ======================================== */\n.panel-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 1000;\n animation: fadeIn 0.2s ease-out;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* ========================================\n Slide-Out Panel\n ======================================== */\n.slide-out-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n background: white;\n box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.slide-out-panel.mobile {\n width: 100% !important;\n left: 0;\n}\n\n.slide-out-panel.resizing {\n user-select: none;\n transition: none;\n}\n\n/* ========================================\n Resize Handle\n ======================================== */\n.resize-handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n background: transparent;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease;\n}\n\n.resize-handle:hover,\n.resize-handle.active {\n background: rgba(33, 150, 243, 0.1);\n}\n\n.resize-grip {\n width: 3px;\n height: 40px;\n background: #ccc;\n border-radius: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.resize-handle:hover .resize-grip,\n.resize-handle.active .resize-grip {\n opacity: 1;\n background: var(--mj-primary-color, #2196f3);\n}\n\n/* ========================================\n Panel Header\n ======================================== */\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.panel-title i {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.close-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n color: #666;\n transition: all 0.15s ease;\n}\n\n.close-btn:hover {\n background: #f5f5f5;\n color: #333;\n}\n\n.close-btn i {\n font-size: 18px;\n}\n\n/* ========================================\n Panel Content\n ======================================== */\n.panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n/* ========================================\n Status Banner\n ======================================== */\n.status-banner {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-radius: 8px;\n margin-bottom: 20px;\n font-weight: 600;\n font-size: 16px;\n}\n\n.status-banner.status-success {\n background: rgba(76, 175, 80, 0.1);\n color: #388e3c;\n}\n\n.status-banner.status-success i {\n font-size: 24px;\n color: #4caf50;\n}\n\n.status-banner.status-error {\n background: rgba(244, 67, 54, 0.1);\n color: #c62828;\n}\n\n.status-banner.status-error i {\n font-size: 24px;\n color: #f44336;\n}\n\n.status-banner.status-running {\n background: rgba(33, 150, 243, 0.1);\n color: #1976d2;\n}\n\n.status-banner.status-running i {\n font-size: 24px;\n color: #2196f3;\n}\n\n.status-banner .status-text {\n flex: 1;\n}\n\n.status-banner .duration {\n font-size: 14px;\n font-weight: normal;\n background: rgba(0, 0, 0, 0.05);\n padding: 4px 10px;\n border-radius: 4px;\n}\n\n/* ========================================\n Info Sections\n ======================================== */\n.info-section {\n margin-bottom: 20px;\n}\n\n.section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-secondary-color, #666);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-title i {\n font-size: 14px;\n color: var(--mj-primary-color, #2196f3);\n}\n\n.section-title.error {\n color: #c62828;\n}\n\n.section-title.error i {\n color: #f44336;\n}\n\n/* ========================================\n Expandable Sections\n ======================================== */\n.expandable-section .section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.expandable-section .section-header.clickable {\n cursor: pointer;\n padding: 8px 12px;\n margin: -8px -12px 12px -12px;\n border-radius: 6px;\n transition: background 0.15s ease;\n}\n\n.expandable-section .section-header.clickable:hover {\n background: rgba(0, 0, 0, 0.03);\n}\n\n.section-title-row {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.expand-icon {\n font-size: 12px;\n color: #999;\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded {\n transform: rotate(90deg);\n}\n\n/* ========================================\n Info Cards\n ======================================== */\n.info-card {\n background: #fafafa;\n border-radius: 8px;\n border: 1px solid #e8e8e8;\n padding: 12px 16px;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n font-size: 14px;\n}\n\n.info-row:not(:last-child) {\n border-bottom: 1px solid #e8e8e8;\n}\n\n.info-label {\n color: var(--mj-text-secondary-color, #666);\n}\n\n.info-value {\n font-weight: 500;\n color: var(--mj-text-color, #333);\n}\n\n.info-value.tool-name {\n font-family: 'Consolas', 'Monaco', monospace;\n background: rgba(33, 150, 243, 0.1);\n padding: 2px 8px;\n border-radius: 4px;\n color: var(--mj-primary-color, #2196f3);\n}\n\n/* ========================================\n Error Card\n ======================================== */\n.error-card {\n background: #fff5f5;\n border: 1px solid rgba(244, 67, 54, 0.2);\n border-radius: 8px;\n padding: 16px;\n}\n\n.error-message {\n margin: 0;\n font-family: monospace;\n font-size: 13px;\n line-height: 1.5;\n color: #c62828;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* ========================================\n Code Card\n ======================================== */\n.code-card {\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n height: 200px;\n}\n\n.code-card mj-code-editor {\n width: 100%;\n height: 100%;\n}\n\n/* ========================================\n Panel Actions\n ======================================== */\n.panel-actions {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n background: white;\n border-top: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.panel-actions button {\n min-width: 100px;\n}\n\n.panel-actions button i {\n margin-right: 6px;\n}\n\n/* ========================================\n Responsive / Mobile\n ======================================== */\n@media (max-width: 768px) {\n .slide-out-panel {\n width: 100% !important;\n left: 0;\n }\n\n .resize-handle {\n display: none;\n }\n\n .panel-content {\n padding: 16px;\n }\n\n .status-banner {\n flex-wrap: wrap;\n }\n\n .panel-actions {\n flex-wrap: wrap;\n }\n\n .panel-actions button {\n flex: 1;\n min-width: 80px;\n }\n\n .code-card {\n height: 150px;\n }\n}\n"] }]
|
|
513
|
+
], template: "<!-- Backdrop -->\n@if (Visible) {\n <div class=\"panel-backdrop\" (click)=\"closePanel()\"></div>\n}\n\n<!-- Slide-out Panel -->\n@if (Visible && Log) {\n <div class=\"slide-out-panel\"\n @slideIn\n [style.width.px]=\"IsMobileMode ? null : PanelWidth\"\n [class.mobile]=\"IsMobileMode\"\n [class.resizing]=\"IsResizing\">\n <!-- Resize Handle -->\n @if (!IsMobileMode) {\n <div class=\"resize-handle\"\n (mousedown)=\"onResizeStart($event)\"\n [class.active]=\"IsResizing\"\n title=\"Drag to resize\">\n <div class=\"resize-grip\"></div>\n </div>\n }\n <!-- Panel Header -->\n <div class=\"panel-header\">\n <h2 class=\"panel-title\">\n <i class=\"fa-solid fa-list-check\"></i>\n Execution Details\n </h2>\n <button class=\"close-btn\" (click)=\"closePanel()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Panel Content -->\n <div class=\"panel-content\">\n <!-- Status Banner -->\n <div class=\"status-banner\" [ngClass]=\"getStatusClass(Log.Status)\">\n <i [class]=\"getStatusIcon(Log.Status)\"></i>\n <span class=\"status-text\">{{ Log.Status }}</span>\n @if (Log.DurationMs) {\n <span class=\"duration\">{{ formatDuration(Log.DurationMs) }}</span>\n }\n </div>\n <!-- Tool Info -->\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-wrench\"></i>\n Tool\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">Name</span>\n <span class=\"info-value tool-name\">{{ Log.ToolName }}</span>\n </div>\n @if (Log.ServerName) {\n <div class=\"info-row\">\n <span class=\"info-label\">Server</span>\n <span class=\"info-value\">{{ Log.ServerName }}</span>\n </div>\n }\n <div class=\"info-row\">\n <span class=\"info-label\">Connection</span>\n <span class=\"info-value\">{{ Log.ConnectionName }}</span>\n </div>\n </div>\n </div>\n <!-- Timing Info -->\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock\"></i>\n Timing\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">Started</span>\n <span class=\"info-value\">{{ formatDate(Log.StartedAt) }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Completed</span>\n <span class=\"info-value\">{{ formatDate(Log.CompletedAt) }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Duration</span>\n <span class=\"info-value\">{{ formatDuration(Log.DurationMs) }}</span>\n </div>\n </div>\n </div>\n <!-- Error Message (if any) -->\n @if (Log.ErrorMessage) {\n <div class=\"info-section error-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(ErrorSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"ErrorSection.expanded\"></i>\n <h3 class=\"section-title error\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n Error\n </h3>\n </div>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"copyError(); $event.stopPropagation()\" title=\"Copy error\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (ErrorSection.expanded) {\n <div class=\"error-card\">\n <pre class=\"error-message\">{{ Log.ErrorMessage }}</pre>\n </div>\n }\n </div>\n }\n <!-- Input Arguments -->\n @if (Log.InputArgs) {\n <div class=\"info-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(InputArgsSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"InputArgsSection.expanded\"></i>\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-arrow-right-to-bracket\"></i>\n Input Arguments\n </h3>\n </div>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"copyInputArgs(); $event.stopPropagation()\" title=\"Copy input arguments\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (InputArgsSection.expanded) {\n <div class=\"code-card\">\n <mj-code-editor\n [ngModel]=\"FormattedInputArgs\"\n [language]=\"'json'\"\n [readonly]=\"true\">\n </mj-code-editor>\n </div>\n }\n </div>\n }\n <!-- Result -->\n @if (Log.Result) {\n <div class=\"info-section expandable-section\">\n <div class=\"section-header clickable\" (click)=\"toggleSection(ResultSection)\">\n <div class=\"section-title-row\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"ResultSection.expanded\"></i>\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i>\n Result\n </h3>\n </div>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"copyResult(); $event.stopPropagation()\" title=\"Copy result\">\n <i class=\"fa-solid fa-copy\"></i>\n </button>\n </div>\n @if (ResultSection.expanded) {\n <div class=\"code-card\">\n <mj-code-editor\n [ngModel]=\"FormattedResult\"\n [language]=\"'json'\"\n [readonly]=\"true\">\n </mj-code-editor>\n </div>\n }\n </div>\n }\n <!-- User Info -->\n @if (Log.UserName) {\n <div class=\"info-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-user\"></i>\n Executed By\n </h3>\n <div class=\"info-card\">\n <div class=\"info-row\">\n <span class=\"info-label\">User</span>\n <span class=\"info-value\">{{ Log.UserName }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n <!-- Panel Actions -->\n <div class=\"panel-actions\">\n @if (Log.ToolID) {\n <button kendoButton themeColor=\"primary\" (click)=\"onRunAgain()\">\n <i class=\"fa-solid fa-play\"></i>\n Run Again\n </button>\n }\n <button kendoButton fillMode=\"flat\" (click)=\"closePanel()\">Close</button>\n </div>\n </div>\n}\n", styles: ["/* MCP Log Detail Panel Styles */\n\n/* ========================================\n Backdrop\n ======================================== */\n.panel-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 1000;\n animation: fadeIn 0.2s ease-out;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* ========================================\n Slide-Out Panel\n ======================================== */\n.slide-out-panel {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-surface);\n box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.slide-out-panel.mobile {\n width: 100% !important;\n left: 0;\n}\n\n.slide-out-panel.resizing {\n user-select: none;\n transition: none;\n}\n\n/* ========================================\n Resize Handle\n ======================================== */\n.resize-handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 6px;\n cursor: ew-resize;\n background: transparent;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s ease;\n}\n\n.resize-handle:hover,\n.resize-handle.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.resize-grip {\n width: 3px;\n height: 40px;\n background: var(--mj-border-strong);\n border-radius: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n}\n\n.resize-handle:hover .resize-grip,\n.resize-handle.active .resize-grip {\n opacity: 1;\n background: var(--mj-brand-primary);\n}\n\n/* ========================================\n Panel Header\n ======================================== */\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.panel-title i {\n color: var(--mj-brand-primary);\n}\n\n.close-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 50%;\n cursor: pointer;\n color: var(--mj-text-muted);\n transition: all 0.15s ease;\n}\n\n.close-btn:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n.close-btn i {\n font-size: 18px;\n}\n\n/* ========================================\n Panel Content\n ======================================== */\n.panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n}\n\n/* ========================================\n Status Banner\n ======================================== */\n.status-banner {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n border-radius: 8px;\n margin-bottom: 20px;\n font-weight: 600;\n font-size: 16px;\n}\n\n.status-banner.status-success {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.status-banner.status-success i {\n font-size: 24px;\n color: var(--mj-status-success);\n}\n\n.status-banner.status-error {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.status-banner.status-error i {\n font-size: 24px;\n color: var(--mj-status-error);\n}\n\n.status-banner.status-running {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.status-banner.status-running i {\n font-size: 24px;\n color: var(--mj-brand-primary);\n}\n\n.status-banner .status-text {\n flex: 1;\n}\n\n.status-banner .duration {\n font-size: 14px;\n font-weight: normal;\n background: rgba(0, 0, 0, 0.05);\n padding: 4px 10px;\n border-radius: 4px;\n}\n\n/* ========================================\n Info Sections\n ======================================== */\n.info-section {\n margin-bottom: 20px;\n}\n\n.section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.section-title i {\n font-size: 14px;\n color: var(--mj-brand-primary);\n}\n\n.section-title.error {\n color: var(--mj-status-error);\n}\n\n.section-title.error i {\n color: var(--mj-status-error);\n}\n\n/* ========================================\n Expandable Sections\n ======================================== */\n.expandable-section .section-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n}\n\n.expandable-section .section-header.clickable {\n cursor: pointer;\n padding: 8px 12px;\n margin: -8px -12px 12px -12px;\n border-radius: 6px;\n transition: background 0.15s ease;\n}\n\n.expandable-section .section-header.clickable:hover {\n background: rgba(0, 0, 0, 0.03);\n}\n\n.section-title-row {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.expand-icon {\n font-size: 12px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded {\n transform: rotate(90deg);\n}\n\n/* ========================================\n Info Cards\n ======================================== */\n.info-card {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n padding: 12px 16px;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 0;\n font-size: 14px;\n}\n\n.info-row:not(:last-child) {\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.info-label {\n color: var(--mj-text-muted);\n}\n\n.info-value {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.info-value.tool-name {\n font-family: 'Consolas', 'Monaco', monospace;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n padding: 2px 8px;\n border-radius: 4px;\n color: var(--mj-brand-primary);\n}\n\n/* ========================================\n Error Card\n ======================================== */\n.error-card {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 20%, transparent);\n border-radius: 8px;\n padding: 16px;\n}\n\n.error-message {\n margin: 0;\n font-family: monospace;\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-status-error);\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* ========================================\n Code Card\n ======================================== */\n.code-card {\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n overflow: hidden;\n height: 200px;\n}\n\n.code-card mj-code-editor {\n width: 100%;\n height: 100%;\n}\n\n/* ========================================\n Panel Actions\n ======================================== */\n.panel-actions {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n background: var(--mj-bg-surface);\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.panel-actions button {\n min-width: 100px;\n}\n\n.panel-actions button i {\n margin-right: 6px;\n}\n\n/* ========================================\n Responsive / Mobile\n ======================================== */\n@media (max-width: 768px) {\n .slide-out-panel {\n width: 100% !important;\n left: 0;\n }\n\n .resize-handle {\n display: none;\n }\n\n .panel-content {\n padding: 16px;\n }\n\n .status-banner {\n flex-wrap: wrap;\n }\n\n .panel-actions {\n flex-wrap: wrap;\n }\n\n .panel-actions button {\n flex: 1;\n min-width: 80px;\n }\n\n .code-card {\n height: 150px;\n }\n}\n"] }]
|
|
514
514
|
}], () => [{ type: i0.ChangeDetectorRef }], { Visible: [{
|
|
515
515
|
type: Input
|
|
516
516
|
}], Log: [{
|