@memberjunction/ng-dashboards 5.34.1 → 5.35.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 +51 -0
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +399 -292
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +75 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +400 -89
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
- package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +104 -103
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +12 -19
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +96 -203
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +990 -992
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +17 -0
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +370 -425
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +317 -357
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +403 -362
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +781 -783
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +6 -0
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +79 -30
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +196 -142
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/index.d.ts +0 -1
- package/dist/Actions/components/explorer/index.d.ts.map +1 -1
- package/dist/Actions/components/explorer/index.js +0 -1
- package/dist/Actions/components/explorer/index.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +32 -40
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +32 -40
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +32 -40
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +32 -40
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +76 -82
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-config-resource.component.js +24 -5
- package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
- package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
- package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +80 -99
- 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 +127 -106
- 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 +44 -45
- 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 +60 -58
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +139 -162
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +245 -266
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +294 -305
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +21 -0
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +147 -160
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +19 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -16
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +6 -0
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +521 -485
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts +8 -0
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +309 -318
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +866 -847
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +182 -163
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +610 -606
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +241 -241
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/Integration/integration.module.d.ts +1 -1
- package/dist/Integration/integration.module.d.ts.map +1 -1
- package/dist/Integration/integration.module.js +28 -1
- package/dist/Integration/integration.module.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +673 -674
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +745 -703
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +18 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +486 -532
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +152 -160
- 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 +302 -319
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +234 -246
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +1248 -1338
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +1 -1
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +34 -1
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/Permissions/audit-log-resource.component.js +76 -85
- package/dist/Permissions/audit-log-resource.component.js.map +1 -1
- package/dist/Permissions/resource-access-resource.component.js +64 -69
- package/dist/Permissions/resource-access-resource.component.js.map +1 -1
- package/dist/Permissions/user-access-resource.component.js +63 -74
- package/dist/Permissions/user-access-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +262 -104
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +773 -783
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
- package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +420 -393
- package/dist/Testing/components/testing-analytics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +8 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +587 -608
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +9 -12
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts +3 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +310 -274
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +16 -19
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts +3 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +307 -273
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -0
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +107 -93
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +185 -188
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +154 -184
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +350 -354
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +163 -169
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/actions-dashboards.module.d.ts +15 -16
- package/dist/actions-dashboards.module.d.ts.map +1 -1
- package/dist/actions-dashboards.module.js +34 -11
- package/dist/actions-dashboards.module.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +45 -48
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +36 -10
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/archiving-dashboards.module.d.ts +2 -1
- package/dist/archiving-dashboards.module.d.ts.map +1 -1
- package/dist/archiving-dashboards.module.js +12 -2
- package/dist/archiving-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +2 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +24 -3
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +1 -1
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +31 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/credentials-dashboards.module.d.ts +1 -1
- package/dist/credentials-dashboards.module.d.ts.map +1 -1
- package/dist/credentials-dashboards.module.js +28 -1
- package/dist/credentials-dashboards.module.js.map +1 -1
- package/dist/lists-dashboards.module.d.ts +1 -1
- package/dist/lists-dashboards.module.d.ts.map +1 -1
- package/dist/lists-dashboards.module.js +28 -1
- package/dist/lists-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +2 -2
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -3
- package/dist/public-api.js.map +1 -1
- package/dist/scheduling-dashboards.module.d.ts +1 -1
- package/dist/scheduling-dashboards.module.d.ts.map +1 -1
- package/dist/scheduling-dashboards.module.js +31 -1
- package/dist/scheduling-dashboards.module.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +8 -7
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +30 -0
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +52 -52
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +0 -1
|
@@ -15,192 +15,38 @@ import { RegisterClass, UUIDsEqual, MJGlobal, MJEventType } from '@memberjunctio
|
|
|
15
15
|
import * as i0 from "@angular/core";
|
|
16
16
|
import * as i1 from "@memberjunction/ng-shared";
|
|
17
17
|
import * as i2 from "@angular/forms";
|
|
18
|
-
import * as i3 from "
|
|
19
|
-
import * as i4 from "@memberjunction/ng-
|
|
18
|
+
import * as i3 from "@memberjunction/ng-shared-generic";
|
|
19
|
+
import * as i4 from "@memberjunction/ng-ui-components";
|
|
20
20
|
import * as i5 from "@angular/common";
|
|
21
21
|
import * as i6 from "../../../shared/pipes/highlight-search.pipe";
|
|
22
|
-
const _forTrack0 = ($index, $item) => $item.
|
|
23
|
-
const _forTrack1 = ($index, $item) => $item.ID;
|
|
22
|
+
const _forTrack0 = ($index, $item) => $item.ID;
|
|
24
23
|
function ModelManagementComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
25
|
-
i0.ɵɵelementStart(0, "div",
|
|
26
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
24
|
+
i0.ɵɵelementStart(0, "div", 0);
|
|
25
|
+
i0.ɵɵelement(1, "mj-loading", 1);
|
|
27
26
|
i0.ɵɵelementEnd();
|
|
28
27
|
} if (rf & 2) {
|
|
29
28
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
30
29
|
i0.ɵɵadvance();
|
|
31
30
|
i0.ɵɵproperty("text", ctx_r0.currentLoadingMessage);
|
|
32
31
|
} }
|
|
33
|
-
function
|
|
34
|
-
i0.ɵɵtext(0, " Hide Filters ");
|
|
35
|
-
} }
|
|
36
|
-
function ModelManagementComponent_Conditional_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
37
|
-
i0.ɵɵtext(0, " Show Filters ");
|
|
38
|
-
} }
|
|
39
|
-
function ModelManagementComponent_Conditional_2_Conditional_21_For_24_Template(rf, ctx) { if (rf & 1) {
|
|
40
|
-
i0.ɵɵelementStart(0, "option", 38);
|
|
41
|
-
i0.ɵɵtext(1);
|
|
42
|
-
i0.ɵɵelementEnd();
|
|
43
|
-
} if (rf & 2) {
|
|
44
|
-
const option_r4 = ctx.$implicit;
|
|
45
|
-
i0.ɵɵproperty("value", option_r4.value);
|
|
46
|
-
i0.ɵɵadvance();
|
|
47
|
-
i0.ɵɵtextInterpolate(option_r4.label);
|
|
48
|
-
} }
|
|
49
|
-
function ModelManagementComponent_Conditional_2_Conditional_21_For_33_Template(rf, ctx) { if (rf & 1) {
|
|
50
|
-
i0.ɵɵelementStart(0, "option", 38);
|
|
51
|
-
i0.ɵɵtext(1);
|
|
52
|
-
i0.ɵɵelementEnd();
|
|
53
|
-
} if (rf & 2) {
|
|
54
|
-
const vendor_r5 = ctx.$implicit;
|
|
55
|
-
i0.ɵɵproperty("value", vendor_r5.ID);
|
|
56
|
-
i0.ɵɵadvance();
|
|
57
|
-
i0.ɵɵtextInterpolate(vendor_r5.Name);
|
|
58
|
-
} }
|
|
59
|
-
function ModelManagementComponent_Conditional_2_Conditional_21_For_42_Template(rf, ctx) { if (rf & 1) {
|
|
60
|
-
i0.ɵɵelementStart(0, "option", 38);
|
|
61
|
-
i0.ɵɵtext(1);
|
|
62
|
-
i0.ɵɵelementEnd();
|
|
63
|
-
} if (rf & 2) {
|
|
64
|
-
const type_r6 = ctx.$implicit;
|
|
65
|
-
i0.ɵɵproperty("value", type_r6.ID);
|
|
66
|
-
i0.ɵɵadvance();
|
|
67
|
-
i0.ɵɵtextInterpolate(type_r6.Name);
|
|
68
|
-
} }
|
|
69
|
-
function ModelManagementComponent_Conditional_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
32
|
+
function ModelManagementComponent_Conditional_2_Conditional_19_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
70
33
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
71
|
-
i0.ɵɵelementStart(0, "
|
|
72
|
-
i0.ɵɵ
|
|
73
|
-
i0.ɵɵ
|
|
74
|
-
i0.ɵɵelementStart(5, "div", 26)(6, "span", 27);
|
|
75
|
-
i0.ɵɵtext(7);
|
|
76
|
-
i0.ɵɵelementEnd();
|
|
77
|
-
i0.ɵɵelementStart(8, "span", 28);
|
|
78
|
-
i0.ɵɵtext(9);
|
|
79
|
-
i0.ɵɵelementEnd()();
|
|
80
|
-
i0.ɵɵelementStart(10, "button", 29);
|
|
81
|
-
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_21_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.toggleFilterPanel()); });
|
|
82
|
-
i0.ɵɵelement(11, "span", 30);
|
|
83
|
-
i0.ɵɵelementEnd()();
|
|
84
|
-
i0.ɵɵelementStart(12, "div", 31)(13, "div", 32)(14, "label", 33);
|
|
85
|
-
i0.ɵɵelement(15, "span", 34);
|
|
86
|
-
i0.ɵɵtext(16, " Name ");
|
|
87
|
-
i0.ɵɵelementEnd();
|
|
88
|
-
i0.ɵɵelementStart(17, "input", 35);
|
|
89
|
-
i0.ɵɵlistener("input", function ModelManagementComponent_Conditional_2_Conditional_21_Template_input_input_17_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onSearchChange($event.target.value)); });
|
|
90
|
-
i0.ɵɵelementEnd()();
|
|
91
|
-
i0.ɵɵelementStart(18, "div", 32)(19, "label", 33);
|
|
92
|
-
i0.ɵɵelement(20, "span", 36);
|
|
93
|
-
i0.ɵɵtext(21, " Sort By ");
|
|
94
|
-
i0.ɵɵelementEnd();
|
|
95
|
-
i0.ɵɵelementStart(22, "select", 37);
|
|
96
|
-
i0.ɵɵlistener("change", function ModelManagementComponent_Conditional_2_Conditional_21_Template_select_change_22_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onSortChange($event.target.value)); });
|
|
97
|
-
i0.ɵɵrepeaterCreate(23, ModelManagementComponent_Conditional_2_Conditional_21_For_24_Template, 2, 2, "option", 38, _forTrack0);
|
|
98
|
-
i0.ɵɵelementEnd()();
|
|
99
|
-
i0.ɵɵelementStart(25, "div", 32)(26, "label", 33);
|
|
100
|
-
i0.ɵɵelement(27, "span", 39);
|
|
101
|
-
i0.ɵɵtext(28, " Vendor ");
|
|
102
|
-
i0.ɵɵelementEnd();
|
|
103
|
-
i0.ɵɵelementStart(29, "select", 37);
|
|
104
|
-
i0.ɵɵlistener("change", function ModelManagementComponent_Conditional_2_Conditional_21_Template_select_change_29_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onVendorChange($event.target.value)); });
|
|
105
|
-
i0.ɵɵelementStart(30, "option", 40);
|
|
106
|
-
i0.ɵɵtext(31, "All Vendors");
|
|
107
|
-
i0.ɵɵelementEnd();
|
|
108
|
-
i0.ɵɵrepeaterCreate(32, ModelManagementComponent_Conditional_2_Conditional_21_For_33_Template, 2, 2, "option", 38, _forTrack1);
|
|
109
|
-
i0.ɵɵelementEnd()();
|
|
110
|
-
i0.ɵɵelementStart(34, "div", 32)(35, "label", 33);
|
|
111
|
-
i0.ɵɵelement(36, "span", 6);
|
|
112
|
-
i0.ɵɵtext(37, " Type ");
|
|
113
|
-
i0.ɵɵelementEnd();
|
|
114
|
-
i0.ɵɵelementStart(38, "select", 37);
|
|
115
|
-
i0.ɵɵlistener("change", function ModelManagementComponent_Conditional_2_Conditional_21_Template_select_change_38_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onTypeChange($event.target.value)); });
|
|
116
|
-
i0.ɵɵelementStart(39, "option", 40);
|
|
117
|
-
i0.ɵɵtext(40, "All Types");
|
|
118
|
-
i0.ɵɵelementEnd();
|
|
119
|
-
i0.ɵɵrepeaterCreate(41, ModelManagementComponent_Conditional_2_Conditional_21_For_42_Template, 2, 2, "option", 38, _forTrack1);
|
|
120
|
-
i0.ɵɵelementEnd()();
|
|
121
|
-
i0.ɵɵelementStart(43, "div", 32)(44, "label", 33);
|
|
122
|
-
i0.ɵɵelement(45, "span", 41);
|
|
123
|
-
i0.ɵɵtext(46, " Status ");
|
|
124
|
-
i0.ɵɵelementEnd();
|
|
125
|
-
i0.ɵɵelementStart(47, "select", 37);
|
|
126
|
-
i0.ɵɵlistener("change", function ModelManagementComponent_Conditional_2_Conditional_21_Template_select_change_47_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onStatusChange($event.target.value)); });
|
|
127
|
-
i0.ɵɵelementStart(48, "option", 40);
|
|
128
|
-
i0.ɵɵtext(49, "All Statuses");
|
|
129
|
-
i0.ɵɵelementEnd();
|
|
130
|
-
i0.ɵɵelementStart(50, "option", 42);
|
|
131
|
-
i0.ɵɵtext(51, "Active");
|
|
132
|
-
i0.ɵɵelementEnd();
|
|
133
|
-
i0.ɵɵelementStart(52, "option", 43);
|
|
134
|
-
i0.ɵɵtext(53, "Inactive");
|
|
135
|
-
i0.ɵɵelementEnd()()();
|
|
136
|
-
i0.ɵɵelementStart(54, "div", 32)(55, "label", 33);
|
|
137
|
-
i0.ɵɵelement(56, "span", 44);
|
|
138
|
-
i0.ɵɵtext(57, " Power Rank ");
|
|
139
|
-
i0.ɵɵelementEnd();
|
|
140
|
-
i0.ɵɵelementStart(58, "div", 45)(59, "input", 46);
|
|
141
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ModelManagementComponent_Conditional_2_Conditional_21_Template_input_ngModelChange_59_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r0.powerRankRange.min, $event) || (ctx_r0.powerRankRange.min = $event); return i0.ɵɵresetView($event); });
|
|
142
|
-
i0.ɵɵlistener("change", function ModelManagementComponent_Conditional_2_Conditional_21_Template_input_change_59_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.validateAndApplyRankFilters("power")); });
|
|
143
|
-
i0.ɵɵelementEnd();
|
|
144
|
-
i0.ɵɵelementStart(60, "span", 47);
|
|
145
|
-
i0.ɵɵtext(61, "-");
|
|
146
|
-
i0.ɵɵelementEnd();
|
|
147
|
-
i0.ɵɵelementStart(62, "input", 48);
|
|
148
|
-
i0.ɵɵtwoWayListener("ngModelChange", function ModelManagementComponent_Conditional_2_Conditional_21_Template_input_ngModelChange_62_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r0.powerRankRange.max, $event) || (ctx_r0.powerRankRange.max = $event); return i0.ɵɵresetView($event); });
|
|
149
|
-
i0.ɵɵlistener("change", function ModelManagementComponent_Conditional_2_Conditional_21_Template_input_change_62_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.validateAndApplyRankFilters("power")); });
|
|
150
|
-
i0.ɵɵelementEnd()()();
|
|
151
|
-
i0.ɵɵelementStart(63, "div", 49)(64, "button", 50);
|
|
152
|
-
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_21_Template_button_click_64_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.clearFilters()); });
|
|
153
|
-
i0.ɵɵelement(65, "span", 51);
|
|
154
|
-
i0.ɵɵtext(66, " Reset Filters ");
|
|
155
|
-
i0.ɵɵelementEnd()()()()();
|
|
156
|
-
} if (rf & 2) {
|
|
157
|
-
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
158
|
-
i0.ɵɵproperty("size", 20)("minSize", 15)("maxSize", 25);
|
|
159
|
-
i0.ɵɵadvance(7);
|
|
160
|
-
i0.ɵɵtextInterpolate(ctx_r0.filteredModels.length);
|
|
161
|
-
i0.ɵɵadvance(2);
|
|
162
|
-
i0.ɵɵtextInterpolate1("of ", ctx_r0.models.length);
|
|
163
|
-
i0.ɵɵadvance(8);
|
|
164
|
-
i0.ɵɵproperty("value", ctx_r0.searchTerm);
|
|
165
|
-
i0.ɵɵadvance(5);
|
|
166
|
-
i0.ɵɵproperty("value", ctx_r0.sortBy);
|
|
167
|
-
i0.ɵɵadvance();
|
|
168
|
-
i0.ɵɵrepeater(ctx_r0.sortOptions);
|
|
169
|
-
i0.ɵɵadvance(6);
|
|
170
|
-
i0.ɵɵproperty("value", ctx_r0.selectedVendor);
|
|
171
|
-
i0.ɵɵadvance(3);
|
|
172
|
-
i0.ɵɵrepeater(ctx_r0.vendors);
|
|
173
|
-
i0.ɵɵadvance(6);
|
|
174
|
-
i0.ɵɵproperty("value", ctx_r0.selectedType);
|
|
175
|
-
i0.ɵɵadvance(3);
|
|
176
|
-
i0.ɵɵrepeater(ctx_r0.modelTypes);
|
|
177
|
-
i0.ɵɵadvance(6);
|
|
178
|
-
i0.ɵɵproperty("value", ctx_r0.selectedStatus);
|
|
179
|
-
i0.ɵɵadvance(12);
|
|
180
|
-
i0.ɵɵproperty("max", ctx_r0.maxPowerRank);
|
|
181
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.powerRankRange.min);
|
|
182
|
-
i0.ɵɵadvance(3);
|
|
183
|
-
i0.ɵɵproperty("max", ctx_r0.maxPowerRank);
|
|
184
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.powerRankRange.max);
|
|
185
|
-
} }
|
|
186
|
-
function ModelManagementComponent_Conditional_2_Conditional_24_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
187
|
-
const _r7 = i0.ɵɵgetCurrentView();
|
|
188
|
-
i0.ɵɵelementStart(0, "button", 54);
|
|
189
|
-
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_24_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.createNewModel()); });
|
|
190
|
-
i0.ɵɵelement(1, "i", 17);
|
|
34
|
+
i0.ɵɵelementStart(0, "button", 24);
|
|
35
|
+
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_19_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.createNewModel()); });
|
|
36
|
+
i0.ɵɵelement(1, "i", 15);
|
|
191
37
|
i0.ɵɵtext(2, " Create First Model ");
|
|
192
38
|
i0.ɵɵelementEnd();
|
|
193
39
|
} }
|
|
194
|
-
function
|
|
195
|
-
i0.ɵɵelementStart(0, "div",
|
|
196
|
-
i0.ɵɵelement(1, "i",
|
|
40
|
+
function ModelManagementComponent_Conditional_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
41
|
+
i0.ɵɵelementStart(0, "div", 19);
|
|
42
|
+
i0.ɵɵelement(1, "i", 22);
|
|
197
43
|
i0.ɵɵelementStart(2, "h3");
|
|
198
44
|
i0.ɵɵtext(3, "No models found");
|
|
199
45
|
i0.ɵɵelementEnd();
|
|
200
46
|
i0.ɵɵelementStart(4, "p");
|
|
201
47
|
i0.ɵɵtext(5);
|
|
202
48
|
i0.ɵɵelementEnd();
|
|
203
|
-
i0.ɵɵconditionalCreate(6,
|
|
49
|
+
i0.ɵɵconditionalCreate(6, ModelManagementComponent_Conditional_2_Conditional_19_Conditional_6_Template, 3, 0, "button", 23);
|
|
204
50
|
i0.ɵɵelementEnd();
|
|
205
51
|
} if (rf & 2) {
|
|
206
52
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
@@ -209,187 +55,187 @@ function ModelManagementComponent_Conditional_2_Conditional_24_Template(rf, ctx)
|
|
|
209
55
|
i0.ɵɵadvance();
|
|
210
56
|
i0.ɵɵconditional(!ctx_r0.hasActiveFilters ? 6 : -1);
|
|
211
57
|
} }
|
|
212
|
-
function
|
|
213
|
-
i0.ɵɵelementStart(0, "span",
|
|
214
|
-
i0.ɵɵelement(1, "i",
|
|
58
|
+
function ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
59
|
+
i0.ɵɵelementStart(0, "span", 35);
|
|
60
|
+
i0.ɵɵelement(1, "i", 46);
|
|
215
61
|
i0.ɵɵtext(2);
|
|
216
62
|
i0.ɵɵelementEnd();
|
|
217
63
|
} if (rf & 2) {
|
|
218
|
-
const
|
|
64
|
+
const model_r5 = i0.ɵɵnextContext().$implicit;
|
|
219
65
|
i0.ɵɵadvance(2);
|
|
220
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
66
|
+
i0.ɵɵtextInterpolate1(" ", model_r5.Vendor, " ");
|
|
221
67
|
} }
|
|
222
|
-
function
|
|
223
|
-
i0.ɵɵelementStart(0, "span",
|
|
224
|
-
i0.ɵɵelement(1, "i",
|
|
68
|
+
function ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
69
|
+
i0.ɵɵelementStart(0, "span", 35);
|
|
70
|
+
i0.ɵɵelement(1, "i", 47);
|
|
225
71
|
i0.ɵɵtext(2);
|
|
226
72
|
i0.ɵɵelementEnd();
|
|
227
73
|
} if (rf & 2) {
|
|
228
|
-
const
|
|
74
|
+
const model_r5 = i0.ɵɵnextContext().$implicit;
|
|
229
75
|
i0.ɵɵadvance(2);
|
|
230
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
76
|
+
i0.ɵɵtextInterpolate1(" ", model_r5.AIModelType, " ");
|
|
231
77
|
} }
|
|
232
|
-
function
|
|
233
|
-
i0.ɵɵelementStart(0, "span",
|
|
234
|
-
i0.ɵɵelement(1, "i",
|
|
78
|
+
function ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
79
|
+
i0.ɵɵelementStart(0, "span", 36);
|
|
80
|
+
i0.ɵɵelement(1, "i", 48);
|
|
235
81
|
i0.ɵɵtext(2, " Active ");
|
|
236
82
|
i0.ɵɵelementEnd();
|
|
237
83
|
} }
|
|
238
|
-
function
|
|
239
|
-
i0.ɵɵelementStart(0, "span",
|
|
240
|
-
i0.ɵɵelement(1, "i",
|
|
84
|
+
function ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
85
|
+
i0.ɵɵelementStart(0, "span", 37);
|
|
86
|
+
i0.ɵɵelement(1, "i", 48);
|
|
241
87
|
i0.ɵɵtext(2, " Inactive ");
|
|
242
88
|
i0.ɵɵelementEnd();
|
|
243
89
|
} }
|
|
244
|
-
function
|
|
245
|
-
i0.ɵɵelement(0, "p",
|
|
90
|
+
function ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
91
|
+
i0.ɵɵelement(0, "p", 40);
|
|
246
92
|
i0.ɵɵpipe(1, "highlightSearch");
|
|
247
93
|
} if (rf & 2) {
|
|
248
|
-
const
|
|
94
|
+
const model_r5 = i0.ɵɵnextContext().$implicit;
|
|
249
95
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
250
|
-
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(1, 1,
|
|
96
|
+
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(1, 1, model_r5.Description, ctx_r0.searchTerm), i0.ɵɵsanitizeHtml);
|
|
251
97
|
} }
|
|
252
|
-
function
|
|
253
|
-
i0.ɵɵelementStart(0, "p",
|
|
98
|
+
function ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
99
|
+
i0.ɵɵelementStart(0, "p", 41);
|
|
254
100
|
i0.ɵɵtext(1, "No description provided");
|
|
255
101
|
i0.ɵɵelementEnd();
|
|
256
102
|
} }
|
|
257
|
-
function
|
|
258
|
-
i0.ɵɵelementStart(0, "div",
|
|
103
|
+
function ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_17_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
104
|
+
i0.ɵɵelementStart(0, "div", 50)(1, "span", 51);
|
|
259
105
|
i0.ɵɵtext(2, "Token Limit");
|
|
260
106
|
i0.ɵɵelementEnd();
|
|
261
|
-
i0.ɵɵelementStart(3, "span",
|
|
107
|
+
i0.ɵɵelementStart(3, "span", 52);
|
|
262
108
|
i0.ɵɵtext(4);
|
|
263
109
|
i0.ɵɵelementEnd()();
|
|
264
110
|
} if (rf & 2) {
|
|
265
|
-
const
|
|
111
|
+
const model_r5 = i0.ɵɵnextContext(2).$implicit;
|
|
266
112
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
267
113
|
i0.ɵɵadvance(4);
|
|
268
|
-
i0.ɵɵtextInterpolate(ctx_r0.formatTokenLimit(
|
|
114
|
+
i0.ɵɵtextInterpolate(ctx_r0.formatTokenLimit(model_r5.InputTokenLimit));
|
|
269
115
|
} }
|
|
270
|
-
function
|
|
271
|
-
i0.ɵɵelementStart(0, "div",
|
|
116
|
+
function ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_17_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
117
|
+
i0.ɵɵelementStart(0, "div", 50)(1, "span", 51);
|
|
272
118
|
i0.ɵɵtext(2, "API Name");
|
|
273
119
|
i0.ɵɵelementEnd();
|
|
274
|
-
i0.ɵɵelementStart(3, "span",
|
|
120
|
+
i0.ɵɵelementStart(3, "span", 52);
|
|
275
121
|
i0.ɵɵtext(4);
|
|
276
122
|
i0.ɵɵelementEnd()();
|
|
277
123
|
} if (rf & 2) {
|
|
278
|
-
const
|
|
124
|
+
const model_r5 = i0.ɵɵnextContext(2).$implicit;
|
|
279
125
|
i0.ɵɵadvance(4);
|
|
280
|
-
i0.ɵɵtextInterpolate(
|
|
126
|
+
i0.ɵɵtextInterpolate(model_r5.APIName);
|
|
281
127
|
} }
|
|
282
|
-
function
|
|
283
|
-
i0.ɵɵelementStart(0, "div",
|
|
128
|
+
function ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_17_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
129
|
+
i0.ɵɵelementStart(0, "div", 50)(1, "span", 51);
|
|
284
130
|
i0.ɵɵtext(2, "Driver");
|
|
285
131
|
i0.ɵɵelementEnd();
|
|
286
|
-
i0.ɵɵelementStart(3, "span",
|
|
132
|
+
i0.ɵɵelementStart(3, "span", 52);
|
|
287
133
|
i0.ɵɵtext(4);
|
|
288
134
|
i0.ɵɵelementEnd()();
|
|
289
135
|
} if (rf & 2) {
|
|
290
|
-
const
|
|
136
|
+
const model_r5 = i0.ɵɵnextContext(2).$implicit;
|
|
291
137
|
i0.ɵɵadvance(4);
|
|
292
|
-
i0.ɵɵtextInterpolate(
|
|
138
|
+
i0.ɵɵtextInterpolate(model_r5.DriverClass);
|
|
293
139
|
} }
|
|
294
|
-
function
|
|
295
|
-
i0.ɵɵelementStart(0, "div",
|
|
140
|
+
function ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
141
|
+
i0.ɵɵelementStart(0, "div", 42)(1, "div", 49)(2, "div", 50)(3, "span", 51);
|
|
296
142
|
i0.ɵɵtext(4, "Power Rank");
|
|
297
143
|
i0.ɵɵelementEnd();
|
|
298
|
-
i0.ɵɵelementStart(5, "span",
|
|
144
|
+
i0.ɵɵelementStart(5, "span", 52);
|
|
299
145
|
i0.ɵɵtext(6);
|
|
300
146
|
i0.ɵɵelementEnd()();
|
|
301
|
-
i0.ɵɵelementStart(7, "div",
|
|
147
|
+
i0.ɵɵelementStart(7, "div", 50)(8, "span", 51);
|
|
302
148
|
i0.ɵɵtext(9, "Speed Rank");
|
|
303
149
|
i0.ɵɵelementEnd();
|
|
304
|
-
i0.ɵɵelementStart(10, "span",
|
|
150
|
+
i0.ɵɵelementStart(10, "span", 52);
|
|
305
151
|
i0.ɵɵtext(11);
|
|
306
152
|
i0.ɵɵelementEnd()();
|
|
307
|
-
i0.ɵɵelementStart(12, "div",
|
|
153
|
+
i0.ɵɵelementStart(12, "div", 50)(13, "span", 51);
|
|
308
154
|
i0.ɵɵtext(14, "Cost Rank");
|
|
309
155
|
i0.ɵɵelementEnd();
|
|
310
|
-
i0.ɵɵelementStart(15, "span",
|
|
156
|
+
i0.ɵɵelementStart(15, "span", 52);
|
|
311
157
|
i0.ɵɵtext(16);
|
|
312
158
|
i0.ɵɵelementEnd()();
|
|
313
|
-
i0.ɵɵconditionalCreate(17,
|
|
314
|
-
i0.ɵɵconditionalCreate(18,
|
|
315
|
-
i0.ɵɵconditionalCreate(19,
|
|
159
|
+
i0.ɵɵconditionalCreate(17, ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_17_Conditional_17_Template, 5, 1, "div", 50);
|
|
160
|
+
i0.ɵɵconditionalCreate(18, ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_17_Conditional_18_Template, 5, 1, "div", 50);
|
|
161
|
+
i0.ɵɵconditionalCreate(19, ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_17_Conditional_19_Template, 5, 1, "div", 50);
|
|
316
162
|
i0.ɵɵelementEnd()();
|
|
317
163
|
} if (rf & 2) {
|
|
318
|
-
const
|
|
164
|
+
const model_r5 = i0.ɵɵnextContext().$implicit;
|
|
319
165
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
320
166
|
i0.ɵɵadvance(6);
|
|
321
|
-
i0.ɵɵtextInterpolate(ctx_r0.formatRank(
|
|
167
|
+
i0.ɵɵtextInterpolate(ctx_r0.formatRank(model_r5.PowerRank, "power"));
|
|
322
168
|
i0.ɵɵadvance(5);
|
|
323
|
-
i0.ɵɵtextInterpolate(ctx_r0.formatRank(
|
|
169
|
+
i0.ɵɵtextInterpolate(ctx_r0.formatRank(model_r5.SpeedRank, "speed"));
|
|
324
170
|
i0.ɵɵadvance(5);
|
|
325
|
-
i0.ɵɵtextInterpolate(ctx_r0.formatRank(
|
|
171
|
+
i0.ɵɵtextInterpolate(ctx_r0.formatRank(model_r5.CostRank, "cost"));
|
|
326
172
|
i0.ɵɵadvance();
|
|
327
|
-
i0.ɵɵconditional(
|
|
173
|
+
i0.ɵɵconditional(model_r5.InputTokenLimit ? 17 : -1);
|
|
328
174
|
i0.ɵɵadvance();
|
|
329
|
-
i0.ɵɵconditional(
|
|
175
|
+
i0.ɵɵconditional(model_r5.APIName ? 18 : -1);
|
|
330
176
|
i0.ɵɵadvance();
|
|
331
|
-
i0.ɵɵconditional(
|
|
177
|
+
i0.ɵɵconditional(model_r5.DriverClass ? 19 : -1);
|
|
332
178
|
} }
|
|
333
|
-
function
|
|
334
|
-
const
|
|
335
|
-
i0.ɵɵelementStart(0, "div",
|
|
336
|
-
i0.ɵɵlistener("click", function
|
|
337
|
-
i0.ɵɵelementStart(2, "div",
|
|
179
|
+
function ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
180
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
181
|
+
i0.ɵɵelementStart(0, "div", 28)(1, "div", 29);
|
|
182
|
+
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Template_div_click_1_listener() { const model_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.toggleModelExpansion(model_r5.ID)); });
|
|
183
|
+
i0.ɵɵelementStart(2, "div", 30)(3, "div", 31);
|
|
338
184
|
i0.ɵɵelement(4, "i");
|
|
339
185
|
i0.ɵɵelementEnd();
|
|
340
|
-
i0.ɵɵelementStart(5, "div",
|
|
341
|
-
i0.ɵɵelement(6, "h4",
|
|
186
|
+
i0.ɵɵelementStart(5, "div", 32);
|
|
187
|
+
i0.ɵɵelement(6, "h4", 33);
|
|
342
188
|
i0.ɵɵpipe(7, "highlightSearch");
|
|
343
|
-
i0.ɵɵelementStart(8, "div",
|
|
344
|
-
i0.ɵɵconditionalCreate(9,
|
|
345
|
-
i0.ɵɵconditionalCreate(10,
|
|
346
|
-
i0.ɵɵconditionalCreate(11,
|
|
189
|
+
i0.ɵɵelementStart(8, "div", 34);
|
|
190
|
+
i0.ɵɵconditionalCreate(9, ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_9_Template, 3, 1, "span", 35);
|
|
191
|
+
i0.ɵɵconditionalCreate(10, ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_10_Template, 3, 1, "span", 35);
|
|
192
|
+
i0.ɵɵconditionalCreate(11, ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_11_Template, 3, 0, "span", 36)(12, ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_12_Template, 3, 0, "span", 37);
|
|
347
193
|
i0.ɵɵelementEnd()()();
|
|
348
|
-
i0.ɵɵelement(13, "i",
|
|
194
|
+
i0.ɵɵelement(13, "i", 38);
|
|
349
195
|
i0.ɵɵelementEnd();
|
|
350
|
-
i0.ɵɵelementStart(14, "div",
|
|
351
|
-
i0.ɵɵconditionalCreate(15,
|
|
352
|
-
i0.ɵɵconditionalCreate(17,
|
|
196
|
+
i0.ɵɵelementStart(14, "div", 39);
|
|
197
|
+
i0.ɵɵconditionalCreate(15, ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_15_Template, 2, 4, "p", 40)(16, ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_16_Template, 2, 0, "p", 41);
|
|
198
|
+
i0.ɵɵconditionalCreate(17, ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Conditional_17_Template, 20, 6, "div", 42);
|
|
353
199
|
i0.ɵɵelementEnd();
|
|
354
|
-
i0.ɵɵelementStart(18, "div",
|
|
355
|
-
i0.ɵɵlistener("click", function
|
|
356
|
-
i0.ɵɵelement(20, "i",
|
|
200
|
+
i0.ɵɵelementStart(18, "div", 43)(19, "button", 44);
|
|
201
|
+
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Template_button_click_19_listener($event) { const model_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.showModelDetails(model_r5, $event)); });
|
|
202
|
+
i0.ɵɵelement(20, "i", 45);
|
|
357
203
|
i0.ɵɵtext(21, " Details ");
|
|
358
204
|
i0.ɵɵelementEnd()()();
|
|
359
205
|
} if (rf & 2) {
|
|
360
|
-
const
|
|
206
|
+
const model_r5 = ctx.$implicit;
|
|
361
207
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
362
|
-
i0.ɵɵclassProp("expanded", ctx_r0.expandedModelId ===
|
|
208
|
+
i0.ɵɵclassProp("expanded", ctx_r0.expandedModelId === model_r5.ID);
|
|
363
209
|
i0.ɵɵadvance(4);
|
|
364
|
-
i0.ɵɵclassMap(ctx_r0.getModelIcon(
|
|
210
|
+
i0.ɵɵclassMap(ctx_r0.getModelIcon(model_r5));
|
|
365
211
|
i0.ɵɵadvance(2);
|
|
366
|
-
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(7, 12,
|
|
212
|
+
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(7, 12, model_r5.Name || "Unnamed Model", ctx_r0.searchTerm), i0.ɵɵsanitizeHtml);
|
|
367
213
|
i0.ɵɵadvance(3);
|
|
368
|
-
i0.ɵɵconditional(
|
|
214
|
+
i0.ɵɵconditional(model_r5.Vendor ? 9 : -1);
|
|
369
215
|
i0.ɵɵadvance();
|
|
370
|
-
i0.ɵɵconditional(
|
|
216
|
+
i0.ɵɵconditional(model_r5.AIModelType ? 10 : -1);
|
|
371
217
|
i0.ɵɵadvance();
|
|
372
|
-
i0.ɵɵconditional(
|
|
218
|
+
i0.ɵɵconditional(model_r5.IsActive ? 11 : 12);
|
|
373
219
|
i0.ɵɵadvance(2);
|
|
374
|
-
i0.ɵɵclassProp("rotated", ctx_r0.expandedModelId ===
|
|
220
|
+
i0.ɵɵclassProp("rotated", ctx_r0.expandedModelId === model_r5.ID);
|
|
375
221
|
i0.ɵɵadvance(2);
|
|
376
|
-
i0.ɵɵconditional(
|
|
222
|
+
i0.ɵɵconditional(model_r5.Description ? 15 : 16);
|
|
377
223
|
i0.ɵɵadvance(2);
|
|
378
|
-
i0.ɵɵconditional(ctx_r0.expandedModelId ===
|
|
224
|
+
i0.ɵɵconditional(ctx_r0.expandedModelId === model_r5.ID ? 17 : -1);
|
|
379
225
|
} }
|
|
380
|
-
function
|
|
381
|
-
i0.ɵɵelementStart(0, "div",
|
|
382
|
-
i0.ɵɵrepeaterCreate(1,
|
|
226
|
+
function ModelManagementComponent_Conditional_2_Conditional_20_Case_0_Template(rf, ctx) { if (rf & 1) {
|
|
227
|
+
i0.ɵɵelementStart(0, "div", 25);
|
|
228
|
+
i0.ɵɵrepeaterCreate(1, ModelManagementComponent_Conditional_2_Conditional_20_Case_0_For_2_Template, 22, 15, "div", 27, _forTrack0);
|
|
383
229
|
i0.ɵɵelementEnd();
|
|
384
230
|
} if (rf & 2) {
|
|
385
231
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
386
232
|
i0.ɵɵadvance();
|
|
387
233
|
i0.ɵɵrepeater(ctx_r0.filteredModels);
|
|
388
234
|
} }
|
|
389
|
-
function
|
|
390
|
-
const
|
|
391
|
-
i0.ɵɵelementStart(0, "tr")(1, "td")(2, "div",
|
|
392
|
-
i0.ɵɵelement(3, "i")(4, "span",
|
|
235
|
+
function ModelManagementComponent_Conditional_2_Conditional_20_Case_1_For_34_Template(rf, ctx) { if (rf & 1) {
|
|
236
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
237
|
+
i0.ɵɵelementStart(0, "tr")(1, "td")(2, "div", 57);
|
|
238
|
+
i0.ɵɵelement(3, "i")(4, "span", 58);
|
|
393
239
|
i0.ɵɵpipe(5, "highlightSearch");
|
|
394
240
|
i0.ɵɵelementEnd()();
|
|
395
241
|
i0.ɵɵelementStart(6, "td");
|
|
@@ -398,87 +244,87 @@ function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_For_34_Tem
|
|
|
398
244
|
i0.ɵɵelementStart(8, "td");
|
|
399
245
|
i0.ɵɵtext(9);
|
|
400
246
|
i0.ɵɵelementEnd();
|
|
401
|
-
i0.ɵɵelementStart(10, "td")(11, "span",
|
|
247
|
+
i0.ɵɵelementStart(10, "td")(11, "span", 59);
|
|
402
248
|
i0.ɵɵtext(12);
|
|
403
249
|
i0.ɵɵelementEnd()();
|
|
404
|
-
i0.ɵɵelementStart(13, "td")(14, "span",
|
|
250
|
+
i0.ɵɵelementStart(13, "td")(14, "span", 59);
|
|
405
251
|
i0.ɵɵtext(15);
|
|
406
252
|
i0.ɵɵelementEnd()();
|
|
407
|
-
i0.ɵɵelementStart(16, "td")(17, "span",
|
|
253
|
+
i0.ɵɵelementStart(16, "td")(17, "span", 59);
|
|
408
254
|
i0.ɵɵtext(18);
|
|
409
255
|
i0.ɵɵelementEnd()();
|
|
410
|
-
i0.ɵɵelementStart(19, "td")(20, "span",
|
|
256
|
+
i0.ɵɵelementStart(19, "td")(20, "span", 60);
|
|
411
257
|
i0.ɵɵtext(21);
|
|
412
258
|
i0.ɵɵelementEnd()();
|
|
413
|
-
i0.ɵɵelementStart(22, "td")(23, "button",
|
|
414
|
-
i0.ɵɵlistener("click", function
|
|
415
|
-
i0.ɵɵelement(24, "i",
|
|
259
|
+
i0.ɵɵelementStart(22, "td")(23, "button", 61);
|
|
260
|
+
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_20_Case_1_For_34_Template_button_click_23_listener() { const model_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.showModelDetails(model_r8)); });
|
|
261
|
+
i0.ɵɵelement(24, "i", 45);
|
|
416
262
|
i0.ɵɵelementEnd()()();
|
|
417
263
|
} if (rf & 2) {
|
|
418
|
-
const
|
|
264
|
+
const model_r8 = ctx.$implicit;
|
|
419
265
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
420
266
|
i0.ɵɵadvance(3);
|
|
421
|
-
i0.ɵɵclassMap(ctx_r0.getModelIcon(
|
|
267
|
+
i0.ɵɵclassMap(ctx_r0.getModelIcon(model_r8));
|
|
422
268
|
i0.ɵɵadvance();
|
|
423
|
-
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(5, 19,
|
|
269
|
+
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(5, 19, model_r8.Name || "Unnamed Model", ctx_r0.searchTerm), i0.ɵɵsanitizeHtml);
|
|
424
270
|
i0.ɵɵadvance(3);
|
|
425
|
-
i0.ɵɵtextInterpolate(
|
|
271
|
+
i0.ɵɵtextInterpolate(model_r8.Vendor || "-");
|
|
426
272
|
i0.ɵɵadvance(2);
|
|
427
|
-
i0.ɵɵtextInterpolate(
|
|
273
|
+
i0.ɵɵtextInterpolate(model_r8.AIModelType);
|
|
428
274
|
i0.ɵɵadvance(2);
|
|
429
|
-
i0.ɵɵclassMap(ctx_r0.getRankClass(
|
|
275
|
+
i0.ɵɵclassMap(ctx_r0.getRankClass(model_r8.PowerRank, "power"));
|
|
430
276
|
i0.ɵɵadvance();
|
|
431
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(
|
|
277
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r8.PowerRank, "power"), " ");
|
|
432
278
|
i0.ɵɵadvance(2);
|
|
433
|
-
i0.ɵɵclassMap(ctx_r0.getRankClass(
|
|
279
|
+
i0.ɵɵclassMap(ctx_r0.getRankClass(model_r8.SpeedRank, "speed"));
|
|
434
280
|
i0.ɵɵadvance();
|
|
435
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(
|
|
281
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r8.SpeedRank, "speed"), " ");
|
|
436
282
|
i0.ɵɵadvance(2);
|
|
437
|
-
i0.ɵɵclassMap(ctx_r0.getRankClass(
|
|
283
|
+
i0.ɵɵclassMap(ctx_r0.getRankClass(model_r8.CostRank, "cost"));
|
|
438
284
|
i0.ɵɵadvance();
|
|
439
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(
|
|
285
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r8.CostRank, "cost"), " ");
|
|
440
286
|
i0.ɵɵadvance(2);
|
|
441
|
-
i0.ɵɵclassProp("active",
|
|
287
|
+
i0.ɵɵclassProp("active", model_r8.IsActive)("inactive", !model_r8.IsActive);
|
|
442
288
|
i0.ɵɵadvance();
|
|
443
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
289
|
+
i0.ɵɵtextInterpolate1(" ", model_r8.IsActive ? "Active" : "Inactive", " ");
|
|
444
290
|
} }
|
|
445
|
-
function
|
|
446
|
-
const
|
|
447
|
-
i0.ɵɵelementStart(0, "div",
|
|
448
|
-
i0.ɵɵlistener("click", function
|
|
449
|
-
i0.ɵɵelementStart(5, "span",
|
|
291
|
+
function ModelManagementComponent_Conditional_2_Conditional_20_Case_1_Template(rf, ctx) { if (rf & 1) {
|
|
292
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
293
|
+
i0.ɵɵelementStart(0, "div", 26)(1, "table", 53)(2, "thead")(3, "tr")(4, "th", 54);
|
|
294
|
+
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_20_Case_1_Template_th_click_4_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("name")); });
|
|
295
|
+
i0.ɵɵelementStart(5, "span", 55);
|
|
450
296
|
i0.ɵɵtext(6, " Name ");
|
|
451
|
-
i0.ɵɵelement(7, "i",
|
|
297
|
+
i0.ɵɵelement(7, "i", 56);
|
|
452
298
|
i0.ɵɵelementEnd()();
|
|
453
|
-
i0.ɵɵelementStart(8, "th",
|
|
454
|
-
i0.ɵɵlistener("click", function
|
|
455
|
-
i0.ɵɵelementStart(9, "span",
|
|
299
|
+
i0.ɵɵelementStart(8, "th", 54);
|
|
300
|
+
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_20_Case_1_Template_th_click_8_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("vendor")); });
|
|
301
|
+
i0.ɵɵelementStart(9, "span", 55);
|
|
456
302
|
i0.ɵɵtext(10, " Vendor ");
|
|
457
|
-
i0.ɵɵelement(11, "i",
|
|
303
|
+
i0.ɵɵelement(11, "i", 56);
|
|
458
304
|
i0.ɵɵelementEnd()();
|
|
459
|
-
i0.ɵɵelementStart(12, "th",
|
|
460
|
-
i0.ɵɵlistener("click", function
|
|
461
|
-
i0.ɵɵelementStart(13, "span",
|
|
305
|
+
i0.ɵɵelementStart(12, "th", 54);
|
|
306
|
+
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_20_Case_1_Template_th_click_12_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("type")); });
|
|
307
|
+
i0.ɵɵelementStart(13, "span", 55);
|
|
462
308
|
i0.ɵɵtext(14, " Type ");
|
|
463
|
-
i0.ɵɵelement(15, "i",
|
|
309
|
+
i0.ɵɵelement(15, "i", 56);
|
|
464
310
|
i0.ɵɵelementEnd()();
|
|
465
|
-
i0.ɵɵelementStart(16, "th",
|
|
466
|
-
i0.ɵɵlistener("click", function
|
|
467
|
-
i0.ɵɵelementStart(17, "span",
|
|
311
|
+
i0.ɵɵelementStart(16, "th", 54);
|
|
312
|
+
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_20_Case_1_Template_th_click_16_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("powerRank")); });
|
|
313
|
+
i0.ɵɵelementStart(17, "span", 55);
|
|
468
314
|
i0.ɵɵtext(18, " Power ");
|
|
469
|
-
i0.ɵɵelement(19, "i",
|
|
315
|
+
i0.ɵɵelement(19, "i", 56);
|
|
470
316
|
i0.ɵɵelementEnd()();
|
|
471
|
-
i0.ɵɵelementStart(20, "th",
|
|
472
|
-
i0.ɵɵlistener("click", function
|
|
473
|
-
i0.ɵɵelementStart(21, "span",
|
|
317
|
+
i0.ɵɵelementStart(20, "th", 54);
|
|
318
|
+
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_20_Case_1_Template_th_click_20_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("speedRank")); });
|
|
319
|
+
i0.ɵɵelementStart(21, "span", 55);
|
|
474
320
|
i0.ɵɵtext(22, " Speed ");
|
|
475
|
-
i0.ɵɵelement(23, "i",
|
|
321
|
+
i0.ɵɵelement(23, "i", 56);
|
|
476
322
|
i0.ɵɵelementEnd()();
|
|
477
|
-
i0.ɵɵelementStart(24, "th",
|
|
478
|
-
i0.ɵɵlistener("click", function
|
|
479
|
-
i0.ɵɵelementStart(25, "span",
|
|
323
|
+
i0.ɵɵelementStart(24, "th", 54);
|
|
324
|
+
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_20_Case_1_Template_th_click_24_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("costRank")); });
|
|
325
|
+
i0.ɵɵelementStart(25, "span", 55);
|
|
480
326
|
i0.ɵɵtext(26, " Cost ");
|
|
481
|
-
i0.ɵɵelement(27, "i",
|
|
327
|
+
i0.ɵɵelement(27, "i", 56);
|
|
482
328
|
i0.ɵɵelementEnd()();
|
|
483
329
|
i0.ɵɵelementStart(28, "th");
|
|
484
330
|
i0.ɵɵtext(29, "Status");
|
|
@@ -487,7 +333,7 @@ function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template(r
|
|
|
487
333
|
i0.ɵɵtext(31, "Actions");
|
|
488
334
|
i0.ɵɵelementEnd()()();
|
|
489
335
|
i0.ɵɵelementStart(32, "tbody");
|
|
490
|
-
i0.ɵɵrepeaterCreate(33,
|
|
336
|
+
i0.ɵɵrepeaterCreate(33, ModelManagementComponent_Conditional_2_Conditional_20_Case_1_For_34_Template, 25, 22, "tr", null, _forTrack0);
|
|
491
337
|
i0.ɵɵelementEnd()()();
|
|
492
338
|
} if (rf & 2) {
|
|
493
339
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
@@ -506,34 +352,34 @@ function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template(r
|
|
|
506
352
|
i0.ɵɵadvance(9);
|
|
507
353
|
i0.ɵɵrepeater(ctx_r0.filteredModels);
|
|
508
354
|
} }
|
|
509
|
-
function
|
|
510
|
-
i0.ɵɵconditionalCreate(0,
|
|
355
|
+
function ModelManagementComponent_Conditional_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
356
|
+
i0.ɵɵconditionalCreate(0, ModelManagementComponent_Conditional_2_Conditional_20_Case_0_Template, 3, 0, "div", 25)(1, ModelManagementComponent_Conditional_2_Conditional_20_Case_1_Template, 35, 24, "div", 26);
|
|
511
357
|
} if (rf & 2) {
|
|
512
358
|
let tmp_2_0;
|
|
513
359
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
514
360
|
i0.ɵɵconditional((tmp_2_0 = ctx_r0.viewMode) === "grid" ? 0 : tmp_2_0 === "list" ? 1 : -1);
|
|
515
361
|
} }
|
|
516
|
-
function
|
|
517
|
-
const
|
|
518
|
-
i0.ɵɵelementStart(0, "div",
|
|
519
|
-
i0.ɵɵlistener("click", function
|
|
362
|
+
function ModelManagementComponent_Conditional_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
363
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
364
|
+
i0.ɵɵelementStart(0, "div", 62);
|
|
365
|
+
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_21_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.closeDetailPanel()); });
|
|
520
366
|
i0.ɵɵelementEnd();
|
|
521
367
|
} }
|
|
522
|
-
function
|
|
523
|
-
i0.ɵɵelementStart(0, "span",
|
|
524
|
-
i0.ɵɵelement(1, "i",
|
|
368
|
+
function ModelManagementComponent_Conditional_2_Conditional_23_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
369
|
+
i0.ɵɵelementStart(0, "span", 73);
|
|
370
|
+
i0.ɵɵelement(1, "i", 48);
|
|
525
371
|
i0.ɵɵtext(2, " Active ");
|
|
526
372
|
i0.ɵɵelementEnd();
|
|
527
373
|
} }
|
|
528
|
-
function
|
|
529
|
-
i0.ɵɵelementStart(0, "span",
|
|
530
|
-
i0.ɵɵelement(1, "i",
|
|
374
|
+
function ModelManagementComponent_Conditional_2_Conditional_23_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
375
|
+
i0.ɵɵelementStart(0, "span", 74);
|
|
376
|
+
i0.ɵɵelement(1, "i", 48);
|
|
531
377
|
i0.ɵɵtext(2, " Inactive ");
|
|
532
378
|
i0.ɵɵelementEnd();
|
|
533
379
|
} }
|
|
534
|
-
function
|
|
535
|
-
i0.ɵɵelementStart(0, "span",
|
|
536
|
-
i0.ɵɵelement(1, "i",
|
|
380
|
+
function ModelManagementComponent_Conditional_2_Conditional_23_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
381
|
+
i0.ɵɵelementStart(0, "span", 75);
|
|
382
|
+
i0.ɵɵelement(1, "i", 47);
|
|
537
383
|
i0.ɵɵtext(2);
|
|
538
384
|
i0.ɵɵelementEnd();
|
|
539
385
|
} if (rf & 2) {
|
|
@@ -541,12 +387,12 @@ function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_16_Te
|
|
|
541
387
|
i0.ɵɵadvance(2);
|
|
542
388
|
i0.ɵɵtextInterpolate1(" ", ctx_r0.selectedModel.AIModelType, " ");
|
|
543
389
|
} }
|
|
544
|
-
function
|
|
545
|
-
i0.ɵɵelementStart(0, "div",
|
|
546
|
-
i0.ɵɵelement(2, "i",
|
|
390
|
+
function ModelManagementComponent_Conditional_2_Conditional_23_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
391
|
+
i0.ɵɵelementStart(0, "div", 71)(1, "h4", 76);
|
|
392
|
+
i0.ɵɵelement(2, "i", 88);
|
|
547
393
|
i0.ɵɵtext(3, " Description ");
|
|
548
394
|
i0.ɵɵelementEnd();
|
|
549
|
-
i0.ɵɵelementStart(4, "p",
|
|
395
|
+
i0.ɵɵelementStart(4, "p", 89);
|
|
550
396
|
i0.ɵɵtext(5);
|
|
551
397
|
i0.ɵɵelementEnd()();
|
|
552
398
|
} if (rf & 2) {
|
|
@@ -554,11 +400,11 @@ function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_17_Te
|
|
|
554
400
|
i0.ɵɵadvance(5);
|
|
555
401
|
i0.ɵɵtextInterpolate(ctx_r0.selectedModel.Description);
|
|
556
402
|
} }
|
|
557
|
-
function
|
|
558
|
-
i0.ɵɵelementStart(0, "div",
|
|
403
|
+
function ModelManagementComponent_Conditional_2_Conditional_23_Conditional_53_Template(rf, ctx) { if (rf & 1) {
|
|
404
|
+
i0.ɵɵelementStart(0, "div", 79)(1, "span", 80);
|
|
559
405
|
i0.ɵɵtext(2, "API Name");
|
|
560
406
|
i0.ɵɵelementEnd();
|
|
561
|
-
i0.ɵɵelementStart(3, "span",
|
|
407
|
+
i0.ɵɵelementStart(3, "span", 83);
|
|
562
408
|
i0.ɵɵtext(4);
|
|
563
409
|
i0.ɵɵelementEnd()();
|
|
564
410
|
} if (rf & 2) {
|
|
@@ -566,11 +412,11 @@ function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_53_Te
|
|
|
566
412
|
i0.ɵɵadvance(4);
|
|
567
413
|
i0.ɵɵtextInterpolate(ctx_r0.selectedModel.APIName);
|
|
568
414
|
} }
|
|
569
|
-
function
|
|
570
|
-
i0.ɵɵelementStart(0, "div",
|
|
415
|
+
function ModelManagementComponent_Conditional_2_Conditional_23_Conditional_54_Template(rf, ctx) { if (rf & 1) {
|
|
416
|
+
i0.ɵɵelementStart(0, "div", 79)(1, "span", 80);
|
|
571
417
|
i0.ɵɵtext(2, "Input Token Limit");
|
|
572
418
|
i0.ɵɵelementEnd();
|
|
573
|
-
i0.ɵɵelementStart(3, "span",
|
|
419
|
+
i0.ɵɵelementStart(3, "span", 83);
|
|
574
420
|
i0.ɵɵtext(4);
|
|
575
421
|
i0.ɵɵelementEnd()();
|
|
576
422
|
} if (rf & 2) {
|
|
@@ -578,11 +424,11 @@ function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_54_Te
|
|
|
578
424
|
i0.ɵɵadvance(4);
|
|
579
425
|
i0.ɵɵtextInterpolate(ctx_r0.formatTokenLimit(ctx_r0.selectedModel.InputTokenLimit));
|
|
580
426
|
} }
|
|
581
|
-
function
|
|
582
|
-
i0.ɵɵelementStart(0, "div",
|
|
427
|
+
function ModelManagementComponent_Conditional_2_Conditional_23_Conditional_55_Template(rf, ctx) { if (rf & 1) {
|
|
428
|
+
i0.ɵɵelementStart(0, "div", 79)(1, "span", 80);
|
|
583
429
|
i0.ɵɵtext(2, "Response Formats");
|
|
584
430
|
i0.ɵɵelementEnd();
|
|
585
|
-
i0.ɵɵelementStart(3, "span",
|
|
431
|
+
i0.ɵɵelementStart(3, "span", 83);
|
|
586
432
|
i0.ɵɵtext(4);
|
|
587
433
|
i0.ɵɵelementEnd()();
|
|
588
434
|
} if (rf & 2) {
|
|
@@ -590,19 +436,19 @@ function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_55_Te
|
|
|
590
436
|
i0.ɵɵadvance(4);
|
|
591
437
|
i0.ɵɵtextInterpolate(ctx_r0.selectedModel.SupportedResponseFormats);
|
|
592
438
|
} }
|
|
593
|
-
function
|
|
594
|
-
i0.ɵɵelementStart(0, "div",
|
|
439
|
+
function ModelManagementComponent_Conditional_2_Conditional_23_Conditional_56_Template(rf, ctx) { if (rf & 1) {
|
|
440
|
+
i0.ɵɵelementStart(0, "div", 79)(1, "span", 80);
|
|
595
441
|
i0.ɵɵtext(2, "Supports Effort Level");
|
|
596
442
|
i0.ɵɵelementEnd();
|
|
597
|
-
i0.ɵɵelementStart(3, "span",
|
|
443
|
+
i0.ɵɵelementStart(3, "span", 83);
|
|
598
444
|
i0.ɵɵtext(4, "Yes");
|
|
599
445
|
i0.ɵɵelementEnd()();
|
|
600
446
|
} }
|
|
601
|
-
function
|
|
602
|
-
i0.ɵɵelementStart(0, "div",
|
|
447
|
+
function ModelManagementComponent_Conditional_2_Conditional_23_Conditional_57_Template(rf, ctx) { if (rf & 1) {
|
|
448
|
+
i0.ɵɵelementStart(0, "div", 79)(1, "span", 80);
|
|
603
449
|
i0.ɵɵtext(2, "Driver Class");
|
|
604
450
|
i0.ɵɵelementEnd();
|
|
605
|
-
i0.ɵɵelementStart(3, "span",
|
|
451
|
+
i0.ɵɵelementStart(3, "span", 83);
|
|
606
452
|
i0.ɵɵtext(4);
|
|
607
453
|
i0.ɵɵelementEnd()();
|
|
608
454
|
} if (rf & 2) {
|
|
@@ -610,91 +456,91 @@ function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_57_Te
|
|
|
610
456
|
i0.ɵɵadvance(4);
|
|
611
457
|
i0.ɵɵtextInterpolate(ctx_r0.selectedModel.DriverClass);
|
|
612
458
|
} }
|
|
613
|
-
function
|
|
614
|
-
const
|
|
615
|
-
i0.ɵɵelementStart(0, "div",
|
|
459
|
+
function ModelManagementComponent_Conditional_2_Conditional_23_Template(rf, ctx) { if (rf & 1) {
|
|
460
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
461
|
+
i0.ɵɵelementStart(0, "div", 63)(1, "div", 64)(2, "div", 65);
|
|
616
462
|
i0.ɵɵelement(3, "i");
|
|
617
463
|
i0.ɵɵelementEnd();
|
|
618
|
-
i0.ɵɵelementStart(4, "div",
|
|
464
|
+
i0.ɵɵelementStart(4, "div", 66)(5, "h3");
|
|
619
465
|
i0.ɵɵtext(6);
|
|
620
466
|
i0.ɵɵelementEnd();
|
|
621
|
-
i0.ɵɵelementStart(7, "span",
|
|
467
|
+
i0.ɵɵelementStart(7, "span", 67);
|
|
622
468
|
i0.ɵɵtext(8);
|
|
623
469
|
i0.ɵɵelementEnd()()();
|
|
624
|
-
i0.ɵɵelementStart(9, "button",
|
|
625
|
-
i0.ɵɵlistener("click", function
|
|
626
|
-
i0.ɵɵelement(10, "i",
|
|
470
|
+
i0.ɵɵelementStart(9, "button", 68);
|
|
471
|
+
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_23_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.closeDetailPanel()); });
|
|
472
|
+
i0.ɵɵelement(10, "i", 69);
|
|
627
473
|
i0.ɵɵelementEnd()();
|
|
628
|
-
i0.ɵɵelementStart(11, "div",
|
|
629
|
-
i0.ɵɵconditionalCreate(14,
|
|
630
|
-
i0.ɵɵconditionalCreate(16,
|
|
474
|
+
i0.ɵɵelementStart(11, "div", 70)(12, "div", 71)(13, "div", 72);
|
|
475
|
+
i0.ɵɵconditionalCreate(14, ModelManagementComponent_Conditional_2_Conditional_23_Conditional_14_Template, 3, 0, "span", 73)(15, ModelManagementComponent_Conditional_2_Conditional_23_Conditional_15_Template, 3, 0, "span", 74);
|
|
476
|
+
i0.ɵɵconditionalCreate(16, ModelManagementComponent_Conditional_2_Conditional_23_Conditional_16_Template, 3, 1, "span", 75);
|
|
631
477
|
i0.ɵɵelementEnd()();
|
|
632
|
-
i0.ɵɵconditionalCreate(17,
|
|
633
|
-
i0.ɵɵelementStart(18, "div",
|
|
634
|
-
i0.ɵɵelement(20, "i",
|
|
478
|
+
i0.ɵɵconditionalCreate(17, ModelManagementComponent_Conditional_2_Conditional_23_Conditional_17_Template, 6, 1, "div", 71);
|
|
479
|
+
i0.ɵɵelementStart(18, "div", 71)(19, "h4", 76);
|
|
480
|
+
i0.ɵɵelement(20, "i", 77);
|
|
635
481
|
i0.ɵɵtext(21, " Rankings ");
|
|
636
482
|
i0.ɵɵelementEnd();
|
|
637
|
-
i0.ɵɵelementStart(22, "div",
|
|
483
|
+
i0.ɵɵelementStart(22, "div", 78)(23, "div", 79)(24, "span", 80);
|
|
638
484
|
i0.ɵɵtext(25, "Power Rank");
|
|
639
485
|
i0.ɵɵelementEnd();
|
|
640
|
-
i0.ɵɵelementStart(26, "span",
|
|
486
|
+
i0.ɵɵelementStart(26, "span", 81);
|
|
641
487
|
i0.ɵɵtext(27);
|
|
642
488
|
i0.ɵɵelementEnd()();
|
|
643
|
-
i0.ɵɵelementStart(28, "div",
|
|
489
|
+
i0.ɵɵelementStart(28, "div", 79)(29, "span", 80);
|
|
644
490
|
i0.ɵɵtext(30, "Speed Rank");
|
|
645
491
|
i0.ɵɵelementEnd();
|
|
646
|
-
i0.ɵɵelementStart(31, "span",
|
|
492
|
+
i0.ɵɵelementStart(31, "span", 81);
|
|
647
493
|
i0.ɵɵtext(32);
|
|
648
494
|
i0.ɵɵelementEnd()();
|
|
649
|
-
i0.ɵɵelementStart(33, "div",
|
|
495
|
+
i0.ɵɵelementStart(33, "div", 79)(34, "span", 80);
|
|
650
496
|
i0.ɵɵtext(35, "Cost Rank");
|
|
651
497
|
i0.ɵɵelementEnd();
|
|
652
|
-
i0.ɵɵelementStart(36, "span",
|
|
498
|
+
i0.ɵɵelementStart(36, "span", 81);
|
|
653
499
|
i0.ɵɵtext(37);
|
|
654
500
|
i0.ɵɵelementEnd()()()();
|
|
655
|
-
i0.ɵɵelementStart(38, "div",
|
|
656
|
-
i0.ɵɵelement(40, "i",
|
|
501
|
+
i0.ɵɵelementStart(38, "div", 71)(39, "h4", 76);
|
|
502
|
+
i0.ɵɵelement(40, "i", 82);
|
|
657
503
|
i0.ɵɵtext(41, " Configuration ");
|
|
658
504
|
i0.ɵɵelementEnd();
|
|
659
|
-
i0.ɵɵelementStart(42, "div",
|
|
505
|
+
i0.ɵɵelementStart(42, "div", 78)(43, "div", 79)(44, "span", 80);
|
|
660
506
|
i0.ɵɵtext(45, "Vendor");
|
|
661
507
|
i0.ɵɵelementEnd();
|
|
662
|
-
i0.ɵɵelementStart(46, "span",
|
|
508
|
+
i0.ɵɵelementStart(46, "span", 83);
|
|
663
509
|
i0.ɵɵtext(47);
|
|
664
510
|
i0.ɵɵelementEnd()();
|
|
665
|
-
i0.ɵɵelementStart(48, "div",
|
|
511
|
+
i0.ɵɵelementStart(48, "div", 79)(49, "span", 80);
|
|
666
512
|
i0.ɵɵtext(50, "Model Type");
|
|
667
513
|
i0.ɵɵelementEnd();
|
|
668
|
-
i0.ɵɵelementStart(51, "span",
|
|
514
|
+
i0.ɵɵelementStart(51, "span", 83);
|
|
669
515
|
i0.ɵɵtext(52);
|
|
670
516
|
i0.ɵɵelementEnd()();
|
|
671
|
-
i0.ɵɵconditionalCreate(53,
|
|
672
|
-
i0.ɵɵconditionalCreate(54,
|
|
673
|
-
i0.ɵɵconditionalCreate(55,
|
|
674
|
-
i0.ɵɵconditionalCreate(56,
|
|
675
|
-
i0.ɵɵconditionalCreate(57,
|
|
517
|
+
i0.ɵɵconditionalCreate(53, ModelManagementComponent_Conditional_2_Conditional_23_Conditional_53_Template, 5, 1, "div", 79);
|
|
518
|
+
i0.ɵɵconditionalCreate(54, ModelManagementComponent_Conditional_2_Conditional_23_Conditional_54_Template, 5, 1, "div", 79);
|
|
519
|
+
i0.ɵɵconditionalCreate(55, ModelManagementComponent_Conditional_2_Conditional_23_Conditional_55_Template, 5, 1, "div", 79);
|
|
520
|
+
i0.ɵɵconditionalCreate(56, ModelManagementComponent_Conditional_2_Conditional_23_Conditional_56_Template, 5, 0, "div", 79);
|
|
521
|
+
i0.ɵɵconditionalCreate(57, ModelManagementComponent_Conditional_2_Conditional_23_Conditional_57_Template, 5, 1, "div", 79);
|
|
676
522
|
i0.ɵɵelementEnd()();
|
|
677
|
-
i0.ɵɵelementStart(58, "div",
|
|
678
|
-
i0.ɵɵelement(60, "i",
|
|
523
|
+
i0.ɵɵelementStart(58, "div", 71)(59, "h4", 76);
|
|
524
|
+
i0.ɵɵelement(60, "i", 84);
|
|
679
525
|
i0.ɵɵtext(61, " Timestamps ");
|
|
680
526
|
i0.ɵɵelementEnd();
|
|
681
|
-
i0.ɵɵelementStart(62, "div",
|
|
527
|
+
i0.ɵɵelementStart(62, "div", 78)(63, "div", 79)(64, "span", 80);
|
|
682
528
|
i0.ɵɵtext(65, "Created");
|
|
683
529
|
i0.ɵɵelementEnd();
|
|
684
|
-
i0.ɵɵelementStart(66, "span",
|
|
530
|
+
i0.ɵɵelementStart(66, "span", 83);
|
|
685
531
|
i0.ɵɵtext(67);
|
|
686
532
|
i0.ɵɵpipe(68, "date");
|
|
687
533
|
i0.ɵɵelementEnd()();
|
|
688
|
-
i0.ɵɵelementStart(69, "div",
|
|
534
|
+
i0.ɵɵelementStart(69, "div", 79)(70, "span", 80);
|
|
689
535
|
i0.ɵɵtext(71, "Updated");
|
|
690
536
|
i0.ɵɵelementEnd();
|
|
691
|
-
i0.ɵɵelementStart(72, "span",
|
|
537
|
+
i0.ɵɵelementStart(72, "span", 83);
|
|
692
538
|
i0.ɵɵtext(73);
|
|
693
539
|
i0.ɵɵpipe(74, "date");
|
|
694
540
|
i0.ɵɵelementEnd()()()()();
|
|
695
|
-
i0.ɵɵelementStart(75, "div",
|
|
696
|
-
i0.ɵɵlistener("click", function
|
|
697
|
-
i0.ɵɵelement(77, "i",
|
|
541
|
+
i0.ɵɵelementStart(75, "div", 85)(76, "button", 86);
|
|
542
|
+
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_23_Template_button_click_76_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openModelFromPanel()); });
|
|
543
|
+
i0.ɵɵelement(77, "i", 87);
|
|
698
544
|
i0.ɵɵtext(78, " Open Full Record ");
|
|
699
545
|
i0.ɵɵelementEnd()();
|
|
700
546
|
} if (rf & 2) {
|
|
@@ -744,60 +590,70 @@ function ModelManagementComponent_Conditional_2_Conditional_28_Template(rf, ctx)
|
|
|
744
590
|
} }
|
|
745
591
|
function ModelManagementComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
746
592
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
747
|
-
i0.ɵɵelementStart(0, "
|
|
748
|
-
i0.ɵɵelement(
|
|
749
|
-
i0.ɵɵ
|
|
750
|
-
i0.ɵɵ
|
|
751
|
-
i0.ɵɵ
|
|
752
|
-
i0.ɵɵ
|
|
753
|
-
i0.ɵɵ
|
|
754
|
-
i0.ɵɵ
|
|
755
|
-
i0.ɵɵ
|
|
756
|
-
i0.ɵɵ
|
|
757
|
-
i0.ɵɵ
|
|
758
|
-
i0.ɵɵ
|
|
759
|
-
i0.ɵɵ
|
|
760
|
-
i0.ɵɵ
|
|
761
|
-
i0.ɵɵ
|
|
593
|
+
i0.ɵɵelementStart(0, "mj-page-header", 2)(1, "div", 3);
|
|
594
|
+
i0.ɵɵelement(2, "mj-stat-badge", 4);
|
|
595
|
+
i0.ɵɵelementEnd();
|
|
596
|
+
i0.ɵɵelementStart(3, "div", 5)(4, "mj-filter-popover", 6);
|
|
597
|
+
i0.ɵɵlistener("ClearAllRequested", function ModelManagementComponent_Conditional_2_Template_mj_filter_popover_ClearAllRequested_4_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.resetPopoverFilters()); });
|
|
598
|
+
i0.ɵɵelementStart(5, "mj-filter-panel", 7);
|
|
599
|
+
i0.ɵɵlistener("ValuesChange", function ModelManagementComponent_Conditional_2_Template_mj_filter_panel_ValuesChange_5_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onFilterValuesChange($event)); })("Reset", function ModelManagementComponent_Conditional_2_Template_mj_filter_panel_Reset_5_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.resetPopoverFilters()); });
|
|
600
|
+
i0.ɵɵelementStart(6, "mj-filter-field", 8)(7, "div", 9)(8, "input", 10);
|
|
601
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ModelManagementComponent_Conditional_2_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.powerRankRange.min, $event) || (ctx_r0.powerRankRange.min = $event); return i0.ɵɵresetView($event); });
|
|
602
|
+
i0.ɵɵlistener("change", function ModelManagementComponent_Conditional_2_Template_input_change_8_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.validateAndApplyRankFilters("power")); });
|
|
603
|
+
i0.ɵɵelementEnd();
|
|
604
|
+
i0.ɵɵelementStart(9, "span", 11);
|
|
605
|
+
i0.ɵɵtext(10, "-");
|
|
606
|
+
i0.ɵɵelementEnd();
|
|
607
|
+
i0.ɵɵelementStart(11, "input", 12);
|
|
608
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ModelManagementComponent_Conditional_2_Template_input_ngModelChange_11_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.powerRankRange.max, $event) || (ctx_r0.powerRankRange.max = $event); return i0.ɵɵresetView($event); });
|
|
609
|
+
i0.ɵɵlistener("change", function ModelManagementComponent_Conditional_2_Template_input_change_11_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.validateAndApplyRankFilters("power")); });
|
|
610
|
+
i0.ɵɵelementEnd()()()()();
|
|
611
|
+
i0.ɵɵelementStart(12, "mj-view-toggle", 13);
|
|
612
|
+
i0.ɵɵlistener("KeyChange", function ModelManagementComponent_Conditional_2_Template_mj_view_toggle_KeyChange_12_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setViewMode($event)); });
|
|
762
613
|
i0.ɵɵelementEnd();
|
|
763
|
-
i0.ɵɵelementStart(
|
|
764
|
-
i0.ɵɵlistener("click", function
|
|
765
|
-
i0.ɵɵelement(
|
|
614
|
+
i0.ɵɵelementStart(13, "button", 14);
|
|
615
|
+
i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.createNewModel()); });
|
|
616
|
+
i0.ɵɵelement(14, "i", 15);
|
|
617
|
+
i0.ɵɵtext(15, " New Model ");
|
|
766
618
|
i0.ɵɵelementEnd()();
|
|
767
|
-
i0.ɵɵelementStart(
|
|
768
|
-
i0.ɵɵlistener("
|
|
769
|
-
i0.ɵɵelement(18, "i", 17);
|
|
770
|
-
i0.ɵɵtext(19, " New Model ");
|
|
771
|
-
i0.ɵɵelementEnd()()();
|
|
772
|
-
i0.ɵɵelementStart(20, "as-split", 18);
|
|
773
|
-
i0.ɵɵconditionalCreate(21, ModelManagementComponent_Conditional_2_Conditional_21_Template, 67, 14, "as-split-area", 19);
|
|
774
|
-
i0.ɵɵelementStart(22, "as-split-area")(23, "div", 20);
|
|
775
|
-
i0.ɵɵconditionalCreate(24, ModelManagementComponent_Conditional_2_Conditional_24_Template, 7, 2, "div", 21)(25, ModelManagementComponent_Conditional_2_Conditional_25_Template, 2, 1);
|
|
619
|
+
i0.ɵɵelementStart(16, "div", 16)(17, "mj-page-search", 17);
|
|
620
|
+
i0.ɵɵlistener("ValueChange", function ModelManagementComponent_Conditional_2_Template_mj_page_search_ValueChange_17_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onSearchChange($event)); });
|
|
776
621
|
i0.ɵɵelementEnd()()();
|
|
777
|
-
i0.ɵɵ
|
|
778
|
-
i0.ɵɵ
|
|
779
|
-
i0.ɵɵ
|
|
622
|
+
i0.ɵɵelementStart(18, "mj-page-body", 18);
|
|
623
|
+
i0.ɵɵconditionalCreate(19, ModelManagementComponent_Conditional_2_Conditional_19_Template, 7, 2, "div", 19)(20, ModelManagementComponent_Conditional_2_Conditional_20_Template, 2, 1);
|
|
624
|
+
i0.ɵɵelementEnd();
|
|
625
|
+
i0.ɵɵconditionalCreate(21, ModelManagementComponent_Conditional_2_Conditional_21_Template, 1, 0, "div", 20);
|
|
626
|
+
i0.ɵɵelementStart(22, "div", 21);
|
|
627
|
+
i0.ɵɵconditionalCreate(23, ModelManagementComponent_Conditional_2_Conditional_23_Template, 79, 31);
|
|
780
628
|
i0.ɵɵelementEnd();
|
|
781
629
|
} if (rf & 2) {
|
|
782
630
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
783
|
-
i0.ɵɵadvance(7);
|
|
784
|
-
i0.ɵɵconditional(ctx_r0.showFilters ? 7 : 8);
|
|
785
|
-
i0.ɵɵadvance(3);
|
|
786
|
-
i0.ɵɵtextInterpolate1("", ctx_r0.filteredModels.length, " models");
|
|
787
|
-
i0.ɵɵadvance(3);
|
|
788
|
-
i0.ɵɵclassProp("active", ctx_r0.viewMode === "grid");
|
|
789
631
|
i0.ɵɵadvance(2);
|
|
790
|
-
i0.ɵɵ
|
|
791
|
-
i0.ɵɵadvance(
|
|
792
|
-
i0.ɵɵ
|
|
632
|
+
i0.ɵɵproperty("Count", ctx_r0.filteredModels.length);
|
|
633
|
+
i0.ɵɵadvance(2);
|
|
634
|
+
i0.ɵɵproperty("ActiveCount", ctx_r0.ActiveFilterCount)("ShowClearAll", ctx_r0.ActiveFilterCount > 0);
|
|
635
|
+
i0.ɵɵadvance();
|
|
636
|
+
i0.ɵɵproperty("Fields", ctx_r0.modelFilterFields)("Values", ctx_r0.modelFilterValues);
|
|
637
|
+
i0.ɵɵadvance(3);
|
|
638
|
+
i0.ɵɵproperty("max", ctx_r0.maxPowerRank);
|
|
639
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.powerRankRange.min);
|
|
793
640
|
i0.ɵɵadvance(3);
|
|
794
|
-
i0.ɵɵ
|
|
641
|
+
i0.ɵɵproperty("max", ctx_r0.maxPowerRank);
|
|
642
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.powerRankRange.max);
|
|
643
|
+
i0.ɵɵadvance();
|
|
644
|
+
i0.ɵɵproperty("Options", ctx_r0.modelViewOptions)("ActiveKey", ctx_r0.viewMode);
|
|
645
|
+
i0.ɵɵadvance(5);
|
|
646
|
+
i0.ɵɵproperty("Value", ctx_r0.searchTerm);
|
|
647
|
+
i0.ɵɵadvance();
|
|
648
|
+
i0.ɵɵproperty("Flex", true);
|
|
649
|
+
i0.ɵɵadvance();
|
|
650
|
+
i0.ɵɵconditional(ctx_r0.filteredModels.length === 0 ? 19 : 20);
|
|
795
651
|
i0.ɵɵadvance(2);
|
|
796
|
-
i0.ɵɵconditional(ctx_r0.detailPanelVisible ?
|
|
652
|
+
i0.ɵɵconditional(ctx_r0.detailPanelVisible ? 21 : -1);
|
|
797
653
|
i0.ɵɵadvance();
|
|
798
654
|
i0.ɵɵclassProp("visible", ctx_r0.detailPanelVisible);
|
|
799
655
|
i0.ɵɵadvance();
|
|
800
|
-
i0.ɵɵconditional(ctx_r0.selectedModel ?
|
|
656
|
+
i0.ɵɵconditional(ctx_r0.selectedModel ? 23 : -1);
|
|
801
657
|
} }
|
|
802
658
|
/**
|
|
803
659
|
* AI Models Resource - displays AI model management
|
|
@@ -1380,6 +1236,95 @@ let ModelManagementComponent = class ModelManagementComponent extends BaseResour
|
|
|
1380
1236
|
this.applyFilters();
|
|
1381
1237
|
this.saveUserPreferencesDebounced();
|
|
1382
1238
|
}
|
|
1239
|
+
/** Reset only the popover filters — leave searchTerm (toolbar) untouched. */
|
|
1240
|
+
resetPopoverFilters() {
|
|
1241
|
+
this.selectedVendor = 'all';
|
|
1242
|
+
this.selectedType = 'all';
|
|
1243
|
+
this.selectedStatus = 'all';
|
|
1244
|
+
this.powerRankRange = { min: 0, max: this.maxPowerRank };
|
|
1245
|
+
this.applyFilters();
|
|
1246
|
+
this.saveUserPreferencesDebounced();
|
|
1247
|
+
}
|
|
1248
|
+
/** Number of active filter criteria inside the popover (excludes searchTerm + sortBy). */
|
|
1249
|
+
get ActiveFilterCount() {
|
|
1250
|
+
let n = 0;
|
|
1251
|
+
if (this.selectedVendor && this.selectedVendor !== 'all')
|
|
1252
|
+
n++;
|
|
1253
|
+
if (this.selectedType && this.selectedType !== 'all')
|
|
1254
|
+
n++;
|
|
1255
|
+
if (this.selectedStatus && this.selectedStatus !== 'all')
|
|
1256
|
+
n++;
|
|
1257
|
+
if (this.powerRankRange.min > 0 || this.powerRankRange.max < this.maxPowerRank)
|
|
1258
|
+
n++;
|
|
1259
|
+
return n;
|
|
1260
|
+
}
|
|
1261
|
+
/** View-mode options for the shared <mj-view-toggle>. */
|
|
1262
|
+
modelViewOptions = [
|
|
1263
|
+
{ key: 'grid', icon: 'fa-solid fa-grip', title: 'Grid View' },
|
|
1264
|
+
{ key: 'list', icon: 'fa-solid fa-list', title: 'List View' },
|
|
1265
|
+
];
|
|
1266
|
+
/** Values record consumed by the centralized <mj-filter-panel>. */
|
|
1267
|
+
get modelFilterValues() {
|
|
1268
|
+
return {
|
|
1269
|
+
sortBy: this.sortBy,
|
|
1270
|
+
selectedVendor: this.selectedVendor,
|
|
1271
|
+
selectedType: this.selectedType,
|
|
1272
|
+
selectedStatus: this.selectedStatus,
|
|
1273
|
+
};
|
|
1274
|
+
}
|
|
1275
|
+
/** Field config consumed by the centralized <mj-filter-panel>. */
|
|
1276
|
+
get modelFilterFields() {
|
|
1277
|
+
return [
|
|
1278
|
+
{
|
|
1279
|
+
key: 'sortBy',
|
|
1280
|
+
type: 'dropdown',
|
|
1281
|
+
label: 'Sort By',
|
|
1282
|
+
icon: 'fa-solid fa-sort',
|
|
1283
|
+
options: this.sortOptions.map(o => ({ text: o.label, value: o.value })),
|
|
1284
|
+
},
|
|
1285
|
+
{
|
|
1286
|
+
key: 'selectedVendor',
|
|
1287
|
+
type: 'dropdown',
|
|
1288
|
+
label: 'Vendor',
|
|
1289
|
+
icon: 'fa-solid fa-building',
|
|
1290
|
+
filterable: this.vendors.length > 10,
|
|
1291
|
+
options: [
|
|
1292
|
+
{ text: 'All Vendors', value: 'all' },
|
|
1293
|
+
...this.vendors.map(v => ({ text: v.Name ?? '', value: v.ID })),
|
|
1294
|
+
],
|
|
1295
|
+
},
|
|
1296
|
+
{
|
|
1297
|
+
key: 'selectedType',
|
|
1298
|
+
type: 'dropdown',
|
|
1299
|
+
label: 'Type',
|
|
1300
|
+
icon: 'fa-solid fa-microchip',
|
|
1301
|
+
options: [
|
|
1302
|
+
{ text: 'All Types', value: 'all' },
|
|
1303
|
+
...this.modelTypes.map(t => ({ text: t.Name ?? '', value: t.ID })),
|
|
1304
|
+
],
|
|
1305
|
+
},
|
|
1306
|
+
{
|
|
1307
|
+
key: 'selectedStatus',
|
|
1308
|
+
type: 'dropdown',
|
|
1309
|
+
label: 'Status',
|
|
1310
|
+
icon: 'fa-solid fa-toggle-on',
|
|
1311
|
+
options: [
|
|
1312
|
+
{ text: 'All Statuses', value: 'all' },
|
|
1313
|
+
{ text: 'Active', value: 'active' },
|
|
1314
|
+
{ text: 'Inactive', value: 'inactive' },
|
|
1315
|
+
],
|
|
1316
|
+
},
|
|
1317
|
+
];
|
|
1318
|
+
}
|
|
1319
|
+
/** Receive the updated values record from <mj-filter-panel> and apply it. */
|
|
1320
|
+
onFilterValuesChange(values) {
|
|
1321
|
+
this.sortBy = values['sortBy'] ?? this.sortBy;
|
|
1322
|
+
this.selectedVendor = values['selectedVendor'] ?? 'all';
|
|
1323
|
+
this.selectedType = values['selectedType'] ?? 'all';
|
|
1324
|
+
this.selectedStatus = values['selectedStatus'] ?? 'all';
|
|
1325
|
+
this.applyFilters();
|
|
1326
|
+
this.saveUserPreferencesDebounced();
|
|
1327
|
+
}
|
|
1383
1328
|
formatTokenLimit(limit) {
|
|
1384
1329
|
if (limit >= 1000000) {
|
|
1385
1330
|
return Math.floor(limit / 1000000) + 'M';
|
|
@@ -1418,14 +1363,14 @@ let ModelManagementComponent = class ModelManagementComponent extends BaseResour
|
|
|
1418
1363
|
return 'fa-solid fa-microchip';
|
|
1419
1364
|
}
|
|
1420
1365
|
static ɵfac = function ModelManagementComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ModelManagementComponent)(i0.ɵɵdirectiveInject(i1.SharedService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
1421
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ModelManagementComponent, selectors: [["app-model-management"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [[1, "
|
|
1422
|
-
i0.ɵɵelementStart(0, "
|
|
1423
|
-
i0.ɵɵconditionalCreate(1, ModelManagementComponent_Conditional_1_Template, 2, 1, "div",
|
|
1366
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ModelManagementComponent, selectors: [["app-model-management"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [[1, "loading-container"], ["size", "large", 3, "text"], ["Title", "Models", "Icon", "fa-solid fa-microchip"], ["meta", ""], ["Label", "models", 3, "Count"], ["actions", ""], [3, "ClearAllRequested", "ActiveCount", "ShowClearAll"], [3, "ValuesChange", "Reset", "Fields", "Values"], ["Label", "Power Rank", "Icon", "fa-solid fa-bolt"], [1, "rank-filter-inputs"], ["type", "number", "min", "0", "placeholder", "Min", 1, "rank-input", 3, "ngModelChange", "change", "max", "ngModel"], [1, "rank-separator"], ["type", "number", "min", "0", "placeholder", "Max", 1, "rank-input", 3, "ngModelChange", "change", "max", "ngModel"], [3, "KeyChange", "Options", "ActiveKey"], ["mjButton", "", "variant", "primary", "size", "sm", "title", "Create New Model", 3, "click"], [1, "fa-solid", "fa-plus"], ["toolbar", ""], ["Placeholder", "Search models...", 3, "ValueChange", "Value"], [3, "Flex"], [1, "empty-state"], [1, "detail-panel-overlay"], [1, "detail-panel"], [1, "fa-solid", "fa-microchip", "fa-4x"], [1, "primary-action"], [1, "primary-action", 3, "click"], [1, "model-grid"], [1, "model-list"], [1, "model-card", 3, "expanded"], [1, "model-card"], [1, "card-header", 3, "click"], [1, "model-info"], [1, "model-icon"], [1, "model-details"], [1, "model-name", 3, "innerHTML"], [1, "model-meta"], [1, "meta-item"], [1, "meta-item", "status-active"], [1, "meta-item", "status-inactive"], [1, "fa-solid", "fa-chevron-down", "expand-icon"], [1, "card-body"], [1, "model-description", 3, "innerHTML"], [1, "model-description", "text-muted"], [1, "expanded-content"], [1, "card-actions"], ["type", "button", "title", "View Details", 1, "action-btn", 3, "click"], [1, "fa-solid", "fa-eye"], [1, "fa-solid", "fa-building"], [1, "fa-solid", "fa-microchip"], [1, "fa-solid", "fa-circle", 2, "font-size", "8px"], [1, "model-stats"], [1, "stat-item"], [1, "stat-label"], [1, "stat-value"], [1, "data-table"], [3, "click"], [1, "sort-header"], [1, "fa-solid", "fa-chevron-up", "sort-icon"], [1, "name-cell"], [3, "innerHTML"], [1, "rank-badge"], [1, "status-badge"], ["title", "View Details", 1, "action-button", "small", 3, "click"], [1, "detail-panel-overlay", 3, "click"], [1, "detail-panel-header"], [1, "detail-panel-title"], [1, "detail-icon"], [1, "detail-title-info"], [1, "detail-subtitle"], [1, "detail-panel-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "detail-panel-content"], [1, "detail-section"], [1, "detail-badges"], [1, "status-badge", "status-active"], [1, "status-badge", "status-inactive"], [1, "feature-badge"], [1, "detail-section-title"], [1, "fa-solid", "fa-chart-bar"], [1, "detail-grid"], [1, "detail-item"], [1, "detail-label"], [1, "detail-value", "rank-badge"], [1, "fa-solid", "fa-cog"], [1, "detail-value"], [1, "fa-solid", "fa-clock"], [1, "detail-panel-actions"], ["type", "button", 1, "detail-action-btn", "primary", 3, "click"], [1, "fa-solid", "fa-external-link-alt"], [1, "fa-solid", "fa-align-left"], [1, "detail-description"]], template: function ModelManagementComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1367
|
+
i0.ɵɵelementStart(0, "mj-page-layout");
|
|
1368
|
+
i0.ɵɵconditionalCreate(1, ModelManagementComponent_Conditional_1_Template, 2, 1, "div", 0)(2, ModelManagementComponent_Conditional_2_Template, 24, 18);
|
|
1424
1369
|
i0.ɵɵelementEnd();
|
|
1425
1370
|
} if (rf & 2) {
|
|
1426
1371
|
i0.ɵɵadvance();
|
|
1427
1372
|
i0.ɵɵconditional(ctx.isLoading ? 1 : 2);
|
|
1428
|
-
} }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.NumberValueAccessor, i2.NgControlStatus, i2.MinValidator, i2.MaxValidator, i2.NgModel, i3.SplitComponent, i3.SplitAreaComponent, i4.LoadingComponent, i5.DatePipe, i6.HighlightSearchPipe], styles: ["\n\n\n\n\n\n\n\n.model-management-v2[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-card);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;\n}\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background: var(--mj-bg-surface-card);\n}\n\n\n\n.dashboard-header[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n padding: 16px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n z-index: 10;\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 20px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 22px;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n padding: 10px 18px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n border-color: var(--mj-border-strong);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.item-count[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 14px;\n font-weight: 500;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 20px;\n border: 1px solid var(--mj-border-default);\n}\n\n.header-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n padding: 3px;\n border: 1px solid var(--mj-border-default);\n}\n\n.view-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 8px 14px;\n border-radius: 6px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 15px;\n}\n\n.view-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n\n.view-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n}\n\n.control-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n padding: 10px 18px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.control-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.control-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.control-btn.primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary-hover);\n color: var(--mj-text-inverse);\n}\n\n.control-btn.primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n}\n\n\n\nas-split[_ngcontent-%COMP%] {\n flex: 1;\n background: var(--mj-bg-surface-card);\n margin-top: 0;\n}\n\n\n\n.filter-panel[_ngcontent-%COMP%] {\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n\n\n.filter-panel-header[_ngcontent-%COMP%] {\n padding: 20px;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.filter-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary);\n flex: 1;\n letter-spacing: -0.02em;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 16px;\n font-size: 13px;\n padding: 6px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 20px;\n border: 1px solid var(--mj-brand-accent);\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-value[_ngcontent-%COMP%] {\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-label[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: var(--mj-text-disabled);\n border-radius: 8px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n\n\n.filter-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 20px;\n}\n\n\n\n.filter-group[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.75px;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-label[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-brand-primary);\n width: 16px;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%], \n.filter-group[_ngcontent-%COMP%] .filter-select[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: var(--mj-text-secondary);\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%]:focus, \n.filter-group[_ngcontent-%COMP%] .filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-select[_ngcontent-%COMP%] {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n\n\n.filter-input[_ngcontent-%COMP%], \n.filter-select[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: var(--mj-text-secondary);\n}\n\n.filter-input[_ngcontent-%COMP%]:focus, \n.filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.filter-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.filter-select[_ngcontent-%COMP%] {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n\n\n.rank-filter-inputs[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n align-items: center;\n margin-top: 8px;\n}\n\n.rank-input[_ngcontent-%COMP%] {\n width: 70px;\n padding: 10px 12px;\n border: 2px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n text-align: center;\n background: var(--mj-bg-surface);\n transition: all 0.3s;\n box-sizing: border-box;\n -moz-appearance: textfield;\n}\n\n.rank-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.rank-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.rank-input[_ngcontent-%COMP%]::-webkit-inner-spin-button, \n.rank-input[_ngcontent-%COMP%]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.rank-separator[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 13px;\n font-weight: 600;\n}\n\n\n\n.filter-actions[_ngcontent-%COMP%] {\n margin-top: 28px;\n padding-top: 20px;\n border-top: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n color: var(--mj-text-muted);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 6px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-card);\n border-radius: 3px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 3px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n height: 100%;\n padding: 28px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n color: var(--mj-text-muted);\n padding: 60px 32px;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 80px;\n background: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n margin-bottom: 28px;\n opacity: 1;\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 32px 0;\n font-size: 16px;\n line-height: 1.6;\n max-width: 420px;\n}\n\n\n\n.model-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));\n gap: 24px;\n}\n\n.model-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);\n border: 1px solid var(--mj-border-default);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n position: relative;\n}\n\n.model-card[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n background: var(--mj-brand-primary);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.model-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 20px 40px -15px color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n transform: translateY(-4px);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n}\n\n.model-card[_ngcontent-%COMP%]:hover::before {\n opacity: 1;\n}\n\n.model-card.expanded[_ngcontent-%COMP%] {\n box-shadow: 0 25px 50px -12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n border-color: var(--mj-brand-accent);\n}\n\n.model-card.expanded[_ngcontent-%COMP%]::before {\n opacity: 1;\n}\n\n.card-header[_ngcontent-%COMP%] {\n padding: 24px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n cursor: pointer;\n user-select: none;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background-color 0.2s;\n}\n\n.card-header[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-card);\n}\n\n.model-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 18px;\n flex: 1;\n}\n\n.model-icon[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: var(--mj-brand-primary);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.model-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-inverse);\n font-size: 24px;\n}\n\n.model-details[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.model-name[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.model-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 14px;\n flex-wrap: wrap;\n}\n\n.meta-item[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--mj-bg-surface-sunken);\n padding: 4px 10px;\n border-radius: 6px;\n}\n\n.meta-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-brand-primary);\n}\n\n.meta-item.status-active[_ngcontent-%COMP%] {\n color: var(--mj-color-success-700);\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n}\n\n.meta-item.status-active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-color-success-700);\n}\n\n.meta-item.status-inactive[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n background: var(--mj-border-default);\n}\n\n.meta-item.status-inactive[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--mj-text-disabled);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n padding: 8px;\n border-radius: 8px;\n}\n\n.expand-icon[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.expand-icon.rotated[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n color: var(--mj-brand-primary);\n}\n\n.card-body[_ngcontent-%COMP%] {\n padding: 0 24px 24px 24px;\n}\n\n.model-description[_ngcontent-%COMP%] {\n margin: 18px 0 0 0;\n font-size: 14px;\n line-height: 1.7;\n color: var(--mj-text-muted);\n}\n\n.model-description.text-muted[_ngcontent-%COMP%] {\n font-style: italic;\n color: var(--mj-text-disabled);\n}\n\n\n\n.expanded-content[_ngcontent-%COMP%] {\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n animation: _ngcontent-%COMP%_slideDown 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-12px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.model-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 18px;\n}\n\n.stat-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n border: 1px solid var(--mj-border-default);\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 15px;\n color: var(--mj-text-primary);\n font-weight: 600;\n}\n\n\n\n.card-actions[_ngcontent-%COMP%] {\n padding: 18px 24px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.action-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-border-default);\n padding: 10px 20px;\n border-radius: 10px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n transform: translateY(-1px);\n}\n\n.action-btn-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: transparent;\n color: var(--mj-text-inverse);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.action-btn-primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n\n\n.model-list[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n border: 1px solid var(--mj-border-default);\n overflow: hidden;\n}\n\n.data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n border-bottom: 2px solid var(--mj-border-default);\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 16px 20px;\n text-align: left;\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n cursor: pointer;\n user-select: none;\n transition: all 0.2s ease;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n color: var(--mj-brand-primary);\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:last-child, \n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:nth-last-child(2) {\n cursor: default;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:last-child:hover, \n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:nth-last-child(2):hover {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th.sorted[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th.sorted.desc[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n.data-table[_ngcontent-%COMP%] .sort-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.data-table[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n font-size: 10px;\n opacity: 0;\n transition: all 0.2s ease;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:hover .sort-icon[_ngcontent-%COMP%] {\n opacity: 0.5;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th.sorted[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n opacity: 1;\n color: var(--mj-brand-primary);\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background-color 0.2s ease;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 18px 20px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.name-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 18px;\n}\n\n\n\n.rank-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 6px 12px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.rank-badge.rank-high[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.rank-badge.rank-medium[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-color-warning-700);\n}\n\n.rank-badge.rank-low[_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.rank-badge.rank-none[_ngcontent-%COMP%] {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.status-badge.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.status-badge.inactive[_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\n\n@media (max-width: 768px) {\n .dashboard-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n align-items: stretch;\n padding: 16px 20px;\n }\n\n .header-info[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n justify-content: center;\n }\n\n .header-controls[_ngcontent-%COMP%] {\n justify-content: center;\n }\n\n .content-area[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .model-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n\n .model-stats[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .card-header[_ngcontent-%COMP%] {\n padding: 18px;\n }\n\n .card-body[_ngcontent-%COMP%] {\n padding: 0 18px 18px 18px;\n }\n\n .card-actions[_ngcontent-%COMP%] {\n padding: 14px 18px;\n flex-wrap: wrap;\n }\n}\n\n\n\n\n\n\n\n\n.detail-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n z-index: 1000;\n opacity: 0;\n animation: _ngcontent-%COMP%_fadeIn 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n to {\n opacity: 1;\n }\n}\n\n\n\n.detail-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: -480px;\n width: 480px;\n max-width: 90vw;\n height: 100vh;\n background: var(--mj-bg-surface);\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transition: right 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.detail-panel.visible[_ngcontent-%COMP%] {\n right: 0;\n}\n\n\n\n.detail-panel-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.detail-panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.detail-icon[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: var(--mj-brand-primary);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.detail-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-inverse);\n font-size: 24px;\n}\n\n.detail-title-info[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 4px 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.detail-subtitle[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.detail-panel-close[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--mj-text-muted);\n}\n\n.detail-panel-close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n\n\n.detail-panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n}\n\n\n\n.detail-section[_ngcontent-%COMP%] {\n margin-bottom: 28px;\n}\n\n.detail-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.detail-badges[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.status-badge.status-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.status-badge.status-inactive[_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.feature-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n.feature-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.detail-description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n line-height: 1.7;\n color: var(--mj-text-secondary);\n}\n\n.detail-section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 700;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n\n\n.detail-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n}\n\n.detail-grid.single-column[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n}\n\n.detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 14px;\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n border: 1px solid var(--mj-border-default);\n}\n\n.detail-item.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n.detail-value.muted[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-style: italic;\n}\n\n\n\n.detail-section[_ngcontent-%COMP%] .status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n}\n\n.detail-section[_ngcontent-%COMP%] .status-badge.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.detail-section[_ngcontent-%COMP%] .status-badge.inactive[_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\n\n.detail-panel-actions[_ngcontent-%COMP%] {\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n flex-shrink: 0;\n}\n\n.detail-action-btn[_ngcontent-%COMP%] {\n padding: 12px 24px;\n border-radius: 10px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-action-btn.primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border: none;\n color: var(--mj-text-inverse);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.detail-action-btn.primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.detail-action-btn.secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n}\n\n.detail-action-btn.secondary[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n@media (max-width: 520px) {\n .detail-panel[_ngcontent-%COMP%] {\n width: 100%;\n right: -100%;\n }\n\n .detail-panel.visible[_ngcontent-%COMP%] {\n right: 0;\n }\n\n .detail-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n[_nghost-%COMP%] .search-highlight, \n.search-highlight[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-status-warning) 30%, var(--mj-bg-surface));\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}"] });
|
|
1373
|
+
} }, dependencies: [i2.DefaultValueAccessor, i2.NumberValueAccessor, i2.NgControlStatus, i2.MinValidator, i2.MaxValidator, i2.NgModel, i3.LoadingComponent, i4.MJButtonDirective, i4.MJPageHeaderComponent, i4.MJPageLayoutComponent, i4.MJPageBodyComponent, i4.MJFilterPopoverComponent, i4.MJPageSearchComponent, i4.MJFilterPanelComponent, i4.MJFilterFieldComponent, i4.MJViewToggleComponent, i4.MJStatBadgeComponent, i5.DatePipe, i6.HighlightSearchPipe], styles: ["\n\n\n\n\n\n\n\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background: var(--mj-bg-surface-card);\n}\n\n\n\n\n[_nghost-%COMP%] mj-page-body[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n}\n\n\n\n\n.control-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n padding: 10px 18px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.control-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.control-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.control-btn.primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary-hover);\n color: var(--mj-text-inverse);\n}\n\n.control-btn.primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n}\n\n\n\nas-split[_ngcontent-%COMP%] {\n flex: 1;\n background: var(--mj-bg-surface-card);\n margin-top: 0;\n}\n\n\n\n.filter-panel[_ngcontent-%COMP%] {\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n\n\n.filter-panel-header[_ngcontent-%COMP%] {\n padding: 20px;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.filter-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary);\n flex: 1;\n letter-spacing: -0.02em;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 16px;\n font-size: 13px;\n padding: 6px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 20px;\n border: 1px solid var(--mj-brand-accent);\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-value[_ngcontent-%COMP%] {\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .filter-summary-inline[_ngcontent-%COMP%] .summary-label[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: var(--mj-text-disabled);\n border-radius: 8px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.filter-panel-header[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n\n\n.filter-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 20px;\n}\n\n\n\n.filter-group[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.75px;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-label[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-brand-primary);\n width: 16px;\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%], \n.filter-group[_ngcontent-%COMP%] .filter-select[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: var(--mj-text-secondary);\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%]:focus, \n.filter-group[_ngcontent-%COMP%] .filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.filter-group[_ngcontent-%COMP%] .filter-select[_ngcontent-%COMP%] {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n\n\n.filter-input[_ngcontent-%COMP%], \n.filter-select[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: var(--mj-text-secondary);\n}\n\n.filter-input[_ngcontent-%COMP%]:focus, \n.filter-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.filter-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.filter-select[_ngcontent-%COMP%] {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n\n\n.rank-filter-inputs[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n align-items: center;\n margin-top: 8px;\n}\n\n.rank-input[_ngcontent-%COMP%] {\n width: 70px;\n padding: 10px 12px;\n border: 2px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n text-align: center;\n background: var(--mj-bg-surface);\n transition: all 0.3s;\n box-sizing: border-box;\n -moz-appearance: textfield;\n}\n\n.rank-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.rank-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.rank-input[_ngcontent-%COMP%]::-webkit-inner-spin-button, \n.rank-input[_ngcontent-%COMP%]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.rank-separator[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 13px;\n font-weight: 600;\n}\n\n\n\n.filter-actions[_ngcontent-%COMP%] {\n margin-top: 28px;\n padding-top: 20px;\n border-top: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n color: var(--mj-text-muted);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.filter-actions[_ngcontent-%COMP%] .reset-btn[_ngcontent-%COMP%] .fa-solid[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 6px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-card);\n border-radius: 3px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 3px;\n}\n\n.filter-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}\n\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n color: var(--mj-text-muted);\n padding: 60px 32px;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 80px;\n background: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n margin-bottom: 28px;\n opacity: 1;\n}\n\n.empty-state[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 32px 0;\n font-size: 16px;\n line-height: 1.6;\n max-width: 420px;\n}\n\n\n\n.model-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));\n gap: 24px;\n}\n\n.model-card[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);\n border: 1px solid var(--mj-border-default);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n position: relative;\n}\n\n.model-card[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n background: var(--mj-brand-primary);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.model-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 20px 40px -15px color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n transform: translateY(-4px);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n}\n\n.model-card[_ngcontent-%COMP%]:hover::before {\n opacity: 1;\n}\n\n.model-card.expanded[_ngcontent-%COMP%] {\n box-shadow: 0 25px 50px -12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n border-color: var(--mj-brand-accent);\n}\n\n.model-card.expanded[_ngcontent-%COMP%]::before {\n opacity: 1;\n}\n\n.card-header[_ngcontent-%COMP%] {\n padding: 24px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n cursor: pointer;\n user-select: none;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background-color 0.2s;\n}\n\n.card-header[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-card);\n}\n\n.model-info[_ngcontent-%COMP%] {\n display: flex;\n gap: 18px;\n flex: 1;\n}\n\n.model-icon[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: var(--mj-brand-primary);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.model-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-inverse);\n font-size: 24px;\n}\n\n.model-details[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.model-name[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.model-meta[_ngcontent-%COMP%] {\n display: flex;\n gap: 14px;\n flex-wrap: wrap;\n}\n\n.meta-item[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--mj-bg-surface-sunken);\n padding: 4px 10px;\n border-radius: 6px;\n}\n\n.meta-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-brand-primary);\n}\n\n.meta-item.status-active[_ngcontent-%COMP%] {\n color: var(--mj-color-success-700);\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n}\n\n.meta-item.status-active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-color-success-700);\n}\n\n.meta-item.status-inactive[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n background: var(--mj-border-default);\n}\n\n.meta-item.status-inactive[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 16px;\n color: var(--mj-text-disabled);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n padding: 8px;\n border-radius: 8px;\n}\n\n.expand-icon[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.expand-icon.rotated[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n color: var(--mj-brand-primary);\n}\n\n.card-body[_ngcontent-%COMP%] {\n padding: 0 24px 24px 24px;\n}\n\n.model-description[_ngcontent-%COMP%] {\n margin: 18px 0 0 0;\n font-size: 14px;\n line-height: 1.7;\n color: var(--mj-text-muted);\n}\n\n.model-description.text-muted[_ngcontent-%COMP%] {\n font-style: italic;\n color: var(--mj-text-disabled);\n}\n\n\n\n.expanded-content[_ngcontent-%COMP%] {\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n animation: _ngcontent-%COMP%_slideDown 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-12px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.model-stats[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 18px;\n}\n\n.stat-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n border: 1px solid var(--mj-border-default);\n}\n\n.stat-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat-value[_ngcontent-%COMP%] {\n font-size: 15px;\n color: var(--mj-text-primary);\n font-weight: 600;\n}\n\n\n\n.card-actions[_ngcontent-%COMP%] {\n padding: 18px 24px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.action-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-border-default);\n padding: 10px 20px;\n border-radius: 10px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n transform: translateY(-1px);\n}\n\n.action-btn-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: transparent;\n color: var(--mj-text-inverse);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.action-btn-primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n\n\n.model-list[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n border: 1px solid var(--mj-border-default);\n overflow: hidden;\n}\n\n.data-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n border-bottom: 2px solid var(--mj-border-default);\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n padding: 16px 20px;\n text-align: left;\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n cursor: pointer;\n user-select: none;\n transition: all 0.2s ease;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n color: var(--mj-brand-primary);\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:last-child, \n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:nth-last-child(2) {\n cursor: default;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:last-child:hover, \n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:nth-last-child(2):hover {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th.sorted[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th.sorted.desc[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n.data-table[_ngcontent-%COMP%] .sort-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.data-table[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n font-size: 10px;\n opacity: 0;\n transition: all 0.2s ease;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]:hover .sort-icon[_ngcontent-%COMP%] {\n opacity: 0.5;\n}\n\n.data-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th.sorted[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n opacity: 1;\n color: var(--mj-brand-primary);\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background-color 0.2s ease;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 18px 20px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.name-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 18px;\n}\n\n\n\n.rank-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 6px 12px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.rank-badge.rank-high[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.rank-badge.rank-medium[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-color-warning-700);\n}\n\n.rank-badge.rank-low[_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.rank-badge.rank-none[_ngcontent-%COMP%] {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.status-badge.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.status-badge.inactive[_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\n\n@media (max-width: 768px) {\n .dashboard-header[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 16px;\n align-items: stretch;\n padding: 16px 20px;\n }\n\n .header-info[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n justify-content: center;\n }\n\n .header-controls[_ngcontent-%COMP%] {\n justify-content: center;\n }\n\n .model-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n\n .model-stats[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .card-header[_ngcontent-%COMP%] {\n padding: 18px;\n }\n\n .card-body[_ngcontent-%COMP%] {\n padding: 0 18px 18px 18px;\n }\n\n .card-actions[_ngcontent-%COMP%] {\n padding: 14px 18px;\n flex-wrap: wrap;\n }\n}\n\n\n\n\n\n\n\n\n.detail-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n z-index: 1000;\n opacity: 0;\n animation: _ngcontent-%COMP%_fadeIn 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n to {\n opacity: 1;\n }\n}\n\n\n\n.detail-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: -480px;\n width: 480px;\n max-width: 90vw;\n height: 100vh;\n background: var(--mj-bg-surface);\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transition: right 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.detail-panel.visible[_ngcontent-%COMP%] {\n right: 0;\n}\n\n\n\n.detail-panel-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.detail-panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.detail-icon[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: var(--mj-brand-primary);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.detail-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-inverse);\n font-size: 24px;\n}\n\n.detail-title-info[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 4px 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.detail-subtitle[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.detail-panel-close[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--mj-text-muted);\n}\n\n.detail-panel-close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n\n\n.detail-panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n}\n\n\n\n.detail-section[_ngcontent-%COMP%] {\n margin-bottom: 28px;\n}\n\n.detail-section[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.detail-badges[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.status-badge.status-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.status-badge.status-inactive[_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.feature-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n.feature-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.detail-description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n line-height: 1.7;\n color: var(--mj-text-secondary);\n}\n\n.detail-section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 700;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n\n\n.detail-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n}\n\n.detail-grid.single-column[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n}\n\n.detail-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 14px;\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n border: 1px solid var(--mj-border-default);\n}\n\n.detail-item.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-value[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n.detail-value.muted[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-style: italic;\n}\n\n\n\n.detail-section[_ngcontent-%COMP%] .status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n}\n\n.detail-section[_ngcontent-%COMP%] .status-badge.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.detail-section[_ngcontent-%COMP%] .status-badge.inactive[_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\n\n.detail-panel-actions[_ngcontent-%COMP%] {\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n flex-shrink: 0;\n}\n\n.detail-action-btn[_ngcontent-%COMP%] {\n padding: 12px 24px;\n border-radius: 10px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-action-btn.primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border: none;\n color: var(--mj-text-inverse);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.detail-action-btn.primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.detail-action-btn.secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n}\n\n.detail-action-btn.secondary[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n@media (max-width: 520px) {\n .detail-panel[_ngcontent-%COMP%] {\n width: 100%;\n right: -100%;\n }\n\n .detail-panel.visible[_ngcontent-%COMP%] {\n right: 0;\n }\n\n .detail-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}\n\n\n\n[_nghost-%COMP%] .search-highlight, \n.search-highlight[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-status-warning) 30%, var(--mj-bg-surface));\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}"] });
|
|
1429
1374
|
};
|
|
1430
1375
|
ModelManagementComponent = __decorate([
|
|
1431
1376
|
RegisterClass(BaseResourceComponent, 'AIModelsResource')
|
|
@@ -1433,7 +1378,7 @@ ModelManagementComponent = __decorate([
|
|
|
1433
1378
|
export { ModelManagementComponent };
|
|
1434
1379
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ModelManagementComponent, [{
|
|
1435
1380
|
type: Component,
|
|
1436
|
-
args: [{ standalone: false, selector: 'app-model-management', template: "<div class=\"model-management-v2\">\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading [text]=\"currentLoadingMessage\" size=\"large\"></mj-loading>\n </div>\n } @else {\n <div class=\"dashboard-header\">\n <div class=\"header-info\">\n <h2 class=\"dashboard-title\">\n <i class=\"fa-solid fa-microchip\"></i>\n AI Models\n </h2>\n <button\n type=\"button\"\n class=\"filter-toggle-btn\"\n (click)=\"toggleFilters()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (showFilters) {\n Hide Filters\n } @else {\n Show Filters\n }\n </button>\n <span class=\"item-count\">{{ filteredModels.length }} models</span>\n </div>\n\n <div class=\"header-controls\">\n <div class=\"view-toggle\">\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"viewMode === 'grid'\"\n (click)=\"setViewMode('grid')\"\n title=\"Grid View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"viewMode === 'list'\"\n (click)=\"setViewMode('list')\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"control-btn primary\"\n (click)=\"createNewModel()\"\n title=\"Create New Model\">\n <i class=\"fa-solid fa-plus\"></i>\n New Model\n </button>\n </div>\n </div>\n\n <as-split direction=\"horizontal\">\n @if (showFilters) {\n <as-split-area [size]=\"20\" [minSize]=\"15\" [maxSize]=\"25\">\n <div class=\"filter-panel\">\n <div class=\"filter-panel-header\">\n <h3>Model Filters</h3>\n <div class=\"filter-summary-inline\">\n <span class=\"summary-value\">{{ filteredModels.length }}</span>\n <span class=\"summary-label\">of {{ models.length }}</span>\n </div>\n <button class=\"close-btn\" (click)=\"toggleFilterPanel()\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n \n <div class=\"filter-content\">\n <!-- Search Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-search\"></span>\n Name\n </label>\n <input \n type=\"text\"\n class=\"filter-input\"\n placeholder=\"Search models...\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n\n <!-- Sort By Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-sort\"></span>\n Sort By\n </label>\n <select class=\"filter-select\" [value]=\"sortBy\" (change)=\"onSortChange($any($event.target).value)\">\n @for (option of sortOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n </div>\n\n <!-- Vendor Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-building\"></span>\n Vendor\n </label>\n <select class=\"filter-select\" [value]=\"selectedVendor\" (change)=\"onVendorChange($any($event.target).value)\">\n <option value=\"all\">All Vendors</option>\n @for (vendor of vendors; track vendor.ID) {\n <option [value]=\"vendor.ID\">{{ vendor.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Type Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-microchip\"></span>\n Type\n </label>\n <select class=\"filter-select\" [value]=\"selectedType\" (change)=\"onTypeChange($any($event.target).value)\">\n <option value=\"all\">All Types</option>\n @for (type of modelTypes; track type.ID) {\n <option [value]=\"type.ID\">{{ type.Name }}</option>\n }\n </select>\n </div>\n\n <!-- Status Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-toggle-on\"></span>\n Status\n </label>\n <select class=\"filter-select\" [value]=\"selectedStatus\" (change)=\"onStatusChange($any($event.target).value)\">\n <option value=\"all\">All Statuses</option>\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n </select>\n </div>\n\n <!-- Power Rank Filter -->\n <div class=\"filter-group\">\n <label class=\"filter-label\">\n <span class=\"fa-solid fa-bolt\"></span>\n Power Rank\n </label>\n <div class=\"rank-filter-inputs\">\n <input \n type=\"number\" \n min=\"0\" \n [max]=\"maxPowerRank\" \n [(ngModel)]=\"powerRankRange.min\"\n (change)=\"validateAndApplyRankFilters('power')\"\n class=\"rank-input\"\n placeholder=\"Min\"\n />\n <span class=\"rank-separator\">-</span>\n <input \n type=\"number\" \n min=\"0\" \n [max]=\"maxPowerRank\" \n [(ngModel)]=\"powerRankRange.max\"\n (change)=\"validateAndApplyRankFilters('power')\"\n class=\"rank-input\"\n placeholder=\"Max\"\n />\n </div>\n </div>\n\n <!-- Reset Button -->\n <div class=\"filter-actions\">\n <button class=\"reset-btn\" (click)=\"clearFilters()\" title=\"Reset all filters\">\n <span class=\"fa-solid fa-undo\"></span>\n Reset Filters\n </button>\n </div>\n </div>\n </div>\n </as-split-area>\n }\n\n <as-split-area>\n <div class=\"content-area\">\n @if (filteredModels.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-microchip fa-4x\"></i>\n <h3>No models found</h3>\n <p>{{ hasActiveFilters ? 'Try adjusting your filters' : 'Create your first AI model to get started' }}</p>\n @if (!hasActiveFilters) {\n <button class=\"primary-action\" (click)=\"createNewModel()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create First Model\n </button>\n }\n </div>\n } @else {\n @switch (viewMode) {\n @case ('grid') {\n <div class=\"model-grid\">\n @for (model of filteredModels; track model.ID) {\n <div class=\"model-card\" [class.expanded]=\"expandedModelId === model.ID\">\n <!-- Card Header -->\n <div class=\"card-header\" (click)=\"toggleModelExpansion(model.ID)\">\n <div class=\"model-info\">\n <div class=\"model-icon\">\n <i [class]=\"getModelIcon(model)\"></i>\n </div>\n <div class=\"model-details\">\n <h4 class=\"model-name\" [innerHTML]=\"(model.Name || 'Unnamed Model') | highlightSearch:searchTerm\"></h4>\n <div class=\"model-meta\">\n @if (model.Vendor) {\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-building\"></i>\n {{ model.Vendor }}\n </span>\n }\n @if (model.AIModelType) {\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ model.AIModelType }}\n </span>\n }\n @if (model.IsActive) {\n <span class=\"meta-item status-active\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Active\n </span>\n } @else {\n <span class=\"meta-item status-inactive\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Inactive\n </span>\n }\n </div>\n </div>\n </div>\n\n <i class=\"fa-solid fa-chevron-down expand-icon\"\n [class.rotated]=\"expandedModelId === model.ID\"></i>\n </div>\n\n <!-- Card Body -->\n <div class=\"card-body\">\n @if (model.Description) {\n <p class=\"model-description\" [innerHTML]=\"model.Description | highlightSearch:searchTerm\"></p>\n } @else {\n <p class=\"model-description text-muted\">No description provided</p>\n }\n\n <!-- Expandable Content -->\n @if (expandedModelId === model.ID) {\n <div class=\"expanded-content\">\n <div class=\"model-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Power Rank</span>\n <span class=\"stat-value\">{{ formatRank(model.PowerRank, 'power') }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Speed Rank</span>\n <span class=\"stat-value\">{{ formatRank(model.SpeedRank, 'speed') }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Cost Rank</span>\n <span class=\"stat-value\">{{ formatRank(model.CostRank, 'cost') }}</span>\n </div>\n @if (model.InputTokenLimit) {\n <div class=\"stat-item\">\n <span class=\"stat-label\">Token Limit</span>\n <span class=\"stat-value\">{{ formatTokenLimit(model.InputTokenLimit) }}</span>\n </div>\n }\n @if (model.APIName) {\n <div class=\"stat-item\">\n <span class=\"stat-label\">API Name</span>\n <span class=\"stat-value\">{{ model.APIName }}</span>\n </div>\n }\n @if (model.DriverClass) {\n <div class=\"stat-item\">\n <span class=\"stat-label\">Driver</span>\n <span class=\"stat-value\">{{ model.DriverClass }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Card Actions -->\n <div class=\"card-actions\">\n <button\n type=\"button\"\n class=\"action-btn\"\n (click)=\"showModelDetails(model, $event)\"\n title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></i>\n Details\n </button>\n </div>\n </div>\n }\n </div>\n }\n \n @case ('list') {\n <div class=\"model-list\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th (click)=\"onSortChange('name')\"\n [class.sorted]=\"sortBy === 'name'\"\n [class.desc]=\"sortBy === 'name' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Name\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('vendor')\"\n [class.sorted]=\"sortBy === 'vendor'\"\n [class.desc]=\"sortBy === 'vendor' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Vendor\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('type')\"\n [class.sorted]=\"sortBy === 'type'\"\n [class.desc]=\"sortBy === 'type' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Type\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('powerRank')\"\n [class.sorted]=\"sortBy === 'powerRank'\"\n [class.desc]=\"sortBy === 'powerRank' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Power\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('speedRank')\"\n [class.sorted]=\"sortBy === 'speedRank'\"\n [class.desc]=\"sortBy === 'speedRank' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Speed\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('costRank')\"\n [class.sorted]=\"sortBy === 'costRank'\"\n [class.desc]=\"sortBy === 'costRank' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Cost\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th>Status</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (model of filteredModels; track model.ID) {\n <tr>\n <td>\n <div class=\"name-cell\">\n <i [class]=\"getModelIcon(model)\"></i>\n <span [innerHTML]=\"(model.Name || 'Unnamed Model') | highlightSearch:searchTerm\"></span>\n </div>\n </td>\n <td>{{ model.Vendor || '-' }}</td>\n <td>{{ model.AIModelType }}</td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.PowerRank, 'power')\">\n {{ formatRank(model.PowerRank, 'power') }}\n </span>\n </td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.SpeedRank, 'speed')\">\n {{ formatRank(model.SpeedRank, 'speed') }}\n </span>\n </td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.CostRank, 'cost')\">\n {{ formatRank(model.CostRank, 'cost') }}\n </span>\n </td>\n <td>\n <span class=\"status-badge\" [class.active]=\"model.IsActive\" [class.inactive]=\"!model.IsActive\">\n {{ model.IsActive ? 'Active' : 'Inactive' }}\n </span>\n </td>\n <td>\n <button class=\"action-button small\" (click)=\"showModelDetails(model)\" title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n }\n </div>\n </as-split-area>\n </as-split>\n\n <!-- Detail Panel Overlay -->\n @if (detailPanelVisible) {\n <div class=\"detail-panel-overlay\" (click)=\"closeDetailPanel()\"></div>\n }\n\n <!-- Detail Panel -->\n <div class=\"detail-panel\" [class.visible]=\"detailPanelVisible\">\n @if (selectedModel) {\n <!-- Panel Header -->\n <div class=\"detail-panel-header\">\n <div class=\"detail-panel-title\">\n <div class=\"detail-icon\">\n <i [class]=\"getModelIcon(selectedModel)\"></i>\n </div>\n <div class=\"detail-title-info\">\n <h3>{{ selectedModel.Name }}</h3>\n <span class=\"detail-subtitle\">{{ selectedModel.Vendor || 'AI Model' }}</span>\n </div>\n </div>\n <button class=\"detail-panel-close\" (click)=\"closeDetailPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Panel Content -->\n <div class=\"detail-panel-content\">\n <!-- Status Section -->\n <div class=\"detail-section\">\n <div class=\"detail-badges\">\n @if (selectedModel.IsActive) {\n <span class=\"status-badge status-active\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Active\n </span>\n } @else {\n <span class=\"status-badge status-inactive\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Inactive\n </span>\n }\n @if (selectedModel.AIModelType) {\n <span class=\"feature-badge\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ selectedModel.AIModelType }}\n </span>\n }\n </div>\n </div>\n\n <!-- Description -->\n @if (selectedModel.Description) {\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-align-left\"></i>\n Description\n </h4>\n <p class=\"detail-description\">{{ selectedModel.Description }}</p>\n </div>\n }\n\n <!-- Ranking Details -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-chart-bar\"></i>\n Rankings\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Power Rank</span>\n <span class=\"detail-value rank-badge\" [class]=\"getRankClass(selectedModel.PowerRank, 'power')\">\n {{ formatRank(selectedModel.PowerRank, 'power') }}\n </span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Speed Rank</span>\n <span class=\"detail-value rank-badge\" [class]=\"getRankClass(selectedModel.SpeedRank, 'speed')\">\n {{ formatRank(selectedModel.SpeedRank, 'speed') }}\n </span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Cost Rank</span>\n <span class=\"detail-value rank-badge\" [class]=\"getRankClass(selectedModel.CostRank, 'cost')\">\n {{ formatRank(selectedModel.CostRank, 'cost') }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Configuration Details -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-cog\"></i>\n Configuration\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Vendor</span>\n <span class=\"detail-value\">{{ selectedModel.Vendor || 'Unknown' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Model Type</span>\n <span class=\"detail-value\">{{ selectedModel.AIModelType || 'Unknown' }}</span>\n </div>\n @if (selectedModel.APIName) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">API Name</span>\n <span class=\"detail-value\">{{ selectedModel.APIName }}</span>\n </div>\n }\n @if (selectedModel.InputTokenLimit) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Input Token Limit</span>\n <span class=\"detail-value\">{{ formatTokenLimit(selectedModel.InputTokenLimit) }}</span>\n </div>\n }\n @if (selectedModel.SupportedResponseFormats) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Response Formats</span>\n <span class=\"detail-value\">{{ selectedModel.SupportedResponseFormats }}</span>\n </div>\n }\n @if (selectedModel.SupportsEffortLevel) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Supports Effort Level</span>\n <span class=\"detail-value\">Yes</span>\n </div>\n }\n @if (selectedModel.DriverClass) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Driver Class</span>\n <span class=\"detail-value\">{{ selectedModel.DriverClass }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Timestamps -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-clock\"></i>\n Timestamps\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Created</span>\n <span class=\"detail-value\">{{ selectedModel.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Updated</span>\n <span class=\"detail-value\">{{ selectedModel.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Panel Actions -->\n <div class=\"detail-panel-actions\">\n <button\n type=\"button\"\n class=\"detail-action-btn primary\"\n (click)=\"openModelFromPanel()\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open Full Record\n </button>\n </div>\n }\n </div>\n }\n</div>", styles: ["/* ============================================\n AI Models Dashboard - World-Class Design\n Clean header with brand blue accents\n ============================================ */\n\n/* Container */\n.model-management-v2 {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-card);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;\n}\n\n/* Loading State */\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background: var(--mj-bg-surface-card);\n}\n\n/* Dashboard Header - Clean White Style */\n.dashboard-header {\n background: var(--mj-bg-surface);\n padding: 16px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n position: relative;\n z-index: 10;\n}\n\n.header-info {\n display: flex;\n align-items: center;\n gap: 20px;\n}\n\n.dashboard-title {\n margin: 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.dashboard-title i {\n color: var(--mj-brand-primary);\n font-size: 22px;\n}\n\n.filter-toggle-btn {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n padding: 10px 18px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.filter-toggle-btn:hover {\n background: var(--mj-border-default);\n border-color: var(--mj-border-strong);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.filter-toggle-btn i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.item-count {\n color: var(--mj-text-muted);\n font-size: 14px;\n font-weight: 500;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 20px;\n border: 1px solid var(--mj-border-default);\n}\n\n.header-controls {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n/* View Toggle */\n.view-toggle {\n display: flex;\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n padding: 3px;\n border: 1px solid var(--mj-border-default);\n}\n\n.view-btn {\n background: transparent;\n border: none;\n padding: 8px 14px;\n border-radius: 6px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 15px;\n}\n\n.view-btn:hover {\n color: var(--mj-text-secondary);\n}\n\n.view-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n}\n\n.control-btn {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n padding: 10px 18px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.control-btn:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.control-btn i {\n font-size: 14px;\n}\n\n.control-btn.primary {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary-hover);\n color: var(--mj-text-inverse);\n}\n\n.control-btn.primary:hover {\n background: var(--mj-brand-primary-hover);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n}\n\n/* Splitter */\nas-split {\n flex: 1;\n background: var(--mj-bg-surface-card);\n margin-top: 0;\n}\n\n/* Filter Panel */\n.filter-panel {\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n/* Header */\n.filter-panel-header {\n padding: 20px;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.filter-panel-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary);\n flex: 1;\n letter-spacing: -0.02em;\n}\n\n.filter-panel-header .filter-summary-inline {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 16px;\n font-size: 13px;\n padding: 6px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 20px;\n border: 1px solid var(--mj-brand-accent);\n}\n\n.filter-panel-header .filter-summary-inline .summary-value {\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n.filter-panel-header .filter-summary-inline .summary-label {\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.filter-panel-header .close-btn {\n background: transparent;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: var(--mj-text-disabled);\n border-radius: 8px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.filter-panel-header .close-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.filter-panel-header .close-btn .fa-solid {\n font-size: 14px;\n}\n\n/* Content Area */\n.filter-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 20px;\n}\n\n/* Filter Groups */\n.filter-group {\n margin-bottom: 24px;\n}\n\n.filter-group .filter-label {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.75px;\n}\n\n.filter-group .filter-label .fa-solid {\n font-size: 13px;\n color: var(--mj-brand-primary);\n width: 16px;\n}\n\n.filter-group .filter-input,\n.filter-group .filter-select {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: var(--mj-text-secondary);\n}\n\n.filter-group .filter-input:focus,\n.filter-group .filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.filter-group .filter-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.filter-group .filter-select {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n/* Legacy support for non-scoped selectors */\n.filter-input,\n.filter-select {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: var(--mj-text-secondary);\n}\n\n.filter-input:focus,\n.filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.filter-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.filter-select {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n/* Rank Filter */\n.rank-filter-inputs {\n display: flex;\n gap: 10px;\n align-items: center;\n margin-top: 8px;\n}\n\n.rank-input {\n width: 70px;\n padding: 10px 12px;\n border: 2px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n text-align: center;\n background: var(--mj-bg-surface);\n transition: all 0.3s;\n box-sizing: border-box;\n -moz-appearance: textfield;\n}\n\n.rank-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.rank-input::placeholder {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.rank-input::-webkit-inner-spin-button,\n.rank-input::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.rank-separator {\n color: var(--mj-text-muted);\n font-size: 13px;\n font-weight: 600;\n}\n\n/* Filter Actions */\n.filter-actions {\n margin-top: 28px;\n padding-top: 20px;\n border-top: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.filter-actions .reset-btn {\n width: 100%;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n color: var(--mj-text-muted);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n}\n\n.filter-actions .reset-btn:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.filter-actions .reset-btn .fa-solid {\n font-size: 13px;\n}\n\n/* Scrollbar Styling */\n.filter-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.filter-content::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-card);\n border-radius: 3px;\n}\n\n.filter-content::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 3px;\n}\n\n.filter-content::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}\n\n/* Content Area */\n.content-area {\n height: 100%;\n padding: 28px;\n overflow-y: auto;\n background: var(--mj-bg-surface-card);\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n color: var(--mj-text-muted);\n padding: 60px 32px;\n}\n\n.empty-state i {\n font-size: 80px;\n background: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n margin-bottom: 28px;\n opacity: 1;\n}\n\n.empty-state h3 {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.empty-state p {\n margin: 0 0 32px 0;\n font-size: 16px;\n line-height: 1.6;\n max-width: 420px;\n}\n\n/* Grid View */\n.model-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));\n gap: 24px;\n}\n\n.model-card {\n background: var(--mj-bg-surface);\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);\n border: 1px solid var(--mj-border-default);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n position: relative;\n}\n\n.model-card::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n background: var(--mj-brand-primary);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.model-card:hover {\n box-shadow: 0 20px 40px -15px color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n transform: translateY(-4px);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n}\n\n.model-card:hover::before {\n opacity: 1;\n}\n\n.model-card.expanded {\n box-shadow: 0 25px 50px -12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n border-color: var(--mj-brand-accent);\n}\n\n.model-card.expanded::before {\n opacity: 1;\n}\n\n.card-header {\n padding: 24px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n cursor: pointer;\n user-select: none;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background-color 0.2s;\n}\n\n.card-header:hover {\n background-color: var(--mj-bg-surface-card);\n}\n\n.model-info {\n display: flex;\n gap: 18px;\n flex: 1;\n}\n\n.model-icon {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: var(--mj-brand-primary);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.model-icon i {\n color: var(--mj-text-inverse);\n font-size: 24px;\n}\n\n.model-details {\n flex: 1;\n min-width: 0;\n}\n\n.model-name {\n margin: 0;\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.model-meta {\n display: flex;\n gap: 14px;\n flex-wrap: wrap;\n}\n\n.meta-item {\n font-size: 13px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--mj-bg-surface-sunken);\n padding: 4px 10px;\n border-radius: 6px;\n}\n\n.meta-item i {\n font-size: 11px;\n color: var(--mj-brand-primary);\n}\n\n.meta-item.status-active {\n color: var(--mj-color-success-700);\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n}\n\n.meta-item.status-active i {\n color: var(--mj-color-success-700);\n}\n\n.meta-item.status-inactive {\n color: var(--mj-text-muted);\n background: var(--mj-border-default);\n}\n\n.meta-item.status-inactive i {\n color: var(--mj-text-muted);\n}\n\n.expand-icon {\n font-size: 16px;\n color: var(--mj-text-disabled);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n padding: 8px;\n border-radius: 8px;\n}\n\n.expand-icon:hover {\n color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.expand-icon.rotated {\n transform: rotate(180deg);\n color: var(--mj-brand-primary);\n}\n\n.card-body {\n padding: 0 24px 24px 24px;\n}\n\n.model-description {\n margin: 18px 0 0 0;\n font-size: 14px;\n line-height: 1.7;\n color: var(--mj-text-muted);\n}\n\n.model-description.text-muted {\n font-style: italic;\n color: var(--mj-text-disabled);\n}\n\n/* Expanded Content */\n.expanded-content {\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n animation: slideDown 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-12px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.model-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 18px;\n}\n\n.stat-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n border: 1px solid var(--mj-border-default);\n}\n\n.stat-label {\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat-value {\n font-size: 15px;\n color: var(--mj-text-primary);\n font-weight: 600;\n}\n\n/* Card Actions */\n.card-actions {\n padding: 18px 24px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.action-btn {\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-border-default);\n padding: 10px 20px;\n border-radius: 10px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.action-btn:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n transform: translateY(-1px);\n}\n\n.action-btn-primary {\n background: var(--mj-brand-primary);\n border-color: transparent;\n color: var(--mj-text-inverse);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.action-btn-primary:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n/* List View */\n.model-list {\n background: var(--mj-bg-surface);\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n border: 1px solid var(--mj-border-default);\n overflow: hidden;\n}\n\n.data-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table thead {\n background: var(--mj-bg-surface-card);\n}\n\n.data-table thead tr {\n border-bottom: 2px solid var(--mj-border-default);\n}\n\n.data-table thead th {\n padding: 16px 20px;\n text-align: left;\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n cursor: pointer;\n user-select: none;\n transition: all 0.2s ease;\n}\n\n.data-table thead th:hover {\n background: var(--mj-border-default);\n color: var(--mj-brand-primary);\n}\n\n.data-table thead th:last-child,\n.data-table thead th:nth-last-child(2) {\n cursor: default;\n}\n\n.data-table thead th:last-child:hover,\n.data-table thead th:nth-last-child(2):hover {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.data-table thead th.sorted {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.data-table thead th.sorted.desc .sort-icon {\n transform: rotate(180deg);\n}\n\n.data-table .sort-header {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.data-table .sort-icon {\n font-size: 10px;\n opacity: 0;\n transition: all 0.2s ease;\n}\n\n.data-table thead th:hover .sort-icon {\n opacity: 0.5;\n}\n\n.data-table thead th.sorted .sort-icon {\n opacity: 1;\n color: var(--mj-brand-primary);\n}\n\n.data-table tbody tr {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background-color 0.2s ease;\n}\n\n.data-table tbody tr:last-child {\n border-bottom: none;\n}\n\n.data-table tbody tr:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.data-table tbody td {\n padding: 18px 20px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.name-cell i {\n color: var(--mj-brand-primary);\n font-size: 18px;\n}\n\n/* Rank Badge */\n.rank-badge {\n display: inline-flex;\n align-items: center;\n padding: 6px 12px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.rank-badge.rank-high {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.rank-badge.rank-medium {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-color-warning-700);\n}\n\n.rank-badge.rank-low {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.rank-badge.rank-none {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n}\n\n/* Status Badge */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.status-badge.active {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.status-badge.inactive {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .dashboard-header {\n flex-direction: column;\n gap: 16px;\n align-items: stretch;\n padding: 16px 20px;\n }\n\n .header-info {\n flex-wrap: wrap;\n justify-content: center;\n }\n\n .header-controls {\n justify-content: center;\n }\n\n .content-area {\n padding: 16px;\n }\n\n .model-grid {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n\n .model-stats {\n grid-template-columns: 1fr;\n }\n\n .card-header {\n padding: 18px;\n }\n\n .card-body {\n padding: 0 18px 18px 18px;\n }\n\n .card-actions {\n padding: 14px 18px;\n flex-wrap: wrap;\n }\n}\n\n/* ============================================\n Detail Panel - Slide-in Panel\n ============================================ */\n\n/* Detail Panel Overlay */\n.detail-panel-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n z-index: 1000;\n opacity: 0;\n animation: fadeIn 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;\n}\n\n@keyframes fadeIn {\n to {\n opacity: 1;\n }\n}\n\n/* Detail Panel */\n.detail-panel {\n position: fixed;\n top: 0;\n right: -480px;\n width: 480px;\n max-width: 90vw;\n height: 100vh;\n background: var(--mj-bg-surface);\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transition: right 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.detail-panel.visible {\n right: 0;\n}\n\n/* Detail Panel Header */\n.detail-panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.detail-panel-title {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.detail-icon {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: var(--mj-brand-primary);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.detail-icon i {\n color: var(--mj-text-inverse);\n font-size: 24px;\n}\n\n.detail-title-info h3 {\n margin: 0 0 4px 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.detail-subtitle {\n font-size: 13px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.detail-panel-close {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--mj-text-muted);\n}\n\n.detail-panel-close:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n/* Detail Panel Content */\n.detail-panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n}\n\n/* Detail Section */\n.detail-section {\n margin-bottom: 28px;\n}\n\n.detail-section:last-child {\n margin-bottom: 0;\n}\n\n.detail-badges {\n display: flex;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.status-badge.status-active {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.status-badge.status-inactive {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.feature-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n.feature-badge i {\n font-size: 11px;\n}\n\n.detail-description {\n margin: 0;\n font-size: 14px;\n line-height: 1.7;\n color: var(--mj-text-secondary);\n}\n\n.detail-section-title {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 700;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-section-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n/* Detail Grid */\n.detail-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n}\n\n.detail-grid.single-column {\n grid-template-columns: 1fr;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 14px;\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n border: 1px solid var(--mj-border-default);\n}\n\n.detail-item.full-width {\n grid-column: 1 / -1;\n}\n\n.detail-label {\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.detail-value {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-value i {\n font-size: 13px;\n}\n\n.detail-value.muted {\n color: var(--mj-text-disabled);\n font-style: italic;\n}\n\n/* Status Badges in Detail Panel */\n.detail-section .status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n}\n\n.detail-section .status-badge.active {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.detail-section .status-badge.inactive {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n/* Detail Panel Actions */\n.detail-panel-actions {\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n flex-shrink: 0;\n}\n\n.detail-action-btn {\n padding: 12px 24px;\n border-radius: 10px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-action-btn.primary {\n background: var(--mj-brand-primary);\n border: none;\n color: var(--mj-text-inverse);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.detail-action-btn.primary:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.detail-action-btn.secondary {\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n}\n\n.detail-action-btn.secondary:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* Responsive adjustments for detail panel */\n@media (max-width: 520px) {\n .detail-panel {\n width: 100%;\n right: -100%;\n }\n\n .detail-panel.visible {\n right: 0;\n }\n\n .detail-grid {\n grid-template-columns: 1fr;\n }\n}\n\n/* Search Highlight */\n:host ::ng-deep .search-highlight,\n.search-highlight {\n background-color: color-mix(in srgb, var(--mj-status-warning) 30%, var(--mj-bg-surface));\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}\n"] }]
|
|
1381
|
+
args: [{ standalone: false, selector: 'app-model-management', template: "<mj-page-layout>\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading [text]=\"currentLoadingMessage\" size=\"large\"></mj-loading>\n </div>\n } @else {\n <mj-page-header\n Title=\"Models\"\n Icon=\"fa-solid fa-microchip\">\n <div meta>\n <mj-stat-badge [Count]=\"filteredModels.length\" Label=\"models\"></mj-stat-badge>\n </div>\n <div actions>\n <mj-filter-popover\n [ActiveCount]=\"ActiveFilterCount\"\n [ShowClearAll]=\"ActiveFilterCount > 0\"\n (ClearAllRequested)=\"resetPopoverFilters()\">\n <mj-filter-panel\n [Fields]=\"modelFilterFields\"\n [Values]=\"modelFilterValues\"\n (ValuesChange)=\"onFilterValuesChange($event)\"\n (Reset)=\"resetPopoverFilters()\">\n <!-- Custom widget: Power Rank range (min/max number inputs) -->\n <mj-filter-field Label=\"Power Rank\" Icon=\"fa-solid fa-bolt\">\n <div class=\"rank-filter-inputs\">\n <input\n type=\"number\"\n min=\"0\"\n [max]=\"maxPowerRank\"\n [(ngModel)]=\"powerRankRange.min\"\n (change)=\"validateAndApplyRankFilters('power')\"\n class=\"rank-input\"\n placeholder=\"Min\" />\n <span class=\"rank-separator\">-</span>\n <input\n type=\"number\"\n min=\"0\"\n [max]=\"maxPowerRank\"\n [(ngModel)]=\"powerRankRange.max\"\n (change)=\"validateAndApplyRankFilters('power')\"\n class=\"rank-input\"\n placeholder=\"Max\" />\n </div>\n </mj-filter-field>\n </mj-filter-panel>\n </mj-filter-popover>\n\n <mj-view-toggle\n [Options]=\"modelViewOptions\"\n [ActiveKey]=\"viewMode\"\n (KeyChange)=\"setViewMode($any($event))\">\n </mj-view-toggle>\n\n <button mjButton variant=\"primary\" size=\"sm\" (click)=\"createNewModel()\" title=\"Create New Model\">\n <i class=\"fa-solid fa-plus\"></i>\n New Model\n </button>\n </div>\n <div toolbar>\n <mj-page-search\n Placeholder=\"Search models...\"\n [Value]=\"searchTerm\"\n (ValueChange)=\"onSearchChange($event)\">\n </mj-page-search>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\">\n @if (filteredModels.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-microchip fa-4x\"></i>\n <h3>No models found</h3>\n <p>{{ hasActiveFilters ? 'Try adjusting your filters' : 'Create your first AI model to get started' }}</p>\n @if (!hasActiveFilters) {\n <button class=\"primary-action\" (click)=\"createNewModel()\">\n <i class=\"fa-solid fa-plus\"></i>\n Create First Model\n </button>\n }\n </div>\n } @else {\n @switch (viewMode) {\n @case ('grid') {\n <div class=\"model-grid\">\n @for (model of filteredModels; track model.ID) {\n <div class=\"model-card\" [class.expanded]=\"expandedModelId === model.ID\">\n <!-- Card Header -->\n <div class=\"card-header\" (click)=\"toggleModelExpansion(model.ID)\">\n <div class=\"model-info\">\n <div class=\"model-icon\">\n <i [class]=\"getModelIcon(model)\"></i>\n </div>\n <div class=\"model-details\">\n <h4 class=\"model-name\" [innerHTML]=\"(model.Name || 'Unnamed Model') | highlightSearch:searchTerm\"></h4>\n <div class=\"model-meta\">\n @if (model.Vendor) {\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-building\"></i>\n {{ model.Vendor }}\n </span>\n }\n @if (model.AIModelType) {\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ model.AIModelType }}\n </span>\n }\n @if (model.IsActive) {\n <span class=\"meta-item status-active\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Active\n </span>\n } @else {\n <span class=\"meta-item status-inactive\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Inactive\n </span>\n }\n </div>\n </div>\n </div>\n\n <i class=\"fa-solid fa-chevron-down expand-icon\"\n [class.rotated]=\"expandedModelId === model.ID\"></i>\n </div>\n\n <!-- Card Body -->\n <div class=\"card-body\">\n @if (model.Description) {\n <p class=\"model-description\" [innerHTML]=\"model.Description | highlightSearch:searchTerm\"></p>\n } @else {\n <p class=\"model-description text-muted\">No description provided</p>\n }\n\n <!-- Expandable Content -->\n @if (expandedModelId === model.ID) {\n <div class=\"expanded-content\">\n <div class=\"model-stats\">\n <div class=\"stat-item\">\n <span class=\"stat-label\">Power Rank</span>\n <span class=\"stat-value\">{{ formatRank(model.PowerRank, 'power') }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Speed Rank</span>\n <span class=\"stat-value\">{{ formatRank(model.SpeedRank, 'speed') }}</span>\n </div>\n <div class=\"stat-item\">\n <span class=\"stat-label\">Cost Rank</span>\n <span class=\"stat-value\">{{ formatRank(model.CostRank, 'cost') }}</span>\n </div>\n @if (model.InputTokenLimit) {\n <div class=\"stat-item\">\n <span class=\"stat-label\">Token Limit</span>\n <span class=\"stat-value\">{{ formatTokenLimit(model.InputTokenLimit) }}</span>\n </div>\n }\n @if (model.APIName) {\n <div class=\"stat-item\">\n <span class=\"stat-label\">API Name</span>\n <span class=\"stat-value\">{{ model.APIName }}</span>\n </div>\n }\n @if (model.DriverClass) {\n <div class=\"stat-item\">\n <span class=\"stat-label\">Driver</span>\n <span class=\"stat-value\">{{ model.DriverClass }}</span>\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Card Actions -->\n <div class=\"card-actions\">\n <button\n type=\"button\"\n class=\"action-btn\"\n (click)=\"showModelDetails(model, $event)\"\n title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></i>\n Details\n </button>\n </div>\n </div>\n }\n </div>\n }\n \n @case ('list') {\n <div class=\"model-list\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th (click)=\"onSortChange('name')\"\n [class.sorted]=\"sortBy === 'name'\"\n [class.desc]=\"sortBy === 'name' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Name\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('vendor')\"\n [class.sorted]=\"sortBy === 'vendor'\"\n [class.desc]=\"sortBy === 'vendor' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Vendor\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('type')\"\n [class.sorted]=\"sortBy === 'type'\"\n [class.desc]=\"sortBy === 'type' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Type\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('powerRank')\"\n [class.sorted]=\"sortBy === 'powerRank'\"\n [class.desc]=\"sortBy === 'powerRank' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Power\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('speedRank')\"\n [class.sorted]=\"sortBy === 'speedRank'\"\n [class.desc]=\"sortBy === 'speedRank' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Speed\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th (click)=\"onSortChange('costRank')\"\n [class.sorted]=\"sortBy === 'costRank'\"\n [class.desc]=\"sortBy === 'costRank' && sortDirection === 'desc'\">\n <span class=\"sort-header\">\n Cost\n <i class=\"fa-solid fa-chevron-up sort-icon\"></i>\n </span>\n </th>\n <th>Status</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (model of filteredModels; track model.ID) {\n <tr>\n <td>\n <div class=\"name-cell\">\n <i [class]=\"getModelIcon(model)\"></i>\n <span [innerHTML]=\"(model.Name || 'Unnamed Model') | highlightSearch:searchTerm\"></span>\n </div>\n </td>\n <td>{{ model.Vendor || '-' }}</td>\n <td>{{ model.AIModelType }}</td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.PowerRank, 'power')\">\n {{ formatRank(model.PowerRank, 'power') }}\n </span>\n </td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.SpeedRank, 'speed')\">\n {{ formatRank(model.SpeedRank, 'speed') }}\n </span>\n </td>\n <td>\n <span class=\"rank-badge\" [class]=\"getRankClass(model.CostRank, 'cost')\">\n {{ formatRank(model.CostRank, 'cost') }}\n </span>\n </td>\n <td>\n <span class=\"status-badge\" [class.active]=\"model.IsActive\" [class.inactive]=\"!model.IsActive\">\n {{ model.IsActive ? 'Active' : 'Inactive' }}\n </span>\n </td>\n <td>\n <button class=\"action-button small\" (click)=\"showModelDetails(model)\" title=\"View Details\">\n <i class=\"fa-solid fa-eye\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n }\n </mj-page-body>\n\n <!-- Detail Panel Overlay -->\n @if (detailPanelVisible) {\n <div class=\"detail-panel-overlay\" (click)=\"closeDetailPanel()\"></div>\n }\n\n <!-- Detail Panel -->\n <div class=\"detail-panel\" [class.visible]=\"detailPanelVisible\">\n @if (selectedModel) {\n <!-- Panel Header -->\n <div class=\"detail-panel-header\">\n <div class=\"detail-panel-title\">\n <div class=\"detail-icon\">\n <i [class]=\"getModelIcon(selectedModel)\"></i>\n </div>\n <div class=\"detail-title-info\">\n <h3>{{ selectedModel.Name }}</h3>\n <span class=\"detail-subtitle\">{{ selectedModel.Vendor || 'AI Model' }}</span>\n </div>\n </div>\n <button class=\"detail-panel-close\" (click)=\"closeDetailPanel()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Panel Content -->\n <div class=\"detail-panel-content\">\n <!-- Status Section -->\n <div class=\"detail-section\">\n <div class=\"detail-badges\">\n @if (selectedModel.IsActive) {\n <span class=\"status-badge status-active\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Active\n </span>\n } @else {\n <span class=\"status-badge status-inactive\">\n <i class=\"fa-solid fa-circle\" style=\"font-size: 8px;\"></i>\n Inactive\n </span>\n }\n @if (selectedModel.AIModelType) {\n <span class=\"feature-badge\">\n <i class=\"fa-solid fa-microchip\"></i>\n {{ selectedModel.AIModelType }}\n </span>\n }\n </div>\n </div>\n\n <!-- Description -->\n @if (selectedModel.Description) {\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-align-left\"></i>\n Description\n </h4>\n <p class=\"detail-description\">{{ selectedModel.Description }}</p>\n </div>\n }\n\n <!-- Ranking Details -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-chart-bar\"></i>\n Rankings\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Power Rank</span>\n <span class=\"detail-value rank-badge\" [class]=\"getRankClass(selectedModel.PowerRank, 'power')\">\n {{ formatRank(selectedModel.PowerRank, 'power') }}\n </span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Speed Rank</span>\n <span class=\"detail-value rank-badge\" [class]=\"getRankClass(selectedModel.SpeedRank, 'speed')\">\n {{ formatRank(selectedModel.SpeedRank, 'speed') }}\n </span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Cost Rank</span>\n <span class=\"detail-value rank-badge\" [class]=\"getRankClass(selectedModel.CostRank, 'cost')\">\n {{ formatRank(selectedModel.CostRank, 'cost') }}\n </span>\n </div>\n </div>\n </div>\n\n <!-- Configuration Details -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-cog\"></i>\n Configuration\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Vendor</span>\n <span class=\"detail-value\">{{ selectedModel.Vendor || 'Unknown' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Model Type</span>\n <span class=\"detail-value\">{{ selectedModel.AIModelType || 'Unknown' }}</span>\n </div>\n @if (selectedModel.APIName) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">API Name</span>\n <span class=\"detail-value\">{{ selectedModel.APIName }}</span>\n </div>\n }\n @if (selectedModel.InputTokenLimit) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Input Token Limit</span>\n <span class=\"detail-value\">{{ formatTokenLimit(selectedModel.InputTokenLimit) }}</span>\n </div>\n }\n @if (selectedModel.SupportedResponseFormats) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Response Formats</span>\n <span class=\"detail-value\">{{ selectedModel.SupportedResponseFormats }}</span>\n </div>\n }\n @if (selectedModel.SupportsEffortLevel) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Supports Effort Level</span>\n <span class=\"detail-value\">Yes</span>\n </div>\n }\n @if (selectedModel.DriverClass) {\n <div class=\"detail-item\">\n <span class=\"detail-label\">Driver Class</span>\n <span class=\"detail-value\">{{ selectedModel.DriverClass }}</span>\n </div>\n }\n </div>\n </div>\n\n <!-- Timestamps -->\n <div class=\"detail-section\">\n <h4 class=\"detail-section-title\">\n <i class=\"fa-solid fa-clock\"></i>\n Timestamps\n </h4>\n <div class=\"detail-grid\">\n <div class=\"detail-item\">\n <span class=\"detail-label\">Created</span>\n <span class=\"detail-value\">{{ selectedModel.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"detail-item\">\n <span class=\"detail-label\">Updated</span>\n <span class=\"detail-value\">{{ selectedModel.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Panel Actions -->\n <div class=\"detail-panel-actions\">\n <button\n type=\"button\"\n class=\"detail-action-btn primary\"\n (click)=\"openModelFromPanel()\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n Open Full Record\n </button>\n </div>\n }\n </div>\n }\n</mj-page-layout>", styles: ["/* ============================================\n AI Models Dashboard - World-Class Design\n Clean header with brand blue accents\n ============================================ */\n\n/* Container is now provided by <mj-page-layout> */\n\n/* Loading State */\n.loading-container {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n background: var(--mj-bg-surface-card);\n}\n\n/* Tinted card background on the body \u2014 matches the original .content-area\n surface treatment so model cards sit on a lightly-tinted surface. */\n:host mj-page-body {\n background: var(--mj-bg-surface-card);\n}\n\n/* View toggle now provided by <mj-view-toggle>. */\n\n.control-btn {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n padding: 10px 18px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.control-btn:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.control-btn i {\n font-size: 14px;\n}\n\n.control-btn.primary {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary-hover);\n color: var(--mj-text-inverse);\n}\n\n.control-btn.primary:hover {\n background: var(--mj-brand-primary-hover);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n}\n\n/* Splitter */\nas-split {\n flex: 1;\n background: var(--mj-bg-surface-card);\n margin-top: 0;\n}\n\n/* Filter Panel */\n.filter-panel {\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n/* Header */\n.filter-panel-header {\n padding: 20px;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n background: var(--mj-bg-surface-card);\n}\n\n.filter-panel-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary);\n flex: 1;\n letter-spacing: -0.02em;\n}\n\n.filter-panel-header .filter-summary-inline {\n display: flex;\n align-items: baseline;\n gap: 4px;\n margin-right: 16px;\n font-size: 13px;\n padding: 6px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-radius: 20px;\n border: 1px solid var(--mj-brand-accent);\n}\n\n.filter-panel-header .filter-summary-inline .summary-value {\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n.filter-panel-header .filter-summary-inline .summary-label {\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n\n.filter-panel-header .close-btn {\n background: transparent;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: var(--mj-text-disabled);\n border-radius: 8px;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.filter-panel-header .close-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.filter-panel-header .close-btn .fa-solid {\n font-size: 14px;\n}\n\n/* Content Area */\n.filter-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 20px;\n}\n\n/* Filter Groups */\n.filter-group {\n margin-bottom: 24px;\n}\n\n.filter-group .filter-label {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 10px;\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.75px;\n}\n\n.filter-group .filter-label .fa-solid {\n font-size: 13px;\n color: var(--mj-brand-primary);\n width: 16px;\n}\n\n.filter-group .filter-input,\n.filter-group .filter-select {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: var(--mj-text-secondary);\n}\n\n.filter-group .filter-input:focus,\n.filter-group .filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.filter-group .filter-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.filter-group .filter-select {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n/* Legacy support for non-scoped selectors */\n.filter-input,\n.filter-select {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 14px;\n background: var(--mj-bg-surface);\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n color: var(--mj-text-secondary);\n}\n\n.filter-input:focus,\n.filter-select:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.filter-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n.filter-select {\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M2.5 4.5L6 8l3.5-3.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 14px center;\n padding-right: 36px;\n}\n\n/* Rank Filter */\n.rank-filter-inputs {\n display: flex;\n gap: 10px;\n align-items: center;\n margin-top: 8px;\n}\n\n.rank-input {\n width: 70px;\n padding: 10px 12px;\n border: 2px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n text-align: center;\n background: var(--mj-bg-surface);\n transition: all 0.3s;\n box-sizing: border-box;\n -moz-appearance: textfield;\n}\n\n.rank-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.rank-input::placeholder {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.rank-input::-webkit-inner-spin-button,\n.rank-input::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.rank-separator {\n color: var(--mj-text-muted);\n font-size: 13px;\n font-weight: 600;\n}\n\n/* Filter Actions */\n.filter-actions {\n margin-top: 28px;\n padding-top: 20px;\n border-top: 1px solid var(--mj-bg-surface-sunken);\n}\n\n.filter-actions .reset-btn {\n width: 100%;\n padding: 12px 16px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n color: var(--mj-text-muted);\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n box-sizing: border-box;\n}\n\n.filter-actions .reset-btn:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-secondary);\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.filter-actions .reset-btn .fa-solid {\n font-size: 13px;\n}\n\n/* Scrollbar Styling */\n.filter-content::-webkit-scrollbar {\n width: 6px;\n}\n\n.filter-content::-webkit-scrollbar-track {\n background: var(--mj-bg-surface-card);\n border-radius: 3px;\n}\n\n.filter-content::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n border-radius: 3px;\n}\n\n.filter-content::-webkit-scrollbar-thumb:hover {\n background: var(--mj-text-disabled);\n}\n\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n color: var(--mj-text-muted);\n padding: 60px 32px;\n}\n\n.empty-state i {\n font-size: 80px;\n background: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n margin-bottom: 28px;\n opacity: 1;\n}\n\n.empty-state h3 {\n margin: 0 0 12px 0;\n font-size: 24px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.empty-state p {\n margin: 0 0 32px 0;\n font-size: 16px;\n line-height: 1.6;\n max-width: 420px;\n}\n\n/* Grid View */\n.model-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));\n gap: 24px;\n}\n\n.model-card {\n background: var(--mj-bg-surface);\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);\n border: 1px solid var(--mj-border-default);\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n position: relative;\n}\n\n.model-card::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 4px;\n background: var(--mj-brand-primary);\n opacity: 0;\n transition: opacity 0.3s ease;\n}\n\n.model-card:hover {\n box-shadow: 0 20px 40px -15px color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n transform: translateY(-4px);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-bg-surface));\n}\n\n.model-card:hover::before {\n opacity: 1;\n}\n\n.model-card.expanded {\n box-shadow: 0 25px 50px -12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n border-color: var(--mj-brand-accent);\n}\n\n.model-card.expanded::before {\n opacity: 1;\n}\n\n.card-header {\n padding: 24px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n cursor: pointer;\n user-select: none;\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background-color 0.2s;\n}\n\n.card-header:hover {\n background-color: var(--mj-bg-surface-card);\n}\n\n.model-info {\n display: flex;\n gap: 18px;\n flex: 1;\n}\n\n.model-icon {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: var(--mj-brand-primary);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.model-icon i {\n color: var(--mj-text-inverse);\n font-size: 24px;\n}\n\n.model-details {\n flex: 1;\n min-width: 0;\n}\n\n.model-name {\n margin: 0;\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin-bottom: 8px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.model-meta {\n display: flex;\n gap: 14px;\n flex-wrap: wrap;\n}\n\n.meta-item {\n font-size: 13px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--mj-bg-surface-sunken);\n padding: 4px 10px;\n border-radius: 6px;\n}\n\n.meta-item i {\n font-size: 11px;\n color: var(--mj-brand-primary);\n}\n\n.meta-item.status-active {\n color: var(--mj-color-success-700);\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n}\n\n.meta-item.status-active i {\n color: var(--mj-color-success-700);\n}\n\n.meta-item.status-inactive {\n color: var(--mj-text-muted);\n background: var(--mj-border-default);\n}\n\n.meta-item.status-inactive i {\n color: var(--mj-text-muted);\n}\n\n.expand-icon {\n font-size: 16px;\n color: var(--mj-text-disabled);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n padding: 8px;\n border-radius: 8px;\n}\n\n.expand-icon:hover {\n color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.expand-icon.rotated {\n transform: rotate(180deg);\n color: var(--mj-brand-primary);\n}\n\n.card-body {\n padding: 0 24px 24px 24px;\n}\n\n.model-description {\n margin: 18px 0 0 0;\n font-size: 14px;\n line-height: 1.7;\n color: var(--mj-text-muted);\n}\n\n.model-description.text-muted {\n font-style: italic;\n color: var(--mj-text-disabled);\n}\n\n/* Expanded Content */\n.expanded-content {\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid var(--mj-border-default);\n animation: slideDown 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-12px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.model-stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n gap: 18px;\n}\n\n.stat-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 16px;\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n border: 1px solid var(--mj-border-default);\n}\n\n.stat-label {\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.stat-value {\n font-size: 15px;\n color: var(--mj-text-primary);\n font-weight: 600;\n}\n\n/* Card Actions */\n.card-actions {\n padding: 18px 24px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n}\n\n.action-btn {\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-border-default);\n padding: 10px 20px;\n border-radius: 10px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.action-btn:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n transform: translateY(-1px);\n}\n\n.action-btn-primary {\n background: var(--mj-brand-primary);\n border-color: transparent;\n color: var(--mj-text-inverse);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.action-btn-primary:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n/* List View */\n.model-list {\n background: var(--mj-bg-surface);\n border-radius: 16px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n border: 1px solid var(--mj-border-default);\n overflow: hidden;\n}\n\n.data-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table thead {\n background: var(--mj-bg-surface-card);\n}\n\n.data-table thead tr {\n border-bottom: 2px solid var(--mj-border-default);\n}\n\n.data-table thead th {\n padding: 16px 20px;\n text-align: left;\n font-size: 12px;\n font-weight: 700;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n cursor: pointer;\n user-select: none;\n transition: all 0.2s ease;\n}\n\n.data-table thead th:hover {\n background: var(--mj-border-default);\n color: var(--mj-brand-primary);\n}\n\n.data-table thead th:last-child,\n.data-table thead th:nth-last-child(2) {\n cursor: default;\n}\n\n.data-table thead th:last-child:hover,\n.data-table thead th:nth-last-child(2):hover {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.data-table thead th.sorted {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n\n.data-table thead th.sorted.desc .sort-icon {\n transform: rotate(180deg);\n}\n\n.data-table .sort-header {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.data-table .sort-icon {\n font-size: 10px;\n opacity: 0;\n transition: all 0.2s ease;\n}\n\n.data-table thead th:hover .sort-icon {\n opacity: 0.5;\n}\n\n.data-table thead th.sorted .sort-icon {\n opacity: 1;\n color: var(--mj-brand-primary);\n}\n\n.data-table tbody tr {\n border-bottom: 1px solid var(--mj-bg-surface-sunken);\n transition: background-color 0.2s ease;\n}\n\n.data-table tbody tr:last-child {\n border-bottom: none;\n}\n\n.data-table tbody tr:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.data-table tbody td {\n padding: 18px 20px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n}\n\n.name-cell {\n display: flex;\n align-items: center;\n gap: 12px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.name-cell i {\n color: var(--mj-brand-primary);\n font-size: 18px;\n}\n\n/* Rank Badge */\n.rank-badge {\n display: inline-flex;\n align-items: center;\n padding: 6px 12px;\n border-radius: 8px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.rank-badge.rank-high {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.rank-badge.rank-medium {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-color-warning-700);\n}\n\n.rank-badge.rank-low {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.rank-badge.rank-none {\n background: var(--mj-border-default);\n color: var(--mj-text-secondary);\n}\n\n/* Status Badge */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.status-badge.active {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.status-badge.inactive {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .dashboard-header {\n flex-direction: column;\n gap: 16px;\n align-items: stretch;\n padding: 16px 20px;\n }\n\n .header-info {\n flex-wrap: wrap;\n justify-content: center;\n }\n\n .header-controls {\n justify-content: center;\n }\n\n .model-grid {\n grid-template-columns: 1fr;\n gap: 16px;\n }\n\n .model-stats {\n grid-template-columns: 1fr;\n }\n\n .card-header {\n padding: 18px;\n }\n\n .card-body {\n padding: 0 18px 18px 18px;\n }\n\n .card-actions {\n padding: 14px 18px;\n flex-wrap: wrap;\n }\n}\n\n/* ============================================\n Detail Panel - Slide-in Panel\n ============================================ */\n\n/* Detail Panel Overlay */\n.detail-panel-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n z-index: 1000;\n opacity: 0;\n animation: fadeIn 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;\n}\n\n@keyframes fadeIn {\n to {\n opacity: 1;\n }\n}\n\n/* Detail Panel */\n.detail-panel {\n position: fixed;\n top: 0;\n right: -480px;\n width: 480px;\n max-width: 90vw;\n height: 100vh;\n background: var(--mj-bg-surface);\n box-shadow: -8px 0 32px rgba(0, 0, 0, 0.15);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transition: right 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.detail-panel.visible {\n right: 0;\n}\n\n/* Detail Panel Header */\n.detail-panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 24px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.detail-panel-title {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.detail-icon {\n width: 56px;\n height: 56px;\n border-radius: 14px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: var(--mj-brand-primary);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.detail-icon i {\n color: var(--mj-text-inverse);\n font-size: 24px;\n}\n\n.detail-title-info h3 {\n margin: 0 0 4px 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n}\n\n.detail-subtitle {\n font-size: 13px;\n color: var(--mj-text-muted);\n font-weight: 500;\n}\n\n.detail-panel-close {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n color: var(--mj-text-muted);\n}\n\n.detail-panel-close:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n/* Detail Panel Content */\n.detail-panel-content {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n}\n\n/* Detail Section */\n.detail-section {\n margin-bottom: 28px;\n}\n\n.detail-section:last-child {\n margin-bottom: 0;\n}\n\n.detail-badges {\n display: flex;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.status-badge.status-active {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.status-badge.status-inactive {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n.feature-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 600;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n.feature-badge i {\n font-size: 11px;\n}\n\n.detail-description {\n margin: 0;\n font-size: 14px;\n line-height: 1.7;\n color: var(--mj-text-secondary);\n}\n\n.detail-section-title {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0 0 16px 0;\n font-size: 14px;\n font-weight: 700;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.detail-section-title i {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n/* Detail Grid */\n.detail-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n}\n\n.detail-grid.single-column {\n grid-template-columns: 1fr;\n}\n\n.detail-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 14px;\n background: var(--mj-bg-surface-card);\n border-radius: 12px;\n border: 1px solid var(--mj-border-default);\n}\n\n.detail-item.full-width {\n grid-column: 1 / -1;\n}\n\n.detail-label {\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.detail-value {\n font-size: 14px;\n color: var(--mj-text-primary);\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.detail-value i {\n font-size: 13px;\n}\n\n.detail-value.muted {\n color: var(--mj-text-disabled);\n font-style: italic;\n}\n\n/* Status Badges in Detail Panel */\n.detail-section .status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border-radius: 20px;\n font-size: 13px;\n font-weight: 600;\n}\n\n.detail-section .status-badge.active {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-color-success-700);\n}\n\n.detail-section .status-badge.inactive {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n color: var(--mj-status-error);\n}\n\n/* Detail Panel Actions */\n.detail-panel-actions {\n padding: 20px 24px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n gap: 12px;\n justify-content: flex-end;\n flex-shrink: 0;\n}\n\n.detail-action-btn {\n padding: 12px 24px;\n border-radius: 10px;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.detail-action-btn.primary {\n background: var(--mj-brand-primary);\n border: none;\n color: var(--mj-text-inverse);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.detail-action-btn.primary:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-2px);\n box-shadow: 0 6px 16px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.detail-action-btn.secondary {\n background: var(--mj-bg-surface);\n border: 2px solid var(--mj-border-default);\n color: var(--mj-text-secondary);\n}\n\n.detail-action-btn.secondary:hover {\n background: var(--mj-bg-surface-card);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n/* Responsive adjustments for detail panel */\n@media (max-width: 520px) {\n .detail-panel {\n width: 100%;\n right: -100%;\n }\n\n .detail-panel.visible {\n right: 0;\n }\n\n .detail-grid {\n grid-template-columns: 1fr;\n }\n}\n\n/* Search Highlight */\n:host ::ng-deep .search-highlight,\n.search-highlight {\n background-color: color-mix(in srgb, var(--mj-status-warning) 30%, var(--mj-bg-surface));\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}\n"] }]
|
|
1437
1382
|
}], () => [{ type: i1.SharedService }, { type: i0.ChangeDetectorRef }], null); })();
|
|
1438
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ModelManagementComponent, { className: "ModelManagementComponent", filePath: "src/AI/components/models/model-management.component.ts", lineNumber:
|
|
1383
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ModelManagementComponent, { className: "ModelManagementComponent", filePath: "src/AI/components/models/model-management.component.ts", lineNumber: 46 }); })();
|
|
1439
1384
|
//# sourceMappingURL=model-management.component.js.map
|