@memberjunction/ng-dashboards 5.34.0 → 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.
Files changed (348) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.d.ts +51 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +399 -292
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +8 -2
  6. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -1
  7. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +87 -85
  8. package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -1
  9. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +75 -0
  10. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  11. package/dist/AI/components/analytics/ai-analytics-resource.component.js +400 -89
  12. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  13. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +5 -0
  14. package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -1
  15. package/dist/AI/components/analytics/analytics-filter-bar.component.js +184 -135
  16. package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -1
  17. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +8 -2
  18. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  19. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +104 -103
  20. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  21. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +8 -2
  22. package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -1
  23. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +76 -74
  24. package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -1
  25. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  26. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +67 -87
  27. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  28. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +12 -19
  29. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  30. package/dist/AI/components/analytics/model-performance/model-performance.component.js +96 -203
  31. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  32. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  33. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +110 -126
  34. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  35. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  36. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +61 -77
  37. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  38. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +990 -992
  39. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  40. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +6 -3
  41. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  42. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +493 -490
  43. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  44. package/dist/AI/components/models/model-management.component.d.ts +17 -0
  45. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  46. package/dist/AI/components/models/model-management.component.js +370 -425
  47. package/dist/AI/components/models/model-management.component.js.map +1 -1
  48. package/dist/AI/components/prompts/prompt-management.component.d.ts +17 -0
  49. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  50. package/dist/AI/components/prompts/prompt-management.component.js +317 -357
  51. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  52. package/dist/AI/components/requests/agent-requests-resource.component.d.ts +11 -0
  53. package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
  54. package/dist/AI/components/requests/agent-requests-resource.component.js +170 -175
  55. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  56. package/dist/AI/components/system/system-configuration.component.d.ts +19 -0
  57. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  58. package/dist/AI/components/system/system-configuration.component.js +403 -362
  59. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  60. package/dist/AI/components/tags/tags-resource.component.js +781 -783
  61. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  62. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +8 -3
  63. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  64. package/dist/AI/components/vectors/vector-management-resource.component.js +547 -521
  65. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  66. package/dist/Actions/components/actions-overview.component.d.ts +6 -0
  67. package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
  68. package/dist/Actions/components/actions-overview.component.js +79 -30
  69. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  70. package/dist/Actions/components/execution-monitoring.component.d.ts +9 -3
  71. package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
  72. package/dist/Actions/components/execution-monitoring.component.js +196 -142
  73. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  74. package/dist/Actions/components/explorer/action-explorer.component.d.ts +41 -1
  75. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  76. package/dist/Actions/components/explorer/action-explorer.component.js +388 -94
  77. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  78. package/dist/Actions/components/explorer/index.d.ts +0 -1
  79. package/dist/Actions/components/explorer/index.d.ts.map +1 -1
  80. package/dist/Actions/components/explorer/index.js +0 -1
  81. package/dist/Actions/components/explorer/index.js.map +1 -1
  82. package/dist/Admin/admin-data-schema.component.js +32 -40
  83. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  84. package/dist/Admin/admin-dev-tools-resource.component.js +32 -40
  85. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  86. package/dist/Admin/admin-identity-access.component.js +32 -40
  87. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  88. package/dist/Admin/admin-monitoring.component.js +32 -40
  89. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  90. package/dist/ApplicationRoles/application-roles-resource.component.js +76 -82
  91. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  92. package/dist/Archiving/components/archive-config-resource.component.d.ts.map +1 -1
  93. package/dist/Archiving/components/archive-config-resource.component.js +24 -5
  94. package/dist/Archiving/components/archive-config-resource.component.js.map +1 -1
  95. package/dist/Archiving/components/archive-runs-resource.component.d.ts.map +1 -1
  96. package/dist/Archiving/components/archive-runs-resource.component.js +24 -5
  97. package/dist/Archiving/components/archive-runs-resource.component.js.map +1 -1
  98. package/dist/Communication/communication-logs-resource.component.d.ts +1 -1
  99. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  100. package/dist/Communication/communication-logs-resource.component.js +80 -99
  101. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  102. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  103. package/dist/Communication/communication-monitor-resource.component.js +127 -106
  104. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  105. package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
  106. package/dist/Communication/communication-providers-resource.component.js +44 -45
  107. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  108. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  109. package/dist/Communication/communication-runs-resource.component.js +60 -58
  110. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  111. package/dist/Communication/communication-templates-resource.component.d.ts +1 -1
  112. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  113. package/dist/Communication/communication-templates-resource.component.js +139 -162
  114. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  115. package/dist/Credentials/components/credentials-audit-resource.component.d.ts +7 -0
  116. package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
  117. package/dist/Credentials/components/credentials-audit-resource.component.js +310 -297
  118. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  119. package/dist/Credentials/components/credentials-categories-resource.component.js +245 -266
  120. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  121. package/dist/Credentials/components/credentials-list-resource.component.d.ts +7 -0
  122. package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
  123. package/dist/Credentials/components/credentials-list-resource.component.js +381 -399
  124. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  125. package/dist/Credentials/components/credentials-overview-resource.component.js +222 -228
  126. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  127. package/dist/Credentials/components/credentials-types-resource.component.d.ts +6 -0
  128. package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
  129. package/dist/Credentials/components/credentials-types-resource.component.js +294 -305
  130. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  131. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts +8 -0
  132. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.d.ts.map +1 -1
  133. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +21 -0
  134. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
  135. package/dist/DatabaseDesigner/components/entity-list.component.js +147 -160
  136. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  137. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
  138. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  139. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +19 -1
  140. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  141. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -16
  142. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  143. package/dist/Home/home-dashboard.component.d.ts +6 -0
  144. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  145. package/dist/Home/home-dashboard.component.js +521 -485
  146. package/dist/Home/home-dashboard.component.js.map +1 -1
  147. package/dist/Integration/components/activity/activity.component.d.ts +8 -0
  148. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  149. package/dist/Integration/components/activity/activity.component.js +309 -318
  150. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  151. package/dist/Integration/components/connections/connections.component.js +866 -847
  152. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  153. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +234 -233
  154. package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
  155. package/dist/Integration/components/overview/overview.component.js +182 -163
  156. package/dist/Integration/components/overview/overview.component.js.map +1 -1
  157. package/dist/Integration/components/pipelines/pipelines.component.d.ts +2 -0
  158. package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
  159. package/dist/Integration/components/pipelines/pipelines.component.js +610 -606
  160. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  161. package/dist/Integration/components/schedules/schedules.component.js +241 -241
  162. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  163. package/dist/Integration/integration.module.d.ts +1 -1
  164. package/dist/Integration/integration.module.d.ts.map +1 -1
  165. package/dist/Integration/integration.module.js +28 -1
  166. package/dist/Integration/integration.module.js.map +1 -1
  167. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +673 -674
  168. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  169. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +54 -51
  170. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  171. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +745 -703
  172. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  173. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +12 -1
  174. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
  175. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +191 -120
  176. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  177. package/dist/Lists/components/lists-browse-resource.component.d.ts +18 -1
  178. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  179. package/dist/Lists/components/lists-browse-resource.component.js +486 -532
  180. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  181. package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
  182. package/dist/Lists/components/lists-categories-resource.component.js +152 -160
  183. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  184. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  185. package/dist/Lists/components/lists-my-lists-resource.component.js +302 -319
  186. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  187. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  188. package/dist/Lists/components/lists-operations-resource.component.js +234 -246
  189. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  190. package/dist/MCP/mcp-dashboard.component.d.ts +20 -0
  191. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  192. package/dist/MCP/mcp-dashboard.component.js +1248 -1338
  193. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  194. package/dist/MCP/mcp.module.d.ts +1 -1
  195. package/dist/MCP/mcp.module.d.ts.map +1 -1
  196. package/dist/MCP/mcp.module.js +34 -1
  197. package/dist/MCP/mcp.module.js.map +1 -1
  198. package/dist/Permissions/audit-log-resource.component.js +76 -85
  199. package/dist/Permissions/audit-log-resource.component.js.map +1 -1
  200. package/dist/Permissions/resource-access-resource.component.js +64 -69
  201. package/dist/Permissions/resource-access-resource.component.js.map +1 -1
  202. package/dist/Permissions/user-access-resource.component.js +63 -74
  203. package/dist/Permissions/user-access-resource.component.js.map +1 -1
  204. package/dist/QueryBrowser/query-browser-resource.component.js +2 -2
  205. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  206. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +2 -1
  207. package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
  208. package/dist/Scheduling/components/scheduling-activity-resource.component.js +11 -12
  209. package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
  210. package/dist/Scheduling/components/scheduling-activity.component.d.ts +9 -1
  211. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  212. package/dist/Scheduling/components/scheduling-activity.component.js +250 -197
  213. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  214. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +2 -1
  215. package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
  216. package/dist/Scheduling/components/scheduling-jobs-resource.component.js +11 -12
  217. package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
  218. package/dist/Scheduling/components/scheduling-jobs.component.d.ts +9 -1
  219. package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
  220. package/dist/Scheduling/components/scheduling-jobs.component.js +203 -147
  221. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  222. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +2 -1
  223. package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
  224. package/dist/Scheduling/components/scheduling-overview-resource.component.js +11 -12
  225. package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
  226. package/dist/Scheduling/components/scheduling-overview.component.d.ts +3 -1
  227. package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
  228. package/dist/Scheduling/components/scheduling-overview.component.js +224 -190
  229. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  230. package/dist/Scheduling/scheduling-dashboard.component.d.ts +19 -6
  231. package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
  232. package/dist/Scheduling/scheduling-dashboard.component.js +262 -104
  233. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  234. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +4 -0
  235. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  236. package/dist/SystemDiagnostics/system-diagnostics.component.js +812 -784
  237. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  238. package/dist/Testing/components/testing-analytics-resource.component.d.ts +2 -1
  239. package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
  240. package/dist/Testing/components/testing-analytics-resource.component.js +7 -14
  241. package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
  242. package/dist/Testing/components/testing-analytics.component.d.ts +3 -1
  243. package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
  244. package/dist/Testing/components/testing-analytics.component.js +420 -393
  245. package/dist/Testing/components/testing-analytics.component.js.map +1 -1
  246. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
  247. package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
  248. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +16 -19
  249. package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
  250. package/dist/Testing/components/testing-dashboard-tab.component.d.ts +3 -1
  251. package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
  252. package/dist/Testing/components/testing-dashboard-tab.component.js +157 -122
  253. package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
  254. package/dist/Testing/components/testing-explorer-resource.component.d.ts +2 -1
  255. package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
  256. package/dist/Testing/components/testing-explorer-resource.component.js +7 -12
  257. package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
  258. package/dist/Testing/components/testing-explorer.component.d.ts +8 -1
  259. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  260. package/dist/Testing/components/testing-explorer.component.js +587 -608
  261. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  262. package/dist/Testing/components/testing-review-resource.component.d.ts +4 -1
  263. package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
  264. package/dist/Testing/components/testing-review-resource.component.js +9 -12
  265. package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
  266. package/dist/Testing/components/testing-review.component.d.ts +3 -1
  267. package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
  268. package/dist/Testing/components/testing-review.component.js +310 -274
  269. package/dist/Testing/components/testing-review.component.js.map +1 -1
  270. package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
  271. package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
  272. package/dist/Testing/components/testing-runs-resource.component.js +16 -19
  273. package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
  274. package/dist/Testing/components/testing-runs.component.d.ts +3 -1
  275. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  276. package/dist/Testing/components/testing-runs.component.js +307 -273
  277. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  278. package/dist/Testing/testing-dashboard.component.d.ts +2 -0
  279. package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
  280. package/dist/Testing/testing-dashboard.component.js +107 -93
  281. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  282. package/dist/VersionHistory/components/diff-resource.component.js +185 -188
  283. package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
  284. package/dist/VersionHistory/components/graph-resource.component.js +154 -184
  285. package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
  286. package/dist/VersionHistory/components/labels-resource.component.d.ts +7 -0
  287. package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
  288. package/dist/VersionHistory/components/labels-resource.component.js +350 -354
  289. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  290. package/dist/VersionHistory/components/restore-resource.component.js +163 -169
  291. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  292. package/dist/actions-dashboards.module.d.ts +15 -16
  293. package/dist/actions-dashboards.module.d.ts.map +1 -1
  294. package/dist/actions-dashboards.module.js +34 -11
  295. package/dist/actions-dashboards.module.js.map +1 -1
  296. package/dist/ai-dashboards.module.d.ts +45 -48
  297. package/dist/ai-dashboards.module.d.ts.map +1 -1
  298. package/dist/ai-dashboards.module.js +36 -10
  299. package/dist/ai-dashboards.module.js.map +1 -1
  300. package/dist/archiving-dashboards.module.d.ts +2 -1
  301. package/dist/archiving-dashboards.module.d.ts.map +1 -1
  302. package/dist/archiving-dashboards.module.js +12 -2
  303. package/dist/archiving-dashboards.module.js.map +1 -1
  304. package/dist/communication-dashboards.module.d.ts +2 -1
  305. package/dist/communication-dashboards.module.d.ts.map +1 -1
  306. package/dist/communication-dashboards.module.js +24 -3
  307. package/dist/communication-dashboards.module.js.map +1 -1
  308. package/dist/core-dashboards.module.d.ts +1 -1
  309. package/dist/core-dashboards.module.d.ts.map +1 -1
  310. package/dist/core-dashboards.module.js +31 -1
  311. package/dist/core-dashboards.module.js.map +1 -1
  312. package/dist/credentials-dashboards.module.d.ts +1 -1
  313. package/dist/credentials-dashboards.module.d.ts.map +1 -1
  314. package/dist/credentials-dashboards.module.js +28 -1
  315. package/dist/credentials-dashboards.module.js.map +1 -1
  316. package/dist/lists-dashboards.module.d.ts +1 -1
  317. package/dist/lists-dashboards.module.d.ts.map +1 -1
  318. package/dist/lists-dashboards.module.js +28 -1
  319. package/dist/lists-dashboards.module.js.map +1 -1
  320. package/dist/public-api.d.ts +2 -2
  321. package/dist/public-api.d.ts.map +1 -1
  322. package/dist/public-api.js +3 -3
  323. package/dist/public-api.js.map +1 -1
  324. package/dist/scheduling-dashboards.module.d.ts +1 -1
  325. package/dist/scheduling-dashboards.module.d.ts.map +1 -1
  326. package/dist/scheduling-dashboards.module.js +31 -1
  327. package/dist/scheduling-dashboards.module.js.map +1 -1
  328. package/dist/testing-dashboards.module.d.ts +8 -7
  329. package/dist/testing-dashboards.module.d.ts.map +1 -1
  330. package/dist/testing-dashboards.module.js +30 -0
  331. package/dist/testing-dashboards.module.js.map +1 -1
  332. package/package.json +52 -52
  333. package/dist/AI/components/agents/agent-filter-panel.component.d.ts +0 -56
  334. package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +0 -1
  335. package/dist/AI/components/agents/agent-filter-panel.component.js +0 -285
  336. package/dist/AI/components/agents/agent-filter-panel.component.js.map +0 -1
  337. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts +0 -49
  338. package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +0 -1
  339. package/dist/AI/components/prompts/prompt-filter-panel.component.js +0 -184
  340. package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +0 -1
  341. package/dist/AI/components/system/system-config-filter-panel.component.d.ts +0 -33
  342. package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +0 -1
  343. package/dist/AI/components/system/system-config-filter-panel.component.js +0 -144
  344. package/dist/AI/components/system/system-config-filter-panel.component.js.map +0 -1
  345. package/dist/Actions/components/explorer/action-toolbar.component.d.ts +0 -63
  346. package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +0 -1
  347. package/dist/Actions/components/explorer/action-toolbar.component.js +0 -463
  348. 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 "angular-split";
