@memberjunction/ng-dashboards 5.35.0 → 5.37.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 (159) hide show
  1. package/dist/AI/components/agents/agent-configuration.component.js +3 -3
  2. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  3. package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +22 -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 +157 -137
  6. package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +28 -0
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  9. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +2075 -2068
  10. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  11. package/dist/AI/components/models/model-management.component.js +4 -4
  12. package/dist/AI/components/models/model-management.component.js.map +1 -1
  13. package/dist/AI/components/prompts/prompt-management.component.js +3 -3
  14. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  15. package/dist/AI/components/tags/tags-resource.component.d.ts +15 -0
  16. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  17. package/dist/AI/components/tags/tags-resource.component.js +1411 -1424
  18. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  19. package/dist/APIKeys/api-keys-resource.component.d.ts +12 -8
  20. package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
  21. package/dist/APIKeys/api-keys-resource.component.js +329 -371
  22. package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
  23. package/dist/Actions/components/actions-overview.component.js +137 -142
  24. package/dist/Actions/components/actions-overview.component.js.map +1 -1
  25. package/dist/Actions/components/execution-monitoring.component.js +111 -116
  26. package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
  27. package/dist/Admin/admin-data-schema.component.js +13 -65
  28. package/dist/Admin/admin-data-schema.component.js.map +1 -1
  29. package/dist/Admin/admin-dev-tools-resource.component.js +13 -65
  30. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  31. package/dist/Admin/admin-identity-access.component.js +13 -65
  32. package/dist/Admin/admin-identity-access.component.js.map +1 -1
  33. package/dist/Admin/admin-monitoring.component.js +13 -65
  34. package/dist/Admin/admin-monitoring.component.js.map +1 -1
  35. package/dist/Admin/base-admin-container.component.d.ts +9 -7
  36. package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
  37. package/dist/Admin/base-admin-container.component.js +26 -17
  38. package/dist/Admin/base-admin-container.component.js.map +1 -1
  39. package/dist/ApplicationRoles/application-roles-resource.component.js +74 -67
  40. package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
  41. package/dist/Communication/communication-new-message-resource.component.d.ts +93 -0
  42. package/dist/Communication/communication-new-message-resource.component.d.ts.map +1 -0
  43. package/dist/Communication/communication-new-message-resource.component.js +661 -0
  44. package/dist/Communication/communication-new-message-resource.component.js.map +1 -0
  45. package/dist/Credentials/components/credentials-categories-resource.component.js +152 -159
  46. package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
  47. package/dist/Credentials/components/credentials-types-resource.component.js +151 -155
  48. package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
  49. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +20 -21
  50. package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js.map +1 -1
  51. package/dist/DatabaseDesigner/components/entity-list.component.d.ts +2 -0
  52. package/dist/DatabaseDesigner/components/entity-list.component.d.ts.map +1 -1
  53. package/dist/DatabaseDesigner/components/entity-list.component.js +131 -125
  54. package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
  55. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +1 -1
  56. package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
  57. package/dist/DatabaseDesigner/database-designer-dashboards.module.js +7 -1
  58. package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
  59. package/dist/DevTools/app-state-inspector.component.d.ts +5 -0
  60. package/dist/DevTools/app-state-inspector.component.d.ts.map +1 -1
  61. package/dist/DevTools/app-state-inspector.component.js +46 -72
  62. package/dist/DevTools/app-state-inspector.component.js.map +1 -1
  63. package/dist/DevTools/class-registry.component.js +88 -100
  64. package/dist/DevTools/class-registry.component.js.map +1 -1
  65. package/dist/DevTools/event-monitor.component.js +158 -168
  66. package/dist/DevTools/event-monitor.component.js.map +1 -1
  67. package/dist/DevTools/graphql-console.component.js +257 -264
  68. package/dist/DevTools/graphql-console.component.js.map +1 -1
  69. package/dist/DevTools/layout-inspector.component.d.ts +5 -0
  70. package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
  71. package/dist/DevTools/layout-inspector.component.js +46 -64
  72. package/dist/DevTools/layout-inspector.component.js.map +1 -1
  73. package/dist/DevTools/lazy-module-status.component.js +75 -84
  74. package/dist/DevTools/lazy-module-status.component.js.map +1 -1
  75. package/dist/DevTools/settings-explorer.component.js +76 -85
  76. package/dist/DevTools/settings-explorer.component.js.map +1 -1
  77. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +2 -0
  78. package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
  79. package/dist/EntityAdmin/entity-admin-dashboard.component.js +7 -3
  80. package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
  81. package/dist/Integration/components/activity/activity.component.js +97 -99
  82. package/dist/Integration/components/activity/activity.component.js.map +1 -1
  83. package/dist/Integration/components/connections/connections.component.js +842 -855
  84. package/dist/Integration/components/connections/connections.component.js.map +1 -1
  85. package/dist/Integration/components/pipelines/pipelines.component.js +502 -517
  86. package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
  87. package/dist/Integration/components/schedules/schedules.component.js +78 -89
  88. package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
  89. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +5 -0
  90. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  91. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1120 -1128
  92. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  93. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +11 -0
  94. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
  95. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +606 -661
  96. package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
  97. package/dist/Lists/components/lists-browse-resource.component.d.ts +102 -0
  98. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  99. package/dist/Lists/components/lists-browse-resource.component.js +1179 -504
  100. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  101. package/dist/Lists/components/lists-operations-resource.component.d.ts +133 -3
  102. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  103. package/dist/Lists/components/lists-operations-resource.component.js +1527 -327
  104. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  105. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts +29 -0
  106. package/dist/Lists/components/lists-shared-with-me-resource.component.d.ts.map +1 -0
  107. package/dist/Lists/components/lists-shared-with-me-resource.component.js +77 -0
  108. package/dist/Lists/components/lists-shared-with-me-resource.component.js.map +1 -0
  109. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts +6 -0
  110. package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
  111. package/dist/Lists/components/venn-diagram/venn-diagram.component.js +35 -7
  112. package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
  113. package/dist/Lists/index.d.ts +1 -0
  114. package/dist/Lists/index.d.ts.map +1 -1
  115. package/dist/Lists/index.js +1 -0
  116. package/dist/Lists/index.js.map +1 -1
  117. package/dist/Lists/services/list-set-operations.service.d.ts +93 -2
  118. package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
  119. package/dist/Lists/services/list-set-operations.service.js +236 -10
  120. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  121. package/dist/MCP/mcp-dashboard.component.js +19 -19
  122. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  123. package/dist/Scheduling/scheduling-dashboard.component.js +58 -60
  124. package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
  125. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +13 -3
  126. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  127. package/dist/SystemDiagnostics/system-diagnostics.component.js +1007 -1252
  128. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  129. package/dist/Testing/components/testing-explorer.component.d.ts +31 -6
  130. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  131. package/dist/Testing/components/testing-explorer.component.js +543 -629
  132. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  133. package/dist/Testing/testing-dashboard.component.js +50 -49
  134. package/dist/Testing/testing-dashboard.component.js.map +1 -1
  135. package/dist/ai-dashboards.module.d.ts +1 -1
  136. package/dist/ai-dashboards.module.d.ts.map +1 -1
  137. package/dist/ai-dashboards.module.js +16 -1
  138. package/dist/ai-dashboards.module.js.map +1 -1
  139. package/dist/communication-dashboards.module.d.ts +9 -7
  140. package/dist/communication-dashboards.module.d.ts.map +1 -1
  141. package/dist/communication-dashboards.module.js +13 -4
  142. package/dist/communication-dashboards.module.js.map +1 -1
  143. package/dist/core-dashboards.module.d.ts +1 -1
  144. package/dist/core-dashboards.module.d.ts.map +1 -1
  145. package/dist/core-dashboards.module.js +16 -1
  146. package/dist/core-dashboards.module.js.map +1 -1
  147. package/dist/lists-dashboards.module.d.ts +10 -9
  148. package/dist/lists-dashboards.module.d.ts.map +1 -1
  149. package/dist/lists-dashboards.module.js +13 -2
  150. package/dist/lists-dashboards.module.js.map +1 -1
  151. package/dist/public-api.d.ts +1 -0
  152. package/dist/public-api.d.ts.map +1 -1
  153. package/dist/public-api.js +1 -0
  154. package/dist/public-api.js.map +1 -1
  155. package/dist/testing-dashboards.module.d.ts +1 -1
  156. package/dist/testing-dashboards.module.d.ts.map +1 -1
  157. package/dist/testing-dashboards.module.js +13 -1
  158. package/dist/testing-dashboards.module.js.map +1 -1
  159. package/package.json +53 -52
