@memberjunction/ng-dashboards 5.37.0 → 5.39.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 (328) hide show
  1. package/README.md +46 -7
  2. package/dist/AI/components/agents/agent-configuration.component.js +199 -198
  3. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  4. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
  5. package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
  8. package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
  9. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +166 -58
  10. package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
  11. package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
  12. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
  13. package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
  14. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +1 -0
  15. package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
  16. package/dist/AI/components/analytics/model-performance/model-performance.component.js +55 -36
  17. package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
  18. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +9 -1
  19. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
  20. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +158 -117
  21. package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
  22. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +1 -0
  23. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
  24. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +22 -8
  25. package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
  26. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +89 -842
  27. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  28. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1353 -7683
  29. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  30. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
  31. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
  32. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
  33. package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
  34. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
  35. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
  36. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
  37. package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
  38. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
  39. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
  40. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
  41. package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
  42. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +235 -0
  43. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
  44. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +1735 -0
  45. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
  46. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
  47. package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
  48. package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
  49. package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
  50. package/dist/AI/components/autotagging/shared/classify.format.d.ts +43 -0
  51. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
  52. package/dist/AI/components/autotagging/shared/classify.format.js +209 -0
  53. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
  54. package/dist/AI/components/autotagging/shared/classify.types.d.ts +276 -0
  55. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
  56. package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
  57. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
  58. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
  59. package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
  60. package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
  61. package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
  62. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +40 -0
  63. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
  64. package/dist/AI/components/autotagging/tabs/history-tab.component.js +402 -0
  65. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
  66. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
  67. package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
  68. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
  69. package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
  70. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +122 -0
  71. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
  72. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +752 -0
  73. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
  74. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +166 -0
  75. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
  76. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1384 -0
  77. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
  78. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +70 -0
  79. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
  80. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +448 -0
  81. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
  82. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
  83. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
  84. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
  85. package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
  86. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +47 -0
  87. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
  88. package/dist/AI/components/autotagging/tabs/types-tab.component.js +220 -0
  89. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
  90. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +293 -289
  91. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  92. package/dist/AI/components/models/model-management.component.js +209 -208
  93. package/dist/AI/components/models/model-management.component.js.map +1 -1
  94. package/dist/AI/components/prompts/prompt-management.component.js +130 -128
  95. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  96. package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
  97. package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
  98. package/dist/AI/components/system/system-configuration.component.js +17 -17
  99. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  100. package/dist/AI/components/tags/tags-resource.component.js +550 -532
  101. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  102. package/dist/AI/components/vectors/vector-management-resource.component.js +1 -1
  103. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  104. package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
  105. package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
  106. package/dist/AI/services/ai-instrumentation.service.js +14 -2
  107. package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
  108. package/dist/AI/services/cache-metrics.d.ts +50 -0
  109. package/dist/AI/services/cache-metrics.d.ts.map +1 -0
  110. package/dist/AI/services/cache-metrics.js +43 -0
  111. package/dist/AI/services/cache-metrics.js.map +1 -0
  112. package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
  113. package/dist/APIKeys/api-keys-resource.component.js +132 -131
  114. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  115. package/dist/Actions/components/actions-overview.component.js +141 -141
  116. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  117. package/dist/Actions/components/execution-monitoring.component.js +15 -15
  118. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  119. package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
  120. package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
  121. package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
  122. package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
  123. package/dist/Admin/admin-data-schema.component.js +2 -2
  124. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  125. package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
  126. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  127. package/dist/Admin/admin-identity-access.component.js +2 -2
  128. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  129. package/dist/Admin/admin-monitoring.component.js +2 -2
  130. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  131. package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
  132. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  133. package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
  134. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  135. package/dist/Communication/communication-logs-resource.component.js +72 -50
  136. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  137. package/dist/Communication/communication-monitor-resource.component.js +103 -102
  138. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  139. package/dist/Communication/communication-providers-resource.component.js +52 -51
  140. package/dist/Communication/communication-providers-resource.component.js.map +1 -1
  141. package/dist/Communication/communication-runs-resource.component.js +39 -38
  142. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  143. package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
  144. package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
  145. package/dist/Communication/communication-templates-resource.component.js +92 -89
  146. package/dist/Communication/communication-templates-resource.component.js.map +1 -1
  147. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +73 -1
  148. package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
  149. package/dist/ComponentStudio/component-studio-dashboard.component.js +512 -127
  150. package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
  151. package/dist/ComponentStudio/component-studio-resource.component.d.ts +22 -0
  152. package/dist/ComponentStudio/component-studio-resource.component.d.ts.map +1 -0
  153. package/dist/ComponentStudio/component-studio-resource.component.js +55 -0
  154. package/dist/ComponentStudio/component-studio-resource.component.js.map +1 -0
  155. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +104 -45
  156. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
  157. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +234 -331
  158. package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
  159. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts +54 -0
  160. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.d.ts.map +1 -0
  161. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js +339 -0
  162. package/dist/ComponentStudio/components/form-builder/form-builder-canvas.component.js.map +1 -0
  163. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts +65 -0
  164. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.d.ts.map +1 -0
  165. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js +492 -0
  166. package/dist/ComponentStudio/components/form-builder/form-builder-right-panel.component.js.map +1 -0
  167. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts +88 -0
  168. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.d.ts.map +1 -0
  169. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js +457 -0
  170. package/dist/ComponentStudio/components/form-builder/form-builder-tab.component.js.map +1 -0
  171. package/dist/ComponentStudio/components/form-override-dialog.component.d.ts +106 -0
  172. package/dist/ComponentStudio/components/form-override-dialog.component.d.ts.map +1 -0
  173. package/dist/ComponentStudio/components/form-override-dialog.component.js +478 -0
  174. package/dist/ComponentStudio/components/form-override-dialog.component.js.map +1 -0
  175. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts +54 -0
  176. package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
  177. package/dist/ComponentStudio/components/workspace/component-preview.component.js +361 -50
  178. package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
  179. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts +10 -0
  180. package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -1
  181. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +114 -45
  182. package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
  183. package/dist/ComponentStudio/services/canvas-to-code.d.ts +32 -0
  184. package/dist/ComponentStudio/services/canvas-to-code.d.ts.map +1 -0
  185. package/dist/ComponentStudio/services/canvas-to-code.js +347 -0
  186. package/dist/ComponentStudio/services/canvas-to-code.js.map +1 -0
  187. package/dist/ComponentStudio/services/code-to-canvas.d.ts +32 -0
  188. package/dist/ComponentStudio/services/code-to-canvas.d.ts.map +1 -0
  189. package/dist/ComponentStudio/services/code-to-canvas.js +92 -0
  190. package/dist/ComponentStudio/services/code-to-canvas.js.map +1 -0
  191. package/dist/ComponentStudio/services/component-studio-state.service.d.ts +29 -0
  192. package/dist/ComponentStudio/services/component-studio-state.service.d.ts.map +1 -1
  193. package/dist/ComponentStudio/services/component-studio-state.service.js +76 -0
  194. package/dist/ComponentStudio/services/component-studio-state.service.js.map +1 -1
  195. package/dist/ComponentStudio/services/entity-form-override.service.d.ts +86 -0
  196. package/dist/ComponentStudio/services/entity-form-override.service.d.ts.map +1 -0
  197. package/dist/ComponentStudio/services/entity-form-override.service.js +246 -0
  198. package/dist/ComponentStudio/services/entity-form-override.service.js.map +1 -0
  199. package/dist/ComponentStudio/services/field-binding-scanner.d.ts +29 -0
  200. package/dist/ComponentStudio/services/field-binding-scanner.d.ts.map +1 -0
  201. package/dist/ComponentStudio/services/field-binding-scanner.js +110 -0
  202. package/dist/ComponentStudio/services/field-binding-scanner.js.map +1 -0
  203. package/dist/ComponentStudio/services/form-canvas-model.d.ts +56 -0
  204. package/dist/ComponentStudio/services/form-canvas-model.d.ts.map +1 -0
  205. package/dist/ComponentStudio/services/form-canvas-model.js +35 -0
  206. package/dist/ComponentStudio/services/form-canvas-model.js.map +1 -0
  207. package/dist/ComponentStudio/services/form-host-props-fixture.d.ts +10 -0
  208. package/dist/ComponentStudio/services/form-host-props-fixture.d.ts.map +1 -0
  209. package/dist/ComponentStudio/services/form-host-props-fixture.js +10 -0
  210. package/dist/ComponentStudio/services/form-host-props-fixture.js.map +1 -0
  211. package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
  212. package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
  213. package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
  214. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  215. package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
  216. package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
  217. package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
  218. package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
  219. package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
  220. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  221. package/dist/DataExplorer/data-explorer-dashboard.component.js +2 -2
  222. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  223. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
  224. package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
  225. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  226. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
  227. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  228. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
  229. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  230. package/dist/DevTools/app-state-inspector.component.js +18 -17
  231. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  232. package/dist/DevTools/class-registry.component.js +88 -85
  233. package/dist/DevTools/class-registry.component.js.map +1 -1
  234. package/dist/DevTools/event-monitor.component.js +155 -150
  235. package/dist/DevTools/event-monitor.component.js.map +1 -1
  236. package/dist/DevTools/graphql-console.component.js +245 -243
  237. package/dist/DevTools/graphql-console.component.js.map +1 -1
  238. package/dist/DevTools/layout-inspector.component.js +18 -17
  239. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  240. package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
  241. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  242. package/dist/FormBuilder/form-builder-resource.component.d.ts +964 -0
  243. package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -0
  244. package/dist/FormBuilder/form-builder-resource.component.js +4487 -0
  245. package/dist/FormBuilder/form-builder-resource.component.js.map +1 -0
  246. package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts +55 -0
  247. package/dist/FormBuilder/form-builder-version-rail.helpers.d.ts.map +1 -0
  248. package/dist/FormBuilder/form-builder-version-rail.helpers.js +73 -0
  249. package/dist/FormBuilder/form-builder-version-rail.helpers.js.map +1 -0
  250. package/dist/Home/home-application.d.ts +21 -1
  251. package/dist/Home/home-application.d.ts.map +1 -1
  252. package/dist/Home/home-application.js +60 -8
  253. package/dist/Home/home-application.js.map +1 -1
  254. package/dist/Home/home-dashboard.component.js +2 -2
  255. package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
  256. package/dist/Integration/components/activity/activity.component.js +236 -229
  257. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  258. package/dist/Integration/components/connections/connections.component.js +390 -389
  259. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  260. package/dist/Integration/components/overview/overview.component.js +2 -2
  261. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +2 -2
  262. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  263. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +45 -44
  264. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  265. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
  266. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  267. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
  268. package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
  269. package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
  270. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  271. package/dist/Lists/components/lists-browse-resource.component.js +525 -566
  272. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  273. package/dist/Lists/components/lists-categories-resource.component.js +135 -134
  274. package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
  275. package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
  276. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  277. package/dist/MCP/mcp-dashboard.component.js +443 -438
  278. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  279. package/dist/QueryBrowser/query-browser-resource.component.d.ts +14 -14
  280. package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
  281. package/dist/QueryBrowser/query-browser-resource.component.js +11 -10
  282. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  283. package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
  284. package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
  285. package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
  286. package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
  287. package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
  288. package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
  289. package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
  290. package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
  291. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  292. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
  293. package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
  294. package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
  295. package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
  296. package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
  297. package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
  298. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  299. package/dist/Testing/components/testing-explorer.component.js +436 -427
  300. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  301. package/dist/Testing/components/testing-runs-resource.component.js +1 -1
  302. package/dist/Testing/components/testing-runs.component.js +116 -115
  303. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  304. package/dist/Testing/testing-dashboard.component.js +6 -7
  305. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  306. package/dist/VersionHistory/components/labels-resource.component.js +173 -172
  307. package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
  308. package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
  309. package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
  310. package/dist/VersionHistory/components/restore-resource.component.js +116 -92
  311. package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
  312. package/dist/ai-dashboards.module.d.ts +47 -35
  313. package/dist/ai-dashboards.module.d.ts.map +1 -1
  314. package/dist/ai-dashboards.module.js +40 -1
  315. package/dist/ai-dashboards.module.js.map +1 -1
  316. package/dist/communication-dashboards.module.d.ts +1 -1
  317. package/dist/communication-dashboards.module.d.ts.map +1 -1
  318. package/dist/communication-dashboards.module.js +7 -1
  319. package/dist/communication-dashboards.module.js.map +1 -1
  320. package/dist/component-studio-dashboards.module.d.ts +34 -22
  321. package/dist/component-studio-dashboards.module.d.ts.map +1 -1
  322. package/dist/component-studio-dashboards.module.js +65 -9
  323. package/dist/component-studio-dashboards.module.js.map +1 -1
  324. package/dist/testing-dashboards.module.d.ts +4 -5
  325. package/dist/testing-dashboards.module.d.ts.map +1 -1
  326. package/dist/testing-dashboards.module.js +7 -5
  327. package/dist/testing-dashboards.module.js.map +1 -1
  328. package/package.json +55 -53