19
- import * as i4 from "@memberjunction/ng-shared-generic";
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.value;
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", 1);
26
- i0.ɵɵelement(1, "mj-loading", 2);
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 ModelManagementComponent_Conditional_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
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, "as-split-area", 19)(1, "div", 24)(2, "div", 25)(3, "h3");
72
- i0.ɵɵtext(4, "Model Filters");
73
- i0.ɵɵelementEnd();
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 ModelManagementComponent_Conditional_2_Conditional_24_Template(rf, ctx) { if (rf & 1) {
195
- i0.ɵɵelementStart(0, "div", 21);
196
- i0.ɵɵelement(1, "i", 52);
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, ModelManagementComponent_Conditional_2_Conditional_24_Conditional_6_Template, 3, 0, "button", 53);
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 ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
213
- i0.ɵɵelementStart(0, "span", 65);
214
- i0.ɵɵelement(1, "i", 39);
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 model_r9 = i0.ɵɵnextContext().$implicit;
64
+ const model_r5 = i0.ɵɵnextContext().$implicit;
219
65
  i0.ɵɵadvance(2);
220
- i0.ɵɵtextInterpolate1(" ", model_r9.Vendor, " ");
66
+ i0.ɵɵtextInterpolate1(" ", model_r5.Vendor, " ");
221
67
  } }