@@ -1 +1 @@
1
- {"version":3,"file":"app-state-inspector.component.js","sourceRoot":"","sources":["../../src/DevTools/app-state-inspector.component.ts","../../src/DevTools/app-state-inspector.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 } from '@memberjunction/global';\nimport { DevToolsPrefs } from './dev-tools-prefs';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { WorkspaceStateManager } from '@memberjunction/ng-base-application';\nimport { DeveloperModeService } from '@memberjunction/ng-shared';\n\ninterface InspectorSection {\n id: string;\n label: string;\n icon: string;\n enabled: boolean;\n description?: string;\n}\n\n/**\n * App State Inspector — read-only structured view of the Explorer's runtime\n * state. Replaces the legacy \"Inspect App State\" user-menu item which only\n * dumped to console. Lives in the Admin app's dev tools area.\n */\n@RegisterClass(BaseResourceComponent, 'AppStateInspector')\n@Component({\n standalone: false,\n selector: 'mj-app-state-inspector',\n templateUrl: './app-state-inspector.component.html',\n styleUrls: ['./inspector-shared.css']\n})\nexport class AppStateInspectorComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n public Sections: InspectorSection[] = [\n { id: 'user', label: 'Current User', icon: 'fa-solid fa-user', enabled: true, description: 'Identity, roles, email' },\n { id: 'provider', label: 'Provider', icon: 'fa-solid fa-plug', enabled: true, description: 'API URL, entities loaded' },\n { id: 'workspace',label: 'Workspace', icon: 'fa-solid fa-table-columns', enabled: true, description: 'Tabs, layout, active state' },\n { id: 'app', label: 'Active Application', icon: 'fa-solid fa-th-large', enabled: true, description: 'Current app + nav items' },\n { id: 'dev', label: 'Developer Mode', icon: 'fa-solid fa-code', enabled: true, description: 'Dev mode flag, eligibility' },\n { id: 'browser', label: 'Browser & Session', icon: 'fa-solid fa-window-maximize',enabled: true, description: 'User agent, viewport, URL' }\n ];\n\n public ActiveSection = 'user';\n public StateJson = '{}';\n public SearchQuery = '';\n public CopyConfirmed = false;\n public LastRefreshed = new Date();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private workspace: WorkspaceStateManager,\n private devMode: DeveloperModeService\n ) {\n super();\n }\n\n public ngOnInit(): void {\n const p = DevToolsPrefs.Get<{ activeSection?: string }>('appStateInspector');\n if (p?.activeSection && this.Sections.some(s => s.id === p.activeSection)) {\n this.ActiveSection = p.activeSection;\n }\n this.refresh();\n this.NotifyLoadComplete();\n }\n\n public override ngOnDestroy(): void {\n DevToolsPrefs.Save('appStateInspector', { activeSection: this.ActiveSection });\n super.ngOnDestroy();\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'App State Inspector'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-magnifying-glass-chart'; }\n\n public OnSectionClick(section: InspectorSection): void {\n if (this.ActiveSection === section.id) return;\n this.ActiveSection = section.id;\n DevToolsPrefs.Save('appStateInspector', { activeSection: this.ActiveSection });\n this.refresh();\n }\n\n public refresh(): void {\n this.StateJson = JSON.stringify(this.computeSectionData(this.ActiveSection), this.jsonReplacer, 2);\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n }\n\n public async OnCopy(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.StateJson);\n this.CopyConfirmed = true;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.CopyConfirmed = false;\n this.cdr.markForCheck();\n }, 1800);\n } catch {\n // clipboard unavailable\n }\n }\n\n public OnDownload(): void {\n const blob = new Blob([this.StateJson], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `mj-app-state-${this.ActiveSection}-${this.timestampSlug()}.json`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public get SectionLabel(): string {\n return this.Sections.find(s => s.id === this.ActiveSection)?.label ?? '';\n }\n\n // ---------- private ----------\n\n private computeSectionData(section: string): unknown {\n switch (section) {\n case 'user': return this.userData();\n case 'provider': return this.providerData();\n case 'workspace': return this.workspaceData();\n case 'app': return this.appData();\n case 'dev': return this.devData();\n case 'browser': return this.browserData();\n default: return {};\n }\n }\n\n private userData(): unknown {\n const user = this.ProviderToUse?.CurrentUser;\n if (!user) return { error: 'No current user' };\n return {\n ID: user.ID,\n Name: user.Name,\n FirstName: user.FirstName,\n LastName: user.LastName,\n Email: user.Email,\n Type: user.Type,\n IsActive: user.IsActive,\n LinkedRecordType: user.LinkedRecordType,\n CreatedAt: user.__mj_CreatedAt,\n Roles: (user.UserRoles ?? []).map(r => ({ Role: r.Role, RoleID: r.RoleID }))\n };\n }\n\n private providerData(): unknown {\n const provider = this.ProviderToUse;\n if (!provider) return { error: 'No provider' };\n const data: Record<string, unknown> = {\n type: provider.constructor.name,\n EntitiesCount: provider.Entities?.length ?? 0,\n ApplicationsCount: provider.Applications?.length ?? 0,\n QueriesCount: provider.Queries?.length ?? 0,\n RolesCount: provider.Roles?.length ?? 0\n };\n if (provider instanceof GraphQLDataProvider) {\n data.URL = provider.ConfigData?.URL;\n data.WSURL = provider.ConfigData?.WSURL;\n }\n return data;\n }\n\n private workspaceData(): unknown {\n const config = this.workspace.GetConfiguration();\n return config;\n }\n\n private appData(): unknown {\n const config = this.workspace.GetConfiguration();\n if (!config) return { error: 'No workspace configuration' };\n const activeTab = config.tabs?.find(t => t.id === config.activeTabId);\n return {\n ActiveTabId: config.activeTabId,\n ActiveTab: activeTab,\n TabCount: config.tabs?.length ?? 0\n };\n }\n\n private devData(): unknown {\n return {\n IsEnabled: this.devMode.IsEnabled,\n IsDeveloper: this.devMode.IsDeveloper,\n EligibleRoles: ['Developer', 'Admin', 'System Administrator', 'Integration']\n };\n }\n\n private browserData(): unknown {\n return {\n UserAgent: navigator.userAgent,\n Language: navigator.language,\n Languages: navigator.languages,\n Platform: navigator.platform,\n Online: navigator.onLine,\n Viewport: { width: window.innerWidth, height: window.innerHeight, devicePixelRatio: window.devicePixelRatio },\n URL: window.location.href,\n Origin: window.location.origin,\n Path: window.location.pathname + window.location.search,\n Memory: this.readMemory()\n };\n }\n\n private jsonReplacer(_key: string, value: unknown): unknown {\n if (value instanceof Date) return value.toISOString();\n if (value instanceof Map) return Object.fromEntries(value.entries());\n if (value instanceof Set) return Array.from(value);\n if (typeof value === 'function') return `[Function ${(value as { name: string }).name || 'anonymous'}]`;\n return value;\n }\n\n private readMemory(): { usedJSHeapSize: number; totalJSHeapSize: number } | undefined {\n const memory = (performance as Performance & {\n memory?: { usedJSHeapSize: number; totalJSHeapSize: number };\n }).memory;\n if (!memory) return undefined;\n return { usedJSHeapSize: memory.usedJSHeapSize, totalJSHeapSize: memory.totalJSHeapSize };\n }\n\n private timestampSlug(): string {\n const d = new Date();\n const pad = (n: number) => n.toString().padStart(2, '0');\n return `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}-${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`;\n }\n\n}\n","<div class=\"mj-inspector\">\n <div class=\"mj-inspector__header\">\n <div class=\"mj-inspector__header-icon\"><i class=\"fa-solid fa-magnifying-glass-chart\"></i></div>\n <div>\n <h3 class=\"mj-inspector__header-title\">App State Inspector</h3>\n <div class=\"mj-inspector__header-sub\">Read-only snapshot of Explorer runtime state</div>\n </div>\n <span class=\"mj-inspector__header-spacer\"></span>\n <div class=\"mj-inspector__header-actions\">\n <button class=\"mj-inspector__btn\" type=\"button\" (click)=\"refresh()\" title=\"Refresh\">\n <i class=\"fa-solid fa-rotate\"></i> Refresh\n </button>\n <button class=\"mj-inspector__btn\"\n [class.mj-inspector__btn--success]=\"CopyConfirmed\"\n type=\"button\" (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\"></i>\n {{ CopyConfirmed ? 'Copied' : 'Copy' }}\n </button>\n <button class=\"mj-inspector__btn\" type=\"button\" (click)=\"OnDownload()\" title=\"Download as JSON\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"mj-inspector__body\">\n <aside class=\"mj-inspector__sidebar\">\n @for (section of Sections; track section.id) {\n <button type=\"button\"\n class=\"mj-inspector__nav-item\"\n [class.mj-inspector__nav-item--active]=\"ActiveSection === section.id\"\n (click)=\"OnSectionClick(section)\">\n <i class=\"mj-inspector__nav-icon\" [class]=\"section.icon\"></i>\n <div class=\"mj-inspector__nav-text\">\n <div class=\"mj-inspector__nav-label\">{{ section.label }}</div>\n @if (section.description) {\n <div class=\"mj-inspector__nav-desc\">{{ section.description }}</div>\n }\n </div>\n </button>\n }\n </aside>\n\n <div class=\"mj-inspector__content\">\n <div class=\"mj-inspector__content-head\">\n <h4 class=\"mj-inspector__content-title\">{{ SectionLabel }}</h4>\n <span class=\"mj-inspector__content-meta\">Refreshed {{ LastRefreshedLabel }}</span>\n </div>\n <div class=\"mj-inspector__editor\">\n <mj-code-editor\n [(ngModel)]=\"StateJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n </div>\n</div>\n"]}
1
+ {"version":3,"file":"app-state-inspector.component.js","sourceRoot":"","sources":["../../src/DevTools/app-state-inspector.component.ts","../../src/DevTools/app-state-inspector.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 } from '@memberjunction/global';\nimport { TabConfig } from '@memberjunction/ng-ui-components';\nimport { DevToolsPrefs } from './dev-tools-prefs';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { WorkspaceStateManager } from '@memberjunction/ng-base-application';\nimport { DeveloperModeService } from '@memberjunction/ng-shared';\n\ninterface InspectorSection {\n id: string;\n label: string;\n icon: string;\n enabled: boolean;\n description?: string;\n}\n\n/**\n * App State Inspector — read-only structured view of the Explorer's runtime\n * state. Replaces the legacy \"Inspect App State\" user-menu item which only\n * dumped to console. Lives in the Admin app's dev tools area.\n */\n@RegisterClass(BaseResourceComponent, 'AppStateInspector')\n@Component({\n standalone: false,\n selector: 'mj-app-state-inspector',\n templateUrl: './app-state-inspector.component.html',\n styleUrls: ['./inspector-shared.css']\n})\nexport class AppStateInspectorComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n public Sections: InspectorSection[] = [\n { id: 'user', label: 'Current User', icon: 'fa-solid fa-user', enabled: true, description: 'Identity, roles, email' },\n { id: 'provider', label: 'Provider', icon: 'fa-solid fa-plug', enabled: true, description: 'API URL, entities loaded' },\n { id: 'workspace',label: 'Workspace', icon: 'fa-solid fa-table-columns', enabled: true, description: 'Tabs, layout, active state' },\n { id: 'app', label: 'Active Application', icon: 'fa-solid fa-th-large', enabled: true, description: 'Current app + nav items' },\n { id: 'dev', label: 'Developer Mode', icon: 'fa-solid fa-code', enabled: true, description: 'Dev mode flag, eligibility' },\n { id: 'browser', label: 'Browser & Session', icon: 'fa-solid fa-window-maximize',enabled: true, description: 'User agent, viewport, URL' }\n ];\n\n public ActiveSection = 'user';\n public StateJson = '{}';\n public SearchQuery = '';\n public CopyConfirmed = false;\n public LastRefreshed = new Date();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private workspace: WorkspaceStateManager,\n private devMode: DeveloperModeService\n ) {\n super();\n }\n\n public ngOnInit(): void {\n const p = DevToolsPrefs.Get<{ activeSection?: string }>('appStateInspector');\n if (p?.activeSection && this.Sections.some(s => s.id === p.activeSection)) {\n this.ActiveSection = p.activeSection;\n }\n this.refresh();\n this.NotifyLoadComplete();\n }\n\n public override ngOnDestroy(): void {\n DevToolsPrefs.Save('appStateInspector', { activeSection: this.ActiveSection });\n super.ngOnDestroy();\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'App State Inspector'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-magnifying-glass-chart'; }\n\n /** Sections rendered as horizontal tabs in the chrome's [toolbar] slot. */\n public get tabsConfig(): TabConfig[] {\n return this.Sections.map(s => ({\n key: s.id,\n label: s.label,\n icon: s.icon\n }));\n }\n\n /** Adapter for `<mj-tab-nav>`'s string-typed `(TabChange)` output. */\n public onTabChange(key: string): void {\n const section = this.Sections.find(s => s.id === key);\n if (section) {\n this.OnSectionClick(section);\n }\n }\n\n public OnSectionClick(section: InspectorSection): void {\n if (this.ActiveSection === section.id) return;\n this.ActiveSection = section.id;\n DevToolsPrefs.Save('appStateInspector', { activeSection: this.ActiveSection });\n this.refresh();\n }\n\n public refresh(): void {\n this.StateJson = JSON.stringify(this.computeSectionData(this.ActiveSection), this.jsonReplacer, 2);\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n }\n\n public async OnCopy(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.StateJson);\n this.CopyConfirmed = true;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.CopyConfirmed = false;\n this.cdr.markForCheck();\n }, 1800);\n } catch {\n // clipboard unavailable\n }\n }\n\n public OnDownload(): void {\n const blob = new Blob([this.StateJson], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `mj-app-state-${this.ActiveSection}-${this.timestampSlug()}.json`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public get SectionLabel(): string {\n return this.Sections.find(s => s.id === this.ActiveSection)?.label ?? '';\n }\n\n // ---------- private ----------\n\n private computeSectionData(section: string): unknown {\n switch (section) {\n case 'user': return this.userData();\n case 'provider': return this.providerData();\n case 'workspace': return this.workspaceData();\n case 'app': return this.appData();\n case 'dev': return this.devData();\n case 'browser': return this.browserData();\n default: return {};\n }\n }\n\n private userData(): unknown {\n const user = this.ProviderToUse?.CurrentUser;\n if (!user) return { error: 'No current user' };\n return {\n ID: user.ID,\n Name: user.Name,\n FirstName: user.FirstName,\n LastName: user.LastName,\n Email: user.Email,\n Type: user.Type,\n IsActive: user.IsActive,\n LinkedRecordType: user.LinkedRecordType,\n CreatedAt: user.__mj_CreatedAt,\n Roles: (user.UserRoles ?? []).map(r => ({ Role: r.Role, RoleID: r.RoleID }))\n };\n }\n\n private providerData(): unknown {\n const provider = this.ProviderToUse;\n if (!provider) return { error: 'No provider' };\n const data: Record<string, unknown> = {\n type: provider.constructor.name,\n EntitiesCount: provider.Entities?.length ?? 0,\n ApplicationsCount: provider.Applications?.length ?? 0,\n QueriesCount: provider.Queries?.length ?? 0,\n RolesCount: provider.Roles?.length ?? 0\n };\n if (provider instanceof GraphQLDataProvider) {\n data.URL = provider.ConfigData?.URL;\n data.WSURL = provider.ConfigData?.WSURL;\n }\n return data;\n }\n\n private workspaceData(): unknown {\n const config = this.workspace.GetConfiguration();\n return config;\n }\n\n private appData(): unknown {\n const config = this.workspace.GetConfiguration();\n if (!config) return { error: 'No workspace configuration' };\n const activeTab = config.tabs?.find(t => t.id === config.activeTabId);\n return {\n ActiveTabId: config.activeTabId,\n ActiveTab: activeTab,\n TabCount: config.tabs?.length ?? 0\n };\n }\n\n private devData(): unknown {\n return {\n IsEnabled: this.devMode.IsEnabled,\n IsDeveloper: this.devMode.IsDeveloper,\n EligibleRoles: ['Developer', 'Admin', 'System Administrator', 'Integration']\n };\n }\n\n private browserData(): unknown {\n return {\n UserAgent: navigator.userAgent,\n Language: navigator.language,\n Languages: navigator.languages,\n Platform: navigator.platform,\n Online: navigator.onLine,\n Viewport: { width: window.innerWidth, height: window.innerHeight, devicePixelRatio: window.devicePixelRatio },\n URL: window.location.href,\n Origin: window.location.origin,\n Path: window.location.pathname + window.location.search,\n Memory: this.readMemory()\n };\n }\n\n private jsonReplacer(_key: string, value: unknown): unknown {\n if (value instanceof Date) return value.toISOString();\n if (value instanceof Map) return Object.fromEntries(value.entries());\n if (value instanceof Set) return Array.from(value);\n if (typeof value === 'function') return `[Function ${(value as { name: string }).name || 'anonymous'}]`;\n return value;\n }\n\n private readMemory(): { usedJSHeapSize: number; totalJSHeapSize: number } | undefined {\n const memory = (performance as Performance & {\n memory?: { usedJSHeapSize: number; totalJSHeapSize: number };\n }).memory;\n if (!memory) return undefined;\n return { usedJSHeapSize: memory.usedJSHeapSize, totalJSHeapSize: memory.totalJSHeapSize };\n }\n\n private timestampSlug(): string {\n const d = new Date();\n const pad = (n: number) => n.toString().padStart(2, '0');\n return `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}-${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`;\n }\n\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"App State inspector\"\n Title=\"App State Inspector\"\n Subtitle=\"Read-only snapshot of Explorer runtime state\">\n <div actions>\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 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 <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnDownload()\" title=\"Download as JSON\" aria-label=\"Download as JSON\">\n <i class=\"fa-solid fa-download\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div toolbar>\n <mj-tab-nav\n [Tabs]=\"tabsConfig\"\n [ActiveKey]=\"ActiveSection\"\n (TabChange)=\"onTabChange($event)\">\n </mj-tab-nav>\n </div>\n </mj-page-header-interior>\n\n <div class=\"mj-inspector__content\">\n <div class=\"mj-inspector__content-head\">\n <h4 class=\"mj-inspector__content-title\">{{ SectionLabel }}</h4>\n <span class=\"mj-inspector__content-meta\">Refreshed {{ LastRefreshedLabel }}</span>\n </div>\n <div class=\"mj-inspector__editor\">\n <mj-code-editor\n [(ngModel)]=\"StateJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n</div>\n"]}
@@ -9,15 +9,16 @@ import { BaseResourceComponent } from '@memberjunction/ng-shared';
9
9
  import { RegisterClass, MJGlobal } from '@memberjunction/global';
