var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
import { Component } from '@angular/core';
import { BaseResourceComponent } from '@memberjunction/ng-shared';
import { RegisterClass, MJGlobal } from '@memberjunction/global';
import { DevToolsPrefs } from './dev-tools-prefs';
import { buildClassRegistryAgentContext } from './dev-tools-agent-context';
import { validateStringParam } from '../shared/agent-tool-validation';
import * as i0 from "@angular/core";
import * as i1 from "@memberjunction/ng-ui-components";
function ClassRegistryInspectorComponent_Conditional_36_Template(rf, ctx) { if (rf & 1) {
    const _r1 = i0.ɵɵgetCurrentView();
    i0.ɵɵelementStart(0, "button", 24);
    i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Conditional_36_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnSearchChange("")); });
    i0.ɵɵelement(1, "i", 25);
    i0.ɵɵelementEnd();
} }
function ClassRegistryInspectorComponent_For_39_ng_template_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "span", 32);
    i0.ɵɵtext(1);
    i0.ɵɵelementEnd();
} if (rf & 2) {
    const group_r4 = i0.ɵɵnextContext(2).$implicit;
    i0.ɵɵadvance();
    i0.ɵɵtextInterpolate1("", group_r4.uniqueKeys, " keys");
} }
function ClassRegistryInspectorComponent_For_39_ng_template_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "span", 33);
    i0.ɵɵelement(1, "i", 34);
    i0.ɵɵtext(2, " overrides ");
    i0.ɵɵelementEnd();
} }
function ClassRegistryInspectorComponent_For_39_ng_template_1_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "span", 29);
    i0.ɵɵtext(1);
    i0.ɵɵelementEnd();
    i0.ɵɵelementStart(2, "span", 30)(3, "span", 31);
    i0.ɵɵtext(4);
    i0.ɵɵelementEnd();
    i0.ɵɵconditionalCreate(5, ClassRegistryInspectorComponent_For_39_ng_template_1_Conditional_5_Template, 2, 1, "span", 32);
    i0.ɵɵconditionalCreate(6, ClassRegistryInspectorComponent_For_39_ng_template_1_Conditional_6_Template, 3, 0, "span", 33);
    i0.ɵɵelementEnd();
} if (rf & 2) {
    const group_r4 = i0.ɵɵnextContext().$implicit;
    i0.ɵɵadvance();
    i0.ɵɵtextInterpolate(group_r4.baseClassName);
    i0.ɵɵadvance(3);
    i0.ɵɵtextInterpolate(group_r4.count);
    i0.ɵɵadvance();
    i0.ɵɵconditional(group_r4.uniqueKeys !== group_r4.count ? 5 : -1);
    i0.ɵɵadvance();
    i0.ɵɵconditional(group_r4.hasOverrides ? 6 : -1);
} }
function ClassRegistryInspectorComponent_For_39_ng_template_2_For_12_Conditional_2_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "code");
    i0.ɵɵtext(1);
    i0.ɵɵelementEnd();
} if (rf & 2) {
    const reg_r5 = i0.ɵɵnextContext().$implicit;
    i0.ɵɵadvance();
    i0.ɵɵtextInterpolate(reg_r5.Key);
} }
function ClassRegistryInspectorComponent_For_39_ng_template_2_For_12_Conditional_3_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "span", 42);
    i0.ɵɵtext(1, "(no key)");
    i0.ɵɵelementEnd();
} }
function ClassRegistryInspectorComponent_For_39_ng_template_2_For_12_Conditional_9_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "span", 46);
    i0.ɵɵelement(1, "i", 48);
    i0.ɵɵtext(2, " winner ");
    i0.ɵɵelementEnd();
} }
function ClassRegistryInspectorComponent_For_39_ng_template_2_For_12_Conditional_10_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "span", 47);
    i0.ɵɵtext(1, " shadowed ");
    i0.ɵɵelementEnd();
} }
function ClassRegistryInspectorComponent_For_39_ng_template_2_For_12_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "tr")(1, "td", 41);
    i0.ɵɵconditionalCreate(2, ClassRegistryInspectorComponent_For_39_ng_template_2_For_12_Conditional_2_Template, 2, 1, "code")(3, ClassRegistryInspectorComponent_For_39_ng_template_2_For_12_Conditional_3_Template, 2, 0, "span", 42);
    i0.ɵɵelementEnd();
    i0.ɵɵelementStart(4, "td", 43);
    i0.ɵɵtext(5);
    i0.ɵɵelementEnd();
    i0.ɵɵelementStart(6, "td", 44);
    i0.ɵɵtext(7);
    i0.ɵɵelementEnd();
    i0.ɵɵelementStart(8, "td", 45);
    i0.ɵɵconditionalCreate(9, ClassRegistryInspectorComponent_For_39_ng_template_2_For_12_Conditional_9_Template, 3, 0, "span", 46)(10, ClassRegistryInspectorComponent_For_39_ng_template_2_For_12_Conditional_10_Template, 2, 0, "span", 47);
    i0.ɵɵelementEnd()();
} if (rf & 2) {
    const reg_r5 = ctx.$implicit;
    const group_r4 = i0.ɵɵnextContext(2).$implicit;
    const ctx_r1 = i0.ɵɵnextContext();
    i0.ɵɵclassProp("cr-row--conflict", ctx_r1.IsConflictRow(group_r4, reg_r5))("cr-row--winning", ctx_r1.IsWinningRow(group_r4, reg_r5));
    i0.ɵɵadvance(2);
    i0.ɵɵconditional(reg_r5.Key ? 2 : 3);
    i0.ɵɵadvance(3);
    i0.ɵɵtextInterpolate(reg_r5.SubClass.name || "(anonymous)");
    i0.ɵɵadvance(2);
    i0.ɵɵtextInterpolate(reg_r5.Priority);
    i0.ɵɵadvance(2);
    i0.ɵɵconditional(ctx_r1.IsWinningRow(group_r4, reg_r5) ? 9 : ctx_r1.IsConflictRow(group_r4, reg_r5) ? 10 : -1);
} }
function ClassRegistryInspectorComponent_For_39_ng_template_2_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelementStart(0, "table", 35)(1, "thead")(2, "tr")(3, "th", 36);
    i0.ɵɵtext(4, "Key");
    i0.ɵɵelementEnd();
    i0.ɵɵelementStart(5, "th", 37);
    i0.ɵɵtext(6, "Subclass");
    i0.ɵɵelementEnd();
    i0.ɵɵelementStart(7, "th", 38);
    i0.ɵɵtext(8, "Priority");
    i0.ɵɵelementEnd();
    i0.ɵɵelement(9, "th", 39);
    i0.ɵɵelementEnd()();
    i0.ɵɵelementStart(10, "tbody");
    i0.ɵɵrepeaterCreate(11, ClassRegistryInspectorComponent_For_39_ng_template_2_For_12_Template, 11, 8, "tr", 40, i0.ɵɵcomponentInstance().TrackByReg, true);
    i0.ɵɵelementEnd()();
} if (rf & 2) {
    const group_r4 = i0.ɵɵnextContext().$implicit;
    i0.ɵɵadvance(11);
    i0.ɵɵrepeater(group_r4.registrations);
} }
function ClassRegistryInspectorComponent_For_39_Template(rf, ctx) { if (rf & 1) {
    const _r3 = i0.ɵɵgetCurrentView();
    i0.ɵɵelementStart(0, "mj-accordion-panel", 26);
    i0.ɵɵlistener("ExpandedChange", function ClassRegistryInspectorComponent_For_39_Template_mj_accordion_panel_ExpandedChange_0_listener($event) { const group_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnGroupExpandedChange(group_r4, $event)); });
    i0.ɵɵtemplate(1, ClassRegistryInspectorComponent_For_39_ng_template_1_Template, 7, 4, "ng-template", 27)(2, ClassRegistryInspectorComponent_For_39_ng_template_2_Template, 13, 0, "ng-template", 28);
    i0.ɵɵelementEnd();
} if (rf & 2) {
    const group_r4 = ctx.$implicit;
    i0.ɵɵproperty("FlushBody", true)("Expanded", group_r4.expanded);
} }
function ClassRegistryInspectorComponent_Conditional_40_Template(rf, ctx) { if (rf & 1) {
    i0.ɵɵelement(0, "mj-empty-state", 22);
} if (rf & 2) {
    const ctx_r1 = i0.ɵɵnextContext();
    i0.ɵɵproperty("Title", "No registrations match \u201C" + ctx_r1.SearchQuery + "\u201D");
} }
/**
 * Class Registry Browser — read-only inspector of every `@RegisterClass`
 * registration tracked by `MJGlobal.Instance.ClassFactory`. Groups by base
 * class, surfaces priority/override conflicts, supports search + copy.
 */