222
- function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
223
- i0.ɵɵelementStart(0, "span", 65);
224
- i0.ɵɵelement(1, "i", 6);
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 model_r9 = i0.ɵɵnextContext().$implicit;
74
+ const model_r5 = i0.ɵɵnextContext().$implicit;
229
75
  i0.ɵɵadvance(2);
230
- i0.ɵɵtextInterpolate1(" ", model_r9.AIModelType, " ");
76
+ i0.ɵɵtextInterpolate1(" ", model_r5.AIModelType, " ");
231
77
  } }
232
- function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_11_Template(rf, ctx) { if (rf & 1) {
233
- i0.ɵɵelementStart(0, "span", 66);
234
- i0.ɵɵelement(1, "i", 76);
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 ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
239
- i0.ɵɵelementStart(0, "span", 67);
240
- i0.ɵɵelement(1, "i", 76);
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 ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_15_Template(rf, ctx) { if (rf & 1) {
245
- i0.ɵɵelement(0, "p", 70);
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 model_r9 = i0.ɵɵnextContext().$implicit;
94
+ const model_r5 = i0.ɵɵnextContext().$implicit;
249
95
  const ctx_r0 = i0.ɵɵnextContext(4);
250
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(1, 1, model_r9.Description, ctx_r0.searchTerm), i0.ɵɵsanitizeHtml);
96
+ i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(1, 1, model_r5.Description, ctx_r0.searchTerm), i0.ɵɵsanitizeHtml);
251
97
  } }