10
10
  import { DevToolsPrefs } from './dev-tools-prefs';
11
11
  import * as i0 from "@angular/core";
12
- function ClassRegistryInspectorComponent_Conditional_45_Template(rf, ctx) { if (rf & 1) {
12
+ import * as i1 from "@memberjunction/ng-ui-components";
13
+ function ClassRegistryInspectorComponent_Conditional_33_Template(rf, ctx) { if (rf & 1) {
13
14
  const _r1 = i0.ɵɵgetCurrentView();
14
- i0.ɵɵelementStart(0, "button", 29);
15
- i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Conditional_45_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnSearchChange("")); });
16
- i0.ɵɵelement(1, "i", 30);
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);
17
18
  i0.ɵɵelementEnd();
18
19
  } }
19
- function ClassRegistryInspectorComponent_For_48_Conditional_8_Template(rf, ctx) { if (rf & 1) {
20
- i0.ɵɵelementStart(0, "span", 37);
20
+ function ClassRegistryInspectorComponent_For_36_Conditional_8_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵelementStart(0, "span", 31);
21
22
  i0.ɵɵtext(1);
22
23
  i0.ɵɵelementEnd();
23
24
  } if (rf & 2) {
@@ -25,13 +26,13 @@ function ClassRegistryInspectorComponent_For_48_Conditional_8_Template(rf, ctx)
25
26
  i0.ɵɵadvance();
26
27
  i0.ɵɵtextInterpolate1("", group_r4.uniqueKeys, " keys");
27
28
  } }