@@ -10,15 +10,15 @@ import { RegisterClass, MJGlobal } from '@memberjunction/global';
10
10
  import { DevToolsPrefs } from './dev-tools-prefs';
11
11
  import * as i0 from "@angular/core";
12
12
  import * as i1 from "@memberjunction/ng-ui-components";
13
- function ClassRegistryInspectorComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
13
+ function ClassRegistryInspectorComponent_Conditional_36_Template(rf, ctx) { if (rf & 1) {
14
14
  const _r1 = i0.ɵɵgetCurrentView();
15
- i0.ɵɵelementStart(0, "button", 23);
16
- i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Conditional_33_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnSearchChange("")); });
17
- i0.ɵɵelement(1, "i", 24);
15
+ i0.ɵɵelementStart(0, "button", 24);
16
+ i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Conditional_36_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnSearchChange("")); });
17
+ i0.ɵɵelement(1, "i", 25);
18
18
  i0.ɵɵelementEnd();
19
19
  } }
20
- function ClassRegistryInspectorComponent_For_36_Conditional_8_Template(rf, ctx) { if (rf & 1) {
21
- i0.ɵɵelementStart(0, "span", 31);
20
+ function ClassRegistryInspectorComponent_For_39_Conditional_8_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵelementStart(0, "span", 32);
22
22
  i0.ɵɵtext(1);
23
23
  i0.ɵɵelementEnd();
24
24
  } if (rf & 2) {
@@ -26,13 +26,13 @@ function ClassRegistryInspectorComponent_For_36_Conditional_8_Template(rf, ctx)
26
26
  i0.ɵɵadvance();
27
27
  i0.ɵɵtextInterpolate1("", group_r4.uniqueKeys, " keys");
28
28
  } }