252
- function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
253
- i0.ɵɵelementStart(0, "p", 71);
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 ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_17_Template(rf, ctx) { if (rf & 1) {
258
- i0.ɵɵelementStart(0, "div", 78)(1, "span", 79);
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", 80);
107
+ i0.ɵɵelementStart(3, "span", 52);
262
108
  i0.ɵɵtext(4);
263
109
  i0.ɵɵelementEnd()();
264
110
  } if (rf & 2) {
265
- const model_r9 = i0.ɵɵnextContext(2).$implicit;
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(model_r9.InputTokenLimit));
114
+ i0.ɵɵtextInterpolate(ctx_r0.formatTokenLimit(model_r5.InputTokenLimit));
269
115
  } }
270
- function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_18_Template(rf, ctx) { if (rf & 1) {
271
- i0.ɵɵelementStart(0, "div", 78)(1, "span", 79);
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", 80);
120
+ i0.ɵɵelementStart(3, "span", 52);
275
121
  i0.ɵɵtext(4);
276
122
  i0.ɵɵelementEnd()();
277
123
  } if (rf & 2) {
278
- const model_r9 = i0.ɵɵnextContext(2).$implicit;
124
+ const model_r5 = i0.ɵɵnextContext(2).$implicit;
279
125
  i0.ɵɵadvance(4);
280
- i0.ɵɵtextInterpolate(model_r9.APIName);
126
+ i0.ɵɵtextInterpolate(model_r5.APIName);
281
127
  } }
282
- function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_19_Template(rf, ctx) { if (rf & 1) {
283
- i0.ɵɵelementStart(0, "div", 78)(1, "span", 79);
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", 80);
132
+ i0.ɵɵelementStart(3, "span", 52);
287
133
  i0.ɵɵtext(4);
288
134
  i0.ɵɵelementEnd()();
289
135
  } if (rf & 2) {
290
- const model_r9 = i0.ɵɵnextContext(2).$implicit;
136
+ const model_r5 = i0.ɵɵnextContext(2).$implicit;
291
137
  i0.ɵɵadvance(4);
292
- i0.ɵɵtextInterpolate(model_r9.DriverClass);
138
+ i0.ɵɵtextInterpolate(model_r5.DriverClass);
293
139
  } }
294
- function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Template(rf, ctx) { if (rf & 1) {
295
- i0.ɵɵelementStart(0, "div", 72)(1, "div", 77)(2, "div", 78)(3, "span", 79);
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", 80);
144
+ i0.ɵɵelementStart(5, "span", 52);
299
145
  i0.ɵɵtext(6);
300
146
  i0.ɵɵelementEnd()();
301
- i0.ɵɵelementStart(7, "div", 78)(8, "span", 79);
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", 80);
150
+ i0.ɵɵelementStart(10, "span", 52);
305
151
  i0.ɵɵtext(11);
306
152
  i0.ɵɵelementEnd()();
307
- i0.ɵɵelementStart(12, "div", 78)(13, "span", 79);
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", 80);
156
+ i0.ɵɵelementStart(15, "span", 52);
311
157
  i0.ɵɵtext(16);
312
158
  i0.ɵɵelementEnd()();
313
- i0.ɵɵconditionalCreate(17, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_17_Template, 5, 1, "div", 78);
314
- i0.ɵɵconditionalCreate(18, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_18_Template, 5, 1, "div", 78);
315
- i0.ɵɵconditionalCreate(19, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Conditional_19_Template, 5, 1, "div", 78);
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 model_r9 = i0.ɵɵnextContext().$implicit;
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(model_r9.PowerRank, "power"));
167
+ i0.ɵɵtextInterpolate(ctx_r0.formatRank(model_r5.PowerRank, "power"));
322
168
  i0.ɵɵadvance(5);
323
- i0.ɵɵtextInterpolate(ctx_r0.formatRank(model_r9.SpeedRank, "speed"));
169
+ i0.ɵɵtextInterpolate(ctx_r0.formatRank(model_r5.SpeedRank, "speed"));
324
170
  i0.ɵɵadvance(5);
325
- i0.ɵɵtextInterpolate(ctx_r0.formatRank(model_r9.CostRank, "cost"));
171
+ i0.ɵɵtextInterpolate(ctx_r0.formatRank(model_r5.CostRank, "cost"));
326
172
  i0.ɵɵadvance();
327
- i0.ɵɵconditional(model_r9.InputTokenLimit ? 17 : -1);
173
+ i0.ɵɵconditional(model_r5.InputTokenLimit ? 17 : -1);
328
174
  i0.ɵɵadvance();
329
- i0.ɵɵconditional(model_r9.APIName ? 18 : -1);
175
+ i0.ɵɵconditional(model_r5.APIName ? 18 : -1);
330
176
  i0.ɵɵadvance();
331
- i0.ɵɵconditional(model_r9.DriverClass ? 19 : -1);
177
+ i0.ɵɵconditional(model_r5.DriverClass ? 19 : -1);
332
178
  } }