28
- function ClassRegistryInspectorComponent_For_48_Conditional_9_Template(rf, ctx) { if (rf & 1) {
29
- i0.ɵɵelementStart(0, "span", 38);
30
- i0.ɵɵelement(1, "i", 40);
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);
31
32
  i0.ɵɵtext(2, " overrides ");
32
33
  i0.ɵɵelementEnd();
33
34
  } }
34
- function ClassRegistryInspectorComponent_For_48_Conditional_10_For_12_Conditional_2_Template(rf, ctx) { if (rf & 1) {
35
+ function ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Conditional_2_Template(rf, ctx) { if (rf & 1) {
35
36
  i0.ɵɵelementStart(0, "code");
36
37
  i0.ɵɵtext(1);
37
38
  i0.ɵɵelementEnd();
@@ -40,34 +41,34 @@ function ClassRegistryInspectorComponent_For_48_Conditional_10_For_12_Conditiona
40
41
  i0.ɵɵadvance();
41
42
  i0.ɵɵtextInterpolate(reg_r5.Key);
42
43
  } }
43
- function ClassRegistryInspectorComponent_For_48_Conditional_10_For_12_Conditional_3_Template(rf, ctx) { if (rf & 1) {
44
- i0.ɵɵelementStart(0, "span", 47);
44
+ function ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Conditional_3_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelementStart(0, "span", 41);
45
46
  i0.ɵɵtext(1, "(no key)");
46
47
  i0.ɵɵelementEnd();
47
48
  } }
48
- function ClassRegistryInspectorComponent_For_48_Conditional_10_For_12_Conditional_9_Template(rf, ctx) { if (rf & 1) {
49
- i0.ɵɵelementStart(0, "span", 51);
50
- i0.ɵɵelement(1, "i", 53);
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);
51
52
  i0.ɵɵtext(2, " winner ");
52
53
  i0.ɵɵelementEnd();
53
54
  } }
54
- function ClassRegistryInspectorComponent_For_48_Conditional_10_For_12_Conditional_10_Template(rf, ctx) { if (rf & 1) {
55
- i0.ɵɵelementStart(0, "span", 52);
55
+ function ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Conditional_10_Template(rf, ctx) { if (rf & 1) {
56
+ i0.ɵɵelementStart(0, "span", 46);
56
57
  i0.ɵɵtext(1, " shadowed ");
57
58
  i0.ɵɵelementEnd();
58
59
  } }
59
- function ClassRegistryInspectorComponent_For_48_Conditional_10_For_12_Template(rf, ctx) { if (rf & 1) {
60
- i0.ɵɵelementStart(0, "tr")(1, "td", 46);
61
- i0.ɵɵconditionalCreate(2, ClassRegistryInspectorComponent_For_48_Conditional_10_For_12_Conditional_2_Template, 2, 1, "code")(3, ClassRegistryInspectorComponent_For_48_Conditional_10_For_12_Conditional_3_Template, 2, 0, "span", 47);
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);
62
63
  i0.ɵɵelementEnd();
63
- i0.ɵɵelementStart(4, "td", 48);
64
+ i0.ɵɵelementStart(4, "td", 42);
64
65
  i0.ɵɵtext(5);
65
66
  i0.ɵɵelementEnd();
66
- i0.ɵɵelementStart(6, "td", 49);
67
+ i0.ɵɵelementStart(6, "td", 43);
67
68
  i0.ɵɵtext(7);
68
69
  i0.ɵɵelementEnd();
69
- i0.ɵɵelementStart(8, "td", 50);
70
- i0.ɵɵconditionalCreate(9, ClassRegistryInspectorComponent_For_48_Conditional_10_For_12_Conditional_9_Template, 3, 0, "span", 51)(10, ClassRegistryInspectorComponent_For_48_Conditional_10_For_12_Conditional_10_Template, 2, 0, "span", 52);
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);
71
72
  i0.ɵɵelementEnd()();
72
73
  } if (rf & 2) {
73
74
  const reg_r5 = ctx.$implicit;
@@ -83,41 +84,41 @@ function ClassRegistryInspectorComponent_For_48_Conditional_10_For_12_Template(r
83
84
  i0.ɵɵadvance(2);
84
85
  i0.ɵɵconditional(ctx_r1.IsWinningRow(group_r4, reg_r5) ? 9 : ctx_r1.IsConflictRow(group_r4, reg_r5) ? 10 : -1);
85
86
  } }
86
- function ClassRegistryInspectorComponent_For_48_Conditional_10_Template(rf, ctx) { if (rf & 1) {
87
- i0.ɵɵelementStart(0, "table", 39)(1, "thead")(2, "tr")(3, "th", 41);
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);
88
89
  i0.ɵɵtext(4, "Key");
89
90
  i0.ɵɵelementEnd();
90
- i0.ɵɵelementStart(5, "th", 42);
91
+ i0.ɵɵelementStart(5, "th", 36);
91
92
  i0.ɵɵtext(6, "Subclass");
92
93
  i0.ɵɵelementEnd();
93
- i0.ɵɵelementStart(7, "th", 43);
94
+ i0.ɵɵelementStart(7, "th", 37);
94
95
  i0.ɵɵtext(8, "Priority");
95
96
  i0.ɵɵelementEnd();
96
- i0.ɵɵelement(9, "th", 44);
97
+ i0.ɵɵelement(9, "th", 38);
97
98
  i0.ɵɵelementEnd()();
98
99
  i0.ɵɵelementStart(10, "tbody");
99
- i0.ɵɵrepeaterCreate(11, ClassRegistryInspectorComponent_For_48_Conditional_10_For_12_Template, 11, 8, "tr", 45, i0.ɵɵcomponentInstance().TrackByReg, true);
100
+ i0.ɵɵrepeaterCreate(11, ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Template, 11, 8, "tr", 39, i0.ɵɵcomponentInstance().TrackByReg, true);
100
101
  i0.ɵɵelementEnd()();
101
102
  } if (rf & 2) {
102
103
  const group_r4 = i0.ɵɵnextContext().$implicit;
103
104
  i0.ɵɵadvance(11);
104
105
  i0.ɵɵrepeater(group_r4.registrations);
105
106
  } }
106
- function ClassRegistryInspectorComponent_For_48_Template(rf, ctx) { if (rf & 1) {
107
+ function ClassRegistryInspectorComponent_For_36_Template(rf, ctx) { if (rf & 1) {
107
108
  const _r3 = i0.ɵɵgetCurrentView();
108
- i0.ɵɵelementStart(0, "div", 31)(1, "button", 32);
109
- i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_For_48_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)); });
110
- i0.ɵɵelement(2, "i", 33);
111
- i0.ɵɵelementStart(3, "span", 34);
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);
112
113
  i0.ɵɵtext(4);