let ClassRegistryInspectorComponent = class ClassRegistryInspectorComponent extends BaseResourceComponent {
    cdr;
    Groups = [];
    Stats = { total: 0, baseClasses: 0, withOverrides: 0 };
    SearchQuery = '';
    CopyConfirmed = false;
    LastRefreshed = new Date();
    constructor(cdr) {
        super();
        this.cdr = cdr;
    }
    ngOnInit() {
        const prefs = DevToolsPrefs.Get('classRegistry');
        if (prefs?.search)
            this.SearchQuery = prefs.search;
        this.refresh();
        // Restore expansion after groups are built
        if (prefs?.expanded) {
            for (const g of this.Groups) {
                g.expanded = prefs.expanded.includes(g.baseClassName);
            }
        }
        this.NotifyLoadComplete();
    }
    ngAfterViewInit() {
        // Publish initial agent context + register the read-only client tools.
        // Re-emit happens on every search / filter change (OnSearchChange, the tools).
        this.publishAgentContext();
        this.registerAgentClientTools();
    }
    ngOnDestroy() {
        this.savePrefs();
        super.ngOnDestroy();
    }
    PersistPrefs() {
        this.savePrefs();
    }
    savePrefs() {
        DevToolsPrefs.Save('classRegistry', {
            search: this.SearchQuery,
            expanded: this.Groups.filter(g => g.expanded).map(g => g.baseClassName)
        });
    }
    async GetResourceDisplayName() { return 'Class Registry'; }
    async GetResourceIconClass() { return 'fa-solid fa-cubes'; }
    refresh() {
        const factory = MJGlobal.Instance.ClassFactory;
        const all = factory._registrations ?? [];
        // Group by base class name
        const byBase = new Map();
        for (const reg of all) {
            const baseName = reg.BaseClass?.name ?? '(unknown)';
            const arr = byBase.get(baseName) ?? [];
            arr.push(reg);
            byBase.set(baseName, arr);
        }
        // Build groups
        const groups = [];
        for (const [baseClassName, registrations] of byBase) {
            const keyCounts = new Map();
            for (const r of registrations) {
                const k = r.Key ?? '';
                keyCounts.set(k, (keyCounts.get(k) ?? 0) + 1);
            }
            let hasOverrides = false;
            for (const c of keyCounts.values()) {
                if (c > 1) {
                    hasOverrides = true;
                    break;
                }
            }
            groups.push({
                baseClassName,
                count: registrations.length,
                registrations: registrations.sort((a, b) => {
                    const ak = a.Key ?? '';
                    const bk = b.Key ?? '';
                    if (ak !== bk)
                        return ak.localeCompare(bk);
                    return b.Priority - a.Priority;
                }),
                expanded: false,
                uniqueKeys: keyCounts.size,
                hasOverrides
            });
        }
        this.Groups = groups.sort((a, b) => b.count - a.count);
        this.Stats = {
            total: all.length,
            baseClasses: byBase.size,
            withOverrides: groups.filter(g => g.hasOverrides).length
        };
        this.LastRefreshed = new Date();
        this.cdr.markForCheck();
    }
    OnGroupExpandedChange(group, expanded) {
        group.expanded = expanded;
        this.savePrefs();
    }
    ExpandAll() {
        for (const g of this.FilteredGroups)
            g.expanded = true;
        this.savePrefs();
    }
    CollapseAll() {
        for (const g of this.Groups)
            g.expanded = false;
        this.savePrefs();
    }
    OnSearchChange(value) {
        this.SearchQuery = value;
        this.savePrefs();
        this.publishAgentContext();
    }
    get FilteredGroups() {
        const q = this.SearchQuery.trim().toLowerCase();
        if (!q)
            return this.Groups;
        return this.Groups
            .map(g => ({
            ...g,
            expanded: true,
            registrations: g.registrations.filter(r => {
                const sub = r.SubClass?.name?.toLowerCase() ?? '';
                const key = r.Key?.toLowerCase() ?? '';
                return g.baseClassName.toLowerCase().includes(q) || sub.includes(q) || key.includes(q);
            })
        }))
            .filter(g => g.registrations.length > 0);
    }
    IsConflictRow(group, reg) {
        if (!group.hasOverrides)
            return false;
        const sameKey = group.registrations.filter(r => (r.Key ?? '') === (reg.Key ?? ''));
        return sameKey.length > 1;
    }
    IsWinningRow(group, reg) {
        const sameKey = group.registrations.filter(r => (r.Key ?? '') === (reg.Key ?? ''));
        if (sameKey.length === 1)
            return false;
        const max = Math.max(...sameKey.map(r => r.Priority));
        // If multiple share max priority, the LAST registered wins (matches ClassFactory behavior).
        const top = sameKey.filter(r => r.Priority === max);
        return top[top.length - 1] === reg;
    }
    async OnCopy() {
        const payload = {
            stats: this.Stats,
            groups: this.FilteredGroups.map(g => ({
                baseClass: g.baseClassName,
                count: g.count,
                registrations: g.registrations.map(r => ({
                    key: r.Key,
                    subClass: r.SubClass?.name ?? '(anonymous)',
                    priority: r.Priority
                }))
            }))
        };
        try {
            await navigator.clipboard.writeText(JSON.stringify(payload, null, 2));
            this.CopyConfirmed = true;
            this.cdr.markForCheck();
            setTimeout(() => { this.CopyConfirmed = false; this.cdr.markForCheck(); }, 1800);
        }
        catch {
            // clipboard unavailable
        }
    }
    get LastRefreshedLabel() {
        return this.LastRefreshed.toLocaleTimeString();
    }
    TrackByBase = (_i, g) => g.baseClassName;
    TrackByReg = (_i, r) => `${r.SubClass?.name ?? ''}|${r.Key ?? ''}|${r.Priority}`;
    // ========================================
    // AI AGENT CONTEXT & CLIENT TOOLS
    //
    // 🔒 SAFETY BOUNDARY — CLASSIFICATION: SAFE developer diagnostic.
    // The Class Registry is a read-only browser of the ClassFactory's
    // @RegisterClass registrations. The context reports registration counts and
    // the user's search/filter; the tools only search and filter that read-only
    // list. No tool reads or mutates application data or class registrations.
    // ========================================
    /**
     * The current base-class filter — non-empty only when the active search term
     * exactly matches a known base class name (the registry's only filter is the
     * search box). Lets the agent know the user has narrowed to one base class.
     */
    get activeBaseClassFilter() {
        const q = this.SearchQuery.trim();
        if (!q)
            return '';
        const match = this.Groups.find(g => g.baseClassName.toLowerCase() === q.toLowerCase());
        return match ? match.baseClassName : '';
    }
    /** Publish the current Class Registry browse state to the AI agent. */
    publishAgentContext() {
        const visible = this.FilteredGroups;
        const context = buildClassRegistryAgentContext({
            TotalClassCount: this.Stats.total,
            BaseClassCount: this.Stats.baseClasses,
            OverrideCount: this.Stats.withOverrides,
            SearchTerm: this.SearchQuery,
            FilterByBase: this.activeBaseClassFilter,
            VisibleGroupCount: visible.length,
            VisibleBaseClassNames: visible.map(g => g.baseClassName),
        });
        this.navigationService.SetAgentContext(this, context);
    }
    /**
     * Register the read-only client tools the AI agent can invoke against the
     * Class Registry: SearchClassRegistry, FilterByBaseClass, ClearClassRegistryFilters.
     */
    registerAgentClientTools() {
        this.navigationService.SetAgentClientTools(this, [
            {
                Name: 'SearchClassRegistry',
                Description: 'Search the class registry by base class, subclass, or key. Pass an empty string to clear the search.',
                ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },
                Handler: async (params) => this.toolSearch(params),
            },
            {
                Name: 'FilterByBaseClass',
                Description: 'Narrow the registry to a single base class by its exact name (e.g. "BaseEntity").',
                ParameterSchema: { type: 'object', properties: { baseClass: { type: 'string' } }, required: ['baseClass'] },
                Handler: async (params) => this.toolFilterByBaseClass(params),
            },
            {
                Name: 'ClearClassRegistryFilters',
                Description: 'Clear the class registry search / filter so all registrations are shown.',
                ParameterSchema: { type: 'object', properties: {} },
                Handler: async () => {
                    this.OnSearchChange('');
                    this.cdr.markForCheck();
                    return { Success: true };
                },
            },
        ]);
    }
    /** Apply (or clear, on empty string) the registry search query. */
    toolSearch(params) {
        const validated = validateStringParam(params['query'], 'query');
        if (!validated.ok) {
            return validated.result;
        }
        this.OnSearchChange(validated.value);
        this.cdr.markForCheck();
        return { Success: true };
    }
    /** Narrow to a single base class by exact name (case-insensitive). */
    toolFilterByBaseClass(params) {
        const validated = validateStringParam(params['baseClass'], 'baseClass');
        if (!validated.ok) {
            return validated.result;
        }
        const name = validated.value.trim();
        if (name.length === 0) {
            return { Success: false, ErrorMessage: 'baseClass must be a non-empty class name.' };
        }
        const match = this.Groups.find(g => g.baseClassName.toLowerCase() === name.toLowerCase());
        if (!match) {
            return { Success: false, ErrorMessage: `No base class named "${name}" is registered.` };
        }
        this.OnSearchChange(match.baseClassName);
        this.cdr.markForCheck();
        return { Success: true };
    }
    static ɵfac = function ClassRegistryInspectorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ClassRegistryInspectorComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
    static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ClassRegistryInspectorComponent, selectors: [["mj-class-registry-inspector"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 43, vars: 17, consts: [[1, "mj-inspector", "mj-inspector--solo"], ["Role", "region", "AriaLabel", "Class registry inspector", "Title", "Class Registry", "Subtitle", "Every class registered with @RegisterClass"], ["actions", ""], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Expand all groups", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-expand"], [1, "mj-action-label"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Collapse all groups", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-compress"], [3, "Clicked", "Loading"], ["mjButton", "", "size", "sm", 3, "click", "variant", "title"], ["aria-hidden", "true", 1, "fa-solid"], [1, "cr-stats-row"], [1, "cr-stat"], [1, "cr-stat__value"], [1, "cr-stat__label"], [1, "cr-stat", "cr-stat--inline"], [1, "cr-search-wrap"], [1, "fa-solid", "fa-search", "cr-search-icon"], ["type", "search", "placeholder", "Search base class, subclass, or key\u2026", 1, "cr-search", 3, "input", "value"], ["title", "Clear", 1, "cr-search-clear"], [1, "cr-groups"], ["Size", "sm", 3, "FlushBody", "Expanded"], ["Variant", "no-results", "Icon", "fa-solid fa-magnifying-glass", 1, "cr-empty", 3, "Title"], [1, "mj-inspector__footer-meta"], ["title", "Clear", 1, "cr-search-clear", 3, "click"], [1, "fa-solid", "fa-xmark"], ["Size", "sm", 3, "ExpandedChange", "FlushBody", "Expanded"], ["mjAccordionTitle", ""], ["mjAccordionBody", ""], [1, "cr-group-name"], [1, "cr-group-meta"], [1, "mj-accordion-badge", "mj-accordion-badge--right"], [1, "mj-accordion-badge", "mj-accordion-badge--info"], [1, "mj-accordion-badge", "mj-accordion-badge--warning"], [1, "fa-solid", "fa-bolt"], [1, "cr-table"], [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"]], template: function ClassRegistryInspectorComponent_Template(rf, ctx) { if (rf & 1) {
            i0.ɵɵelementStart(0, "div", 0)(1, "mj-page-header-interior", 1)(2, "div", 2)(3, "button", 3);
            i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_3_listener() { return ctx.ExpandAll(); });
            i0.ɵɵelement(4, "i", 4);
            i0.ɵɵelementStart(5, "span", 5);
            i0.ɵɵtext(6, "Expand");
            i0.ɵɵelementEnd()();
            i0.ɵɵelementStart(7, "button", 6);
            i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_7_listener() { return ctx.CollapseAll(); });
            i0.ɵɵelement(8, "i", 7);
            i0.ɵɵelementStart(9, "span", 5);
            i0.ɵɵtext(10, "Collapse");
            i0.ɵɵelementEnd()();
            i0.ɵɵelementStart(11, "mj-refresh-button", 8);
            i0.ɵɵlistener("Clicked", function ClassRegistryInspectorComponent_Template_mj_refresh_button_Clicked_11_listener() { return ctx.refresh(); });
            i0.ɵɵelementEnd();
            i0.ɵɵelementStart(12, "button", 9);
            i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_12_listener() { return ctx.OnCopy(); });
            i0.ɵɵelement(13, "i", 10);
            i0.ɵɵelementStart(14, "span", 5);
            i0.ɵɵtext(15);
            i0.ɵɵelementEnd()()()();
            i0.ɵɵelementStart(16, "div", 11)(17, "div", 12)(18, "div", 13);
            i0.ɵɵtext(19);
            i0.ɵɵelementEnd();
            i0.ɵɵelementStart(20, "div", 14);
            i0.ɵɵtext(21, "Total registrations");
            i0.ɵɵelementEnd()();
            i0.ɵɵelementStart(22, "div", 12)(23, "div", 13);
            i0.ɵɵtext(24);
            i0.ɵɵelementEnd();
            i0.ɵɵelementStart(25, "div", 14);
            i0.ɵɵtext(26, "Base classes");
            i0.ɵɵelementEnd()();
            i0.ɵɵelementStart(27, "div", 12)(28, "div", 13);
            i0.ɵɵtext(29);
            i0.ɵɵelementEnd();
            i0.ɵɵelementStart(30, "div", 14);
            i0.ɵɵtext(31, "With overrides");
            i0.ɵɵelementEnd()();
            i0.ɵɵelementStart(32, "div", 15)(33, "div", 16);
            i0.ɵɵelement(34, "i", 17);
            i0.ɵɵelementStart(35, "input", 18);
            i0.ɵɵlistener("input", function ClassRegistryInspectorComponent_Template_input_input_35_listener($event) { return ctx.OnSearchChange($event.target.value); });
            i0.ɵɵelementEnd();
            i0.ɵɵconditionalCreate(36, ClassRegistryInspectorComponent_Conditional_36_Template, 2, 0, "button", 19);
            i0.ɵɵelementEnd()()();
            i0.ɵɵelementStart(37, "div", 20);
            i0.ɵɵrepeaterCreate(38, ClassRegistryInspectorComponent_For_39_Template, 3, 2, "mj-accordion-panel", 21, ctx.TrackByBase, true);
            i0.ɵɵconditionalCreate(40, ClassRegistryInspectorComponent_Conditional_40_Template, 1, 1, "mj-empty-state", 22);
            i0.ɵɵelementEnd();
            i0.ɵɵelementStart(41, "div", 23);
            i0.ɵɵtext(42);
            i0.ɵɵelementEnd()();
        } if (rf & 2) {
            i0.ɵɵadvance(11);
            i0.ɵɵproperty("Loading", false);
            i0.ɵɵadvance();
            i0.ɵɵproperty("variant", ctx.CopyConfirmed ? "success" : "secondary")("title", ctx.CopyConfirmed ? "Copied" : "Copy as JSON");
            i0.ɵɵadvance();
            i0.ɵɵclassProp("fa-clipboard", !ctx.CopyConfirmed)("fa-check", ctx.CopyConfirmed);
            i0.ɵɵadvance(2);
            i0.ɵɵtextInterpolate(ctx.CopyConfirmed ? "Copied" : "Copy");
            i0.ɵɵadvance(4);
            i0.ɵɵtextInterpolate(ctx.Stats.total);
            i0.ɵɵadvance(5);
            i0.ɵɵtextInterpolate(ctx.Stats.baseClasses);
            i0.ɵɵadvance(3);
            i0.ɵɵclassProp("cr-stat--warn", ctx.Stats.withOverrides > 0);
            i0.ɵɵadvance(2);
            i0.ɵɵtextInterpolate(ctx.Stats.withOverrides);
            i0.ɵɵadvance(6);
            i0.ɵɵproperty("value", ctx.SearchQuery);
            i0.ɵɵadvance();
            i0.ɵɵconditional(ctx.SearchQuery ? 36 : -1);
            i0.ɵɵadvance(2);
            i0.ɵɵrepeater(ctx.FilteredGroups);
            i0.ɵɵadvance(2);
            i0.ɵɵconditional(ctx.FilteredGroups.length === 0 ? 40 : -1);
            i0.ɵɵadvance(2);
            i0.ɵɵtextInterpolate1("Refreshed ", ctx.LastRefreshedLabel);
        } }, dependencies: [i1.MJButtonDirective, i1.MJPageHeaderInteriorComponent, i1.MJRefreshButtonComponent, i1.MJEmptyStateComponent, i1.MJAccordionPanelComponent, i1.MJAccordionTitleDirective, i1.MJAccordionBodyDirective], 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\n\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\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    width: 100%;\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}"] });
};
ClassRegistryInspectorComponent = __decorate([
    RegisterClass(BaseResourceComponent, 'ClassRegistryInspector')
], ClassRegistryInspectorComponent);
export { ClassRegistryInspectorComponent };
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ClassRegistryInspectorComponent, [{
        type: Component,
        args: [{ standalone: false, selector: 'mj-class-registry-inspector', template: "<div class=\"mj-inspector mj-inspector--solo\">\n    <mj-page-header-interior\n        Role=\"region\"\n        AriaLabel=\"Class registry inspector\"\n        Title=\"Class Registry\"\n        Subtitle=\"Every class registered with @RegisterClass\">\n        <div actions>\n            <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"ExpandAll()\" title=\"Expand all groups\">\n                <i class=\"fa-solid fa-expand\" aria-hidden=\"true\"></i> <span class=\"mj-action-label\">Expand</span>\n            </button>\n            <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"CollapseAll()\" title=\"Collapse all groups\">\n                <i class=\"fa-solid fa-compress\" aria-hidden=\"true\"></i> <span class=\"mj-action-label\">Collapse</span>\n            </button>\n            <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n            <button mjButton\n                    [variant]=\"CopyConfirmed ? 'success' : 'secondary'\"\n                    size=\"sm\"\n                    (click)=\"OnCopy()\"\n                    [title]=\"CopyConfirmed ? 'Copied' : 'Copy as JSON'\">\n                <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\" aria-hidden=\"true\"></i>\n                <span class=\"mj-action-label\">{{ CopyConfirmed ? 'Copied' : 'Copy' }}</span>\n            </button>\n        </div>\n    </mj-page-header-interior>\n\n    <div class=\"cr-stats-row\">\n        <div class=\"cr-stat\">\n            <div class=\"cr-stat__value\">{{ Stats.total }}</div>\n            <div class=\"cr-stat__label\">Total registrations</div>\n        </div>\n        <div class=\"cr-stat\">\n            <div class=\"cr-stat__value\">{{ Stats.baseClasses }}</div>\n            <div class=\"cr-stat__label\">Base classes</div>\n        </div>\n        <div class=\"cr-stat\" [class.cr-stat--warn]=\"Stats.withOverrides > 0\">\n            <div class=\"cr-stat__value\">{{ Stats.withOverrides }}</div>\n            <div class=\"cr-stat__label\">With overrides</div>\n        </div>\n        <div class=\"cr-stat cr-stat--inline\">\n            <div class=\"cr-search-wrap\">\n                <i class=\"fa-solid fa-search cr-search-icon\"></i>\n                <input type=\"search\"\n                       class=\"cr-search\"\n                       placeholder=\"Search base class, subclass, or key\u2026\"\n                       [value]=\"SearchQuery\"\n                       (input)=\"OnSearchChange($any($event.target).value)\" />\n                @if (SearchQuery) {\n                    <button class=\"cr-search-clear\" (click)=\"OnSearchChange('')\" title=\"Clear\">\n                        <i class=\"fa-solid fa-xmark\"></i>\n                    </button>\n                }\n            </div>\n        </div>\n    </div>\n\n    <div class=\"cr-groups\">\n        @for (group of FilteredGroups; track TrackByBase($index, group)) {\n            <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\"\n                [Expanded]=\"group.expanded\" (ExpandedChange)=\"OnGroupExpandedChange(group, $event)\">\n                <ng-template mjAccordionTitle>\n                    <span class=\"cr-group-name\">{{ group.baseClassName }}</span>\n                    <span class=\"cr-group-meta\">\n                        <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ group.count }}</span>\n                        @if (group.uniqueKeys !== group.count) {\n                            <span class=\"mj-accordion-badge mj-accordion-badge--info\">{{ group.uniqueKeys }} keys</span>\n                        }\n                        @if (group.hasOverrides) {\n                            <span class=\"mj-accordion-badge mj-accordion-badge--warning\">\n                                <i class=\"fa-solid fa-bolt\"></i> overrides\n                            </span>\n                        }\n                    </span>\n                </ng-template>\n                <ng-template mjAccordionBody>\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                </ng-template>\n            </mj-accordion-panel>\n        }\n        @if (FilteredGroups.length === 0) {\n            <mj-empty-state class=\"cr-empty\" Variant=\"no-results\" Icon=\"fa-solid fa-magnifying-glass\"\n                [Title]=\"'No registrations match \u201C' + SearchQuery + '\u201D'\" />\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 chrome (border / header / chevron) is now owned by <mj-accordion-panel>. */\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/* Count/keys/overrides pills migrated to <mj-accordion-badge> (--right / --info /\n   --warning). The bespoke .cr-pill* rules were removed. */\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    width: 100%;\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"] }]
    }], () => [{ type: i0.ChangeDetectorRef }], null); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ClassRegistryInspectorComponent, { className: "ClassRegistryInspectorComponent", filePath: "src/DevTools/class-registry.component.ts", lineNumber: 39 }); })();
//# sourceMappingURL=class-registry.component.js.map