333
- function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Template(rf, ctx) { if (rf & 1) {
334
- const _r8 = i0.ɵɵgetCurrentView();
335
- i0.ɵɵelementStart(0, "div", 58)(1, "div", 59);
336
- i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Template_div_click_1_listener() { const model_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.toggleModelExpansion(model_r9.ID)); });
337
- i0.ɵɵelementStart(2, "div", 60)(3, "div", 61);
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", 62);
341
- i0.ɵɵelement(6, "h4", 63);
186
+ i0.ɵɵelementStart(5, "div", 32);
187
+ i0.ɵɵelement(6, "h4", 33);
342
188
  i0.ɵɵpipe(7, "highlightSearch");
343
- i0.ɵɵelementStart(8, "div", 64);
344
- i0.ɵɵconditionalCreate(9, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_9_Template, 3, 1, "span", 65);
345
- i0.ɵɵconditionalCreate(10, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_10_Template, 3, 1, "span", 65);
346
- i0.ɵɵconditionalCreate(11, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_11_Template, 3, 0, "span", 66)(12, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_12_Template, 3, 0, "span", 67);
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", 68);
194
+ i0.ɵɵelement(13, "i", 38);
349
195
  i0.ɵɵelementEnd();
350
- i0.ɵɵelementStart(14, "div", 69);
351
- i0.ɵɵconditionalCreate(15, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_15_Template, 2, 4, "p", 70)(16, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_16_Template, 2, 0, "p", 71);
352
- i0.ɵɵconditionalCreate(17, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Conditional_17_Template, 20, 6, "div", 72);
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", 73)(19, "button", 74);
355
- i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Template_button_click_19_listener($event) { const model_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.showModelDetails(model_r9, $event)); });
356
- i0.ɵɵelement(20, "i", 75);
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 model_r9 = ctx.$implicit;
206
+ const model_r5 = ctx.$implicit;
361
207
  const ctx_r0 = i0.ɵɵnextContext(4);
362
- i0.ɵɵclassProp("expanded", ctx_r0.expandedModelId === model_r9.ID);
208
+ i0.ɵɵclassProp("expanded", ctx_r0.expandedModelId === model_r5.ID);
363
209
  i0.ɵɵadvance(4);
364
- i0.ɵɵclassMap(ctx_r0.getModelIcon(model_r9));
210
+ i0.ɵɵclassMap(ctx_r0.getModelIcon(model_r5));
365
211
  i0.ɵɵadvance(2);
366
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(7, 12, model_r9.Name || "Unnamed Model", ctx_r0.searchTerm), i0.ɵɵsanitizeHtml);
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(model_r9.Vendor ? 9 : -1);
214
+ i0.ɵɵconditional(model_r5.Vendor ? 9 : -1);
369
215
  i0.ɵɵadvance();
370
- i0.ɵɵconditional(model_r9.AIModelType ? 10 : -1);
216
+ i0.ɵɵconditional(model_r5.AIModelType ? 10 : -1);
371
217
  i0.ɵɵadvance();
372
- i0.ɵɵconditional(model_r9.IsActive ? 11 : 12);
218
+ i0.ɵɵconditional(model_r5.IsActive ? 11 : 12);
373
219
  i0.ɵɵadvance(2);
374
- i0.ɵɵclassProp("rotated", ctx_r0.expandedModelId === model_r9.ID);
220
+ i0.ɵɵclassProp("rotated", ctx_r0.expandedModelId === model_r5.ID);
375
221
  i0.ɵɵadvance(2);
376
- i0.ɵɵconditional(model_r9.Description ? 15 : 16);
222
+ i0.ɵɵconditional(model_r5.Description ? 15 : 16);
377
223
  i0.ɵɵadvance(2);
378
- i0.ɵɵconditional(ctx_r0.expandedModelId === model_r9.ID ? 17 : -1);
224
+ i0.ɵɵconditional(ctx_r0.expandedModelId === model_r5.ID ? 17 : -1);
379
225
  } }