113
114
  i0.ɵɵelementEnd();
114
- i0.ɵɵelementStart(5, "span", 35)(6, "span", 36);
115
+ i0.ɵɵelementStart(5, "span", 29)(6, "span", 30);
115
116
  i0.ɵɵtext(7);
116
117
  i0.ɵɵelementEnd();
117
- i0.ɵɵconditionalCreate(8, ClassRegistryInspectorComponent_For_48_Conditional_8_Template, 2, 1, "span", 37);
118
- i0.ɵɵconditionalCreate(9, ClassRegistryInspectorComponent_For_48_Conditional_9_Template, 3, 0, "span", 38);
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);
119
120
  i0.ɵɵelementEnd()();
120
- i0.ɵɵconditionalCreate(10, ClassRegistryInspectorComponent_For_48_Conditional_10_Template, 13, 0, "table", 39);
121
+ i0.ɵɵconditionalCreate(10, ClassRegistryInspectorComponent_For_36_Conditional_10_Template, 13, 0, "table", 33);
121
122
  i0.ɵɵelementEnd();
122
123
  } if (rf & 2) {
123
124
  const group_r4 = ctx.$implicit;
@@ -135,9 +136,9 @@ function ClassRegistryInspectorComponent_For_48_Template(rf, ctx) { if (rf & 1)
135
136
  i0.ɵɵadvance();
136
137
  i0.ɵɵconditional(group_r4.expanded ? 10 : -1);
137
138
  } }