29
- function ClassRegistryInspectorComponent_For_36_Conditional_9_Template(rf, ctx) { if (rf & 1) {
30
- i0.ɵɵelementStart(0, "span", 32);
31
- i0.ɵɵelement(1, "i", 34);
29
+ function ClassRegistryInspectorComponent_For_39_Conditional_9_Template(rf, ctx) { if (rf & 1) {
30
+ i0.ɵɵelementStart(0, "span", 33);
31
+ i0.ɵɵelement(1, "i", 35);
32
32
  i0.ɵɵtext(2, " overrides ");
33
33
  i0.ɵɵelementEnd();
34
34
  } }
35
- function ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Conditional_2_Template(rf, ctx) { if (rf & 1) {
35
+ function ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_2_Template(rf, ctx) { if (rf & 1) {
36
36
  i0.ɵɵelementStart(0, "code");
37
37
  i0.ɵɵtext(1);
38
38
  i0.ɵɵelementEnd();
@@ -41,34 +41,34 @@ function ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Conditiona
41
41
  i0.ɵɵadvance();
42
42
  i0.ɵɵtextInterpolate(reg_r5.Key);
43
43
  } }
44
- function ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Conditional_3_Template(rf, ctx) { if (rf & 1) {
45
- i0.ɵɵelementStart(0, "span", 41);
44
+ function ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_3_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelementStart(0, "span", 42);
46
46
  i0.ɵɵtext(1, "(no key)");
47
47
  i0.ɵɵelementEnd();
48
48
  } }
49
- function ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Conditional_9_Template(rf, ctx) { if (rf & 1) {
50
- i0.ɵɵelementStart(0, "span", 45);
51
- i0.ɵɵelement(1, "i", 47);
49
+ function ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_9_Template(rf, ctx) { if (rf & 1) {
50
+ i0.ɵɵelementStart(0, "span", 46);
51
+ i0.ɵɵelement(1, "i", 48);
52
52
  i0.ɵɵtext(2, " winner ");
53
53
  i0.ɵɵelementEnd();
54
54
  } }
55
- function ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Conditional_10_Template(rf, ctx) { if (rf & 1) {
56
- i0.ɵɵelementStart(0, "span", 46);
55
+ function ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_10_Template(rf, ctx) { if (rf & 1) {
56
+ i0.ɵɵelementStart(0, "span", 47);
57
57
  i0.ɵɵtext(1, " shadowed ");
58
58
  i0.ɵɵelementEnd();
59
59
  } }
60
- function ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Template(rf, ctx) { if (rf & 1) {
61
- i0.ɵɵelementStart(0, "tr")(1, "td", 40);
62
- i0.ɵɵconditionalCreate(2, ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Conditional_2_Template, 2, 1, "code")(3, ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Conditional_3_Template, 2, 0, "span", 41);
60
+ function ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Template(rf, ctx) { if (rf & 1) {
61
+ i0.ɵɵelementStart(0, "tr")(1, "td", 41);
62
+ i0.ɵɵconditionalCreate(2, ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_2_Template, 2, 1, "code")(3, ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_3_Template, 2, 0, "span", 42);
63
63
  i0.ɵɵelementEnd();
64
- i0.ɵɵelementStart(4, "td", 42);
64
+ i0.ɵɵelementStart(4, "td", 43);
65
65
  i0.ɵɵtext(5);
66
66
  i0.ɵɵelementEnd();
67
- i0.ɵɵelementStart(6, "td", 43);
67
+ i0.ɵɵelementStart(6, "td", 44);
68
68
  i0.ɵɵtext(7);
69
69
  i0.ɵɵelementEnd();
70
- i0.ɵɵelementStart(8, "td", 44);
71
- i0.ɵɵconditionalCreate(9, ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Conditional_9_Template, 3, 0, "span", 45)(10, ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Conditional_10_Template, 2, 0, "span", 46);
70
+ i0.ɵɵelementStart(8, "td", 45);
71
+ i0.ɵɵconditionalCreate(9, ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_9_Template, 3, 0, "span", 46)(10, ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_10_Template, 2, 0, "span", 47);
72
72
  i0.ɵɵelementEnd()();
73
73
  } if (rf & 2) {
74
74
  const reg_r5 = ctx.$implicit;
@@ -84,41 +84,41 @@ function ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Template(r
84
84
  i0.ɵɵadvance(2);
85
85
  i0.ɵɵconditional(ctx_r1.IsWinningRow(group_r4, reg_r5) ? 9 : ctx_r1.IsConflictRow(group_r4, reg_r5) ? 10 : -1);
86
86
  } }
87
- function ClassRegistryInspectorComponent_For_36_Conditional_10_Template(rf, ctx) { if (rf & 1) {
88
- i0.ɵɵelementStart(0, "table", 33)(1, "thead")(2, "tr")(3, "th", 35);
87
+ function ClassRegistryInspectorComponent_For_39_Conditional_10_Template(rf, ctx) { if (rf & 1) {
88
+ i0.ɵɵelementStart(0, "table", 34)(1, "thead")(2, "tr")(3, "th", 36);
89
89
  i0.ɵɵtext(4, "Key");
90
90
  i0.ɵɵelementEnd();
91
- i0.ɵɵelementStart(5, "th", 36);
91
+ i0.ɵɵelementStart(5, "th", 37);
92
92
  i0.ɵɵtext(6, "Subclass");
93
93
  i0.ɵɵelementEnd();
94
- i0.ɵɵelementStart(7, "th", 37);
94
+ i0.ɵɵelementStart(7, "th", 38);
95
95
  i0.ɵɵtext(8, "Priority");
96
96
  i0.ɵɵelementEnd();
97
- i0.ɵɵelement(9, "th", 38);
97
+ i0.ɵɵelement(9, "th", 39);
98
98
  i0.ɵɵelementEnd()();
99
99
  i0.ɵɵelementStart(10, "tbody");
100
- i0.ɵɵrepeaterCreate(11, ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Template, 11, 8, "tr", 39, i0.ɵɵcomponentInstance().TrackByReg, true);
100
+ i0.ɵɵrepeaterCreate(11, ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Template, 11, 8, "tr", 40, i0.ɵɵcomponentInstance().TrackByReg, true);
101
101
  i0.ɵɵelementEnd()();
102
102
  } if (rf & 2) {
103
103
  const group_r4 = i0.ɵɵnextContext().$implicit;
104
104
  i0.ɵɵadvance(11);
105
105
  i0.ɵɵrepeater(group_r4.registrations);
106
106
  } }
107
- function ClassRegistryInspectorComponent_For_36_Template(rf, ctx) { if (rf & 1) {
107
+ function ClassRegistryInspectorComponent_For_39_Template(rf, ctx) { if (rf & 1) {
108
108
  const _r3 = i0.ɵɵgetCurrentView();
109
- i0.ɵɵelementStart(0, "div", 25)(1, "button", 26);
110
- i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_For_36_Template_button_click_1_listener() { const group_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ToggleGroup(group_r4)); });
111
- i0.ɵɵelement(2, "i", 27);
112
- i0.ɵɵelementStart(3, "span", 28);
109
+ i0.ɵɵelementStart(0, "div", 26)(1, "button", 27);
110
+ i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_For_39_Template_button_click_1_listener() { const group_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ToggleGroup(group_r4)); });
111
+ i0.ɵɵelement(2, "i", 28);
112
+ i0.ɵɵelementStart(3, "span", 29);
113
113
  i0.ɵɵtext(4);
114
114
  i0.ɵɵelementEnd();
115
- i0.ɵɵelementStart(5, "span", 29)(6, "span", 30);
115
+ i0.ɵɵelementStart(5, "span", 30)(6, "span", 31);
116
116
  i0.ɵɵtext(7);
117
117
  i0.ɵɵelementEnd();
118
- i0.ɵɵconditionalCreate(8, ClassRegistryInspectorComponent_For_36_Conditional_8_Template, 2, 1, "span", 31);
119
- i0.ɵɵconditionalCreate(9, ClassRegistryInspectorComponent_For_36_Conditional_9_Template, 3, 0, "span", 32);
118
+ i0.ɵɵconditionalCreate(8, ClassRegistryInspectorComponent_For_39_Conditional_8_Template, 2, 1, "span", 32);
119
+ i0.ɵɵconditionalCreate(9, ClassRegistryInspectorComponent_For_39_Conditional_9_Template, 3, 0, "span", 33);
120
120
  i0.ɵɵelementEnd()();
121
- i0.ɵɵconditionalCreate(10, ClassRegistryInspectorComponent_For_36_Conditional_10_Template, 13, 0, "table", 33);
121
+ i0.ɵɵconditionalCreate(10, ClassRegistryInspectorComponent_For_39_Conditional_10_Template, 13, 0, "table", 34);
122
122
  i0.ɵɵelementEnd();
123
123
  } if (rf & 2) {
124
124
  const group_r4 = ctx.$implicit;
@@ -136,9 +136,9 @@ function ClassRegistryInspectorComponent_For_36_Template(rf, ctx) { if (rf & 1)
136
136
  i0.ɵɵadvance();
137
137
  i0.ɵɵconditional(group_r4.expanded ? 10 : -1);
138
138
  } }
139
- function ClassRegistryInspectorComponent_Conditional_37_Template(rf, ctx) { if (rf & 1) {
140
- i0.ɵɵelementStart(0, "div", 21);
141
- i0.ɵɵelement(1, "i", 48);
139
+ function ClassRegistryInspectorComponent_Conditional_40_Template(rf, ctx) { if (rf & 1) {
140
+ i0.ɵɵelementStart(0, "div", 22);
141
+ i0.ɵɵelement(1, "i", 49);
142
142
  i0.ɵɵelementStart(2, "span");
143
143
  i0.ɵɵtext(3);
144
144
  i0.ɵɵelementEnd()();
@@ -319,66 +319,69 @@ let ClassRegistryInspectorComponent = class ClassRegistryInspectorComponent exte
319
319
  TrackByBase = (_i, g) => g.baseClassName;
320
320
  TrackByReg = (_i, r) => `${r.SubClass?.name ?? ''}|${r.Key ?? ''}|${r.Priority}`;
321
321
  static ɵfac = function ClassRegistryInspectorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ClassRegistryInspectorComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
322
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ClassRegistryInspectorComponent, selectors: [["mj-class-registry-inspector"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 40, vars: 17, consts: [[1, "mj-inspector", "mj-inspector--solo"], ["Role", "region", "AriaLabel", "Class registry inspector", "Title", "Class Registry", "Subtitle", "Every class registered with @RegisterClass"], ["actions", ""], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Expand all groups", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-expand"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Collapse all groups", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-compress"], [3, "Clicked", "Loading"], ["mjButton", "", "size", "sm", 3, "click", "variant", "title"], ["aria-hidden", "true", 1, "fa-solid"], [1, "cr-stats-row"], [1, "cr-stat"], [1, "cr-stat__value"], [1, "cr-stat__label"], [1, "cr-stat", "cr-stat--inline"], [1, "cr-search-wrap"], [1, "fa-solid", "fa-search", "cr-search-icon"], ["type", "search", "placeholder", "Search base class, subclass, or key\u2026", 1, "cr-search", 3, "input", "value"], ["title", "Clear", 1, "cr-search-clear"], [1, "cr-groups"], [1, "cr-group", 3, "cr-group--expanded"], [1, "cr-empty"], [1, "mj-inspector__footer-meta"], ["title", "Clear", 1, "cr-search-clear", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "cr-group"], ["type", "button", 1, "cr-group-head", 3, "click"], [1, "fa-solid", "fa-chevron-right", "cr-group-chev"], [1, "cr-group-name"], [1, "cr-group-meta"], [1, "cr-pill", "cr-pill--neutral"], [1, "cr-pill", "cr-pill--info"], [1, "cr-pill", "cr-pill--warn"], [1, "cr-table"], [1, "fa-solid", "fa-bolt"], [1, "cr-th-key"], [1, "cr-th-class"], [1, "cr-th-prio"], [1, "cr-th-status"], [3, "cr-row--conflict", "cr-row--winning"], [1, "cr-td-key"], [1, "cr-td-empty"], [1, "cr-td-class"], [1, "cr-td-prio"], [1, "cr-td-status"], ["title", "Highest priority among same-key registrations", 1, "cr-status", "cr-status--win"], ["title", "Outranked by another registration with the same key", 1, "cr-status", "cr-status--shadowed"], [1, "fa-solid", "fa-crown"], [1, "fa-solid", "fa-magnifying-glass"]], template: function ClassRegistryInspectorComponent_Template(rf, ctx) { if (rf & 1) {
322
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ClassRegistryInspectorComponent, selectors: [["mj-class-registry-inspector"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 43, vars: 17, consts: [[1, "mj-inspector", "mj-inspector--solo"], ["Role", "region", "AriaLabel", "Class registry inspector", "Title", "Class Registry", "Subtitle", "Every class registered with @RegisterClass"], ["actions", ""], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Expand all groups", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-expand"], [1, "mj-action-label"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Collapse all groups", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-compress"], [3, "Clicked", "Loading"], ["mjButton", "", "size", "sm", 3, "click", "variant", "title"], ["aria-hidden", "true", 1, "fa-solid"], [1, "cr-stats-row"], [1, "cr-stat"], [1, "cr-stat__value"], [1, "cr-stat__label"], [1, "cr-stat", "cr-stat--inline"], [1, "cr-search-wrap"], [1, "fa-solid", "fa-search", "cr-search-icon"], ["type", "search", "placeholder", "Search base class, subclass, or key\u2026", 1, "cr-search", 3, "input", "value"], ["title", "Clear", 1, "cr-search-clear"], [1, "cr-groups"], [1, "cr-group", 3, "cr-group--expanded"], [1, "cr-empty"], [1, "mj-inspector__footer-meta"], ["title", "Clear", 1, "cr-search-clear", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "cr-group"], ["type", "button", 1, "cr-group-head", 3, "click"], [1, "fa-solid", "fa-chevron-right", "cr-group-chev"], [1, "cr-group-name"], [1, "cr-group-meta"], [1, "cr-pill", "cr-pill--neutral"], [1, "cr-pill", "cr-pill--info"], [1, "cr-pill", "cr-pill--warn"], [1, "cr-table"], [1, "fa-solid", "fa-bolt"], [1, "cr-th-key"], [1, "cr-th-class"], [1, "cr-th-prio"], [1, "cr-th-status"], [3, "cr-row--conflict", "cr-row--winning"], [1, "cr-td-key"], [1, "cr-td-empty"], [1, "cr-td-class"], [1, "cr-td-prio"], [1, "cr-td-status"], ["title", "Highest priority among same-key registrations", 1, "cr-status", "cr-status--win"], ["title", "Outranked by another registration with the same key", 1, "cr-status", "cr-status--shadowed"], [1, "fa-solid", "fa-crown"], [1, "fa-solid", "fa-magnifying-glass"]], template: function ClassRegistryInspectorComponent_Template(rf, ctx) { if (rf & 1) {
323
323
  i0.ɵɵelementStart(0, "div", 0)(1, "mj-page-header-interior", 1)(2, "div", 2)(3, "button", 3);
324
324
  i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_3_listener() { return ctx.ExpandAll(); });
325
325
  i0.ɵɵelement(4, "i", 4);
326
- i0.ɵɵtext(5, " Expand ");
327
- i0.ɵɵelementEnd();
328
- i0.ɵɵelementStart(6, "button", 5);
329
- i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_6_listener() { return ctx.CollapseAll(); });
330
- i0.ɵɵelement(7, "i", 6);
331
- i0.ɵɵtext(8, " Collapse ");
332
- i0.ɵɵelementEnd();
333
- i0.ɵɵelementStart(9, "mj-refresh-button", 7);
334
- i0.ɵɵlistener("Clicked", function ClassRegistryInspectorComponent_Template_mj_refresh_button_Clicked_9_listener() { return ctx.refresh(); });
326
+ i0.ɵɵelementStart(5, "span", 5);
327
+ i0.ɵɵtext(6, "Expand");
328
+ i0.ɵɵelementEnd()();
329
+ i0.ɵɵelementStart(7, "button", 6);
330
+ i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_7_listener() { return ctx.CollapseAll(); });
331
+ i0.ɵɵelement(8, "i", 7);
332
+ i0.ɵɵelementStart(9, "span", 5);
333
+ i0.ɵɵtext(10, "Collapse");
334
+ i0.ɵɵelementEnd()();
335
+ i0.ɵɵelementStart(11, "mj-refresh-button", 8);
336
+ i0.ɵɵlistener("Clicked", function ClassRegistryInspectorComponent_Template_mj_refresh_button_Clicked_11_listener() { return ctx.refresh(); });
335
337
  i0.ɵɵelementEnd();
336
- i0.ɵɵelementStart(10, "button", 8);
337
- i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_10_listener() { return ctx.OnCopy(); });
338
- i0.ɵɵelement(11, "i", 9);
339
- i0.ɵɵtext(12);
340
- i0.ɵɵelementEnd()()();
341
- i0.ɵɵelementStart(13, "div", 10)(14, "div", 11)(15, "div", 12);
342
- i0.ɵɵtext(16);
338
+ i0.ɵɵelementStart(12, "button", 9);
339
+ i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_12_listener() { return ctx.OnCopy(); });
340
+ i0.ɵɵelement(13, "i", 10);
341
+ i0.ɵɵelementStart(14, "span", 5);
342
+ i0.ɵɵtext(15);
343
+ i0.ɵɵelementEnd()()()();
344
+ i0.ɵɵelementStart(16, "div", 11)(17, "div", 12)(18, "div", 13);
345
+ i0.ɵɵtext(19);
343
346
  i0.ɵɵelementEnd();
344
- i0.ɵɵelementStart(17, "div", 13);
345
- i0.ɵɵtext(18, "Total registrations");
347
+ i0.ɵɵelementStart(20, "div", 14);
348
+ i0.ɵɵtext(21, "Total registrations");
346
349
  i0.ɵɵelementEnd()();
347
- i0.ɵɵelementStart(19, "div", 11)(20, "div", 12);
348
- i0.ɵɵtext(21);
350
+ i0.ɵɵelementStart(22, "div", 12)(23, "div", 13);
351
+ i0.ɵɵtext(24);
349
352
  i0.ɵɵelementEnd();
350
- i0.ɵɵelementStart(22, "div", 13);
351
- i0.ɵɵtext(23, "Base classes");
353
+ i0.ɵɵelementStart(25, "div", 14);
354
+ i0.ɵɵtext(26, "Base classes");
352
355
  i0.ɵɵelementEnd()();
353
- i0.ɵɵelementStart(24, "div", 11)(25, "div", 12);
354
- i0.ɵɵtext(26);
356
+ i0.ɵɵelementStart(27, "div", 12)(28, "div", 13);
357
+ i0.ɵɵtext(29);
355
358
  i0.ɵɵelementEnd();
356
- i0.ɵɵelementStart(27, "div", 13);
357
- i0.ɵɵtext(28, "With overrides");
359
+ i0.ɵɵelementStart(30, "div", 14);
360
+ i0.ɵɵtext(31, "With overrides");
358
361
  i0.ɵɵelementEnd()();
359
- i0.ɵɵelementStart(29, "div", 14)(30, "div", 15);
360
- i0.ɵɵelement(31, "i", 16);
361
- i0.ɵɵelementStart(32, "input", 17);
362
- i0.ɵɵlistener("input", function ClassRegistryInspectorComponent_Template_input_input_32_listener($event) { return ctx.OnSearchChange($event.target.value); });
362
+ i0.ɵɵelementStart(32, "div", 15)(33, "div", 16);
363
+ i0.ɵɵelement(34, "i", 17);
364
+ i0.ɵɵelementStart(35, "input", 18);
365
+ i0.ɵɵlistener("input", function ClassRegistryInspectorComponent_Template_input_input_35_listener($event) { return ctx.OnSearchChange($event.target.value); });
363
366
  i0.ɵɵelementEnd();
364
- i0.ɵɵconditionalCreate(33, ClassRegistryInspectorComponent_Conditional_33_Template, 2, 0, "button", 18);
367
+ i0.ɵɵconditionalCreate(36, ClassRegistryInspectorComponent_Conditional_36_Template, 2, 0, "button", 19);
365
368
  i0.ɵɵelementEnd()()();
366
- i0.ɵɵelementStart(34, "div", 19);
367
- i0.ɵɵrepeaterCreate(35, ClassRegistryInspectorComponent_For_36_Template, 11, 9, "div", 20, ctx.TrackByBase, true);
368
- i0.ɵɵconditionalCreate(37, ClassRegistryInspectorComponent_Conditional_37_Template, 4, 1, "div", 21);
369
+ i0.ɵɵelementStart(37, "div", 20);
370
+ i0.ɵɵrepeaterCreate(38, ClassRegistryInspectorComponent_For_39_Template, 11, 9, "div", 21, ctx.TrackByBase, true);
371
+ i0.ɵɵconditionalCreate(40, ClassRegistryInspectorComponent_Conditional_40_Template, 4, 1, "div", 22);
369
372
  i0.ɵɵelementEnd();
370
- i0.ɵɵelementStart(38, "div", 22);
371
- i0.ɵɵtext(39);
373
+ i0.ɵɵelementStart(41, "div", 23);
374
+ i0.ɵɵtext(42);
372
375
  i0.ɵɵelementEnd()();
373
376
  } if (rf & 2) {
374
- i0.ɵɵadvance(9);
377
+ i0.ɵɵadvance(11);
375
378
  i0.ɵɵproperty("Loading", false);
376
379
  i0.ɵɵadvance();
377
380
  i0.ɵɵproperty("variant", ctx.CopyConfirmed ? "success" : "secondary")("title", ctx.CopyConfirmed ? "Copied" : "Copy as JSON");
378
381
  i0.ɵɵadvance();
379
382
  i0.ɵɵclassProp("fa-clipboard", !ctx.CopyConfirmed)("fa-check", ctx.CopyConfirmed);
380
- i0.ɵɵadvance();
381
- i0.ɵɵtextInterpolate1(" ", ctx.CopyConfirmed ? "Copied" : "Copy", " ");
383
+ i0.ɵɵadvance(2);
384
+ i0.ɵɵtextInterpolate(ctx.CopyConfirmed ? "Copied" : "Copy");
382
385
  i0.ɵɵadvance(4);
383
386
  i0.ɵɵtextInterpolate(ctx.Stats.total);
384
387
  i0.ɵɵadvance(5);
@@ -390,11 +393,11 @@ let ClassRegistryInspectorComponent = class ClassRegistryInspectorComponent exte
390
393
  i0.ɵɵadvance(6);
391
394
  i0.ɵɵproperty("value", ctx.SearchQuery);
392
395
  i0.ɵɵadvance();
393
- i0.ɵɵconditional(ctx.SearchQuery ? 33 : -1);
396
+ i0.ɵɵconditional(ctx.SearchQuery ? 36 : -1);
394
397
  i0.ɵɵadvance(2);
395
398
  i0.ɵɵrepeater(ctx.FilteredGroups);
396
399
  i0.ɵɵadvance(2);
397
- i0.ɵɵconditional(ctx.FilteredGroups.length === 0 ? 37 : -1);
400
+ i0.ɵɵconditional(ctx.FilteredGroups.length === 0 ? 40 : -1);
398
401
  i0.ɵɵadvance(2);
399
402
  i0.ɵɵtextInterpolate1("Refreshed ", ctx.LastRefreshedLabel);
400
403
  } }, dependencies: [i1.MJButtonDirective, i1.MJPageHeaderInteriorComponent, i1.MJRefreshButtonComponent], styles: ["[_nghost-%COMP%] { display: block; height: 100%; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.mj-inspector[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n\n\n.mj-inspector__content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n}\n.mj-inspector__content-head[_ngcontent-%COMP%] {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface-card);\n}\n.mj-inspector__content-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-inspector__content-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-inspector__editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.mj-inspector__editor[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n\n\n.mj-inspector__empty[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}", "\n\n\n.mj-inspector--solo[_ngcontent-%COMP%] {\n background: var(--mj-bg-page);\n}\n\n\n\n.cr-stats-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, max-content) 1fr;\n gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n align-items: center;\n}\n.cr-stat[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 10px 16px;\n min-width: 120px;\n transition: border-color 0.15s;\n}\n.cr-stat--warn[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-status-warning) 30%, var(--mj-border-subtle));\n background: color-mix(in srgb, var(--mj-status-warning) 4%, var(--mj-bg-surface-card));\n}\n.cr-stat--inline[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 0;\n min-width: 0;\n}\n.cr-stat__value[_ngcontent-%COMP%] {\n font-size: 22px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: -0.5px;\n color: var(--mj-text-primary);\n}\n.cr-stat--warn[_ngcontent-%COMP%] .cr-stat__value[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n.cr-stat__label[_ngcontent-%COMP%] {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n font-weight: 600;\n letter-spacing: 0.5px;\n margin-top: 4px;\n}\n\n\n\n.cr-search-wrap[_ngcontent-%COMP%] {\n position: relative;\n width: 100%;\n max-width: 420px;\n margin-left: auto;\n}\n.cr-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n.cr-search[_ngcontent-%COMP%] {\n width: 100%;\n padding: 9px 32px 9px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n.cr-search[_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.cr-search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n width: 22px;\n height: 22px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n}\n.cr-search-clear[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n\n\n\n.cr-groups[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 12px 20px;\n}\n.cr-group[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 8px;\n overflow: hidden;\n transition: box-shadow 0.15s;\n}\n.cr-group--expanded[_ngcontent-%COMP%] {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n}\n.cr-group-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n width: 100%;\n background: transparent;\n border: none;\n cursor: pointer;\n text-align: left;\n font-family: inherit;\n transition: background 0.12s;\n}\n.cr-group-head[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); }\n.cr-group-chev[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 11px;\n transition: transform 0.2s;\n width: 12px;\n}\n.cr-group-chev--down[_ngcontent-%COMP%] { transform: rotate(90deg); }\n.cr-group-name[_ngcontent-%COMP%] {\n font-size: 13.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n letter-spacing: -0.2px;\n}\n.cr-group-meta[_ngcontent-%COMP%] { display: inline-flex; gap: 6px; }\n\n.cr-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10.5px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 100px;\n line-height: 1.4;\n}\n.cr-pill--neutral[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n.cr-pill--info[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n}\n.cr-pill--warn[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 16%, transparent);\n color: color-mix(in srgb, var(--mj-status-warning) 70%, var(--mj-text-primary));\n}\n\n\n\n.cr-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 12.5px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-subtle);\n}\n.cr-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n}\n.cr-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n padding: 8px 14px;\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.cr-th-prio[_ngcontent-%COMP%] { text-align: right; width: 90px; }\n.cr-th-status[_ngcontent-%COMP%] { width: 110px; }\n.cr-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 7px 14px;\n border-top: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n vertical-align: middle;\n}\n.cr-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:first-child td[_ngcontent-%COMP%] { border-top: none; }\n.cr-td-key[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n padding: 2px 7px;\n border-radius: 5px;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-primary);\n}\n.cr-td-empty[_ngcontent-%COMP%] { color: var(--mj-text-muted); font-style: italic; font-size: 11.5px; }\n.cr-td-class[_ngcontent-%COMP%] {\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 12px;\n}\n.cr-td-prio[_ngcontent-%COMP%] {\n text-align: right;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-secondary);\n}\n.cr-td-status[_ngcontent-%COMP%] { text-align: left; }\n\n.cr-row--conflict[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-warning) 5%, transparent); }\n.cr-row--winning[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-success) 5%, transparent); }\n\n.cr-status[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10.5px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 100px;\n}\n.cr-status--win[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 14%, transparent);\n color: color-mix(in srgb, var(--mj-status-success) 70%, var(--mj-text-primary));\n}\n.cr-status--shadowed[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n text-decoration: line-through;\n}\n\n.cr-empty[_ngcontent-%COMP%] {\n padding: 40px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.mj-inspector__footer-meta[_ngcontent-%COMP%] {\n padding: 8px 20px;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n font-size: 11px;\n color: var(--mj-text-muted);\n text-align: right;\n flex-shrink: 0;\n}\n\n@media (max-width: 700px) {\n .cr-stats-row[_ngcontent-%COMP%] { grid-template-columns: repeat(2, 1fr); }\n .cr-stat--inline[_ngcontent-%COMP%] { grid-column: 1 / -1; }\n .cr-search-wrap[_ngcontent-%COMP%] { max-width: 100%; }\n .cr-groups[_ngcontent-%COMP%] { padding: 10px 14px; }\n .cr-th-status[_ngcontent-%COMP%] { display: none; }\n .cr-td-status[_ngcontent-%COMP%] { display: none; }\n}"] });
@@ -405,7 +408,7 @@ ClassRegistryInspectorComponent = __decorate([
405
408
  export { ClassRegistryInspectorComponent };
406
409
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ClassRegistryInspectorComponent, [{
407
410
  type: Component,
408
- args: [{ standalone: false, selector: 'mj-class-registry-inspector', template: "<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Class registry inspector\"\n Title=\"Class Registry\"\n Subtitle=\"Every class registered with @RegisterClass\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"ExpandAll()\" title=\"Expand all groups\">\n <i class=\"fa-solid fa-expand\" aria-hidden=\"true\"></i> Expand\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"CollapseAll()\" title=\"Collapse all groups\">\n <i class=\"fa-solid fa-compress\" aria-hidden=\"true\"></i> Collapse\n </button>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n <button mjButton\n [variant]=\"CopyConfirmed ? 'success' : 'secondary'\"\n size=\"sm\"\n (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy as JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\" aria-hidden=\"true\"></i>\n {{ CopyConfirmed ? 'Copied' : 'Copy' }}\n </button>\n </div>\n </mj-page-header-interior>\n\n <div class=\"cr-stats-row\">\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.total }}</div>\n <div class=\"cr-stat__label\">Total registrations</div>\n </div>\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.baseClasses }}</div>\n <div class=\"cr-stat__label\">Base classes</div>\n </div>\n <div class=\"cr-stat\" [class.cr-stat--warn]=\"Stats.withOverrides > 0\">\n <div class=\"cr-stat__value\">{{ Stats.withOverrides }}</div>\n <div class=\"cr-stat__label\">With overrides</div>\n </div>\n <div class=\"cr-stat cr-stat--inline\">\n <div class=\"cr-search-wrap\">\n <i class=\"fa-solid fa-search cr-search-icon\"></i>\n <input type=\"search\"\n class=\"cr-search\"\n placeholder=\"Search base class, subclass, or key\u2026\"\n [value]=\"SearchQuery\"\n (input)=\"OnSearchChange($any($event.target).value)\" />\n @if (SearchQuery) {\n <button class=\"cr-search-clear\" (click)=\"OnSearchChange('')\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div class=\"cr-groups\">\n @for (group of FilteredGroups; track TrackByBase($index, group)) {\n <div class=\"cr-group\" [class.cr-group--expanded]=\"group.expanded\">\n <button type=\"button\" class=\"cr-group-head\" (click)=\"ToggleGroup(group)\">\n <i class=\"fa-solid fa-chevron-right cr-group-chev\"\n [class.cr-group-chev--down]=\"group.expanded\"></i>\n <span class=\"cr-group-name\">{{ group.baseClassName }}</span>\n <span class=\"cr-group-meta\">\n <span class=\"cr-pill cr-pill--neutral\">{{ group.count }}</span>\n @if (group.uniqueKeys !== group.count) {\n <span class=\"cr-pill cr-pill--info\">{{ group.uniqueKeys }} keys</span>\n }\n @if (group.hasOverrides) {\n <span class=\"cr-pill cr-pill--warn\">\n <i class=\"fa-solid fa-bolt\"></i> overrides\n </span>\n }\n </span>\n </button>\n @if (group.expanded) {\n <table class=\"cr-table\">\n <thead>\n <tr>\n <th class=\"cr-th-key\">Key</th>\n <th class=\"cr-th-class\">Subclass</th>\n <th class=\"cr-th-prio\">Priority</th>\n <th class=\"cr-th-status\"></th>\n </tr>\n </thead>\n <tbody>\n @for (reg of group.registrations; track TrackByReg($index, reg)) {\n <tr [class.cr-row--conflict]=\"IsConflictRow(group, reg)\"\n [class.cr-row--winning]=\"IsWinningRow(group, reg)\">\n <td class=\"cr-td-key\">\n @if (reg.Key) {\n <code>{{ reg.Key }}</code>\n } @else {\n <span class=\"cr-td-empty\">(no key)</span>\n }\n </td>\n <td class=\"cr-td-class\">{{ reg.SubClass.name || '(anonymous)' }}</td>\n <td class=\"cr-td-prio\">{{ reg.Priority }}</td>\n <td class=\"cr-td-status\">\n @if (IsWinningRow(group, reg)) {\n <span class=\"cr-status cr-status--win\" title=\"Highest priority among same-key registrations\">\n <i class=\"fa-solid fa-crown\"></i> winner\n </span>\n } @else if (IsConflictRow(group, reg)) {\n <span class=\"cr-status cr-status--shadowed\" title=\"Outranked by another registration with the same key\">\n shadowed\n </span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n @if (FilteredGroups.length === 0) {\n <div class=\"cr-empty\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No registrations match \"{{ SearchQuery }}\"</span>\n </div>\n }\n </div>\n\n <div class=\"mj-inspector__footer-meta\">Refreshed {{ LastRefreshedLabel }}</div>\n</div>\n", styles: [":host { display: block; height: 100%; }\n\n/*\n Inspector shell \u2014 each Dev Tools sub-page wraps its body in .mj-inspector. The\n chrome (title icon, title, subtitle, action buttons) was previously rendered\n via .mj-inspector__header*, but that's been replaced by <mj-page-header-interior>\n in every inspector template. Action buttons now use the mjButton directive\n (variant=\"secondary\" / \"success\") so they inherit global button styling. App\n State + Layout inspectors used to carry an inner left rail (.mj-inspector__body\n + __sidebar + __nav-item) for L2 sections; that rail was retired 2026-05-19 in\n favor of <mj-tab-nav> projected into the chrome's [toolbar] slot, matching\n SystemDiagnostics and the API Keys tab strip. All inspectors are now \"solo\"\n mode (no sidebar).\n*/\n.mj-inspector {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n/* Content area */\n.mj-inspector__content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n}\n.mj-inspector__content-head {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface-card);\n}\n.mj-inspector__content-title {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-inspector__content-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-inspector__editor {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.mj-inspector__editor mj-code-editor {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n/* Empty state */\n.mj-inspector__empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n", "/* Class Registry Browser \u2014 overlays + extends inspector-shared.css */\n\n.mj-inspector--solo {\n background: var(--mj-bg-page);\n}\n\n/* Stats row */\n.cr-stats-row {\n display: grid;\n grid-template-columns: repeat(3, max-content) 1fr;\n gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n align-items: center;\n}\n.cr-stat {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 10px 16px;\n min-width: 120px;\n transition: border-color 0.15s;\n}\n.cr-stat--warn {\n border-color: color-mix(in srgb, var(--mj-status-warning) 30%, var(--mj-border-subtle));\n background: color-mix(in srgb, var(--mj-status-warning) 4%, var(--mj-bg-surface-card));\n}\n.cr-stat--inline {\n background: transparent;\n border: none;\n padding: 0;\n min-width: 0;\n}\n.cr-stat__value {\n font-size: 22px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: -0.5px;\n color: var(--mj-text-primary);\n}\n.cr-stat--warn .cr-stat__value { color: var(--mj-status-warning); }\n.cr-stat__label {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n font-weight: 600;\n letter-spacing: 0.5px;\n margin-top: 4px;\n}\n\n/* Search */\n.cr-search-wrap {\n position: relative;\n width: 100%;\n max-width: 420px;\n margin-left: auto;\n}\n.cr-search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n.cr-search {\n width: 100%;\n padding: 9px 32px 9px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n.cr-search: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.cr-search-clear {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n width: 22px;\n height: 22px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n}\n.cr-search-clear:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n\n/* Groups */\n.cr-groups {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 12px 20px;\n}\n.cr-group {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 8px;\n overflow: hidden;\n transition: box-shadow 0.15s;\n}\n.cr-group--expanded {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n}\n.cr-group-head {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n width: 100%;\n background: transparent;\n border: none;\n cursor: pointer;\n text-align: left;\n font-family: inherit;\n transition: background 0.12s;\n}\n.cr-group-head:hover { background: var(--mj-bg-surface-hover); }\n.cr-group-chev {\n color: var(--mj-text-muted);\n font-size: 11px;\n transition: transform 0.2s;\n width: 12px;\n}\n.cr-group-chev--down { transform: rotate(90deg); }\n.cr-group-name {\n font-size: 13.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n letter-spacing: -0.2px;\n}\n.cr-group-meta { display: inline-flex; gap: 6px; }\n\n.cr-pill {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10.5px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 100px;\n line-height: 1.4;\n}\n.cr-pill--neutral {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n.cr-pill--info {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n}\n.cr-pill--warn {\n background: color-mix(in srgb, var(--mj-status-warning) 16%, transparent);\n color: color-mix(in srgb, var(--mj-status-warning) 70%, var(--mj-text-primary));\n}\n\n/* Table */\n.cr-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12.5px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-subtle);\n}\n.cr-table thead {\n background: var(--mj-bg-surface-sunken);\n}\n.cr-table th {\n text-align: left;\n padding: 8px 14px;\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.cr-th-prio { text-align: right; width: 90px; }\n.cr-th-status { width: 110px; }\n.cr-table td {\n padding: 7px 14px;\n border-top: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n vertical-align: middle;\n}\n.cr-table tbody tr:first-child td { border-top: none; }\n.cr-td-key code {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n padding: 2px 7px;\n border-radius: 5px;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-primary);\n}\n.cr-td-empty { color: var(--mj-text-muted); font-style: italic; font-size: 11.5px; }\n.cr-td-class {\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 12px;\n}\n.cr-td-prio {\n text-align: right;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-secondary);\n}\n.cr-td-status { text-align: left; }\n\n.cr-row--conflict { background: color-mix(in srgb, var(--mj-status-warning) 5%, transparent); }\n.cr-row--winning { background: color-mix(in srgb, var(--mj-status-success) 5%, transparent); }\n\n.cr-status {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10.5px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 100px;\n}\n.cr-status--win {\n background: color-mix(in srgb, var(--mj-status-success) 14%, transparent);\n color: color-mix(in srgb, var(--mj-status-success) 70%, var(--mj-text-primary));\n}\n.cr-status--shadowed {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n text-decoration: line-through;\n}\n\n.cr-empty {\n padding: 40px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.mj-inspector__footer-meta {\n padding: 8px 20px;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n font-size: 11px;\n color: var(--mj-text-muted);\n text-align: right;\n flex-shrink: 0;\n}\n\n@media (max-width: 700px) {\n .cr-stats-row { grid-template-columns: repeat(2, 1fr); }\n .cr-stat--inline { grid-column: 1 / -1; }\n .cr-search-wrap { max-width: 100%; }\n .cr-groups { padding: 10px 14px; }\n .cr-th-status { display: none; }\n .cr-td-status { display: none; }\n}\n"] }]
411
+ args: [{ standalone: false, selector: 'mj-class-registry-inspector', template: "<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Class registry inspector\"\n Title=\"Class Registry\"\n Subtitle=\"Every class registered with @RegisterClass\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"ExpandAll()\" title=\"Expand all groups\">\n <i class=\"fa-solid fa-expand\" aria-hidden=\"true\"></i> <span class=\"mj-action-label\">Expand</span>\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"CollapseAll()\" title=\"Collapse all groups\">\n <i class=\"fa-solid fa-compress\" aria-hidden=\"true\"></i> <span class=\"mj-action-label\">Collapse</span>\n </button>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n <button mjButton\n [variant]=\"CopyConfirmed ? 'success' : 'secondary'\"\n size=\"sm\"\n (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy as JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\" aria-hidden=\"true\"></i>\n <span class=\"mj-action-label\">{{ CopyConfirmed ? 'Copied' : 'Copy' }}</span>\n </button>\n </div>\n </mj-page-header-interior>\n\n <div class=\"cr-stats-row\">\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.total }}</div>\n <div class=\"cr-stat__label\">Total registrations</div>\n </div>\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.baseClasses }}</div>\n <div class=\"cr-stat__label\">Base classes</div>\n </div>\n <div class=\"cr-stat\" [class.cr-stat--warn]=\"Stats.withOverrides > 0\">\n <div class=\"cr-stat__value\">{{ Stats.withOverrides }}</div>\n <div class=\"cr-stat__label\">With overrides</div>\n </div>\n <div class=\"cr-stat cr-stat--inline\">\n <div class=\"cr-search-wrap\">\n <i class=\"fa-solid fa-search cr-search-icon\"></i>\n <input type=\"search\"\n class=\"cr-search\"\n placeholder=\"Search base class, subclass, or key\u2026\"\n [value]=\"SearchQuery\"\n (input)=\"OnSearchChange($any($event.target).value)\" />\n @if (SearchQuery) {\n <button class=\"cr-search-clear\" (click)=\"OnSearchChange('')\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div class=\"cr-groups\">\n @for (group of FilteredGroups; track TrackByBase($index, group)) {\n <div class=\"cr-group\" [class.cr-group--expanded]=\"group.expanded\">\n <button type=\"button\" class=\"cr-group-head\" (click)=\"ToggleGroup(group)\">\n <i class=\"fa-solid fa-chevron-right cr-group-chev\"\n [class.cr-group-chev--down]=\"group.expanded\"></i>\n <span class=\"cr-group-name\">{{ group.baseClassName }}</span>\n <span class=\"cr-group-meta\">\n <span class=\"cr-pill cr-pill--neutral\">{{ group.count }}</span>\n @if (group.uniqueKeys !== group.count) {\n <span class=\"cr-pill cr-pill--info\">{{ group.uniqueKeys }} keys</span>\n }\n @if (group.hasOverrides) {\n <span class=\"cr-pill cr-pill--warn\">\n <i class=\"fa-solid fa-bolt\"></i> overrides\n </span>\n }\n </span>\n </button>\n @if (group.expanded) {\n <table class=\"cr-table\">\n <thead>\n <tr>\n <th class=\"cr-th-key\">Key</th>\n <th class=\"cr-th-class\">Subclass</th>\n <th class=\"cr-th-prio\">Priority</th>\n <th class=\"cr-th-status\"></th>\n </tr>\n </thead>\n <tbody>\n @for (reg of group.registrations; track TrackByReg($index, reg)) {\n <tr [class.cr-row--conflict]=\"IsConflictRow(group, reg)\"\n [class.cr-row--winning]=\"IsWinningRow(group, reg)\">\n <td class=\"cr-td-key\">\n @if (reg.Key) {\n <code>{{ reg.Key }}</code>\n } @else {\n <span class=\"cr-td-empty\">(no key)</span>\n }\n </td>\n <td class=\"cr-td-class\">{{ reg.SubClass.name || '(anonymous)' }}</td>\n <td class=\"cr-td-prio\">{{ reg.Priority }}</td>\n <td class=\"cr-td-status\">\n @if (IsWinningRow(group, reg)) {\n <span class=\"cr-status cr-status--win\" title=\"Highest priority among same-key registrations\">\n <i class=\"fa-solid fa-crown\"></i> winner\n </span>\n } @else if (IsConflictRow(group, reg)) {\n <span class=\"cr-status cr-status--shadowed\" title=\"Outranked by another registration with the same key\">\n shadowed\n </span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n @if (FilteredGroups.length === 0) {\n <div class=\"cr-empty\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No registrations match \"{{ SearchQuery }}\"</span>\n </div>\n }\n </div>\n\n <div class=\"mj-inspector__footer-meta\">Refreshed {{ LastRefreshedLabel }}</div>\n</div>\n", styles: [":host { display: block; height: 100%; }\n\n/*\n Inspector shell \u2014 each Dev Tools sub-page wraps its body in .mj-inspector. The\n chrome (title icon, title, subtitle, action buttons) was previously rendered\n via .mj-inspector__header*, but that's been replaced by <mj-page-header-interior>\n in every inspector template. Action buttons now use the mjButton directive\n (variant=\"secondary\" / \"success\") so they inherit global button styling. App\n State + Layout inspectors used to carry an inner left rail (.mj-inspector__body\n + __sidebar + __nav-item) for L2 sections; that rail was retired 2026-05-19 in\n favor of <mj-tab-nav> projected into the chrome's [toolbar] slot, matching\n SystemDiagnostics and the API Keys tab strip. All inspectors are now \"solo\"\n mode (no sidebar).\n*/\n.mj-inspector {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n/* Content area */\n.mj-inspector__content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n}\n.mj-inspector__content-head {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface-card);\n}\n.mj-inspector__content-title {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-inspector__content-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-inspector__editor {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.mj-inspector__editor mj-code-editor {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n/* Empty state */\n.mj-inspector__empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n", "/* Class Registry Browser \u2014 overlays + extends inspector-shared.css */\n\n.mj-inspector--solo {\n background: var(--mj-bg-page);\n}\n\n/* Stats row */\n.cr-stats-row {\n display: grid;\n grid-template-columns: repeat(3, max-content) 1fr;\n gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n align-items: center;\n}\n.cr-stat {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 10px 16px;\n min-width: 120px;\n transition: border-color 0.15s;\n}\n.cr-stat--warn {\n border-color: color-mix(in srgb, var(--mj-status-warning) 30%, var(--mj-border-subtle));\n background: color-mix(in srgb, var(--mj-status-warning) 4%, var(--mj-bg-surface-card));\n}\n.cr-stat--inline {\n background: transparent;\n border: none;\n padding: 0;\n min-width: 0;\n}\n.cr-stat__value {\n font-size: 22px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: -0.5px;\n color: var(--mj-text-primary);\n}\n.cr-stat--warn .cr-stat__value { color: var(--mj-status-warning); }\n.cr-stat__label {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n font-weight: 600;\n letter-spacing: 0.5px;\n margin-top: 4px;\n}\n\n/* Search */\n.cr-search-wrap {\n position: relative;\n width: 100%;\n max-width: 420px;\n margin-left: auto;\n}\n.cr-search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n.cr-search {\n width: 100%;\n padding: 9px 32px 9px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n.cr-search: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.cr-search-clear {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n width: 22px;\n height: 22px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n}\n.cr-search-clear:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n\n/* Groups */\n.cr-groups {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 12px 20px;\n}\n.cr-group {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 8px;\n overflow: hidden;\n transition: box-shadow 0.15s;\n}\n.cr-group--expanded {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n}\n.cr-group-head {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n width: 100%;\n background: transparent;\n border: none;\n cursor: pointer;\n text-align: left;\n font-family: inherit;\n transition: background 0.12s;\n}\n.cr-group-head:hover { background: var(--mj-bg-surface-hover); }\n.cr-group-chev {\n color: var(--mj-text-muted);\n font-size: 11px;\n transition: transform 0.2s;\n width: 12px;\n}\n.cr-group-chev--down { transform: rotate(90deg); }\n.cr-group-name {\n font-size: 13.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n letter-spacing: -0.2px;\n}\n.cr-group-meta { display: inline-flex; gap: 6px; }\n\n.cr-pill {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10.5px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 100px;\n line-height: 1.4;\n}\n.cr-pill--neutral {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n.cr-pill--info {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n}\n.cr-pill--warn {\n background: color-mix(in srgb, var(--mj-status-warning) 16%, transparent);\n color: color-mix(in srgb, var(--mj-status-warning) 70%, var(--mj-text-primary));\n}\n\n/* Table */\n.cr-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12.5px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-subtle);\n}\n.cr-table thead {\n background: var(--mj-bg-surface-sunken);\n}\n.cr-table th {\n text-align: left;\n padding: 8px 14px;\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.cr-th-prio { text-align: right; width: 90px; }\n.cr-th-status { width: 110px; }\n.cr-table td {\n padding: 7px 14px;\n border-top: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n vertical-align: middle;\n}\n.cr-table tbody tr:first-child td { border-top: none; }\n.cr-td-key code {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n padding: 2px 7px;\n border-radius: 5px;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-primary);\n}\n.cr-td-empty { color: var(--mj-text-muted); font-style: italic; font-size: 11.5px; }\n.cr-td-class {\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 12px;\n}\n.cr-td-prio {\n text-align: right;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-secondary);\n}\n.cr-td-status { text-align: left; }\n\n.cr-row--conflict { background: color-mix(in srgb, var(--mj-status-warning) 5%, transparent); }\n.cr-row--winning { background: color-mix(in srgb, var(--mj-status-success) 5%, transparent); }\n\n.cr-status {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10.5px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 100px;\n}\n.cr-status--win {\n background: color-mix(in srgb, var(--mj-status-success) 14%, transparent);\n color: color-mix(in srgb, var(--mj-status-success) 70%, var(--mj-text-primary));\n}\n.cr-status--shadowed {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n text-decoration: line-through;\n}\n\n.cr-empty {\n padding: 40px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.mj-inspector__footer-meta {\n padding: 8px 20px;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n font-size: 11px;\n color: var(--mj-text-muted);\n text-align: right;\n flex-shrink: 0;\n}\n\n@media (max-width: 700px) {\n .cr-stats-row { grid-template-columns: repeat(2, 1fr); }\n .cr-stat--inline { grid-column: 1 / -1; }\n .cr-search-wrap { max-width: 100%; }\n .cr-groups { padding: 10px 14px; }\n .cr-th-status { display: none; }\n .cr-td-status { display: none; }\n}\n"] }]
409
412
  }], () => [{ type: i0.ChangeDetectorRef }], null); })();
410
413
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ClassRegistryInspectorComponent, { className: "ClassRegistryInspectorComponent", filePath: "src/DevTools/class-registry.component.ts", lineNumber: 37 }); })();
411
414
  //# sourceMappingURL=class-registry.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"class-registry.component.js","sourceRoot":"","sources":["../../src/DevTools/class-registry.component.ts","../../src/DevTools/class-registry.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass, MJGlobal } from '@memberjunction/global';\nimport { DevToolsPrefs } from './dev-tools-prefs';\n\n/** Local mirror of MJGlobal's ClassRegistration shape (avoids importing the type). */\ninterface ClassRegistration {\n BaseClass: { name?: string };\n SubClass: { name?: string };\n Key: string | null;\n Priority: number;\n}\n\ninterface RegistrationGroup {\n baseClassName: string;\n count: number;\n registrations: ClassRegistration[];\n expanded: boolean;\n /** Number of distinct keys (some keys can have multiple registrations at different priorities). */\n uniqueKeys: number;\n /** True when at least one key in this group has multiple registrations (priority resolution applies). */\n hasOverrides: boolean;\n}\n\n/**\n * Class Registry Browser — read-only inspector of every `@RegisterClass`\n * registration tracked by `MJGlobal.Instance.ClassFactory`. Groups by base\n * class, surfaces priority/override conflicts, supports search + copy.\n */\n@RegisterClass(BaseResourceComponent, 'ClassRegistryInspector')\n@Component({\n standalone: false,\n selector: 'mj-class-registry-inspector',\n templateUrl: './class-registry.component.html',\n styleUrls: ['./inspector-shared.css', './class-registry.component.css']\n})\nexport class ClassRegistryInspectorComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n public Groups: RegistrationGroup[] = [];\n public Stats = { total: 0, baseClasses: 0, withOverrides: 0 };\n public SearchQuery = '';\n public CopyConfirmed = false;\n public LastRefreshed = new Date();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public ngOnInit(): void {\n const prefs = DevToolsPrefs.Get<{ search?: string; expanded?: string[] }>('classRegistry');\n if (prefs?.search) this.SearchQuery = prefs.search;\n this.refresh();\n // Restore expansion after groups are built\n if (prefs?.expanded) {\n for (const g of this.Groups) {\n g.expanded = prefs.expanded.includes(g.baseClassName);\n }\n }\n this.NotifyLoadComplete();\n }\n\n public override ngOnDestroy(): void {\n this.savePrefs();\n super.ngOnDestroy();\n }\n\n public PersistPrefs(): void {\n this.savePrefs();\n }\n\n private savePrefs(): void {\n DevToolsPrefs.Save('classRegistry', {\n search: this.SearchQuery,\n expanded: this.Groups.filter(g => g.expanded).map(g => g.baseClassName)\n });\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Class Registry'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-cubes'; }\n\n public refresh(): void {\n const factory = MJGlobal.Instance.ClassFactory as unknown as { _registrations: ClassRegistration[] };\n const all = factory._registrations ?? [];\n\n // Group by base class name\n const byBase = new Map<string, ClassRegistration[]>();\n for (const reg of all) {\n const baseName = reg.BaseClass?.name ?? '(unknown)';\n const arr = byBase.get(baseName) ?? [];\n arr.push(reg);\n byBase.set(baseName, arr);\n }\n\n // Build groups\n const groups: RegistrationGroup[] = [];\n for (const [baseClassName, registrations] of byBase) {\n const keyCounts = new Map<string, number>();\n for (const r of registrations) {\n const k = r.Key ?? '';\n keyCounts.set(k, (keyCounts.get(k) ?? 0) + 1);\n }\n let hasOverrides = false;\n for (const c of keyCounts.values()) {\n if (c > 1) { hasOverrides = true; break; }\n }\n groups.push({\n baseClassName,\n count: registrations.length,\n registrations: registrations.sort((a, b) => {\n const ak = a.Key ?? '';\n const bk = b.Key ?? '';\n if (ak !== bk) return ak.localeCompare(bk);\n return b.Priority - a.Priority;\n }),\n expanded: false,\n uniqueKeys: keyCounts.size,\n hasOverrides\n });\n }\n\n this.Groups = groups.sort((a, b) => b.count - a.count);\n\n this.Stats = {\n total: all.length,\n baseClasses: byBase.size,\n withOverrides: groups.filter(g => g.hasOverrides).length\n };\n\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n }\n\n public ToggleGroup(group: RegistrationGroup): void {\n group.expanded = !group.expanded;\n this.savePrefs();\n }\n\n public ExpandAll(): void {\n for (const g of this.FilteredGroups) g.expanded = true;\n this.savePrefs();\n }\n\n public CollapseAll(): void {\n for (const g of this.Groups) g.expanded = false;\n this.savePrefs();\n }\n\n public OnSearchChange(value: string): void {\n this.SearchQuery = value;\n this.savePrefs();\n }\n\n public get FilteredGroups(): RegistrationGroup[] {\n const q = this.SearchQuery.trim().toLowerCase();\n if (!q) return this.Groups;\n return this.Groups\n .map(g => ({\n ...g,\n expanded: true,\n registrations: g.registrations.filter(r => {\n const sub = r.SubClass?.name?.toLowerCase() ?? '';\n const key = r.Key?.toLowerCase() ?? '';\n return g.baseClassName.toLowerCase().includes(q) || sub.includes(q) || key.includes(q);\n })\n }))\n .filter(g => g.registrations.length > 0);\n }\n\n public IsConflictRow(group: RegistrationGroup, reg: ClassRegistration): boolean {\n if (!group.hasOverrides) return false;\n const sameKey = group.registrations.filter(r => (r.Key ?? '') === (reg.Key ?? ''));\n return sameKey.length > 1;\n }\n\n public IsWinningRow(group: RegistrationGroup, reg: ClassRegistration): boolean {\n const sameKey = group.registrations.filter(r => (r.Key ?? '') === (reg.Key ?? ''));\n if (sameKey.length === 1) return false;\n const max = Math.max(...sameKey.map(r => r.Priority));\n // If multiple share max priority, the LAST registered wins (matches ClassFactory behavior).\n const top = sameKey.filter(r => r.Priority === max);\n return top[top.length - 1] === reg;\n }\n\n public async OnCopy(): Promise<void> {\n const payload = {\n stats: this.Stats,\n groups: this.FilteredGroups.map(g => ({\n baseClass: g.baseClassName,\n count: g.count,\n registrations: g.registrations.map(r => ({\n key: r.Key,\n subClass: r.SubClass?.name ?? '(anonymous)',\n priority: r.Priority\n }))\n }))\n };\n try {\n await navigator.clipboard.writeText(JSON.stringify(payload, null, 2));\n this.CopyConfirmed = true;\n this.cdr.markForCheck();\n setTimeout(() => { this.CopyConfirmed = false; this.cdr.markForCheck(); }, 1800);\n } catch {\n // clipboard unavailable\n }\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public TrackByBase = (_i: number, g: RegistrationGroup) => g.baseClassName;\n public TrackByReg = (_i: number, r: ClassRegistration) => `${r.SubClass?.name ?? ''}|${r.Key ?? ''}|${r.Priority}`;\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Class registry inspector\"\n Title=\"Class Registry\"\n Subtitle=\"Every class registered with @RegisterClass\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"ExpandAll()\" title=\"Expand all groups\">\n <i class=\"fa-solid fa-expand\" aria-hidden=\"true\"></i> Expand\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"CollapseAll()\" title=\"Collapse all groups\">\n <i class=\"fa-solid fa-compress\" aria-hidden=\"true\"></i> Collapse\n </button>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n <button mjButton\n [variant]=\"CopyConfirmed ? 'success' : 'secondary'\"\n size=\"sm\"\n (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy as JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\" aria-hidden=\"true\"></i>\n {{ CopyConfirmed ? 'Copied' : 'Copy' }}\n </button>\n </div>\n </mj-page-header-interior>\n\n <div class=\"cr-stats-row\">\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.total }}</div>\n <div class=\"cr-stat__label\">Total registrations</div>\n </div>\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.baseClasses }}</div>\n <div class=\"cr-stat__label\">Base classes</div>\n </div>\n <div class=\"cr-stat\" [class.cr-stat--warn]=\"Stats.withOverrides > 0\">\n <div class=\"cr-stat__value\">{{ Stats.withOverrides }}</div>\n <div class=\"cr-stat__label\">With overrides</div>\n </div>\n <div class=\"cr-stat cr-stat--inline\">\n <div class=\"cr-search-wrap\">\n <i class=\"fa-solid fa-search cr-search-icon\"></i>\n <input type=\"search\"\n class=\"cr-search\"\n placeholder=\"Search base class, subclass, or key…\"\n [value]=\"SearchQuery\"\n (input)=\"OnSearchChange($any($event.target).value)\" />\n @if (SearchQuery) {\n <button class=\"cr-search-clear\" (click)=\"OnSearchChange('')\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div class=\"cr-groups\">\n @for (group of FilteredGroups; track TrackByBase($index, group)) {\n <div class=\"cr-group\" [class.cr-group--expanded]=\"group.expanded\">\n <button type=\"button\" class=\"cr-group-head\" (click)=\"ToggleGroup(group)\">\n <i class=\"fa-solid fa-chevron-right cr-group-chev\"\n [class.cr-group-chev--down]=\"group.expanded\"></i>\n <span class=\"cr-group-name\">{{ group.baseClassName }}</span>\n <span class=\"cr-group-meta\">\n <span class=\"cr-pill cr-pill--neutral\">{{ group.count }}</span>\n @if (group.uniqueKeys !== group.count) {\n <span class=\"cr-pill cr-pill--info\">{{ group.uniqueKeys }} keys</span>\n }\n @if (group.hasOverrides) {\n <span class=\"cr-pill cr-pill--warn\">\n <i class=\"fa-solid fa-bolt\"></i> overrides\n </span>\n }\n </span>\n </button>\n @if (group.expanded) {\n <table class=\"cr-table\">\n <thead>\n <tr>\n <th class=\"cr-th-key\">Key</th>\n <th class=\"cr-th-class\">Subclass</th>\n <th class=\"cr-th-prio\">Priority</th>\n <th class=\"cr-th-status\"></th>\n </tr>\n </thead>\n <tbody>\n @for (reg of group.registrations; track TrackByReg($index, reg)) {\n <tr [class.cr-row--conflict]=\"IsConflictRow(group, reg)\"\n [class.cr-row--winning]=\"IsWinningRow(group, reg)\">\n <td class=\"cr-td-key\">\n @if (reg.Key) {\n <code>{{ reg.Key }}</code>\n } @else {\n <span class=\"cr-td-empty\">(no key)</span>\n }\n </td>\n <td class=\"cr-td-class\">{{ reg.SubClass.name || '(anonymous)' }}</td>\n <td class=\"cr-td-prio\">{{ reg.Priority }}</td>\n <td class=\"cr-td-status\">\n @if (IsWinningRow(group, reg)) {\n <span class=\"cr-status cr-status--win\" title=\"Highest priority among same-key registrations\">\n <i class=\"fa-solid fa-crown\"></i> winner\n </span>\n } @else if (IsConflictRow(group, reg)) {\n <span class=\"cr-status cr-status--shadowed\" title=\"Outranked by another registration with the same key\">\n shadowed\n </span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n @if (FilteredGroups.length === 0) {\n <div class=\"cr-empty\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No registrations match \"{{ SearchQuery }}\"</span>\n </div>\n }\n </div>\n\n <div class=\"mj-inspector__footer-meta\">Refreshed {{ LastRefreshedLabel }}</div>\n</div>\n"]}
1
+ {"version":3,"file":"class-registry.component.js","sourceRoot":"","sources":["../../src/DevTools/class-registry.component.ts","../../src/DevTools/class-registry.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass, MJGlobal } from '@memberjunction/global';\nimport { DevToolsPrefs } from './dev-tools-prefs';\n\n/** Local mirror of MJGlobal's ClassRegistration shape (avoids importing the type). */\ninterface ClassRegistration {\n BaseClass: { name?: string };\n SubClass: { name?: string };\n Key: string | null;\n Priority: number;\n}\n\ninterface RegistrationGroup {\n baseClassName: string;\n count: number;\n registrations: ClassRegistration[];\n expanded: boolean;\n /** Number of distinct keys (some keys can have multiple registrations at different priorities). */\n uniqueKeys: number;\n /** True when at least one key in this group has multiple registrations (priority resolution applies). */\n hasOverrides: boolean;\n}\n\n/**\n * Class Registry Browser — read-only inspector of every `@RegisterClass`\n * registration tracked by `MJGlobal.Instance.ClassFactory`. Groups by base\n * class, surfaces priority/override conflicts, supports search + copy.\n */\n@RegisterClass(BaseResourceComponent, 'ClassRegistryInspector')\n@Component({\n standalone: false,\n selector: 'mj-class-registry-inspector',\n templateUrl: './class-registry.component.html',\n styleUrls: ['./inspector-shared.css', './class-registry.component.css']\n})\nexport class ClassRegistryInspectorComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n public Groups: RegistrationGroup[] = [];\n public Stats = { total: 0, baseClasses: 0, withOverrides: 0 };\n public SearchQuery = '';\n public CopyConfirmed = false;\n public LastRefreshed = new Date();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public ngOnInit(): void {\n const prefs = DevToolsPrefs.Get<{ search?: string; expanded?: string[] }>('classRegistry');\n if (prefs?.search) this.SearchQuery = prefs.search;\n this.refresh();\n // Restore expansion after groups are built\n if (prefs?.expanded) {\n for (const g of this.Groups) {\n g.expanded = prefs.expanded.includes(g.baseClassName);\n }\n }\n this.NotifyLoadComplete();\n }\n\n public override ngOnDestroy(): void {\n this.savePrefs();\n super.ngOnDestroy();\n }\n\n public PersistPrefs(): void {\n this.savePrefs();\n }\n\n private savePrefs(): void {\n DevToolsPrefs.Save('classRegistry', {\n search: this.SearchQuery,\n expanded: this.Groups.filter(g => g.expanded).map(g => g.baseClassName)\n });\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Class Registry'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-cubes'; }\n\n public refresh(): void {\n const factory = MJGlobal.Instance.ClassFactory as unknown as { _registrations: ClassRegistration[] };\n const all = factory._registrations ?? [];\n\n // Group by base class name\n const byBase = new Map<string, ClassRegistration[]>();\n for (const reg of all) {\n const baseName = reg.BaseClass?.name ?? '(unknown)';\n const arr = byBase.get(baseName) ?? [];\n arr.push(reg);\n byBase.set(baseName, arr);\n }\n\n // Build groups\n const groups: RegistrationGroup[] = [];\n for (const [baseClassName, registrations] of byBase) {\n const keyCounts = new Map<string, number>();\n for (const r of registrations) {\n const k = r.Key ?? '';\n keyCounts.set(k, (keyCounts.get(k) ?? 0) + 1);\n }\n let hasOverrides = false;\n for (const c of keyCounts.values()) {\n if (c > 1) { hasOverrides = true; break; }\n }\n groups.push({\n baseClassName,\n count: registrations.length,\n registrations: registrations.sort((a, b) => {\n const ak = a.Key ?? '';\n const bk = b.Key ?? '';\n if (ak !== bk) return ak.localeCompare(bk);\n return b.Priority - a.Priority;\n }),\n expanded: false,\n uniqueKeys: keyCounts.size,\n hasOverrides\n });\n }\n\n this.Groups = groups.sort((a, b) => b.count - a.count);\n\n this.Stats = {\n total: all.length,\n baseClasses: byBase.size,\n withOverrides: groups.filter(g => g.hasOverrides).length\n };\n\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n }\n\n public ToggleGroup(group: RegistrationGroup): void {\n group.expanded = !group.expanded;\n this.savePrefs();\n }\n\n public ExpandAll(): void {\n for (const g of this.FilteredGroups) g.expanded = true;\n this.savePrefs();\n }\n\n public CollapseAll(): void {\n for (const g of this.Groups) g.expanded = false;\n this.savePrefs();\n }\n\n public OnSearchChange(value: string): void {\n this.SearchQuery = value;\n this.savePrefs();\n }\n\n public get FilteredGroups(): RegistrationGroup[] {\n const q = this.SearchQuery.trim().toLowerCase();\n if (!q) return this.Groups;\n return this.Groups\n .map(g => ({\n ...g,\n expanded: true,\n registrations: g.registrations.filter(r => {\n const sub = r.SubClass?.name?.toLowerCase() ?? '';\n const key = r.Key?.toLowerCase() ?? '';\n return g.baseClassName.toLowerCase().includes(q) || sub.includes(q) || key.includes(q);\n })\n }))\n .filter(g => g.registrations.length > 0);\n }\n\n public IsConflictRow(group: RegistrationGroup, reg: ClassRegistration): boolean {\n if (!group.hasOverrides) return false;\n const sameKey = group.registrations.filter(r => (r.Key ?? '') === (reg.Key ?? ''));\n return sameKey.length > 1;\n }\n\n public IsWinningRow(group: RegistrationGroup, reg: ClassRegistration): boolean {\n const sameKey = group.registrations.filter(r => (r.Key ?? '') === (reg.Key ?? ''));\n if (sameKey.length === 1) return false;\n const max = Math.max(...sameKey.map(r => r.Priority));\n // If multiple share max priority, the LAST registered wins (matches ClassFactory behavior).\n const top = sameKey.filter(r => r.Priority === max);\n return top[top.length - 1] === reg;\n }\n\n public async OnCopy(): Promise<void> {\n const payload = {\n stats: this.Stats,\n groups: this.FilteredGroups.map(g => ({\n baseClass: g.baseClassName,\n count: g.count,\n registrations: g.registrations.map(r => ({\n key: r.Key,\n subClass: r.SubClass?.name ?? '(anonymous)',\n priority: r.Priority\n }))\n }))\n };\n try {\n await navigator.clipboard.writeText(JSON.stringify(payload, null, 2));\n this.CopyConfirmed = true;\n this.cdr.markForCheck();\n setTimeout(() => { this.CopyConfirmed = false; this.cdr.markForCheck(); }, 1800);\n } catch {\n // clipboard unavailable\n }\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public TrackByBase = (_i: number, g: RegistrationGroup) => g.baseClassName;\n public TrackByReg = (_i: number, r: ClassRegistration) => `${r.SubClass?.name ?? ''}|${r.Key ?? ''}|${r.Priority}`;\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Class registry inspector\"\n Title=\"Class Registry\"\n Subtitle=\"Every class registered with @RegisterClass\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"ExpandAll()\" title=\"Expand all groups\">\n <i class=\"fa-solid fa-expand\" aria-hidden=\"true\"></i> <span class=\"mj-action-label\">Expand</span>\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"CollapseAll()\" title=\"Collapse all groups\">\n <i class=\"fa-solid fa-compress\" aria-hidden=\"true\"></i> <span class=\"mj-action-label\">Collapse</span>\n </button>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n <button mjButton\n [variant]=\"CopyConfirmed ? 'success' : 'secondary'\"\n size=\"sm\"\n (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy as JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\" aria-hidden=\"true\"></i>\n <span class=\"mj-action-label\">{{ CopyConfirmed ? 'Copied' : 'Copy' }}</span>\n </button>\n </div>\n </mj-page-header-interior>\n\n <div class=\"cr-stats-row\">\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.total }}</div>\n <div class=\"cr-stat__label\">Total registrations</div>\n </div>\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.baseClasses }}</div>\n <div class=\"cr-stat__label\">Base classes</div>\n </div>\n <div class=\"cr-stat\" [class.cr-stat--warn]=\"Stats.withOverrides > 0\">\n <div class=\"cr-stat__value\">{{ Stats.withOverrides }}</div>\n <div class=\"cr-stat__label\">With overrides</div>\n </div>\n <div class=\"cr-stat cr-stat--inline\">\n <div class=\"cr-search-wrap\">\n <i class=\"fa-solid fa-search cr-search-icon\"></i>\n <input type=\"search\"\n class=\"cr-search\"\n placeholder=\"Search base class, subclass, or key…\"\n [value]=\"SearchQuery\"\n (input)=\"OnSearchChange($any($event.target).value)\" />\n @if (SearchQuery) {\n <button class=\"cr-search-clear\" (click)=\"OnSearchChange('')\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div class=\"cr-groups\">\n @for (group of FilteredGroups; track TrackByBase($index, group)) {\n <div class=\"cr-group\" [class.cr-group--expanded]=\"group.expanded\">\n <button type=\"button\" class=\"cr-group-head\" (click)=\"ToggleGroup(group)\">\n <i class=\"fa-solid fa-chevron-right cr-group-chev\"\n [class.cr-group-chev--down]=\"group.expanded\"></i>\n <span class=\"cr-group-name\">{{ group.baseClassName }}</span>\n <span class=\"cr-group-meta\">\n <span class=\"cr-pill cr-pill--neutral\">{{ group.count }}</span>\n @if (group.uniqueKeys !== group.count) {\n <span class=\"cr-pill cr-pill--info\">{{ group.uniqueKeys }} keys</span>\n }\n @if (group.hasOverrides) {\n <span class=\"cr-pill cr-pill--warn\">\n <i class=\"fa-solid fa-bolt\"></i> overrides\n </span>\n }\n </span>\n </button>\n @if (group.expanded) {\n <table class=\"cr-table\">\n <thead>\n <tr>\n <th class=\"cr-th-key\">Key</th>\n <th class=\"cr-th-class\">Subclass</th>\n <th class=\"cr-th-prio\">Priority</th>\n <th class=\"cr-th-status\"></th>\n </tr>\n </thead>\n <tbody>\n @for (reg of group.registrations; track TrackByReg($index, reg)) {\n <tr [class.cr-row--conflict]=\"IsConflictRow(group, reg)\"\n [class.cr-row--winning]=\"IsWinningRow(group, reg)\">\n <td class=\"cr-td-key\">\n @if (reg.Key) {\n <code>{{ reg.Key }}</code>\n } @else {\n <span class=\"cr-td-empty\">(no key)</span>\n }\n </td>\n <td class=\"cr-td-class\">{{ reg.SubClass.name || '(anonymous)' }}</td>\n <td class=\"cr-td-prio\">{{ reg.Priority }}</td>\n <td class=\"cr-td-status\">\n @if (IsWinningRow(group, reg)) {\n <span class=\"cr-status cr-status--win\" title=\"Highest priority among same-key registrations\">\n <i class=\"fa-solid fa-crown\"></i> winner\n </span>\n } @else if (IsConflictRow(group, reg)) {\n <span class=\"cr-status cr-status--shadowed\" title=\"Outranked by another registration with the same key\">\n shadowed\n </span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n @if (FilteredGroups.length === 0) {\n <div class=\"cr-empty\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No registrations match \"{{ SearchQuery }}\"</span>\n </div>\n }\n </div>\n\n <div class=\"mj-inspector__footer-meta\">Refreshed {{ LastRefreshedLabel }}</div>\n</div>\n"]}