380
- function ModelManagementComponent_Conditional_2_Conditional_25_Case_0_Template(rf, ctx) { if (rf & 1) {
381
- i0.ɵɵelementStart(0, "div", 55);
382
- i0.ɵɵrepeaterCreate(1, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_For_2_Template, 22, 15, "div", 57, _forTrack1);
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 ModelManagementComponent_Conditional_2_Conditional_25_Case_1_For_34_Template(rf, ctx) { if (rf & 1) {
390
- const _r11 = i0.ɵɵgetCurrentView();
391
- i0.ɵɵelementStart(0, "tr")(1, "td")(2, "div", 85);
392
- i0.ɵɵelement(3, "i")(4, "span", 86);
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", 87);
247
+ i0.ɵɵelementStart(10, "td")(11, "span", 59);
402
248
  i0.ɵɵtext(12);
403
249
  i0.ɵɵelementEnd()();
404
- i0.ɵɵelementStart(13, "td")(14, "span", 87);
250
+ i0.ɵɵelementStart(13, "td")(14, "span", 59);
405
251
  i0.ɵɵtext(15);
406
252
  i0.ɵɵelementEnd()();
407
- i0.ɵɵelementStart(16, "td")(17, "span", 87);
253
+ i0.ɵɵelementStart(16, "td")(17, "span", 59);
408
254
  i0.ɵɵtext(18);
409
255
  i0.ɵɵelementEnd()();
410
- i0.ɵɵelementStart(19, "td")(20, "span", 88);
256
+ i0.ɵɵelementStart(19, "td")(20, "span", 60);
411
257
  i0.ɵɵtext(21);
412
258
  i0.ɵɵelementEnd()();
413
- i0.ɵɵelementStart(22, "td")(23, "button", 89);
414
- i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_For_34_Template_button_click_23_listener() { const model_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.showModelDetails(model_r12)); });
415
- i0.ɵɵelement(24, "i", 75);
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 model_r12 = ctx.$implicit;
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(model_r12));
267
+ i0.ɵɵclassMap(ctx_r0.getModelIcon(model_r8));
422
268
  i0.ɵɵadvance();
423
- i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(5, 19, model_r12.Name || "Unnamed Model", ctx_r0.searchTerm), i0.ɵɵsanitizeHtml);
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(model_r12.Vendor || "-");
271
+ i0.ɵɵtextInterpolate(model_r8.Vendor || "-");
426
272
  i0.ɵɵadvance(2);
427
- i0.ɵɵtextInterpolate(model_r12.AIModelType);
273
+ i0.ɵɵtextInterpolate(model_r8.AIModelType);
428
274
  i0.ɵɵadvance(2);
429
- i0.ɵɵclassMap(ctx_r0.getRankClass(model_r12.PowerRank, "power"));
275
+ i0.ɵɵclassMap(ctx_r0.getRankClass(model_r8.PowerRank, "power"));
430
276
  i0.ɵɵadvance();
431
- i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r12.PowerRank, "power"), " ");
277
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r8.PowerRank, "power"), " ");
432
278
  i0.ɵɵadvance(2);
433
- i0.ɵɵclassMap(ctx_r0.getRankClass(model_r12.SpeedRank, "speed"));
279
+ i0.ɵɵclassMap(ctx_r0.getRankClass(model_r8.SpeedRank, "speed"));
434
280
  i0.ɵɵadvance();
435
- i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r12.SpeedRank, "speed"), " ");
281
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r8.SpeedRank, "speed"), " ");
436
282
  i0.ɵɵadvance(2);
437
- i0.ɵɵclassMap(ctx_r0.getRankClass(model_r12.CostRank, "cost"));
283
+ i0.ɵɵclassMap(ctx_r0.getRankClass(model_r8.CostRank, "cost"));
438
284
  i0.ɵɵadvance();
439
- i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r12.CostRank, "cost"), " ");
285
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatRank(model_r8.CostRank, "cost"), " ");
440
286
  i0.ɵɵadvance(2);
441
- i0.ɵɵclassProp("active", model_r12.IsActive)("inactive", !model_r12.IsActive);
287
+ i0.ɵɵclassProp("active", model_r8.IsActive)("inactive", !model_r8.IsActive);
442
288
  i0.ɵɵadvance();
443
- i0.ɵɵtextInterpolate1(" ", model_r12.IsActive ? "Active" : "Inactive", " ");
289
+ i0.ɵɵtextInterpolate1(" ", model_r8.IsActive ? "Active" : "Inactive", " ");
444
290
  } }
445
- function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template(rf, ctx) { if (rf & 1) {
446
- const _r10 = i0.ɵɵgetCurrentView();
447
- i0.ɵɵelementStart(0, "div", 56)(1, "table", 81)(2, "thead")(3, "tr")(4, "th", 82);
448
- i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template_th_click_4_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("name")); });
449
- i0.ɵɵelementStart(5, "span", 83);
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", 84);
297
+ i0.ɵɵelement(7, "i", 56);
452
298
  i0.ɵɵelementEnd()();
453
- i0.ɵɵelementStart(8, "th", 82);
454
- i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template_th_click_8_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("vendor")); });
455
- i0.ɵɵelementStart(9, "span", 83);
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", 84);
303
+ i0.ɵɵelement(11, "i", 56);
458
304
  i0.ɵɵelementEnd()();
459
- i0.ɵɵelementStart(12, "th", 82);
460
- i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template_th_click_12_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("type")); });
461
- i0.ɵɵelementStart(13, "span", 83);
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", 84);
309
+ i0.ɵɵelement(15, "i", 56);
464
310
  i0.ɵɵelementEnd()();
465
- i0.ɵɵelementStart(16, "th", 82);
466
- i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template_th_click_16_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("powerRank")); });
467
- i0.ɵɵelementStart(17, "span", 83);
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", 84);
315
+ i0.ɵɵelement(19, "i", 56);
470
316
  i0.ɵɵelementEnd()();
471
- i0.ɵɵelementStart(20, "th", 82);
472
- i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template_th_click_20_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("speedRank")); });
473
- i0.ɵɵelementStart(21, "span", 83);
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", 84);
321
+ i0.ɵɵelement(23, "i", 56);
476
322
  i0.ɵɵelementEnd()();