138
- function ClassRegistryInspectorComponent_Conditional_49_Template(rf, ctx) { if (rf & 1) {
139
- i0.ɵɵelementStart(0, "div", 27);
140
- i0.ɵɵelement(1, "i", 54);
139
+ function ClassRegistryInspectorComponent_Conditional_37_Template(rf, ctx) { if (rf & 1) {
140
+ i0.ɵɵelementStart(0, "div", 21);
141
+ i0.ɵɵelement(1, "i", 48);
141
142
  i0.ɵɵelementStart(2, "span");
142
143
  i0.ɵɵtext(3);
143
144
  i0.ɵɵelementEnd()();
@@ -318,75 +319,62 @@ let ClassRegistryInspectorComponent = class ClassRegistryInspectorComponent exte
318
319
  TrackByBase = (_i, g) => g.baseClassName;
319
320
  TrackByReg = (_i, r) => `${r.SubClass?.name ?? ''}|${r.Key ?? ''}|${r.Priority}`;
320
321
  static ɵfac = function ClassRegistryInspectorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ClassRegistryInspectorComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
321
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ClassRegistryInspectorComponent, selectors: [["mj-class-registry-inspector"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 52, vars: 17, consts: [[1, "mj-inspector", "mj-inspector--solo"], [1, "mj-inspector__header"], [1, "mj-inspector__header-icon"], [1, "fa-solid", "fa-cubes"], [1, "mj-inspector__header-title"], [1, "mj-inspector__header-sub"], [1, "mj-inspector__header-spacer"], [1, "mj-inspector__header-actions"], ["type", "button", "title", "Expand all groups", 1, "mj-inspector__btn", 3, "click"], [1, "fa-solid", "fa-expand"], ["type", "button", "title", "Collapse all groups", 1, "mj-inspector__btn", 3, "click"], [1, "fa-solid", "fa-compress"], ["type", "button", "title", "Re-scan registry", 1, "mj-inspector__btn", 3, "click"], [1, "fa-solid", "fa-rotate"], ["type", "button", 1, "mj-inspector__btn", 3, "click", "title"], [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
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
323
- i0.ɵɵelement(3, "i", 3);
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) {
323
+ i0.ɵɵelementStart(0, "div", 0)(1, "mj-page-header-interior", 1)(2, "div", 2)(3, "button", 3);
324
+ i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_3_listener() { return ctx.ExpandAll(); });
325
+ i0.ɵɵelement(4, "i", 4);
326
+ i0.ɵɵtext(5, " Expand ");
324
327
  i0.ɵɵelementEnd();
325
- i0.ɵɵelementStart(4, "div")(5, "h3", 4);
326
- i0.ɵɵtext(6, "Class Registry");
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 ");
327
332
  i0.ɵɵelementEnd();
328
- i0.ɵɵelementStart(7, "div", 5);
329
- i0.ɵɵtext(8, "Every class registered with ");
330
- i0.ɵɵelementStart(9, "code");
331
- i0.ɵɵtext(10, "@RegisterClass");
332
- i0.ɵɵelementEnd()()();
333
- i0.ɵɵelement(11, "span", 6);
334
- i0.ɵɵelementStart(12, "div", 7)(13, "button", 8);
335
- i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_13_listener() { return ctx.ExpandAll(); });
336
- i0.ɵɵelement(14, "i", 9);
337
- i0.ɵɵtext(15, " Expand ");
338
- i0.ɵɵelementEnd();
339
- i0.ɵɵelementStart(16, "button", 10);
340
- i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_16_listener() { return ctx.CollapseAll(); });
341
- i0.ɵɵelement(17, "i", 11);
342
- i0.ɵɵtext(18, " Collapse ");
343
- i0.ɵɵelementEnd();
344
- i0.ɵɵelementStart(19, "button", 12);
345
- i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_19_listener() { return ctx.refresh(); });
346
- i0.ɵɵelement(20, "i", 13);
347
- i0.ɵɵtext(21, " Refresh ");
333
+ i0.ɵɵelementStart(9, "mj-refresh-button", 7);
334
+ i0.ɵɵlistener("Clicked", function ClassRegistryInspectorComponent_Template_mj_refresh_button_Clicked_9_listener() { return ctx.refresh(); });
348
335
  i0.ɵɵelementEnd();
349
- i0.ɵɵelementStart(22, "button", 14);
350
- i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_22_listener() { return ctx.OnCopy(); });
351
- i0.ɵɵelement(23, "i", 15);
352
- i0.ɵɵtext(24);
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);
353
340
  i0.ɵɵelementEnd()()();
354
- i0.ɵɵelementStart(25, "div", 16)(26, "div", 17)(27, "div", 18);
355
- i0.ɵɵtext(28);
341
+ i0.ɵɵelementStart(13, "div", 10)(14, "div", 11)(15, "div", 12);
342
+ i0.ɵɵtext(16);
356
343
  i0.ɵɵelementEnd();
357
- i0.ɵɵelementStart(29, "div", 19);
358
- i0.ɵɵtext(30, "Total registrations");
344
+ i0.ɵɵelementStart(17, "div", 13);
345
+ i0.ɵɵtext(18, "Total registrations");
359
346
  i0.ɵɵelementEnd()();
360
- i0.ɵɵelementStart(31, "div", 17)(32, "div", 18);
361
- i0.ɵɵtext(33);
347
+ i0.ɵɵelementStart(19, "div", 11)(20, "div", 12);
348
+ i0.ɵɵtext(21);
362
349
  i0.ɵɵelementEnd();
363
- i0.ɵɵelementStart(34, "div", 19);
364
- i0.ɵɵtext(35, "Base classes");
350
+ i0.ɵɵelementStart(22, "div", 13);
351
+ i0.ɵɵtext(23, "Base classes");
365
352
  i0.ɵɵelementEnd()();
366
- i0.ɵɵelementStart(36, "div", 17)(37, "div", 18);
367
- i0.ɵɵtext(38);
353
+ i0.ɵɵelementStart(24, "div", 11)(25, "div", 12);
354
+ i0.ɵɵtext(26);
368
355
  i0.ɵɵelementEnd();
369
- i0.ɵɵelementStart(39, "div", 19);
370
- i0.ɵɵtext(40, "With overrides");
356
+ i0.ɵɵelementStart(27, "div", 13);
357
+ i0.ɵɵtext(28, "With overrides");
371
358
  i0.ɵɵelementEnd()();
372
- i0.ɵɵelementStart(41, "div", 20)(42, "div", 21);
373
- i0.ɵɵelement(43, "i", 22);
374
- i0.ɵɵelementStart(44, "input", 23);
375
- i0.ɵɵlistener("input", function ClassRegistryInspectorComponent_Template_input_input_44_listener($event) { return ctx.OnSearchChange($event.target.value); });
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); });
376
363
  i0.ɵɵelementEnd();