477
- i0.ɵɵelementStart(24, "th", 82);
478
- i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template_th_click_24_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onSortChange("costRank")); });
479
- i0.ɵɵelementStart(25, "span", 83);
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", 84);
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, ModelManagementComponent_Conditional_2_Conditional_25_Case_1_For_34_Template, 25, 22, "tr", null, _forTrack1);
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 ModelManagementComponent_Conditional_2_Conditional_25_Template(rf, ctx) { if (rf & 1) {
510
- i0.ɵɵconditionalCreate(0, ModelManagementComponent_Conditional_2_Conditional_25_Case_0_Template, 3, 0, "div", 55)(1, ModelManagementComponent_Conditional_2_Conditional_25_Case_1_Template, 35, 24, "div", 56);
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 ModelManagementComponent_Conditional_2_Conditional_26_Template(rf, ctx) { if (rf & 1) {
517
- const _r13 = i0.ɵɵgetCurrentView();
518
- i0.ɵɵelementStart(0, "div", 90);
519
- i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_26_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.closeDetailPanel()); });
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 ModelManagementComponent_Conditional_2_Conditional_28_Conditional_14_Template(rf, ctx) { if (rf & 1) {
523
- i0.ɵɵelementStart(0, "span", 100);
524
- i0.ɵɵelement(1, "i", 76);
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 ModelManagementComponent_Conditional_2_Conditional_28_Conditional_15_Template(rf, ctx) { if (rf & 1) {
529
- i0.ɵɵelementStart(0, "span", 101);
530
- i0.ɵɵelement(1, "i", 76);
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 ModelManagementComponent_Conditional_2_Conditional_28_Conditional_16_Template(rf, ctx) { if (rf & 1) {
535
- i0.ɵɵelementStart(0, "span", 102);
536
- i0.ɵɵelement(1, "i", 6);
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 ModelManagementComponent_Conditional_2_Conditional_28_Conditional_17_Template(rf, ctx) { if (rf & 1) {
545
- i0.ɵɵelementStart(0, "div", 98)(1, "h4", 103);
546
- i0.ɵɵelement(2, "i", 115);
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", 116);
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 ModelManagementComponent_Conditional_2_Conditional_28_Conditional_53_Template(rf, ctx) { if (rf & 1) {
558
- i0.ɵɵelementStart(0, "div", 106)(1, "span", 107);
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", 110);
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 ModelManagementComponent_Conditional_2_Conditional_28_Conditional_54_Template(rf, ctx) { if (rf & 1) {
570
- i0.ɵɵelementStart(0, "div", 106)(1, "span", 107);
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", 110);
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 ModelManagementComponent_Conditional_2_Conditional_28_Conditional_55_Template(rf, ctx) { if (rf & 1) {
582
- i0.ɵɵelementStart(0, "div", 106)(1, "span", 107);
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", 110);
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 ModelManagementComponent_Conditional_2_Conditional_28_Conditional_56_Template(rf, ctx) { if (rf & 1) {
594
- i0.ɵɵelementStart(0, "div", 106)(1, "span", 107);
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", 110);
443
+ i0.ɵɵelementStart(3, "span", 83);
598
444
  i0.ɵɵtext(4, "Yes");
599
445
  i0.ɵɵelementEnd()();
600
446
  } }
601
- function ModelManagementComponent_Conditional_2_Conditional_28_Conditional_57_Template(rf, ctx) { if (rf & 1) {
602
- i0.ɵɵelementStart(0, "div", 106)(1, "span", 107);
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", 110);
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 ModelManagementComponent_Conditional_2_Conditional_28_Template(rf, ctx) { if (rf & 1) {
614
- const _r14 = i0.ɵɵgetCurrentView();
615
- i0.ɵɵelementStart(0, "div", 91)(1, "div", 92)(2, "div", 93);
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", 94)(5, "h3");
464
+ i0.ɵɵelementStart(4, "div", 66)(5, "h3");
619
465
  i0.ɵɵtext(6);
620
466
  i0.ɵɵelementEnd();
621
- i0.ɵɵelementStart(7, "span", 95);
467
+ i0.ɵɵelementStart(7, "span", 67);
622
468
  i0.ɵɵtext(8);
623
469
  i0.ɵɵelementEnd()()();
624
- i0.ɵɵelementStart(9, "button", 96);
625
- i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_28_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r14); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.closeDetailPanel()); });
626
- i0.ɵɵelement(10, "i", 30);
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", 97)(12, "div", 98)(13, "div", 99);
629
- i0.ɵɵconditionalCreate(14, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_14_Template, 3, 0, "span", 100)(15, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_15_Template, 3, 0, "span", 101);
630
- i0.ɵɵconditionalCreate(16, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_16_Template, 3, 1, "span", 102);
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, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_17_Template, 6, 1, "div", 98);
633
- i0.ɵɵelementStart(18, "div", 98)(19, "h4", 103);
634
- i0.ɵɵelement(20, "i", 104);
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", 105)(23, "div", 106)(24, "span", 107);
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", 108);
486
+ i0.ɵɵelementStart(26, "span", 81);
641
487
  i0.ɵɵtext(27);
642
488
  i0.ɵɵelementEnd()();
643
- i0.ɵɵelementStart(28, "div", 106)(29, "span", 107);
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", 108);
492
+ i0.ɵɵelementStart(31, "span", 81);
647
493
  i0.ɵɵtext(32);
648
494
  i0.ɵɵelementEnd()();
649
- i0.ɵɵelementStart(33, "div", 106)(34, "span", 107);
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", 108);
498
+ i0.ɵɵelementStart(36, "span", 81);
653
499
  i0.ɵɵtext(37);
654
500
  i0.ɵɵelementEnd()()()();
655
- i0.ɵɵelementStart(38, "div", 98)(39, "h4", 103);
656
- i0.ɵɵelement(40, "i", 109);
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", 105)(43, "div", 106)(44, "span", 107);
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", 110);
508
+ i0.ɵɵelementStart(46, "span", 83);
663
509
  i0.ɵɵtext(47);
664
510
  i0.ɵɵelementEnd()();
665
- i0.ɵɵelementStart(48, "div", 106)(49, "span", 107);
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", 110);
514
+ i0.ɵɵelementStart(51, "span", 83);
669
515
  i0.ɵɵtext(52);
670
516
  i0.ɵɵelementEnd()();
671
- i0.ɵɵconditionalCreate(53, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_53_Template, 5, 1, "div", 106);
672
- i0.ɵɵconditionalCreate(54, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_54_Template, 5, 1, "div", 106);
673
- i0.ɵɵconditionalCreate(55, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_55_Template, 5, 1, "div", 106);
674
- i0.ɵɵconditionalCreate(56, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_56_Template, 5, 0, "div", 106);
675
- i0.ɵɵconditionalCreate(57, ModelManagementComponent_Conditional_2_Conditional_28_Conditional_57_Template, 5, 1, "div", 106);
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", 98)(59, "h4", 103);
678
- i0.ɵɵelement(60, "i", 111);
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", 105)(63, "div", 106)(64, "span", 107);
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", 110);
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", 106)(70, "span", 107);
534
+ i0.ɵɵelementStart(69, "div", 79)(70, "span", 80);
689
535
  i0.ɵɵtext(71, "Updated");
690
536
  i0.ɵɵelementEnd();
691
- i0.ɵɵelementStart(72, "span", 110);
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", 112)(76, "button", 113);
696
- i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Conditional_28_Template_button_click_76_listener() { i0.ɵɵrestoreView(_r14); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openModelFromPanel()); });
697
- i0.ɵɵelement(77, "i", 114);
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, "div", 3)(1, "div", 4)(2, "h2", 5);
748
- i0.ɵɵelement(3, "i", 6);
749
- i0.ɵɵtext(4, " AI Models ");
750
- i0.ɵɵelementEnd();
751
- i0.ɵɵelementStart(5, "button", 7);
752
- i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.toggleFilters()); });
753
- i0.ɵɵelement(6, "i", 8);
754
- i0.ɵɵconditionalCreate(7, ModelManagementComponent_Conditional_2_Conditional_7_Template, 1, 0)(8, ModelManagementComponent_Conditional_2_Conditional_8_Template, 1, 0);
755
- i0.ɵɵelementEnd();
756
- i0.ɵɵelementStart(9, "span", 9);
757
- i0.ɵɵtext(10);
758
- i0.ɵɵelementEnd()();
759
- i0.ɵɵelementStart(11, "div", 10)(12, "div", 11)(13, "button", 12);
760
- 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.setViewMode("grid")); });
761
- i0.ɵɵelement(14, "i", 13);
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(15, "button", 14);
764
- i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setViewMode("list")); });
765
- i0.ɵɵelement(16, "i", 15);
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(17, "button", 16);
768
- i0.ɵɵlistener("click", function ModelManagementComponent_Conditional_2_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.createNewModel()); });
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.ɵɵconditionalCreate(26, ModelManagementComponent_Conditional_2_Conditional_26_Template, 1, 0, "div", 22);
778
- i0.ɵɵelementStart(27, "div", 23);
779
- i0.ɵɵconditionalCreate(28, ModelManagementComponent_Conditional_2_Conditional_28_Template, 79, 31);
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.ɵɵclassProp("active", ctx_r0.viewMode === "list");
791
- i0.ɵɵadvance(6);
792
- i0.ɵɵconditional(ctx_r0.showFilters ? 21 : -1);
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.ɵɵconditional(ctx_r0.filteredModels.length === 0 ? 24 : 25);
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 ? 26 : -1);
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 ? 28 : -1);
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, "model-management-v2"], [1, "loading-container"], ["size", "large", 3, "text"], [1, "dashboard-header"], [1, "header-info"], [1, "dashboard-title"], [1, "fa-solid", "fa-microchip"], ["type", "button", "title", "Toggle Filters", 1, "filter-toggle-btn", 3, "click"], [1, "fa-solid", "fa-filter"], [1, "item-count"], [1, "header-controls"], [1, "view-toggle"], ["type", "button", "title", "Grid View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-grip"], ["type", "button", "title", "List View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-list"], ["type", "button", "title", "Create New Model", 1, "control-btn", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], ["direction", "horizontal"], [3, "size", "minSize", "maxSize"], [1, "content-area"], [1, "empty-state"], [1, "detail-panel-overlay"], [1, "detail-panel"], [1, "filter-panel"], [1, "filter-panel-header"], [1, "filter-summary-inline"], [1, "summary-value"], [1, "summary-label"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "filter-content"], [1, "filter-group"], [1, "filter-label"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Search models...", 1, "filter-input", 3, "input", "value"], [1, "fa-solid", "fa-sort"], [1, "filter-select", 3, "change", "value"], [3, "value"], [1, "fa-solid", "fa-building"], ["value", "all"], [1, "fa-solid", "fa-toggle-on"], ["value", "active"], ["value", "inactive"], [1, "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"], [1, "filter-actions"], ["title", "Reset all filters", 1, "reset-btn", 3, "click"], [1, "fa-solid", "fa-undo"], [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-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, "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) {
1422
- i0.ɵɵelementStart(0, "div", 0);
1423
- i0.ɵɵconditionalCreate(1, ModelManagementComponent_Conditional_1_Template, 2, 1, "div", 1)(2, ModelManagementComponent_Conditional_2_Template, 29, 12);
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: 45 }); })();
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