377
- i0.ɵɵconditionalCreate(45, ClassRegistryInspectorComponent_Conditional_45_Template, 2, 0, "button", 24);
364
+ i0.ɵɵconditionalCreate(33, ClassRegistryInspectorComponent_Conditional_33_Template, 2, 0, "button", 18);
378
365
  i0.ɵɵelementEnd()()();
379
- i0.ɵɵelementStart(46, "div", 25);
380
- i0.ɵɵrepeaterCreate(47, ClassRegistryInspectorComponent_For_48_Template, 11, 9, "div", 26, ctx.TrackByBase, true);
381
- i0.ɵɵconditionalCreate(49, ClassRegistryInspectorComponent_Conditional_49_Template, 4, 1, "div", 27);
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);
382
369
  i0.ɵɵelementEnd();
383
- i0.ɵɵelementStart(50, "div", 28);
384
- i0.ɵɵtext(51);
370
+ i0.ɵɵelementStart(38, "div", 22);
371
+ i0.ɵɵtext(39);
385
372
  i0.ɵɵelementEnd()();
386
373
  } if (rf & 2) {
387
- i0.ɵɵadvance(22);
388
- i0.ɵɵclassProp("mj-inspector__btn--success", ctx.CopyConfirmed);
389
- i0.ɵɵproperty("title", ctx.CopyConfirmed ? "Copied" : "Copy as JSON");
374
+ i0.ɵɵadvance(9);
375
+ i0.ɵɵproperty("Loading", false);
376
+ i0.ɵɵadvance();
377
+ i0.ɵɵproperty("variant", ctx.CopyConfirmed ? "success" : "secondary")("title", ctx.CopyConfirmed ? "Copied" : "Copy as JSON");
390
378
  i0.ɵɵadvance();
391
379
  i0.ɵɵclassProp("fa-clipboard", !ctx.CopyConfirmed)("fa-check", ctx.CopyConfirmed);
392
380
  i0.ɵɵadvance();
@@ -402,14 +390,14 @@ let ClassRegistryInspectorComponent = class ClassRegistryInspectorComponent exte
402
390
  i0.ɵɵadvance(6);
403
391
  i0.ɵɵproperty("value", ctx.SearchQuery);
404
392
  i0.ɵɵadvance();
405
- i0.ɵɵconditional(ctx.SearchQuery ? 45 : -1);
393
+ i0.ɵɵconditional(ctx.SearchQuery ? 33 : -1);
406
394
  i0.ɵɵadvance(2);
407
395
  i0.ɵɵrepeater(ctx.FilteredGroups);
408
396
  i0.ɵɵadvance(2);
409
- i0.ɵɵconditional(ctx.FilteredGroups.length === 0 ? 49 : -1);
397
+ i0.ɵɵconditional(ctx.FilteredGroups.length === 0 ? 37 : -1);
410
398
  i0.ɵɵadvance(2);
411
399
  i0.ɵɵtextInterpolate1("Refreshed ", ctx.LastRefreshedLabel);
412
- } }, styles: ["[_nghost-%COMP%] { display: block; height: 100%; }\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__header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n.mj-inspector__header-icon[_ngcontent-%COMP%] {\n width: 36px; height: 36px;\n border-radius: 9px;\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: white;\n display: flex; align-items: center; justify-content: center;\n font-size: 15px;\n flex-shrink: 0;\n}\n.mj-inspector__header-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n letter-spacing: -0.2px;\n}\n.mj-inspector__header-sub[_ngcontent-%COMP%] {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n.mj-inspector__header-spacer[_ngcontent-%COMP%] { flex: 1; }\n.mj-inspector__header-actions[_ngcontent-%COMP%] {\n display: flex; gap: 6px;\n}\n.mj-inspector__btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n border-radius: 7px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n font-family: inherit;\n transition: all 0.15s;\n}\n.mj-inspector__btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__btn--success[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-border-default));\n}\n\n\n\n.mj-inspector__body[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.mj-inspector__sidebar[_ngcontent-%COMP%] {\n width: 220px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n overflow-y: auto;\n flex-shrink: 0;\n padding: 8px;\n}\n.mj-inspector__nav-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n margin-bottom: 2px;\n font-family: inherit;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n text-align: left;\n width: 100%;\n}\n.mj-inspector__nav-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.mj-inspector__nav-item--active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__nav-item--active[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n.mj-inspector__nav-icon[_ngcontent-%COMP%] {\n width: 18px;\n text-align: center;\n font-size: 13px;\n margin-top: 1px;\n flex-shrink: 0;\n color: inherit;\n}\n.mj-inspector__nav-text[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n.mj-inspector__nav-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n}\n.mj-inspector__nav-desc[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 3px;\n line-height: 1.3;\n}\n.mj-inspector__nav-item--active[_ngcontent-%COMP%] .mj-inspector__nav-desc[_ngcontent-%COMP%] {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\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@media (max-width: 700px) {\n .mj-inspector__body[_ngcontent-%COMP%] { flex-direction: column; }\n .mj-inspector__sidebar[_ngcontent-%COMP%] {\n width: 100%;\n height: auto;\n max-height: 200px;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n }\n .mj-inspector__nav-item[_ngcontent-%COMP%] { flex: 1 1 calc(50% - 8px); margin-bottom: 0; }\n .mj-inspector__nav-desc[_ngcontent-%COMP%] { display: none; }\n .mj-inspector__header[_ngcontent-%COMP%] { padding: 12px 14px; gap: 10px; }\n}", "\n\n\n.mj-inspector--solo[_ngcontent-%COMP%] {\n background: var(--mj-bg-page);\n}\n.mj-inspector--solo[_ngcontent-%COMP%] .mj-inspector__header[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\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}"] });
400
+ } }, 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}"] });
413
401
  };
414
402
  ClassRegistryInspectorComponent = __decorate([
415
403
  RegisterClass(BaseResourceComponent, 'ClassRegistryInspector')
@@ -417,7 +405,7 @@ ClassRegistryInspectorComponent = __decorate([
417
405
  export { ClassRegistryInspectorComponent };
418
406
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ClassRegistryInspectorComponent, [{
419
407
  type: Component,
420
- args: [{ standalone: false, selector: 'mj-class-registry-inspector', template: "<div class=\"mj-inspector mj-inspector--solo\">\n <div class=\"mj-inspector__header\">\n <div class=\"mj-inspector__header-icon\"><i class=\"fa-solid fa-cubes\"></i></div>\n <div>\n <h3 class=\"mj-inspector__header-title\">Class Registry</h3>\n <div class=\"mj-inspector__header-sub\">Every class registered with <code>@RegisterClass</code></div>\n </div>\n <span class=\"mj-inspector__header-spacer\"></span>\n <div class=\"mj-inspector__header-actions\">\n <button class=\"mj-inspector__btn\" type=\"button\" (click)=\"ExpandAll()\" title=\"Expand all groups\">\n <i class=\"fa-solid fa-expand\"></i> Expand\n </button>\n <button class=\"mj-inspector__btn\" type=\"button\" (click)=\"CollapseAll()\" title=\"Collapse all groups\">\n <i class=\"fa-solid fa-compress\"></i> Collapse\n </button>\n <button class=\"mj-inspector__btn\" type=\"button\" (click)=\"refresh()\" title=\"Re-scan registry\">\n <i class=\"fa-solid fa-rotate\"></i> Refresh\n </button>\n <button class=\"mj-inspector__btn\"\n [class.mj-inspector__btn--success]=\"CopyConfirmed\"\n type=\"button\" (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy as JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\"></i>\n {{ CopyConfirmed ? 'Copied' : 'Copy' }}\n </button>\n </div>\n </div>\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.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/* Header */\n.mj-inspector__header {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n flex-shrink: 0;\n}\n.mj-inspector__header-icon {\n width: 36px; height: 36px;\n border-radius: 9px;\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: white;\n display: flex; align-items: center; justify-content: center;\n font-size: 15px;\n flex-shrink: 0;\n}\n.mj-inspector__header-title {\n margin: 0;\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n letter-spacing: -0.2px;\n}\n.mj-inspector__header-sub {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n}\n.mj-inspector__header-spacer { flex: 1; }\n.mj-inspector__header-actions {\n display: flex; gap: 6px;\n}\n.mj-inspector__btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n border-radius: 7px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n font-family: inherit;\n transition: all 0.15s;\n}\n.mj-inspector__btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__btn--success {\n color: var(--mj-status-success);\n border-color: color-mix(in srgb, var(--mj-status-success) 30%, var(--mj-border-default));\n}\n\n/* Layout: sidebar + content */\n.mj-inspector__body {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.mj-inspector__sidebar {\n width: 220px;\n border-right: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n overflow-y: auto;\n flex-shrink: 0;\n padding: 8px;\n}\n.mj-inspector__nav-item {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.12s;\n margin-bottom: 2px;\n font-family: inherit;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n text-align: left;\n width: 100%;\n}\n.mj-inspector__nav-item:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n.mj-inspector__nav-item--active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n}\n.mj-inspector__nav-item--active:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n.mj-inspector__nav-icon {\n width: 18px;\n text-align: center;\n font-size: 13px;\n margin-top: 1px;\n flex-shrink: 0;\n color: inherit;\n}\n.mj-inspector__nav-text { flex: 1; min-width: 0; }\n.mj-inspector__nav-label {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n}\n.mj-inspector__nav-desc {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 3px;\n line-height: 1.3;\n}\n.mj-inspector__nav-item--active .mj-inspector__nav-desc {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\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@media (max-width: 700px) {\n .mj-inspector__body { flex-direction: column; }\n .mj-inspector__sidebar {\n width: 100%;\n height: auto;\n max-height: 200px;\n border-right: none;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n }\n .mj-inspector__nav-item { flex: 1 1 calc(50% - 8px); margin-bottom: 0; }\n .mj-inspector__nav-desc { display: none; }\n .mj-inspector__header { padding: 12px 14px; gap: 10px; }\n}\n", "/* Class Registry Browser \u2014 overlays + extends inspector-shared.css */\n\n.mj-inspector--solo {\n background: var(--mj-bg-page);\n}\n.mj-inspector--solo .mj-inspector__header {\n background: var(--mj-bg-surface);\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"] }]
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"] }]
421
409
  }], () => [{ type: i0.ChangeDetectorRef }], null); })();
422
410
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ClassRegistryInspectorComponent, { className: "ClassRegistryInspectorComponent", filePath: "src/DevTools/class-registry.component.ts", lineNumber: 37 }); })();
423
411
  //# sourceMappingURL=class-registry.component.js.map