@memberjunction/ng-versions 5.43.0 → 5.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/label-create/label-create.component.js +56 -59
- package/dist/lib/label-create/label-create.component.js.map +1 -1
- package/dist/lib/label-detail/label-detail.component.js +134 -150
- package/dist/lib/label-detail/label-detail.component.js.map +1 -1
- package/dist/lib/record-micro-view/record-micro-view.component.js +6 -7
- package/dist/lib/record-micro-view/record-micro-view.component.js.map +1 -1
- package/dist/lib/versions.module.d.ts +2 -1
- package/dist/lib/versions.module.d.ts.map +1 -1
- package/dist/lib/versions.module.js +10 -3
- package/dist/lib/versions.module.js.map +1 -1
- package/package.json +9 -7
- package/dist/__tests__/index.test.d.ts +0 -2
- package/dist/__tests__/index.test.d.ts.map +0 -1
- package/dist/__tests__/index.test.js +0 -7
- package/dist/__tests__/index.test.js.map +0 -1
- package/dist/__tests__/types.test.d.ts +0 -2
- package/dist/__tests__/types.test.d.ts.map +0 -1
- package/dist/__tests__/types.test.js +0 -57
- package/dist/__tests__/types.test.js.map +0 -1
|
@@ -8,7 +8,8 @@ import * as i0 from "@angular/core";
|
|
|
8
8
|
import * as i1 from "@angular/common";
|
|
9
9
|
import * as i2 from "@angular/forms";
|
|
10
10
|
import * as i3 from "@memberjunction/ng-shared-generic";
|
|
11
|
-
import * as i4 from "
|
|
11
|
+
import * as i4 from "@memberjunction/ng-ui-components";
|
|
12
|
+
import * as i5 from "../record-micro-view/record-micro-view.component";
|
|
12
13
|
const _c0 = a0 => ({ $implicit: a0 });
|
|
13
14
|
function MjLabelDetailComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
14
15
|
i0.ɵɵelementStart(0, "p", 12);
|
|
@@ -439,39 +440,55 @@ function MjLabelDetailComponent_Conditional_43_Conditional_3_Conditional_12_Temp
|
|
|
439
440
|
function MjLabelDetailComponent_Conditional_43_Conditional_3_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
440
441
|
i0.ɵɵelement(0, "i", 95);
|
|
441
442
|
} }
|
|
442
|
-
function
|
|
443
|
-
i0.ɵɵ
|
|
444
|
-
i0.ɵɵ
|
|
443
|
+
function MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_1_Template(rf, ctx) { if (rf & 1) {
|
|
444
|
+
i0.ɵɵelement(0, "i", 107);
|
|
445
|
+
i0.ɵɵelementStart(1, "span", 108);
|
|
446
|
+
i0.ɵɵtext(2);
|
|
447
|
+
i0.ɵɵelementEnd();
|
|
448
|
+
i0.ɵɵelementStart(3, "span", 109);
|
|
449
|
+
i0.ɵɵtext(4);
|
|
445
450
|
i0.ɵɵelementEnd();
|
|
451
|
+
} if (rf & 2) {
|
|
452
|
+
const group_r9 = i0.ɵɵnextContext().$implicit;
|
|
453
|
+
i0.ɵɵclassMap(group_r9.EntityIcon);
|
|
454
|
+
i0.ɵɵadvance(2);
|
|
455
|
+
i0.ɵɵtextInterpolate(group_r9.EntityName);
|
|
456
|
+
i0.ɵɵadvance(2);
|
|
457
|
+
i0.ɵɵtextInterpolate(group_r9.Items.length);
|
|
446
458
|
} }
|
|
447
|
-
function
|
|
459
|
+
function MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
460
|
+
i0.ɵɵelementStart(0, "div", 111);
|
|
461
|
+
i0.ɵɵelement(1, "mj-loading", 113);
|
|
462
|
+
i0.ɵɵelementEnd();
|
|
463
|
+
} }
|
|
464
|
+
function MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_2_Conditional_2_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
448
465
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
449
|
-
i0.ɵɵelementStart(0, "div",
|
|
450
|
-
i0.ɵɵlistener("click", function
|
|
451
|
-
i0.ɵɵelement(1, "i",
|
|
452
|
-
i0.ɵɵelementStart(2, "span",
|
|
466
|
+
i0.ɵɵelementStart(0, "div", 115);
|
|
467
|
+
i0.ɵɵlistener("click", function MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_2_Conditional_2_For_1_Template_div_click_0_listener() { const item_r11 = i0.ɵɵrestoreView(_r10).$implicit; const group_r9 = i0.ɵɵnextContext(3).$implicit; const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OpenMicroView(group_r9.EntityName, item_r11.RecordID, item_r11.RecordChangeID, item_r11.DisplayName)); });
|
|
468
|
+
i0.ɵɵelement(1, "i", 116);
|
|
469
|
+
i0.ɵɵelementStart(2, "span", 117);
|
|
453
470
|
i0.ɵɵtext(3);
|
|
454
471
|
i0.ɵɵelementEnd();
|
|
455
|
-
i0.ɵɵelement(4, "i",
|
|
472
|
+
i0.ɵɵelement(4, "i", 118);
|
|
456
473
|
i0.ɵɵelementEnd();
|
|
457
474
|
} if (rf & 2) {
|
|
458
475
|
const item_r11 = ctx.$implicit;
|
|
459
476
|
i0.ɵɵadvance(3);
|
|
460
477
|
i0.ɵɵtextInterpolate(item_r11.DisplayName);
|
|
461
478
|
} }
|
|
462
|
-
function
|
|
463
|
-
i0.ɵɵrepeaterCreate(0,
|
|
479
|
+
function MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
480
|
+
i0.ɵɵrepeaterCreate(0, MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_2_Conditional_2_For_1_Template, 5, 1, "div", 114, i0.ɵɵrepeaterTrackByIdentity);
|
|
464
481
|
} if (rf & 2) {
|
|
465
482
|
const group_r9 = i0.ɵɵnextContext(2).$implicit;
|
|
466
483
|
i0.ɵɵrepeater(group_r9.Items);
|
|
467
484
|
} }
|
|
468
|
-
function
|
|
485
|
+
function MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_2_Conditional_3_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
469
486
|
const _r12 = i0.ɵɵgetCurrentView();
|
|
470
|
-
i0.ɵɵelementStart(0, "div",
|
|
471
|
-
i0.ɵɵlistener("click", function
|
|
472
|
-
i0.ɵɵelementStart(1, "div",
|
|
473
|
-
i0.ɵɵelement(2, "i",
|
|
474
|
-
i0.ɵɵelementStart(3, "span",
|
|
487
|
+
i0.ɵɵelementStart(0, "div", 120);
|
|
488
|
+
i0.ɵɵlistener("click", function MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_2_Conditional_3_For_2_Template_div_click_0_listener() { const item_r13 = i0.ɵɵrestoreView(_r12).$implicit; const group_r9 = i0.ɵɵnextContext(3).$implicit; const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OpenMicroView(group_r9.EntityName, item_r13.RecordID, item_r13.RecordChangeID, item_r13.DisplayName)); });
|
|
489
|
+
i0.ɵɵelementStart(1, "div", 121);
|
|
490
|
+
i0.ɵɵelement(2, "i", 122);
|
|
491
|
+
i0.ɵɵelementStart(3, "span", 123);
|
|
475
492
|
i0.ɵɵtext(4);
|
|
476
493
|
i0.ɵɵelementEnd()()();
|
|
477
494
|
} if (rf & 2) {
|
|
@@ -479,20 +496,20 @@ function MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_Conditional_
|
|
|
479
496
|
i0.ɵɵadvance(4);
|
|
480
497
|
i0.ɵɵtextInterpolate(item_r13.DisplayName);
|
|
481
498
|
} }
|
|
482
|
-
function
|
|
483
|
-
i0.ɵɵelementStart(0, "div",
|
|
484
|
-
i0.ɵɵrepeaterCreate(1,
|
|
499
|
+
function MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
500
|
+
i0.ɵɵelementStart(0, "div", 112);
|
|
501
|
+
i0.ɵɵrepeaterCreate(1, MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_2_Conditional_3_For_2_Template, 5, 1, "div", 119, i0.ɵɵrepeaterTrackByIdentity);
|
|
485
502
|
i0.ɵɵelementEnd();
|
|
486
503
|
} if (rf & 2) {
|
|
487
504
|
const group_r9 = i0.ɵɵnextContext(2).$implicit;
|
|
488
505
|
i0.ɵɵadvance();
|
|
489
506
|
i0.ɵɵrepeater(group_r9.Items);
|
|
490
507
|
} }
|
|
491
|
-
function
|
|
492
|
-
i0.ɵɵelementStart(0, "div",
|
|
493
|
-
i0.ɵɵconditionalCreate(1,
|
|
494
|
-
i0.ɵɵconditionalCreate(2,
|
|
495
|
-
i0.ɵɵconditionalCreate(3,
|
|
508
|
+
function MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_2_Template(rf, ctx) { if (rf & 1) {
|
|
509
|
+
i0.ɵɵelementStart(0, "div", 110);
|
|
510
|
+
i0.ɵɵconditionalCreate(1, MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_2_Conditional_1_Template, 2, 0, "div", 111);
|
|
511
|
+
i0.ɵɵconditionalCreate(2, MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_2_Conditional_2_Template, 2, 0);
|
|
512
|
+
i0.ɵɵconditionalCreate(3, MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_2_Conditional_3_Template, 3, 0, "div", 112);
|
|
496
513
|
i0.ɵɵelementEnd();
|
|
497
514
|
} if (rf & 2) {
|
|
498
515
|
const group_r9 = i0.ɵɵnextContext().$implicit;
|
|
@@ -506,35 +523,16 @@ function MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_Conditional_
|
|
|
506
523
|
} }
|
|
507
524
|
function MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_Template(rf, ctx) { if (rf & 1) {
|
|
508
525
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
509
|
-
i0.ɵɵelementStart(0, "
|
|
510
|
-
i0.ɵɵlistener("
|
|
511
|
-
i0.ɵɵ
|
|
512
|
-
i0.ɵɵelementStart(4, "span", 107);
|
|
513
|
-
i0.ɵɵtext(5);
|
|
514
|
-
i0.ɵɵelementStart(6, "span", 108);
|
|
515
|
-
i0.ɵɵtext(7);
|
|
516
|
-
i0.ɵɵelementEnd()()();
|
|
517
|
-
i0.ɵɵconditionalCreate(8, MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_Conditional_8_Template, 4, 3, "div", 109);
|
|
526
|
+
i0.ɵɵelementStart(0, "mj-accordion-panel", 104);
|
|
527
|
+
i0.ɵɵlistener("ExpandedChange", function MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_Template_mj_accordion_panel_ExpandedChange_0_listener() { const group_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.ToggleSnapshotGroup(group_r9)); });
|
|
528
|
+
i0.ɵɵtemplate(1, MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_1_Template, 5, 4, "ng-template", 105)(2, MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_ng_template_2_Template, 4, 3, "ng-template", 106);
|
|
518
529
|
i0.ɵɵelementEnd();
|
|
519
530
|
} if (rf & 2) {
|
|
520
531
|
const group_r9 = ctx.$implicit;
|
|
521
|
-
i0.ɵɵ
|
|
522
|
-
i0.ɵɵclassProp("expanded", group_r9.IsExpanded);
|
|
523
|
-
i0.ɵɵadvance();
|
|
524
|
-
i0.ɵɵclassMap(group_r9.EntityIcon);
|
|
525
|
-
i0.ɵɵadvance(2);
|
|
526
|
-
i0.ɵɵtextInterpolate1("", group_r9.EntityName, " ");
|
|
527
|
-
i0.ɵɵadvance(2);
|
|
528
|
-
i0.ɵɵtextInterpolate(group_r9.Items.length);
|
|
529
|
-
i0.ɵɵadvance();
|
|
530
|
-
i0.ɵɵconditional(group_r9.IsExpanded ? 8 : -1);
|
|
532
|
+
i0.ɵɵproperty("FlushBody", true)("Expanded", group_r9.IsExpanded);
|
|
531
533
|
} }
|
|
532
534
|
function MjLabelDetailComponent_Conditional_43_Conditional_3_Conditional_22_Template(rf, ctx) { if (rf & 1) {
|
|
533
|
-
i0.ɵɵ
|
|
534
|
-
i0.ɵɵelement(1, "i", 123);
|
|
535
|
-
i0.ɵɵelementStart(2, "p");
|
|
536
|
-
i0.ɵɵtext(3, "No snapshot items found.");
|
|
537
|
-
i0.ɵɵelementEnd()();
|
|
535
|
+
i0.ɵɵelement(0, "mj-empty-state", 103);
|
|
538
536
|
} }
|
|
539
537
|
function MjLabelDetailComponent_Conditional_43_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
540
538
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
@@ -564,9 +562,9 @@ function MjLabelDetailComponent_Conditional_43_Conditional_3_Template(rf, ctx) {
|
|
|
564
562
|
i0.ɵɵelement(18, "i", 100);
|
|
565
563
|
i0.ɵɵelementEnd()()();
|
|
566
564
|
i0.ɵɵelementStart(19, "div", 101);
|
|
567
|
-
i0.ɵɵrepeaterCreate(20, MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_Template,
|
|
565
|
+
i0.ɵɵrepeaterCreate(20, MjLabelDetailComponent_Conditional_43_Conditional_3_For_21_Template, 3, 2, "mj-accordion-panel", 102, i0.ɵɵrepeaterTrackByIdentity);
|
|
568
566
|
i0.ɵɵelementEnd();
|
|
569
|
-
i0.ɵɵconditionalCreate(22, MjLabelDetailComponent_Conditional_43_Conditional_3_Conditional_22_Template,
|
|
567
|
+
i0.ɵɵconditionalCreate(22, MjLabelDetailComponent_Conditional_43_Conditional_3_Conditional_22_Template, 1, 0, "mj-empty-state", 103);
|
|
570
568
|
i0.ɵɵelementEnd();
|
|
571
569
|
} if (rf & 2) {
|
|
572
570
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
@@ -604,7 +602,7 @@ function MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_2_Condi
|
|
|
604
602
|
i0.ɵɵelementContainer(0);
|
|
605
603
|
} }
|
|
606
604
|
function MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_2_Conditional_7_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
607
|
-
i0.ɵɵtemplate(0, MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_2_Conditional_7_For_1_ng_container_0_Template, 1, 0, "ng-container",
|
|
605
|
+
i0.ɵɵtemplate(0, MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_2_Conditional_7_For_1_ng_container_0_Template, 1, 0, "ng-container", 132);
|
|
608
606
|
} if (rf & 2) {
|
|
609
607
|
const node_r14 = ctx.$implicit;
|
|
610
608
|
i0.ɵɵnextContext(4);
|
|
@@ -618,21 +616,19 @@ function MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_2_Condi
|
|
|
618
616
|
i0.ɵɵrepeater(ctx_r0.DependencyTree);
|
|
619
617
|
} }
|
|
620
618
|
function MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
621
|
-
i0.ɵɵ
|
|
622
|
-
i0.ɵɵtext(2, "No dependent entities found.");
|
|
623
|
-
i0.ɵɵelementEnd()();
|
|
619
|
+
i0.ɵɵelement(0, "mj-empty-state", 131);
|
|
624
620
|
} }
|
|
625
621
|
function MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
626
|
-
i0.ɵɵelementStart(0, "div", 125)(1, "div",
|
|
627
|
-
i0.ɵɵelement(2, "i",
|
|
628
|
-
i0.ɵɵelementStart(3, "span",
|
|
622
|
+
i0.ɵɵelementStart(0, "div", 125)(1, "div", 127);
|
|
623
|
+
i0.ɵɵelement(2, "i", 128);
|
|
624
|
+
i0.ɵɵelementStart(3, "span", 129);
|
|
629
625
|
i0.ɵɵtext(4);
|
|
630
626
|
i0.ɵɵelementEnd();
|
|
631
|
-
i0.ɵɵelementStart(5, "span",
|
|
627
|
+
i0.ɵɵelementStart(5, "span", 130);
|
|
632
628
|
i0.ɵɵtext(6, "Root");
|
|
633
629
|
i0.ɵɵelementEnd()();
|
|
634
630
|
i0.ɵɵconditionalCreate(7, MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_2_Conditional_7_Template, 2, 0);
|
|
635
|
-
i0.ɵɵconditionalCreate(8, MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_2_Conditional_8_Template,
|
|
631
|
+
i0.ɵɵconditionalCreate(8, MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_2_Conditional_8_Template, 1, 0, "mj-empty-state", 131);
|
|
636
632
|
i0.ɵɵelementEnd();
|
|
637
633
|
} if (rf & 2) {
|
|
638
634
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
@@ -646,17 +642,13 @@ function MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_2_Templ
|
|
|
646
642
|
i0.ɵɵconditional(ctx_r0.DependencyTree.length === 0 ? 8 : -1);
|
|
647
643
|
} }
|
|
648
644
|
function MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
649
|
-
i0.ɵɵ
|
|
650
|
-
i0.ɵɵelement(1, "i", 132);
|
|
651
|
-
i0.ɵɵelementStart(2, "p");
|
|
652
|
-
i0.ɵɵtext(3, "No entity associated with this label.");
|
|
653
|
-
i0.ɵɵelementEnd()();
|
|
645
|
+
i0.ɵɵelement(0, "mj-empty-state", 126);
|
|
654
646
|
} }
|
|
655
647
|
function MjLabelDetailComponent_Conditional_43_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
656
648
|
i0.ɵɵelementStart(0, "div", 51);
|
|
657
649
|
i0.ɵɵconditionalCreate(1, MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_1_Template, 1, 0, "mj-loading", 124);
|
|
658
650
|
i0.ɵɵconditionalCreate(2, MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_2_Template, 9, 5, "div", 125);
|
|
659
|
-
i0.ɵɵconditionalCreate(3, MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_3_Template,
|
|
651
|
+
i0.ɵɵconditionalCreate(3, MjLabelDetailComponent_Conditional_43_Conditional_4_Conditional_3_Template, 1, 0, "mj-empty-state", 126);
|
|
660
652
|
i0.ɵɵelementEnd();
|
|
661
653
|
} if (rf & 2) {
|
|
662
654
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
@@ -689,7 +681,7 @@ function MjLabelDetailComponent_Conditional_43_ng_template_5_Conditional_10_For_
|
|
|
689
681
|
i0.ɵɵelementContainer(0);
|
|
690
682
|
} }
|
|
691
683
|
function MjLabelDetailComponent_Conditional_43_ng_template_5_Conditional_10_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
692
|
-
i0.ɵɵtemplate(0, MjLabelDetailComponent_Conditional_43_ng_template_5_Conditional_10_For_1_ng_container_0_Template, 1, 0, "ng-container",
|
|
684
|
+
i0.ɵɵtemplate(0, MjLabelDetailComponent_Conditional_43_ng_template_5_Conditional_10_For_1_ng_container_0_Template, 1, 0, "ng-container", 132);
|
|
693
685
|
} if (rf & 2) {
|
|
694
686
|
const child_r18 = ctx.$implicit;
|
|
695
687
|
i0.ɵɵnextContext(3);
|
|
@@ -743,21 +735,38 @@ function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_1_Templ
|
|
|
743
735
|
} }
|
|
744
736
|
function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
745
737
|
const _r19 = i0.ɵɵgetCurrentView();
|
|
746
|
-
i0.ɵɵelementStart(0, "div", 148)(1, "button",
|
|
738
|
+
i0.ɵɵelementStart(0, "div", 148)(1, "button", 151);
|
|
747
739
|
i0.ɵɵlistener("click", function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_16_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r19); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.ExpandAllDiffGroups()); });
|
|
748
|
-
i0.ɵɵelement(2, "i",
|
|
740
|
+
i0.ɵɵelement(2, "i", 152);
|
|
749
741
|
i0.ɵɵelementStart(3, "span");
|
|
750
742
|
i0.ɵɵtext(4, "Expand All");
|
|
751
743
|
i0.ɵɵelementEnd()();
|
|
752
|
-
i0.ɵɵelementStart(5, "button",
|
|
744
|
+
i0.ɵɵelementStart(5, "button", 153);
|
|
753
745
|
i0.ɵɵlistener("click", function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_16_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r19); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.CollapseAllDiffGroups()); });
|
|
754
|
-
i0.ɵɵelement(6, "i",
|
|
746
|
+
i0.ɵɵelement(6, "i", 154);
|
|
755
747
|
i0.ɵɵelementStart(7, "span");
|
|
756
748
|
i0.ɵɵtext(8, "Collapse All");
|
|
757
749
|
i0.ɵɵelementEnd()()();
|
|
758
750
|
} }
|
|
759
|
-
function
|
|
760
|
-
i0.ɵɵ
|
|
751
|
+
function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_1_Template(rf, ctx) { if (rf & 1) {
|
|
752
|
+
i0.ɵɵelement(0, "i", 155);
|
|
753
|
+
i0.ɵɵelementStart(1, "span", 156);
|
|
754
|
+
i0.ɵɵtext(2);
|
|
755
|
+
i0.ɵɵelementEnd();
|
|
756
|
+
i0.ɵɵelementStart(3, "span", 157);
|
|
757
|
+
i0.ɵɵtext(4);
|
|
758
|
+
i0.ɵɵelementEnd();
|
|
759
|
+
} if (rf & 2) {
|
|
760
|
+
const group_r21 = i0.ɵɵnextContext().$implicit;
|
|
761
|
+
const ctx_r0 = i0.ɵɵnextContext(5);
|
|
762
|
+
i0.ɵɵclassMap(ctx_r0.resolveEntityIconByName(group_r21.EntityName));
|
|
763
|
+
i0.ɵɵadvance(2);
|
|
764
|
+
i0.ɵɵtextInterpolate(group_r21.EntityName);
|
|
765
|
+
i0.ɵɵadvance(2);
|
|
766
|
+
i0.ɵɵtextInterpolate1(" ", group_r21.Records.length, " modified ");
|
|
767
|
+
} }
|
|
768
|
+
function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_2_For_2_Conditional_6_For_2_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
769
|
+
i0.ɵɵelementStart(0, "span", 166);
|
|
761
770
|
i0.ɵɵtext(1);
|
|
762
771
|
i0.ɵɵpipe(2, "slice");
|
|
763
772
|
i0.ɵɵelementEnd();
|
|
@@ -766,11 +775,11 @@ function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Condi
|
|
|
766
775
|
i0.ɵɵadvance();
|
|
767
776
|
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind3(2, 1, field_r22.OldValue, 0, 40));
|
|
768
777
|
} }
|
|
769
|
-
function
|
|
770
|
-
i0.ɵɵelement(0, "i",
|
|
778
|
+
function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_2_For_2_Conditional_6_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
779
|
+
i0.ɵɵelement(0, "i", 167);
|
|
771
780
|
} }
|
|
772
|
-
function
|
|
773
|
-
i0.ɵɵelementStart(0, "span",
|
|
781
|
+
function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_2_For_2_Conditional_6_For_2_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
782
|
+
i0.ɵɵelementStart(0, "span", 168);
|
|
774
783
|
i0.ɵɵtext(1);
|
|
775
784
|
i0.ɵɵpipe(2, "slice");
|
|
776
785
|
i0.ɵɵelementEnd();
|
|
@@ -779,13 +788,13 @@ function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Condi
|
|
|
779
788
|
i0.ɵɵadvance();
|
|
780
789
|
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind3(2, 1, field_r22.NewValue, 0, 40));
|
|
781
790
|
} }
|
|
782
|
-
function
|
|
783
|
-
i0.ɵɵelementStart(0, "div",
|
|
791
|
+
function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_2_For_2_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
792
|
+
i0.ɵɵelementStart(0, "div", 164)(1, "span", 165);
|
|
784
793
|
i0.ɵɵtext(2);
|
|
785
794
|
i0.ɵɵelementEnd();
|
|
786
|
-
i0.ɵɵconditionalCreate(3,
|
|
787
|
-
i0.ɵɵconditionalCreate(4,
|
|
788
|
-
i0.ɵɵconditionalCreate(5,
|
|
795
|
+
i0.ɵɵconditionalCreate(3, MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_2_For_2_Conditional_6_For_2_Conditional_3_Template, 3, 5, "span", 166);
|
|
796
|
+
i0.ɵɵconditionalCreate(4, MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_2_For_2_Conditional_6_For_2_Conditional_4_Template, 1, 0, "i", 167);
|
|
797
|
+
i0.ɵɵconditionalCreate(5, MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_2_For_2_Conditional_6_For_2_Conditional_5_Template, 3, 5, "span", 168);
|
|
789
798
|
i0.ɵɵelementEnd();
|
|
790
799
|
} if (rf & 2) {
|
|
791
800
|
const field_r22 = ctx.$implicit;
|
|
@@ -800,23 +809,23 @@ function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Condi
|
|
|
800
809
|
i0.ɵɵadvance();
|
|
801
810
|
i0.ɵɵconditional(field_r22.NewValue ? 5 : -1);
|
|
802
811
|
} }
|
|
803
|
-
function
|
|
804
|
-
i0.ɵɵelementStart(0, "div",
|
|
805
|
-
i0.ɵɵrepeaterCreate(1,
|
|
812
|
+
function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_2_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
813
|
+
i0.ɵɵelementStart(0, "div", 163);
|
|
814
|
+
i0.ɵɵrepeaterCreate(1, MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_2_For_2_Conditional_6_For_2_Template, 6, 5, "div", 164, i0.ɵɵrepeaterTrackByIdentity);
|
|
806
815
|
i0.ɵɵelementEnd();
|
|
807
816
|
} if (rf & 2) {
|
|
808
817
|
const record_r23 = i0.ɵɵnextContext().$implicit;
|
|
809
818
|
i0.ɵɵadvance();
|
|
810
819
|
i0.ɵɵrepeater(record_r23.FieldChanges);
|
|
811
820
|
} }
|
|
812
|
-
function
|
|
813
|
-
i0.ɵɵelementStart(0, "div",
|
|
814
|
-
i0.ɵɵelement(2, "i",
|
|
815
|
-
i0.ɵɵelementStart(3, "span",
|
|
821
|
+
function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_2_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
822
|
+
i0.ɵɵelementStart(0, "div", 159)(1, "div", 160);
|
|
823
|
+
i0.ɵɵelement(2, "i", 161);
|
|
824
|
+
i0.ɵɵelementStart(3, "span", 162);
|
|
816
825
|
i0.ɵɵtext(4);
|
|
817
826
|
i0.ɵɵpipe(5, "slice");
|
|
818
827
|
i0.ɵɵelementEnd()();
|
|
819
|
-
i0.ɵɵconditionalCreate(6,
|
|
828
|
+
i0.ɵɵconditionalCreate(6, MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_2_For_2_Conditional_6_Template, 3, 0, "div", 163);
|
|
820
829
|
i0.ɵɵelementEnd();
|
|
821
830
|
} if (rf & 2) {
|
|
822
831
|
const record_r23 = ctx.$implicit;
|
|
@@ -829,9 +838,9 @@ function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Condi
|
|
|
829
838
|
i0.ɵɵadvance(2);
|
|
830
839
|
i0.ɵɵconditional(record_r23.FieldChanges.length > 0 ? 6 : -1);
|
|
831
840
|
} }
|
|
832
|
-
function
|
|
833
|
-
i0.ɵɵelementStart(0, "div",
|
|
834
|
-
i0.ɵɵrepeaterCreate(1,
|
|
841
|
+
function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_2_Template(rf, ctx) { if (rf & 1) {
|
|
842
|
+
i0.ɵɵelementStart(0, "div", 158);
|
|
843
|
+
i0.ɵɵrepeaterCreate(1, MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_2_For_2_Template, 7, 9, "div", 159, i0.ɵɵrepeaterTrackByIdentity);
|
|
835
844
|
i0.ɵɵelementEnd();
|
|
836
845
|
} if (rf & 2) {
|
|
837
846
|
const group_r21 = i0.ɵɵnextContext().$implicit;
|
|
@@ -840,34 +849,17 @@ function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Condi
|
|
|
840
849
|
} }
|
|
841
850
|
function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
842
851
|
const _r20 = i0.ɵɵgetCurrentView();
|
|
843
|
-
i0.ɵɵelementStart(0, "
|
|
844
|
-
i0.ɵɵlistener("
|
|
845
|
-
i0.ɵɵ
|
|
846
|
-
i0.ɵɵelementStart(4, "span", 158);
|
|
847
|
-
i0.ɵɵtext(5);
|
|
848
|
-
i0.ɵɵelementEnd();
|
|
849
|
-
i0.ɵɵelementStart(6, "span", 159);
|
|
850
|
-
i0.ɵɵtext(7);
|
|
851
|
-
i0.ɵɵelementEnd()();
|
|
852
|
-
i0.ɵɵconditionalCreate(8, MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_Conditional_8_Template, 3, 0, "div", 160);
|
|
852
|
+
i0.ɵɵelementStart(0, "mj-accordion-panel", 104);
|
|
853
|
+
i0.ɵɵlistener("ExpandedChange", function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_Template_mj_accordion_panel_ExpandedChange_0_listener() { const group_r21 = i0.ɵɵrestoreView(_r20).$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.ToggleDiffGroup(group_r21)); });
|
|
854
|
+
i0.ɵɵtemplate(1, MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_1_Template, 5, 4, "ng-template", 105)(2, MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_ng_template_2_Template, 3, 0, "ng-template", 106);
|
|
853
855
|
i0.ɵɵelementEnd();
|
|
854
856
|
} if (rf & 2) {
|
|
855
857
|
const group_r21 = ctx.$implicit;
|
|
856
|
-
|
|
857
|
-
i0.ɵɵadvance(2);
|
|
858
|
-
i0.ɵɵclassProp("expanded", group_r21.IsExpanded);
|
|
859
|
-
i0.ɵɵadvance();
|
|
860
|
-
i0.ɵɵclassMap(ctx_r0.resolveEntityIconByName(group_r21.EntityName));
|
|
861
|
-
i0.ɵɵadvance(2);
|
|
862
|
-
i0.ɵɵtextInterpolate(group_r21.EntityName);
|
|
863
|
-
i0.ɵɵadvance(2);
|
|
864
|
-
i0.ɵɵtextInterpolate1(" ", group_r21.Records.length, " modified ");
|
|
865
|
-
i0.ɵɵadvance();
|
|
866
|
-
i0.ɵɵconditional(group_r21.IsExpanded ? 8 : -1);
|
|
858
|
+
i0.ɵɵproperty("FlushBody", true)("Expanded", group_r21.IsExpanded);
|
|
867
859
|
} }
|
|
868
860
|
function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
869
861
|
i0.ɵɵelementStart(0, "div", 149);
|
|
870
|
-
i0.ɵɵrepeaterCreate(1, MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_Template,
|
|
862
|
+
i0.ɵɵrepeaterCreate(1, MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_For_2_Template, 3, 2, "mj-accordion-panel", 102, i0.ɵɵrepeaterTrackByIdentity);
|
|
871
863
|
i0.ɵɵelementEnd();
|
|
872
864
|
} if (rf & 2) {
|
|
873
865
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
@@ -875,11 +867,7 @@ function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Condi
|
|
|
875
867
|
i0.ɵɵrepeater(ctx_r0.DiffResult.EntityGroups);
|
|
876
868
|
} }
|
|
877
869
|
function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
878
|
-
i0.ɵɵ
|
|
879
|
-
i0.ɵɵelement(1, "i", 171);
|
|
880
|
-
i0.ɵɵelementStart(2, "p");
|
|
881
|
-
i0.ɵɵtext(3, "No changes detected since this label was created.");
|
|
882
|
-
i0.ɵɵelementEnd()();
|
|
870
|
+
i0.ɵɵelement(0, "mj-empty-state", 150);
|
|
883
871
|
} }
|
|
884
872
|
function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
885
873
|
i0.ɵɵelementStart(0, "div", 143)(1, "div", 144)(2, "span", 145);
|
|
@@ -902,7 +890,7 @@ function MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Templ
|
|
|
902
890
|
i0.ɵɵelementEnd()()();
|
|
903
891
|
i0.ɵɵconditionalCreate(16, MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_16_Template, 9, 0, "div", 148);
|
|
904
892
|
i0.ɵɵconditionalCreate(17, MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_17_Template, 3, 0, "div", 149);
|
|
905
|
-
i0.ɵɵconditionalCreate(18, MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_18_Template,
|
|
893
|
+
i0.ɵɵconditionalCreate(18, MjLabelDetailComponent_Conditional_43_Conditional_7_Conditional_2_Conditional_18_Template, 1, 0, "mj-empty-state", 150);
|
|
906
894
|
} if (rf & 2) {
|
|
907
895
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
908
896
|
i0.ɵɵadvance(3);
|
|
@@ -931,7 +919,7 @@ function MjLabelDetailComponent_Conditional_43_Conditional_7_Template(rf, ctx) {
|
|
|
931
919
|
i0.ɵɵconditional(!ctx_r0.IsLoadingDiff && ctx_r0.DiffResult ? 2 : -1);
|
|
932
920
|
} }
|
|
933
921
|
function MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
934
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
922
|
+
i0.ɵɵelement(0, "mj-loading", 169);
|
|
935
923
|
} }
|
|
936
924
|
function MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Conditional_0_For_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
937
925
|
i0.ɵɵelementStart(0, "span");
|
|
@@ -943,17 +931,17 @@ function MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Condi
|
|
|
943
931
|
i0.ɵɵtextInterpolate1(" \u00B7 ", restore_r24.FailedItems, " failed");
|
|
944
932
|
} }
|
|
945
933
|
function MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Conditional_0_For_6_Template(rf, ctx) { if (rf & 1) {
|
|
946
|
-
i0.ɵɵelementStart(0, "div",
|
|
947
|
-
i0.ɵɵelement(2, "i",
|
|
934
|
+
i0.ɵɵelementStart(0, "div", 173)(1, "div", 174);
|
|
935
|
+
i0.ɵɵelement(2, "i", 175);
|
|
948
936
|
i0.ɵɵelementEnd();
|
|
949
|
-
i0.ɵɵelementStart(3, "div",
|
|
937
|
+
i0.ɵɵelementStart(3, "div", 176)(4, "span", 177);
|
|
950
938
|
i0.ɵɵtext(5);
|
|
951
939
|
i0.ɵɵelementEnd();
|
|
952
|
-
i0.ɵɵelementStart(6, "span",
|
|
940
|
+
i0.ɵɵelementStart(6, "span", 178);
|
|
953
941
|
i0.ɵɵtext(7);
|
|
954
942
|
i0.ɵɵconditionalCreate(8, MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Conditional_0_For_6_Conditional_8_Template, 2, 1, "span");
|
|
955
943
|
i0.ɵɵelementEnd()();
|
|
956
|
-
i0.ɵɵelementStart(9, "span",
|
|
944
|
+
i0.ɵɵelementStart(9, "span", 179);
|
|
957
945
|
i0.ɵɵtext(10);
|
|
958
946
|
i0.ɵɵelementEnd()();
|
|
959
947
|
} if (rf & 2) {
|
|
@@ -972,11 +960,11 @@ function MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Condi
|
|
|
972
960
|
} }
|
|
973
961
|
function MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
974
962
|
i0.ɵɵelementStart(0, "div", 52)(1, "h3", 53);
|
|
975
|
-
i0.ɵɵelement(2, "i",
|
|
963
|
+
i0.ɵɵelement(2, "i", 171);
|
|
976
964
|
i0.ɵɵtext(3, " Restore Operations ");
|
|
977
965
|
i0.ɵɵelementEnd();
|
|
978
|
-
i0.ɵɵelementStart(4, "div",
|
|
979
|
-
i0.ɵɵrepeaterCreate(5, MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Conditional_0_For_6_Template, 11, 6, "div",
|
|
966
|
+
i0.ɵɵelementStart(4, "div", 172);
|
|
967
|
+
i0.ɵɵrepeaterCreate(5, MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Conditional_0_For_6_Template, 11, 6, "div", 173, i0.ɵɵrepeaterTrackByIdentity);
|
|
980
968
|
i0.ɵɵelementEnd()();
|
|
981
969
|
} if (rf & 2) {
|
|
982
970
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
@@ -984,16 +972,16 @@ function MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Condi
|
|
|
984
972
|
i0.ɵɵrepeater(ctx_r0.Restores);
|
|
985
973
|
} }
|
|
986
974
|
function MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Conditional_1_For_6_Template(rf, ctx) { if (rf & 1) {
|
|
987
|
-
i0.ɵɵelementStart(0, "div",
|
|
988
|
-
i0.ɵɵelement(2, "i",
|
|
975
|
+
i0.ɵɵelementStart(0, "div", 173)(1, "div", 181);
|
|
976
|
+
i0.ɵɵelement(2, "i", 182);
|
|
989
977
|
i0.ɵɵelementEnd();
|
|
990
|
-
i0.ɵɵelementStart(3, "div",
|
|
978
|
+
i0.ɵɵelementStart(3, "div", 176)(4, "span", 177);
|
|
991
979
|
i0.ɵɵtext(5);
|
|
992
980
|
i0.ɵɵelementEnd();
|
|
993
|
-
i0.ɵɵelementStart(6, "span",
|
|
981
|
+
i0.ɵɵelementStart(6, "span", 178)(7, "span", 183);
|
|
994
982
|
i0.ɵɵtext(8);
|
|
995
983
|
i0.ɵɵelementEnd()()();
|
|
996
|
-
i0.ɵɵelementStart(9, "span",
|
|
984
|
+
i0.ɵɵelementStart(9, "span", 179);
|
|
997
985
|
i0.ɵɵtext(10);
|
|
998
986
|
i0.ɵɵelementEnd()();
|
|
999
987
|
} if (rf & 2) {
|
|
@@ -1010,11 +998,11 @@ function MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Condi
|
|
|
1010
998
|
} }
|
|
1011
999
|
function MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
1012
1000
|
i0.ɵɵelementStart(0, "div", 52)(1, "h3", 53);
|
|
1013
|
-
i0.ɵɵelement(2, "i",
|
|
1001
|
+
i0.ɵɵelement(2, "i", 180);
|
|
1014
1002
|
i0.ɵɵtext(3, " Related Labels ");
|
|
1015
1003
|
i0.ɵɵelementEnd();
|
|
1016
|
-
i0.ɵɵelementStart(4, "div",
|
|
1017
|
-
i0.ɵɵrepeaterCreate(5, MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Conditional_1_For_6_Template, 11, 4, "div",
|
|
1004
|
+
i0.ɵɵelementStart(4, "div", 172);
|
|
1005
|
+
i0.ɵɵrepeaterCreate(5, MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Conditional_1_For_6_Template, 11, 4, "div", 173, i0.ɵɵrepeaterTrackByIdentity);
|
|
1018
1006
|
i0.ɵɵelementEnd()();
|
|
1019
1007
|
} if (rf & 2) {
|
|
1020
1008
|
const ctx_r0 = i0.ɵɵnextContext(4);
|
|
@@ -1022,16 +1010,12 @@ function MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Condi
|
|
|
1022
1010
|
i0.ɵɵrepeater(ctx_r0.RelatedLabels);
|
|
1023
1011
|
} }
|
|
1024
1012
|
function MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1025
|
-
i0.ɵɵ
|
|
1026
|
-
i0.ɵɵelement(1, "i", 186);
|
|
1027
|
-
i0.ɵɵelementStart(2, "p");
|
|
1028
|
-
i0.ɵɵtext(3, "No restore history or related labels found.");
|
|
1029
|
-
i0.ɵɵelementEnd()();
|
|
1013
|
+
i0.ɵɵelement(0, "mj-empty-state", 170);
|
|
1030
1014
|
} }
|
|
1031
1015
|
function MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1032
1016
|
i0.ɵɵconditionalCreate(0, MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Conditional_0_Template, 7, 0, "div", 52);
|
|
1033
1017
|
i0.ɵɵconditionalCreate(1, MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Conditional_1_Template, 7, 0, "div", 52);
|
|
1034
|
-
i0.ɵɵconditionalCreate(2, MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Conditional_2_Template,
|
|
1018
|
+
i0.ɵɵconditionalCreate(2, MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Conditional_2_Template, 1, 0, "mj-empty-state", 170);
|
|
1035
1019
|
} if (rf & 2) {
|
|
1036
1020
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
1037
1021
|
i0.ɵɵconditional(ctx_r0.Restores.length > 0 ? 0 : -1);
|
|
@@ -1042,7 +1026,7 @@ function MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Templ
|
|
|
1042
1026
|
} }
|
|
1043
1027
|
function MjLabelDetailComponent_Conditional_43_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
1044
1028
|
i0.ɵɵelementStart(0, "div", 51);
|
|
1045
|
-
i0.ɵɵconditionalCreate(1, MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_1_Template, 1, 0, "mj-loading",
|
|
1029
|
+
i0.ɵɵconditionalCreate(1, MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_1_Template, 1, 0, "mj-loading", 169);
|
|
1046
1030
|
i0.ɵɵconditionalCreate(2, MjLabelDetailComponent_Conditional_43_Conditional_8_Conditional_2_Template, 3, 3);
|
|
1047
1031
|
i0.ɵɵelementEnd();
|
|
1048
1032
|
} if (rf & 2) {
|
|
@@ -1079,7 +1063,7 @@ function MjLabelDetailComponent_Conditional_43_Template(rf, ctx) { if (rf & 1) {
|
|
|
1079
1063
|
} }
|
|
1080
1064
|
function MjLabelDetailComponent_Conditional_44_Template(rf, ctx) { if (rf & 1) {
|
|
1081
1065
|
const _r26 = i0.ɵɵgetCurrentView();
|
|
1082
|
-
i0.ɵɵelementStart(0, "div", 30)(1, "mj-record-micro-view",
|
|
1066
|
+
i0.ɵɵelementStart(0, "div", 30)(1, "mj-record-micro-view", 184);
|
|
1083
1067
|
i0.ɵɵlistener("Close", function MjLabelDetailComponent_Conditional_44_Template_mj_record_micro_view_Close_1_listener() { i0.ɵɵrestoreView(_r26); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnBackFromMicroView()); })("EntityLinkClick", function MjLabelDetailComponent_Conditional_44_Template_mj_record_micro_view_EntityLinkClick_1_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnEntityLinkClick($event)); })("OpenRecord", function MjLabelDetailComponent_Conditional_44_Template_mj_record_micro_view_OpenRecord_1_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnOpenRecordClick($event)); });
|
|
1084
1068
|
i0.ɵɵelementEnd()();
|
|
1085
1069
|
} if (rf & 2) {
|
|
@@ -1977,7 +1961,7 @@ export class MjLabelDetailComponent extends BaseAngularComponent {
|
|
|
1977
1961
|
static ɵfac = function MjLabelDetailComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MjLabelDetailComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i0.ElementRef)); };
|
|
1978
1962
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjLabelDetailComponent, selectors: [["mj-label-detail-panel"]], hostBindings: function MjLabelDetailComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1979
1963
|
i0.ɵɵlistener("keydown.escape", function MjLabelDetailComponent_keydown_escape_HostBindingHandler() { return ctx.OnEscapeKey(); }, i0.ɵɵresolveDocument);
|
|
1980
|
-
} }, inputs: { Label: "Label", AllLabels: "AllLabels", ItemCountMap: "ItemCountMap" }, outputs: { Close: "Close", LabelUpdated: "LabelUpdated", EntityLinkClick: "EntityLinkClick" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 45, vars: 22, consts: [["depNode", ""], [1, "panel-backdrop", 3, "click"], [1, "detail-panel"], [1, "resize-handle", 3, "mousedown"], [1, "resize-handle-grip"], [1, "panel-header"], [1, "header-info"], [1, "header-title-row"], [1, "header-scope-icon"], [1, "header-title"], [1, "header-status", 3, "ngClass"], [1, "header-scope-badge"], [1, "header-description"], [1, "header-actions"], ["title", "Archive this label", 1, "header-action-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-box-archive"], ["title", "View changes", 1, "header-action-btn", 3, "click"], [1, "fa-solid", "fa-code-compare"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "summary-kpis"], [1, "summary-kpi"], [1, "kpi-mini-icon", 2, "background", "color-mix(in srgb, var(--mj-brand-primary) 10%, transparent)", "color", "var(--mj-brand-primary)"], [1, "fa-solid", "fa-camera"], [1, "kpi-mini-content"], [1, "kpi-mini-value"], [1, "kpi-mini-label"], [1, "fa-solid", "fa-table"], [1, "tab-bar"], [1, "breadcrumb-bar"], [1, "tab-content"], [1, "kpi-mini-icon", 2, "background", "rgba(16, 185, 129, 0.1)", "color", "#10b981"], [1, "fa-solid", "fa-stopwatch"], [1, "kpi-mini-icon", 2, "background", "rgba(245, 158, 11, 0.1)", "color", "#f59e0b"], [1, "fa-solid", "fa-layer-group"], [1, "tab", 3, "click"], [1, "fa-solid", "fa-info-circle", "tab-icon"], [1, "fa-solid", "fa-camera", "tab-icon"], [1, "tab-count"], [1, "fa-solid", "fa-diagram-project", "tab-icon"], [1, "fa-solid", "fa-code-compare", "tab-icon"], [1, "fa-solid", "fa-clock-rotate-left", "tab-icon"], [1, "breadcrumb-back", 3, "click"], [1, "fa-solid", "fa-arrow-left"], [1, "breadcrumb-trail"], [1, "breadcrumb-item", "clickable", 3, "click"], [1, "fa-solid", "fa-camera", "breadcrumb-icon"], [1, "fa-solid", "fa-chevron-right", "breadcrumb-separator"], [1, "breadcrumb-item", "current"], [1, "fa-solid", "fa-file-lines", "breadcrumb-icon"], ["text", "Loading label data..."], [1, "tab-pane"], [1, "detail-section"], [1, "section-title"], [1, "fa-solid", "fa-info-circle", "section-icon"], [1, "detail-grid"], [1, "detail-field"], [1, "field-label"], [1, "field-value"], [1, "inline-badge", 3, "ngClass"], [2, "margin-right", "6px"], [1, "record-card"], [1, "fa-solid", "fa-clock", "section-icon"], [2, "margin-right", "6px", "color", "var(--mj-brand-primary)"], [1, "field-value", "field-mono"], [1, "record-card-main"], [1, "record-card-icon"], [1, "record-card-info"], [1, "record-card-name"], [1, "record-card-name", "record-card-name-loading"], [1, "record-card-entity"], [1, "record-card-id"], ["title", "Open record", 1, "record-card-open-btn", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square"], [1, "fa-solid", "fa-align-left", "section-icon"], [1, "description-text"], [1, "fa-solid", "fa-user", 2, "margin-right", "6px", "opacity", "0.5"], [1, "fa-solid", "fa-sitemap", "section-icon"], [1, "hierarchy-item", "parent"], [1, "hierarchy-children"], [1, "fa-solid", "fa-arrow-up", "hierarchy-icon"], [1, "hierarchy-label"], [1, "hierarchy-name"], [1, "hierarchy-item", "child"], [1, "fa-solid", "fa-arrow-turn-down-right", "hierarchy-icon"], [1, "hierarchy-meta"], [1, "snapshot-toolbar"], [1, "snapshot-search"], [1, "fa-solid", "fa-search", "snapshot-search-icon"], ["type", "text", "placeholder", "Search by entity or record...", 1, "snapshot-search-input", 3, "ngModelChange", "ngModel"], [1, "snapshot-sort-toggle"], ["title", "Sort by name", 1, "toggle-btn-sm", 3, "click"], [1, "fa-solid", "fa-arrow-down-a-z"], [1, "fa-solid", "fa-arrow-up-z-a"], ["title", "Sort by record count", 1, "toggle-btn-sm", 3, "click"], [1, "fa-solid", "fa-arrow-down-9-1"], [1, "fa-solid", "fa-arrow-up-1-9"], [1, "snapshot-view-toggle"], [1, "toggle-btn-sm", 3, "click"], [1, "fa-solid", "fa-list"], [1, "fa-solid", "fa-grip"], [1, "snapshot-groups"], [
|
|
1964
|
+
} }, inputs: { Label: "Label", AllLabels: "AllLabels", ItemCountMap: "ItemCountMap" }, outputs: { Close: "Close", LabelUpdated: "LabelUpdated", EntityLinkClick: "EntityLinkClick" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 45, vars: 22, consts: [["depNode", ""], [1, "panel-backdrop", 3, "click"], [1, "detail-panel"], [1, "resize-handle", 3, "mousedown"], [1, "resize-handle-grip"], [1, "panel-header"], [1, "header-info"], [1, "header-title-row"], [1, "header-scope-icon"], [1, "header-title"], [1, "header-status", 3, "ngClass"], [1, "header-scope-badge"], [1, "header-description"], [1, "header-actions"], ["title", "Archive this label", 1, "header-action-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-box-archive"], ["title", "View changes", 1, "header-action-btn", 3, "click"], [1, "fa-solid", "fa-code-compare"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "summary-kpis"], [1, "summary-kpi"], [1, "kpi-mini-icon", 2, "background", "color-mix(in srgb, var(--mj-brand-primary) 10%, transparent)", "color", "var(--mj-brand-primary)"], [1, "fa-solid", "fa-camera"], [1, "kpi-mini-content"], [1, "kpi-mini-value"], [1, "kpi-mini-label"], [1, "fa-solid", "fa-table"], [1, "tab-bar"], [1, "breadcrumb-bar"], [1, "tab-content"], [1, "kpi-mini-icon", 2, "background", "rgba(16, 185, 129, 0.1)", "color", "#10b981"], [1, "fa-solid", "fa-stopwatch"], [1, "kpi-mini-icon", 2, "background", "rgba(245, 158, 11, 0.1)", "color", "#f59e0b"], [1, "fa-solid", "fa-layer-group"], [1, "tab", 3, "click"], [1, "fa-solid", "fa-info-circle", "tab-icon"], [1, "fa-solid", "fa-camera", "tab-icon"], [1, "tab-count"], [1, "fa-solid", "fa-diagram-project", "tab-icon"], [1, "fa-solid", "fa-code-compare", "tab-icon"], [1, "fa-solid", "fa-clock-rotate-left", "tab-icon"], [1, "breadcrumb-back", 3, "click"], [1, "fa-solid", "fa-arrow-left"], [1, "breadcrumb-trail"], [1, "breadcrumb-item", "clickable", 3, "click"], [1, "fa-solid", "fa-camera", "breadcrumb-icon"], [1, "fa-solid", "fa-chevron-right", "breadcrumb-separator"], [1, "breadcrumb-item", "current"], [1, "fa-solid", "fa-file-lines", "breadcrumb-icon"], ["text", "Loading label data..."], [1, "tab-pane"], [1, "detail-section"], [1, "section-title"], [1, "fa-solid", "fa-info-circle", "section-icon"], [1, "detail-grid"], [1, "detail-field"], [1, "field-label"], [1, "field-value"], [1, "inline-badge", 3, "ngClass"], [2, "margin-right", "6px"], [1, "record-card"], [1, "fa-solid", "fa-clock", "section-icon"], [2, "margin-right", "6px", "color", "var(--mj-brand-primary)"], [1, "field-value", "field-mono"], [1, "record-card-main"], [1, "record-card-icon"], [1, "record-card-info"], [1, "record-card-name"], [1, "record-card-name", "record-card-name-loading"], [1, "record-card-entity"], [1, "record-card-id"], ["title", "Open record", 1, "record-card-open-btn", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square"], [1, "fa-solid", "fa-align-left", "section-icon"], [1, "description-text"], [1, "fa-solid", "fa-user", 2, "margin-right", "6px", "opacity", "0.5"], [1, "fa-solid", "fa-sitemap", "section-icon"], [1, "hierarchy-item", "parent"], [1, "hierarchy-children"], [1, "fa-solid", "fa-arrow-up", "hierarchy-icon"], [1, "hierarchy-label"], [1, "hierarchy-name"], [1, "hierarchy-item", "child"], [1, "fa-solid", "fa-arrow-turn-down-right", "hierarchy-icon"], [1, "hierarchy-meta"], [1, "snapshot-toolbar"], [1, "snapshot-search"], [1, "fa-solid", "fa-search", "snapshot-search-icon"], ["type", "text", "placeholder", "Search by entity or record...", 1, "snapshot-search-input", 3, "ngModelChange", "ngModel"], [1, "snapshot-sort-toggle"], ["title", "Sort by name", 1, "toggle-btn-sm", 3, "click"], [1, "fa-solid", "fa-arrow-down-a-z"], [1, "fa-solid", "fa-arrow-up-z-a"], ["title", "Sort by record count", 1, "toggle-btn-sm", 3, "click"], [1, "fa-solid", "fa-arrow-down-9-1"], [1, "fa-solid", "fa-arrow-up-1-9"], [1, "snapshot-view-toggle"], [1, "toggle-btn-sm", 3, "click"], [1, "fa-solid", "fa-list"], [1, "fa-solid", "fa-grip"], [1, "snapshot-groups"], ["Size", "sm", 3, "FlushBody", "Expanded"], ["Size", "compact", "Icon", "fa-solid fa-camera", "Title", "No snapshot items found."], ["Size", "sm", 3, "ExpandedChange", "FlushBody", "Expanded"], ["mjAccordionTitle", ""], ["mjAccordionBody", ""], [1, "group-entity-icon"], [1, "group-name"], [1, "mj-accordion-badge", "mj-accordion-badge--right"], [1, "group-content"], [1, "group-names-loading"], [1, "snapshot-cards"], ["text", "Loading record names...", "size", "small"], [1, "snapshot-list-item"], [1, "snapshot-list-item", 3, "click"], [1, "fa-solid", "fa-file-lines", "snapshot-item-icon"], [1, "snapshot-item-name"], [1, "fa-solid", "fa-chevron-right", "snapshot-item-arrow"], [1, "snapshot-card"], [1, "snapshot-card", 3, "click"], [1, "snapshot-card-header"], [1, "fa-solid", "fa-file-lines"], [1, "snapshot-card-name"], ["text", "Loading dependencies..."], [1, "dep-root"], ["Size", "compact", "Icon", "fa-solid fa-diagram-project", "Title", "No entity associated with this label."], [1, "dep-root-entity"], [1, "dep-root-icon"], [1, "dep-root-name"], [1, "dep-root-badge"], ["Size", "compact", "Icon", "fa-solid fa-diagram-project", "Title", "No dependent entities found."], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "dep-node"], [1, "dep-node-header", 3, "click"], [1, "fa-solid", "fa-chevron-right", "dep-chevron", 3, "expanded"], [1, "dep-node-spacer"], [1, "dep-node-icon"], [1, "dep-node-name"], [1, "dep-node-field"], [1, "dep-node-count"], [1, "fa-solid", "fa-chevron-right", "dep-chevron"], ["text", "Computing differences..."], [1, "diff-summary"], [1, "diff-stat"], [1, "diff-stat-value", "change-modified"], [1, "diff-stat-label"], [1, "diff-stat-value"], [1, "diff-toolbar"], [1, "diff-groups"], ["Size", "compact", "Variant", "success", "Title", "No changes detected since this label was created."], ["title", "Expand all", 1, "toolbar-action-btn", 3, "click"], [1, "fa-solid", "fa-angles-down"], ["title", "Collapse all", 1, "toolbar-action-btn", 3, "click"], [1, "fa-solid", "fa-angles-up"], [1, "diff-group-icon"], [1, "diff-group-name"], [1, "mj-accordion-badge", "mj-accordion-badge--warning", "mj-accordion-badge--right"], [1, "diff-group-content"], [1, "diff-record"], [1, "diff-record-header"], [3, "ngClass"], [1, "diff-record-id"], [1, "diff-fields"], [1, "diff-field", 3, "ngClass"], [1, "diff-field-name"], [1, "diff-field-old"], [1, "fa-solid", "fa-arrow-right", "diff-field-arrow"], [1, "diff-field-new"], ["text", "Loading history..."], ["Size", "compact", "Icon", "fa-solid fa-clock-rotate-left", "Title", "No restore history or related labels found."], [1, "fa-solid", "fa-clock-rotate-left", "section-icon"], [1, "history-list"], [1, "history-item"], [1, "history-item-icon", 3, "ngClass"], [1, "fa-solid", "fa-clock-rotate-left"], [1, "history-item-content"], [1, "history-item-title"], [1, "history-item-meta"], [1, "history-item-date"], [1, "fa-solid", "fa-tags", "section-icon"], [1, "history-item-icon", 2, "background", "color-mix(in srgb, var(--mj-brand-primary) 10%, transparent)", "color", "var(--mj-brand-primary)"], [1, "fa-solid", "fa-tag"], [1, "inline-badge", "small", 3, "ngClass"], [3, "Close", "EntityLinkClick", "OpenRecord", "Data", "Inline"]], template: function MjLabelDetailComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1981
1965
|
i0.ɵɵelementStart(0, "div", 1);
|
|
1982
1966
|
i0.ɵɵlistener("click", function MjLabelDetailComponent_Template_div_click_0_listener() { return ctx.OnBackdropClick(); });
|
|
1983
1967
|
i0.ɵɵelementEnd();
|
|
@@ -2071,11 +2055,11 @@ export class MjLabelDetailComponent extends BaseAngularComponent {
|
|
|
2071
2055
|
i0.ɵɵconditional(!ctx.ShowMicroView ? 43 : -1);
|
|
2072
2056
|
i0.ɵɵadvance();
|
|
2073
2057
|
i0.ɵɵconditional(ctx.ShowMicroView && ctx.MicroViewRecord ? 44 : -1);
|
|
2074
|
-
} }, dependencies: [i1.NgClass, i1.NgTemplateOutlet, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, i3.LoadingComponent, i4.MjRecordMicroViewComponent, i1.SlicePipe], styles: ["\n\n\n\n\n\n\n.panel-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: transparent;\n z-index: 1000;\n transition: background 0.3s ease;\n pointer-events: none;\n}\n\n.panel-backdrop.visible[_ngcontent-%COMP%] {\n background: var(--mj-bg-overlay);\n pointer-events: auto;\n}\n\n\n\n\n\n\n\n\n.detail-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-lg);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);\n \n\n min-width: 400px;\n max-width: 92vw;\n}\n\n.detail-panel.visible[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n\n\n\n\n\n\n\n.resize-handle[_ngcontent-%COMP%] {\n position: absolute;\n left: -4px;\n top: 0;\n width: 8px;\n height: 100%;\n cursor: col-resize;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover .resize-handle-grip[_ngcontent-%COMP%], \n.resize-handle[_ngcontent-%COMP%]:active .resize-handle-grip[_ngcontent-%COMP%] {\n opacity: 1;\n background: var(--mj-brand-primary);\n}\n\n.resize-handle-grip[_ngcontent-%COMP%] {\n width: 3px;\n height: 40px;\n background: var(--mj-border-strong);\n border-radius: 3px;\n opacity: 0;\n transition: opacity 0.2s ease, background 0.2s ease;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n\n\n\n\n\n\n\n.breadcrumb-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n background: var(--mj-bg-surface-sunken);\n}\n\n.breadcrumb-back[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n font-size: 13px;\n flex-shrink: 0;\n}\n\n.breadcrumb-back[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.breadcrumb-trail[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n overflow: hidden;\n}\n\n.breadcrumb-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 5px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.breadcrumb-item.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: color 0.15s ease;\n}\n\n.breadcrumb-item.clickable[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n}\n\n.breadcrumb-item.current[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.breadcrumb-separator[_ngcontent-%COMP%] {\n font-size: 9px;\n color: var(--mj-border-strong);\n flex-shrink: 0;\n}\n\n.breadcrumb-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.header-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.header-title-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.header-scope-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.header-title[_ngcontent-%COMP%] {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.header-status[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.header-scope-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n color: var(--mj-brand-primary);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.header-description[_ngcontent-%COMP%] {\n margin: 8px 0 0 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n align-items: center;\n flex-shrink: 0;\n margin-left: 16px;\n}\n\n.header-action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n font-size: 14px;\n}\n\n.header-action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.header-action-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.close-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: none;\n border: none;\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n font-size: 16px;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n\n\n.status-active[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-success) 10%, transparent); color: var(--mj-status-success); }\n.status-archived[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-text-muted) 10%, transparent); color: var(--mj-text-muted); }\n.status-restored[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-warning) 10%, transparent); color: var(--mj-status-warning); }\n\n\n\n\n\n\n\n\n.summary-kpis[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 16px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n overflow-x: auto;\n}\n\n.summary-kpi[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n flex-shrink: 0;\n}\n\n.kpi-mini-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n font-size: 15px;\n flex-shrink: 0;\n}\n\n.kpi-mini-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.kpi-mini-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.kpi-mini-label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n margin-top: 2px;\n}\n\n\n\n\n\n\n\n\n.tab-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 0;\n padding: 0 24px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n overflow-x: auto;\n}\n\n.tab[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 12px 16px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.tab-icon[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n.tab-count[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n}\n\n\n\n\n\n\n\n\n.tab-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.tab-pane[_ngcontent-%COMP%] {\n padding: 20px 24px;\n animation: _ngcontent-%COMP%_tabFadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_tabFadeIn {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.tab-empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n}\n\n.tab-empty-icon[_ngcontent-%COMP%] {\n font-size: 40px;\n color: var(--mj-border-strong);\n margin-bottom: 12px;\n}\n\n.tab-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin: 0;\n}\n\n\n\n\n\n\n\n\n.detail-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 14px 0;\n padding-bottom: 10px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.section-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.detail-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 14px;\n}\n\n.detail-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.field-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.field-value[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n}\n\n.field-mono[_ngcontent-%COMP%] {\n font-family: 'SF Mono', 'Fira Code', monospace;\n font-size: 13px;\n word-break: break-all;\n}\n\n.field-record-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n\n\n.record-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 16px 18px;\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n border-radius: 12px;\n margin-bottom: 24px;\n}\n\n.record-card-main[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n min-width: 0;\n flex: 1;\n}\n\n.record-card-icon[_ngcontent-%COMP%] {\n font-size: 22px;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.record-card-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.record-card-name[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.record-card-name-loading[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-weight: 500;\n font-style: italic;\n}\n\n.record-card-entity[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.record-card-id[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n font-family: 'SF Mono', 'Fira Code', monospace;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.record-card-open-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n flex-shrink: 0;\n white-space: nowrap;\n}\n\n.record-card-open-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n box-shadow: var(--mj-shadow-md);\n}\n\n.inline-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.inline-badge.small[_ngcontent-%COMP%] {\n padding: 2px 8px;\n font-size: 11px;\n}\n\n.description-text[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n line-height: 1.6;\n margin: 0;\n}\n\n\n\n.hierarchy-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 12px;\n border-radius: 8px;\n font-size: 14px;\n transition: background 0.15s ease;\n}\n\n.hierarchy-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.hierarchy-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 13px;\n width: 16px;\n text-align: center;\n}\n\n.hierarchy-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n}\n\n.hierarchy-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.hierarchy-meta[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n font-family: monospace;\n}\n\n.hierarchy-children[_ngcontent-%COMP%] {\n margin-left: 16px;\n border-left: 2px solid var(--mj-border-default);\n padding-left: 8px;\n}\n\n\n\n\n\n\n\n\n.snapshot-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.snapshot-search[_ngcontent-%COMP%] {\n position: relative;\n flex: 1;\n}\n\n.snapshot-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n.snapshot-search-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 12px 8px 36px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n color: var(--mj-text-primary);\n outline: none;\n box-sizing: border-box;\n transition: border-color 0.15s ease;\n}\n\n.snapshot-search-input[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.snapshot-sort-toggle[_ngcontent-%COMP%], \n.snapshot-view-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.toggle-btn-sm[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n background: transparent;\n border: none;\n cursor: pointer;\n color: var(--mj-text-disabled);\n transition: all 0.15s ease;\n font-size: 12px;\n}\n\n.toggle-btn-sm[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.toggle-btn-sm.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.toggle-btn-sm[_ngcontent-%COMP%] + .toggle-btn-sm[_ngcontent-%COMP%] {\n border-left: 1px solid var(--mj-border-default);\n}\n\n\n\n.snapshot-groups[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.snapshot-group[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n overflow: hidden;\n}\n\n.group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 14px;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.group-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.group-chevron[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n width: 14px;\n text-align: center;\n}\n\n.group-chevron.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.group-entity-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.group-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n.group-count-inline[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n margin-left: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n border-radius: 10px;\n font-size: 12px;\n font-weight: 600;\n vertical-align: middle;\n}\n\n.group-content[_ngcontent-%COMP%] {\n border-top: 1px solid var(--mj-border-default);\n animation: _ngcontent-%COMP%_tabFadeIn 0.15s ease;\n}\n\n.group-names-loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n padding: 8px 14px;\n}\n\n\n\n.snapshot-list-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px 10px 40px;\n cursor: pointer;\n transition: background 0.15s ease;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.snapshot-list-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.snapshot-list-item[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n.snapshot-item-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n.snapshot-item-name[_ngcontent-%COMP%] {\n flex: 1;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.snapshot-item-id[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n font-family: monospace;\n}\n\n.snapshot-item-arrow[_ngcontent-%COMP%] {\n color: var(--mj-border-strong);\n font-size: 11px;\n transition: transform 0.15s ease, color 0.15s ease;\n}\n\n.snapshot-list-item[_ngcontent-%COMP%]:hover .snapshot-item-arrow[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n transform: translateX(2px);\n}\n\n\n\n.snapshot-cards[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 10px;\n padding: 12px 14px;\n}\n\n.snapshot-card[_ngcontent-%COMP%] {\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.snapshot-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.snapshot-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.snapshot-card-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.snapshot-card-name[_ngcontent-%COMP%] {\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.snapshot-card-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n font-family: monospace;\n}\n\n\n\n\n\n\n\n\n.dep-root[_ngcontent-%COMP%] {\n padding: 4px 0;\n}\n\n.dep-root-entity[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 14px;\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n border-radius: 10px;\n margin-bottom: 12px;\n}\n\n.dep-root-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.dep-root-name[_ngcontent-%COMP%] {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n.dep-root-badge[_ngcontent-%COMP%] {\n padding: 2px 10px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n}\n\n.dep-node[_ngcontent-%COMP%] {\n margin-left: 8px;\n border-left: 2px solid var(--mj-border-default);\n}\n\n.dep-node-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n transition: background 0.15s ease;\n border-radius: 6px;\n}\n\n.dep-node-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.dep-chevron[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n width: 12px;\n text-align: center;\n}\n\n.dep-chevron.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.dep-node-spacer[_ngcontent-%COMP%] {\n width: 12px;\n}\n\n.dep-node-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n.dep-node-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.dep-node-field[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n font-style: italic;\n}\n\n.dep-node-count[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n padding: 1px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n}\n\n.dep-empty[_ngcontent-%COMP%] {\n padding: 20px;\n text-align: center;\n}\n\n.dep-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin: 0;\n}\n\n\n\n\n\n\n\n\n.diff-summary[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n margin-bottom: 20px;\n}\n\n.diff-stat[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 12px 20px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n min-width: 80px;\n}\n\n.diff-stat-value[_ngcontent-%COMP%] {\n font-size: 24px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.diff-stat-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n margin-top: 4px;\n}\n\n\n\n.diff-toolbar[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.toolbar-action-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.toolbar-action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.toolbar-action-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n}\n\n.diff-groups[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.diff-group[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n overflow: hidden;\n}\n\n.diff-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 14px;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.diff-group-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.diff-chevron[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n width: 14px;\n text-align: center;\n}\n\n.diff-chevron.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.diff-group-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.diff-group-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n.diff-group-count[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n padding: 2px 10px;\n border-radius: 10px;\n}\n\n.diff-group-content[_ngcontent-%COMP%] {\n border-top: 1px solid var(--mj-border-default);\n animation: _ngcontent-%COMP%_tabFadeIn 0.15s ease;\n}\n\n.diff-record[_ngcontent-%COMP%] {\n padding: 10px 14px 10px 40px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.diff-record[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.diff-record-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.diff-record-id[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n font-family: monospace;\n}\n\n.diff-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin-left: 22px;\n}\n\n.diff-field[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n}\n\n.diff-field-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n min-width: 100px;\n}\n\n.diff-field-old[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n text-decoration: line-through;\n opacity: 0.7;\n font-family: monospace;\n font-size: 12px;\n}\n\n.diff-field-arrow[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 10px;\n}\n\n.diff-field-new[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n font-family: monospace;\n font-size: 12px;\n}\n\n\n\n.change-added[_ngcontent-%COMP%] { color: var(--mj-status-success); }\n.change-modified[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n.change-removed[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n\n.diff-field.change-added[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-success) 6%, transparent); }\n.diff-field.change-modified[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-warning) 6%, transparent); }\n.diff-field.change-removed[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-error) 6%, transparent); }\n\n\n\n\n\n\n\n\n.history-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.history-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 8px;\n transition: background 0.15s ease;\n}\n\n.history-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.history-item-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: 8px;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.history-item-icon.status-complete[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-success) 10%, transparent); color: var(--mj-status-success); }\n.history-item-icon.status-error[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-error) 10%, transparent); color: var(--mj-status-error); }\n.history-item-icon.status-partial[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-warning) 10%, transparent); color: var(--mj-status-warning); }\n.history-item-icon.status-in-progress[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary); }\n.history-item-icon.status-pending[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-text-muted) 10%, transparent); color: var(--mj-text-muted); }\n\n.history-item-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.history-item-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.history-item-meta[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.history-item-date[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n flex-shrink: 0;\n}\n\n\n\n\n\n\n\n\n@media (max-width: 1024px) {\n .detail-panel[_ngcontent-%COMP%] {\n min-width: 360px;\n }\n\n .summary-kpis[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 768px) {\n .detail-panel[_ngcontent-%COMP%] {\n width: 100% !important;\n min-width: unset;\n }\n\n .resize-handle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .detail-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .summary-kpis[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n gap: 8px;\n padding: 12px 16px;\n }\n\n .summary-kpi[_ngcontent-%COMP%] {\n padding: 8px 10px;\n }\n\n .panel-header[_ngcontent-%COMP%] {\n padding: 16px 16px 12px;\n }\n\n .tab-bar[_ngcontent-%COMP%] {\n padding: 0 16px;\n }\n\n .tab-pane[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .breadcrumb-bar[_ngcontent-%COMP%] {\n padding: 8px 16px;\n }\n\n .snapshot-toolbar[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n\n .diff-summary[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n gap: 8px;\n }\n\n .diff-stat[_ngcontent-%COMP%] {\n padding: 10px 14px;\n min-width: 60px;\n }\n}\n\n@media (max-width: 480px) {\n .header-title[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .header-title-row[_ngcontent-%COMP%] {\n gap: 6px;\n }\n\n .header-actions[_ngcontent-%COMP%] {\n margin-left: 8px;\n }\n\n .tab[_ngcontent-%COMP%] {\n padding: 10px 10px;\n font-size: 12px;\n }\n\n .snapshot-cards[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}"], changeDetection: 0 });
|
|
2058
|
+
} }, dependencies: [i1.NgClass, i1.NgTemplateOutlet, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgModel, i3.LoadingComponent, i4.MJEmptyStateComponent, i4.MJAccordionPanelComponent, i4.MJAccordionTitleDirective, i4.MJAccordionBodyDirective, i5.MjRecordMicroViewComponent, i1.SlicePipe], styles: ["\n\n\n\n\n\n\n.panel-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: transparent;\n z-index: 1000;\n transition: background 0.3s ease;\n pointer-events: none;\n}\n\n.panel-backdrop.visible[_ngcontent-%COMP%] {\n background: var(--mj-bg-overlay);\n pointer-events: auto;\n}\n\n\n\n\n\n\n\n\n.detail-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-lg);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);\n \n\n min-width: 400px;\n max-width: 92vw;\n}\n\n.detail-panel.visible[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n\n\n\n\n\n\n\n.resize-handle[_ngcontent-%COMP%] {\n position: absolute;\n left: -4px;\n top: 0;\n width: 8px;\n height: 100%;\n cursor: col-resize;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover .resize-handle-grip[_ngcontent-%COMP%], \n.resize-handle[_ngcontent-%COMP%]:active .resize-handle-grip[_ngcontent-%COMP%] {\n opacity: 1;\n background: var(--mj-brand-primary);\n}\n\n.resize-handle-grip[_ngcontent-%COMP%] {\n width: 3px;\n height: 40px;\n background: var(--mj-border-strong);\n border-radius: 3px;\n opacity: 0;\n transition: opacity 0.2s ease, background 0.2s ease;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n\n\n\n\n\n\n\n.breadcrumb-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n background: var(--mj-bg-surface-sunken);\n}\n\n.breadcrumb-back[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n font-size: 13px;\n flex-shrink: 0;\n}\n\n.breadcrumb-back[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.breadcrumb-trail[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n overflow: hidden;\n}\n\n.breadcrumb-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 5px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.breadcrumb-item.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: color 0.15s ease;\n}\n\n.breadcrumb-item.clickable[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n}\n\n.breadcrumb-item.current[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.breadcrumb-separator[_ngcontent-%COMP%] {\n font-size: 9px;\n color: var(--mj-border-strong);\n flex-shrink: 0;\n}\n\n.breadcrumb-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.header-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.header-title-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.header-scope-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.header-title[_ngcontent-%COMP%] {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.header-status[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.header-scope-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n color: var(--mj-brand-primary);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.header-description[_ngcontent-%COMP%] {\n margin: 8px 0 0 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n align-items: center;\n flex-shrink: 0;\n margin-left: 16px;\n}\n\n.header-action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n font-size: 14px;\n}\n\n.header-action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.header-action-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.close-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: none;\n border: none;\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n font-size: 16px;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n\n\n.status-active[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-success) 10%, transparent); color: var(--mj-status-success); }\n.status-archived[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-text-muted) 10%, transparent); color: var(--mj-text-muted); }\n.status-restored[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-warning) 10%, transparent); color: var(--mj-status-warning); }\n\n\n\n\n\n\n\n\n.summary-kpis[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 16px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n overflow-x: auto;\n}\n\n.summary-kpi[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n flex-shrink: 0;\n}\n\n.kpi-mini-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n font-size: 15px;\n flex-shrink: 0;\n}\n\n.kpi-mini-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.kpi-mini-value[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.kpi-mini-label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n margin-top: 2px;\n}\n\n\n\n\n\n\n\n\n.tab-bar[_ngcontent-%COMP%] {\n display: flex;\n gap: 0;\n padding: 0 24px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n overflow-x: auto;\n}\n\n.tab[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 12px 16px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.tab[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.tab.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.tab-icon[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n.tab-count[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n}\n\n\n\n\n\n\n\n\n.tab-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.tab-pane[_ngcontent-%COMP%] {\n padding: 20px 24px;\n animation: _ngcontent-%COMP%_tabFadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_tabFadeIn {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n\n\n\n\n\n\n\n.detail-section[_ngcontent-%COMP%] {\n margin-bottom: 24px;\n}\n\n.section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 14px 0;\n padding-bottom: 10px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.section-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.detail-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 14px;\n}\n\n.detail-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.field-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.field-value[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n}\n\n.field-mono[_ngcontent-%COMP%] {\n font-family: 'SF Mono', 'Fira Code', monospace;\n font-size: 13px;\n word-break: break-all;\n}\n\n.field-record-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n\n\n.record-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 16px 18px;\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n border-radius: 12px;\n margin-bottom: 24px;\n}\n\n.record-card-main[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 14px;\n min-width: 0;\n flex: 1;\n}\n\n.record-card-icon[_ngcontent-%COMP%] {\n font-size: 22px;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.record-card-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.record-card-name[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.record-card-name-loading[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-weight: 500;\n font-style: italic;\n}\n\n.record-card-entity[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.record-card-id[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n font-family: 'SF Mono', 'Fira Code', monospace;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.record-card-open-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n flex-shrink: 0;\n white-space: nowrap;\n}\n\n.record-card-open-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n box-shadow: var(--mj-shadow-md);\n}\n\n.inline-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.inline-badge.small[_ngcontent-%COMP%] {\n padding: 2px 8px;\n font-size: 11px;\n}\n\n.description-text[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-secondary);\n line-height: 1.6;\n margin: 0;\n}\n\n\n\n.hierarchy-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 12px;\n border-radius: 8px;\n font-size: 14px;\n transition: background 0.15s ease;\n}\n\n.hierarchy-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.hierarchy-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 13px;\n width: 16px;\n text-align: center;\n}\n\n.hierarchy-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n}\n\n.hierarchy-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.hierarchy-meta[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n font-family: monospace;\n}\n\n.hierarchy-children[_ngcontent-%COMP%] {\n margin-left: 16px;\n border-left: 2px solid var(--mj-border-default);\n padding-left: 8px;\n}\n\n\n\n\n\n\n\n\n.snapshot-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.snapshot-search[_ngcontent-%COMP%] {\n position: relative;\n flex: 1;\n}\n\n.snapshot-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n.snapshot-search-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 8px 12px 8px 36px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n color: var(--mj-text-primary);\n outline: none;\n box-sizing: border-box;\n transition: border-color 0.15s ease;\n}\n\n.snapshot-search-input[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.snapshot-sort-toggle[_ngcontent-%COMP%], \n.snapshot-view-toggle[_ngcontent-%COMP%] {\n display: flex;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.toggle-btn-sm[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n background: transparent;\n border: none;\n cursor: pointer;\n color: var(--mj-text-disabled);\n transition: all 0.15s ease;\n font-size: 12px;\n}\n\n.toggle-btn-sm[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.toggle-btn-sm.active[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.toggle-btn-sm[_ngcontent-%COMP%] + .toggle-btn-sm[_ngcontent-%COMP%] {\n border-left: 1px solid var(--mj-border-default);\n}\n\n\n\n.snapshot-groups[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n\n\n\n\n\n.group-entity-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.group-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n\n\n\n.group-content[_ngcontent-%COMP%] {\n border-top: 1px solid var(--mj-border-default);\n animation: _ngcontent-%COMP%_tabFadeIn 0.15s ease;\n}\n\n.group-names-loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n padding: 8px 14px;\n}\n\n\n\n.snapshot-list-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px 10px 40px;\n cursor: pointer;\n transition: background 0.15s ease;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.snapshot-list-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.snapshot-list-item[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n.snapshot-item-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n.snapshot-item-name[_ngcontent-%COMP%] {\n flex: 1;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.snapshot-item-id[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n font-family: monospace;\n}\n\n.snapshot-item-arrow[_ngcontent-%COMP%] {\n color: var(--mj-border-strong);\n font-size: 11px;\n transition: transform 0.15s ease, color 0.15s ease;\n}\n\n.snapshot-list-item[_ngcontent-%COMP%]:hover .snapshot-item-arrow[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n transform: translateX(2px);\n}\n\n\n\n.snapshot-cards[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 10px;\n padding: 12px 14px;\n}\n\n.snapshot-card[_ngcontent-%COMP%] {\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.snapshot-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.snapshot-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.snapshot-card-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.snapshot-card-name[_ngcontent-%COMP%] {\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.snapshot-card-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n font-family: monospace;\n}\n\n\n\n\n\n\n\n\n.dep-root[_ngcontent-%COMP%] {\n padding: 4px 0;\n}\n\n.dep-root-entity[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 14px;\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n border-radius: 10px;\n margin-bottom: 12px;\n}\n\n.dep-root-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.dep-root-name[_ngcontent-%COMP%] {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n.dep-root-badge[_ngcontent-%COMP%] {\n padding: 2px 10px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n}\n\n.dep-node[_ngcontent-%COMP%] {\n margin-left: 8px;\n border-left: 2px solid var(--mj-border-default);\n}\n\n.dep-node-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n transition: background 0.15s ease;\n border-radius: 6px;\n}\n\n.dep-node-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.dep-chevron[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n width: 12px;\n text-align: center;\n}\n\n.dep-chevron.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.dep-node-spacer[_ngcontent-%COMP%] {\n width: 12px;\n}\n\n.dep-node-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n.dep-node-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.dep-node-field[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n font-style: italic;\n}\n\n.dep-node-count[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-disabled);\n padding: 1px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n}\n\n\n\n\n\n\n\n\n.diff-summary[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n margin-bottom: 20px;\n}\n\n.diff-stat[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 12px 20px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n min-width: 80px;\n}\n\n.diff-stat-value[_ngcontent-%COMP%] {\n font-size: 24px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.diff-stat-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n margin-top: 4px;\n}\n\n\n\n.diff-toolbar[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.toolbar-action-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.toolbar-action-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.toolbar-action-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n}\n\n.diff-groups[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n\n\n.diff-group-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.diff-group-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n\n\n\n\n.diff-group-content[_ngcontent-%COMP%] {\n border-top: 1px solid var(--mj-border-default);\n animation: _ngcontent-%COMP%_tabFadeIn 0.15s ease;\n}\n\n.diff-record[_ngcontent-%COMP%] {\n padding: 10px 14px 10px 40px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.diff-record[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.diff-record-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.diff-record-id[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n font-family: monospace;\n}\n\n.diff-fields[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin-left: 22px;\n}\n\n.diff-field[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n}\n\n.diff-field-name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n min-width: 100px;\n}\n\n.diff-field-old[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n text-decoration: line-through;\n opacity: 0.7;\n font-family: monospace;\n font-size: 12px;\n}\n\n.diff-field-arrow[_ngcontent-%COMP%] {\n color: var(--mj-text-disabled);\n font-size: 10px;\n}\n\n.diff-field-new[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n font-family: monospace;\n font-size: 12px;\n}\n\n\n\n.change-added[_ngcontent-%COMP%] { color: var(--mj-status-success); }\n.change-modified[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n.change-removed[_ngcontent-%COMP%] { color: var(--mj-status-error); }\n\n.diff-field.change-added[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-success) 6%, transparent); }\n.diff-field.change-modified[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-warning) 6%, transparent); }\n.diff-field.change-removed[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-error) 6%, transparent); }\n\n\n\n\n\n\n\n\n.history-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.history-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 8px;\n transition: background 0.15s ease;\n}\n\n.history-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.history-item-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: 8px;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.history-item-icon.status-complete[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-success) 10%, transparent); color: var(--mj-status-success); }\n.history-item-icon.status-error[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-error) 10%, transparent); color: var(--mj-status-error); }\n.history-item-icon.status-partial[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-warning) 10%, transparent); color: var(--mj-status-warning); }\n.history-item-icon.status-in-progress[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary); }\n.history-item-icon.status-pending[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-text-muted) 10%, transparent); color: var(--mj-text-muted); }\n\n.history-item-content[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.history-item-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.history-item-meta[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.history-item-date[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n flex-shrink: 0;\n}\n\n\n\n\n\n\n\n\n@media (max-width: 1024px) {\n .detail-panel[_ngcontent-%COMP%] {\n min-width: 360px;\n }\n\n .summary-kpis[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 768px) {\n .detail-panel[_ngcontent-%COMP%] {\n width: 100% !important;\n min-width: unset;\n }\n\n .resize-handle[_ngcontent-%COMP%] {\n display: none;\n }\n\n .detail-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .summary-kpis[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n gap: 8px;\n padding: 12px 16px;\n }\n\n .summary-kpi[_ngcontent-%COMP%] {\n padding: 8px 10px;\n }\n\n .panel-header[_ngcontent-%COMP%] {\n padding: 16px 16px 12px;\n }\n\n .tab-bar[_ngcontent-%COMP%] {\n padding: 0 16px;\n }\n\n .tab-pane[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .breadcrumb-bar[_ngcontent-%COMP%] {\n padding: 8px 16px;\n }\n\n .snapshot-toolbar[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n }\n\n .diff-summary[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n gap: 8px;\n }\n\n .diff-stat[_ngcontent-%COMP%] {\n padding: 10px 14px;\n min-width: 60px;\n }\n}\n\n@media (max-width: 480px) {\n .header-title[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .header-title-row[_ngcontent-%COMP%] {\n gap: 6px;\n }\n\n .header-actions[_ngcontent-%COMP%] {\n margin-left: 8px;\n }\n\n .tab[_ngcontent-%COMP%] {\n padding: 10px 10px;\n font-size: 12px;\n }\n\n .snapshot-cards[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n}"], changeDetection: 0 });
|
|
2075
2059
|
}
|
|
2076
2060
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MjLabelDetailComponent, [{
|
|
2077
2061
|
type: Component,
|
|
2078
|
-
args: [{ standalone: false, selector: 'mj-label-detail-panel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Backdrop overlay -->\n<div class=\"panel-backdrop\" [class.visible]=\"IsVisible\" (click)=\"OnBackdropClick()\"></div>\n\n<!-- Slide-in panel -->\n<div class=\"detail-panel\" [class.visible]=\"IsVisible\" [style.width.px]=\"PanelWidthPx\">\n <!-- Resize handle -->\n <div class=\"resize-handle\" (mousedown)=\"OnResizeStart($event)\">\n <div class=\"resize-handle-grip\"></div>\n </div>\n\n <!-- ============================================================ -->\n <!-- HEADER -->\n <!-- ============================================================ -->\n <div class=\"panel-header\">\n <div class=\"header-info\">\n <div class=\"header-title-row\">\n <i [class]=\"GetScopeIcon(Label.Scope)\" class=\"header-scope-icon\"></i>\n <h2 class=\"header-title\">{{Label.Name}}</h2>\n <span class=\"header-status\" [ngClass]=\"GetStatusClass(Label.Status)\">\n {{Label.Status}}\n </span>\n <span class=\"header-scope-badge\">{{Label.Scope}}</span>\n </div>\n @if (Label.Description) {\n <p class=\"header-description\">{{Label.Description}}</p>\n }\n </div>\n <div class=\"header-actions\">\n <button class=\"header-action-btn\" (click)=\"OnArchive()\"\n [disabled]=\"IsArchiving || Label.Status === 'Archived'\"\n title=\"Archive this label\">\n <i class=\"fa-solid fa-box-archive\"></i>\n </button>\n <button class=\"header-action-btn\" (click)=\"OnTabChange('changes')\" title=\"View changes\">\n <i class=\"fa-solid fa-code-compare\"></i>\n </button>\n <button class=\"close-btn\" (click)=\"OnClose()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n\n <!-- ============================================================ -->\n <!-- SUMMARY KPIs -->\n <!-- ============================================================ -->\n <div class=\"summary-kpis\">\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary);\">\n <i class=\"fa-solid fa-camera\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{LabelItems.length || Label.ItemCount || GetItemCount(Label.ID)}}</span>\n <span class=\"kpi-mini-label\">Items</span>\n </div>\n </div>\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary);\">\n <i class=\"fa-solid fa-table\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{UniqueEntityCount}}</span>\n <span class=\"kpi-mini-label\">Entities</span>\n </div>\n </div>\n @if (Label.CreationDurationMS) {\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: rgba(16, 185, 129, 0.1); color: #10b981;\">\n <i class=\"fa-solid fa-stopwatch\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{FormatDuration(Label.CreationDurationMS)}}</span>\n <span class=\"kpi-mini-label\">Duration</span>\n </div>\n </div>\n }\n @if (ChildLabels.length > 0) {\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: rgba(245, 158, 11, 0.1); color: #f59e0b;\">\n <i class=\"fa-solid fa-layer-group\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{ChildLabels.length}}</span>\n <span class=\"kpi-mini-label\">Children</span>\n </div>\n </div>\n }\n </div>\n\n <!-- ============================================================ -->\n <!-- TAB BAR (hidden when micro-view is active) -->\n <!-- ============================================================ -->\n @if (!ShowMicroView) {\n <div class=\"tab-bar\">\n <button class=\"tab\" [class.active]=\"ActiveTab === 'overview'\" (click)=\"OnTabChange('overview')\">\n <i class=\"fa-solid fa-info-circle tab-icon\"></i> Overview\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'snapshots'\" (click)=\"OnTabChange('snapshots')\">\n <i class=\"fa-solid fa-camera tab-icon\"></i> Snapshots\n @if (LabelItems.length > 0) {\n <span class=\"tab-count\">{{LabelItems.length}}</span>\n }\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'dependencies'\" (click)=\"OnTabChange('dependencies')\">\n <i class=\"fa-solid fa-diagram-project tab-icon\"></i> Dependencies\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'changes'\" (click)=\"OnTabChange('changes')\">\n <i class=\"fa-solid fa-code-compare tab-icon\"></i> Changes\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'history'\" (click)=\"OnTabChange('history')\">\n <i class=\"fa-solid fa-clock-rotate-left tab-icon\"></i> History\n </button>\n </div>\n }\n\n <!-- ============================================================ -->\n <!-- BREADCRUMB (shown when micro-view is active) -->\n <!-- ============================================================ -->\n @if (ShowMicroView) {\n <div class=\"breadcrumb-bar\">\n <button class=\"breadcrumb-back\" (click)=\"OnBackFromMicroView()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n </button>\n <div class=\"breadcrumb-trail\">\n <span class=\"breadcrumb-item clickable\" (click)=\"OnBackFromMicroView()\">\n <i class=\"fa-solid fa-camera breadcrumb-icon\"></i> Snapshots\n </span>\n <i class=\"fa-solid fa-chevron-right breadcrumb-separator\"></i>\n <span class=\"breadcrumb-item current\">\n <i class=\"fa-solid fa-file-lines breadcrumb-icon\"></i> {{BreadcrumbLabel}}\n </span>\n </div>\n </div>\n }\n\n <!-- ============================================================ -->\n <!-- TAB CONTENT (scrollable) - or inline micro-view -->\n <!-- ============================================================ -->\n @if (!ShowMicroView) {\n <div class=\"tab-content\">\n <!-- Loading state for items -->\n @if (IsLoadingItems && ActiveTab !== 'dependencies') {\n <mj-loading text=\"Loading label data...\"></mj-loading>\n }\n <!-- ======================================================== -->\n <!-- OVERVIEW TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'overview' && !IsLoadingItems) {\n <div class=\"tab-pane\">\n <!-- Metadata section -->\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-info-circle section-icon\"></i> Label Details\n </h3>\n <div class=\"detail-grid\">\n <div class=\"detail-field\">\n <span class=\"field-label\">Name</span>\n <span class=\"field-value\">{{Label.Name}}</span>\n </div>\n <div class=\"detail-field\">\n <span class=\"field-label\">Status</span>\n <span class=\"field-value\">\n <span class=\"inline-badge\" [ngClass]=\"GetStatusClass(Label.Status)\">{{Label.Status}}</span>\n </span>\n </div>\n <div class=\"detail-field\">\n <span class=\"field-label\">Scope</span>\n <span class=\"field-value\">\n <i [class]=\"GetScopeIcon(Label.Scope)\" style=\"margin-right: 6px;\"></i>{{Label.Scope}}\n </span>\n </div>\n @if (Label.EntityID) {\n <div class=\"detail-field\">\n <span class=\"field-label\">Entity</span>\n <span class=\"field-value\">\n <i [class]=\"OverviewEntityIcon\" style=\"margin-right: 6px; color: var(--mj-brand-primary);\"></i>{{Label.Entity ?? resolveEntityName(Label.EntityID)}}\n </span>\n </div>\n }\n @if (Label.RecordID && Label.Scope !== 'Record') {\n <div class=\"detail-field\">\n <span class=\"field-label\">Record ID</span>\n <span class=\"field-value field-mono\">{{FormatRecordID(Label.RecordID)}}</span>\n </div>\n }\n @if (Label.ExternalSystemID) {\n <div class=\"detail-field\">\n <span class=\"field-label\">External Ref</span>\n <span class=\"field-value field-mono\">{{Label.ExternalSystemID}}</span>\n </div>\n }\n </div>\n </div>\n <!-- Record card (Record-scoped labels) -->\n @if (Label.Scope === 'Record' && Label.RecordID) {\n <div class=\"record-card\">\n <div class=\"record-card-main\">\n <i [class]=\"OverviewEntityIcon\" class=\"record-card-icon\"></i>\n <div class=\"record-card-info\">\n @if (OverviewRecordName) {\n <span class=\"record-card-name\">{{OverviewRecordName}}</span>\n }\n @if (!OverviewRecordName) {\n <span class=\"record-card-name record-card-name-loading\">Loading...</span>\n }\n <span class=\"record-card-entity\">{{Label.Entity ?? resolveEntityName(Label.EntityID)}}</span>\n <span class=\"record-card-id\">{{FormatRecordID(Label.RecordID)}}</span>\n </div>\n </div>\n <button class=\"record-card-open-btn\" (click)=\"OnOpenOverviewRecord()\" title=\"Open record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open\n </button>\n </div>\n }\n <!-- Description -->\n @if (Label.Description) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-align-left section-icon\"></i> Description\n </h3>\n <p class=\"description-text\">{{Label.Description}}</p>\n </div>\n }\n <!-- Creation info -->\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock section-icon\"></i> Creation\n </h3>\n <div class=\"detail-grid\">\n <div class=\"detail-field\">\n <span class=\"field-label\">Created</span>\n <span class=\"field-value\">{{FormatDate(Label.__mj_CreatedAt)}}</span>\n </div>\n @if (Label.CreatedByUser) {\n <div class=\"detail-field\">\n <span class=\"field-label\">Created By</span>\n <span class=\"field-value\">\n <i class=\"fa-solid fa-user\" style=\"margin-right: 6px; opacity: 0.5;\"></i>{{Label.CreatedByUser}}\n </span>\n </div>\n }\n @if (Label.CreationDurationMS) {\n <div class=\"detail-field\">\n <span class=\"field-label\">Capture Duration</span>\n <span class=\"field-value\">{{FormatDuration(Label.CreationDurationMS)}}</span>\n </div>\n }\n <div class=\"detail-field\">\n <span class=\"field-label\">Items Captured</span>\n <span class=\"field-value\">{{LabelItems.length}}</span>\n </div>\n </div>\n </div>\n <!-- Parent / Children -->\n @if (Label.ParentID || ChildLabels.length > 0) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-sitemap section-icon\"></i> Hierarchy\n </h3>\n <!-- Parent reference -->\n @if (Label.ParentID) {\n <div class=\"hierarchy-item parent\">\n <i class=\"fa-solid fa-arrow-up hierarchy-icon\"></i>\n <span class=\"hierarchy-label\">Parent:</span>\n <span class=\"hierarchy-name\">\n @for (pl of AllLabels; track pl) {\n @if (IsParentLabel(pl)) {\n <span>{{pl.Name}}</span>\n }\n }\n </span>\n </div>\n }\n <!-- Children -->\n @if (ChildLabels.length > 0) {\n <div class=\"hierarchy-children\">\n @for (child of ChildLabels; track child) {\n <div class=\"hierarchy-item child\">\n <i class=\"fa-solid fa-arrow-turn-down-right hierarchy-icon\"></i>\n <span class=\"hierarchy-name\">{{child.Name}}</span>\n @if (child.RecordID) {\n <span class=\"hierarchy-meta\">{{child.RecordID | slice:0:12}}...</span>\n }\n @if (child.ItemCount) {\n <span class=\"hierarchy-meta\">{{child.ItemCount}} items</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n <!-- ======================================================== -->\n <!-- SNAPSHOTS TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'snapshots' && !IsLoadingItems) {\n <div class=\"tab-pane\">\n <!-- Snapshot toolbar -->\n <div class=\"snapshot-toolbar\">\n <div class=\"snapshot-search\">\n <i class=\"fa-solid fa-search snapshot-search-icon\"></i>\n <input type=\"text\" class=\"snapshot-search-input\"\n placeholder=\"Search by entity or record...\"\n [ngModel]=\"SnapshotSearch\"\n (ngModelChange)=\"OnSnapshotSearchChange($event)\" />\n </div>\n <div class=\"snapshot-sort-toggle\">\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotSortBy === 'name'\"\n (click)=\"OnSnapshotSortChange('name')\" title=\"Sort by name\">\n @if (SnapshotSortBy === 'name' && SnapshotSortDir === 'asc') {\n <i class=\"fa-solid fa-arrow-down-a-z\"></i>\n }\n @if (SnapshotSortBy === 'name' && SnapshotSortDir === 'desc') {\n <i class=\"fa-solid fa-arrow-up-z-a\"></i>\n }\n @if (SnapshotSortBy !== 'name') {\n <i class=\"fa-solid fa-arrow-down-a-z\"></i>\n }\n </button>\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotSortBy === 'count'\"\n (click)=\"OnSnapshotSortChange('count')\" title=\"Sort by record count\">\n @if (SnapshotSortBy === 'count' && SnapshotSortDir === 'desc') {\n <i class=\"fa-solid fa-arrow-down-9-1\"></i>\n }\n @if (SnapshotSortBy === 'count' && SnapshotSortDir === 'asc') {\n <i class=\"fa-solid fa-arrow-up-1-9\"></i>\n }\n @if (SnapshotSortBy !== 'count') {\n <i class=\"fa-solid fa-arrow-down-9-1\"></i>\n }\n </button>\n </div>\n <div class=\"snapshot-view-toggle\">\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotViewMode === 'list'\" (click)=\"SnapshotViewMode = 'list'\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotViewMode === 'card'\" (click)=\"SnapshotViewMode = 'card'\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n </div>\n </div>\n <!-- Entity groups -->\n <div class=\"snapshot-groups\">\n @for (group of FilteredSnapshotGroups; track group) {\n <div class=\"snapshot-group\">\n <div class=\"group-header\" (click)=\"ToggleSnapshotGroup(group)\">\n <i class=\"fa-solid fa-chevron-right group-chevron\" [class.expanded]=\"group.IsExpanded\"></i>\n <i [class]=\"group.EntityIcon\" class=\"group-entity-icon\"></i>\n <span class=\"group-name\">{{group.EntityName}} <span class=\"group-count-inline\">{{group.Items.length}}</span></span>\n </div>\n @if (group.IsExpanded) {\n <div class=\"group-content\">\n <!-- Loading names indicator -->\n @if (group.IsLoadingNames) {\n <div class=\"group-names-loading\">\n <mj-loading text=\"Loading record names...\" size=\"small\"></mj-loading>\n </div>\n }\n <!-- List mode -->\n @if (SnapshotViewMode === 'list') {\n @for (item of group.Items; track item) {\n <div class=\"snapshot-list-item\"\n (click)=\"OpenMicroView(group.EntityName, item.RecordID, item.RecordChangeID, item.DisplayName)\">\n <i class=\"fa-solid fa-file-lines snapshot-item-icon\"></i>\n <span class=\"snapshot-item-name\">{{item.DisplayName}}</span>\n <i class=\"fa-solid fa-chevron-right snapshot-item-arrow\"></i>\n </div>\n }\n }\n <!-- Card mode -->\n @if (SnapshotViewMode === 'card') {\n <div class=\"snapshot-cards\">\n @for (item of group.Items; track item) {\n <div class=\"snapshot-card\"\n (click)=\"OpenMicroView(group.EntityName, item.RecordID, item.RecordChangeID, item.DisplayName)\">\n <div class=\"snapshot-card-header\">\n <i class=\"fa-solid fa-file-lines\"></i>\n <span class=\"snapshot-card-name\">{{item.DisplayName}}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n <!-- Empty state -->\n @if (FilteredSnapshotGroups.length === 0) {\n <div class=\"tab-empty\">\n <i class=\"fa-solid fa-camera tab-empty-icon\"></i>\n <p>No snapshot items found.</p>\n </div>\n }\n </div>\n }\n <!-- ======================================================== -->\n <!-- DEPENDENCIES TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'dependencies') {\n <div class=\"tab-pane\">\n @if (IsLoadingDependencies) {\n <mj-loading text=\"Loading dependencies...\"></mj-loading>\n }\n @if (!IsLoadingDependencies && Label.EntityID) {\n <div class=\"dep-root\">\n <div class=\"dep-root-entity\">\n <i [class]=\"GetScopeIcon(Label.Scope)\" class=\"dep-root-icon\"></i>\n <span class=\"dep-root-name\">{{Label.Entity ?? resolveEntityName(Label.EntityID)}}</span>\n <span class=\"dep-root-badge\">Root</span>\n </div>\n @if (DependencyTree.length > 0) {\n @for (node of DependencyTree; track node) {\n <ng-container *ngTemplateOutlet=\"depNode; context: { $implicit: node }\"></ng-container>\n }\n }\n @if (DependencyTree.length === 0) {\n <div class=\"dep-empty\">\n <p>No dependent entities found.</p>\n </div>\n }\n </div>\n }\n @if (!IsLoadingDependencies && !Label.EntityID) {\n <div class=\"tab-empty\">\n <i class=\"fa-solid fa-diagram-project tab-empty-icon\"></i>\n <p>No entity associated with this label.</p>\n </div>\n }\n </div>\n }\n <!-- Dependency tree node template -->\n <ng-template #depNode let-node>\n <div class=\"dep-node\" [style.padding-left.px]=\"node.Depth * 24\">\n <div class=\"dep-node-header\" (click)=\"ToggleDependencyNode(node)\">\n @if (node.Children.length > 0) {\n <i class=\"fa-solid fa-chevron-right dep-chevron\"\n [class.expanded]=\"node.IsExpanded\"\n ></i>\n }\n @if (node.Children.length === 0) {\n <span class=\"dep-node-spacer\"></span>\n }\n <i [class]=\"resolveEntityIconByName(node.EntityName)\" class=\"dep-node-icon\"></i>\n <span class=\"dep-node-name\">{{node.EntityName}}</span>\n <span class=\"dep-node-field\">via {{node.RelationshipField}}</span>\n @if (node.Children.length > 0) {\n <span class=\"dep-node-count\">\n {{node.Children.length}} dep{{node.Children.length !== 1 ? 's' : ''}}\n </span>\n }\n </div>\n @if (node.IsExpanded && node.Children.length > 0) {\n @for (child of node.Children; track child) {\n <ng-container *ngTemplateOutlet=\"depNode; context: { $implicit: child }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n <!-- ======================================================== -->\n <!-- CHANGES TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'changes') {\n <div class=\"tab-pane\">\n @if (IsLoadingDiff) {\n <mj-loading text=\"Computing differences...\"></mj-loading>\n }\n @if (!IsLoadingDiff && DiffResult) {\n <!-- Diff summary -->\n <div class=\"diff-summary\">\n <div class=\"diff-stat\">\n <span class=\"diff-stat-value change-modified\">{{DiffResult.Summary.Changed}}</span>\n <span class=\"diff-stat-label\">Changed</span>\n </div>\n <div class=\"diff-stat\">\n <span class=\"diff-stat-value\">{{DiffResult.Summary.Unchanged}}</span>\n <span class=\"diff-stat-label\">Unchanged</span>\n </div>\n <div class=\"diff-stat\">\n <span class=\"diff-stat-value\">{{DiffResult.Summary.EntitiesAffected}}</span>\n <span class=\"diff-stat-label\">Entities</span>\n </div>\n </div>\n <!-- Expand/collapse all -->\n @if (DiffResult.EntityGroups.length > 0) {\n <div class=\"diff-toolbar\">\n <button class=\"toolbar-action-btn\" (click)=\"ExpandAllDiffGroups()\" title=\"Expand all\">\n <i class=\"fa-solid fa-angles-down\"></i>\n <span>Expand All</span>\n </button>\n <button class=\"toolbar-action-btn\" (click)=\"CollapseAllDiffGroups()\" title=\"Collapse all\">\n <i class=\"fa-solid fa-angles-up\"></i>\n <span>Collapse All</span>\n </button>\n </div>\n }\n <!-- Entity diff groups -->\n @if (DiffResult.EntityGroups.length > 0) {\n <div class=\"diff-groups\">\n @for (group of DiffResult.EntityGroups; track group) {\n <div class=\"diff-group\">\n <div class=\"diff-group-header\" (click)=\"ToggleDiffGroup(group)\">\n <i class=\"fa-solid fa-chevron-right diff-chevron\" [class.expanded]=\"group.IsExpanded\"></i>\n <i [class]=\"resolveEntityIconByName(group.EntityName)\" class=\"diff-group-icon\"></i>\n <span class=\"diff-group-name\">{{group.EntityName}}</span>\n <span class=\"diff-group-count change-modified\">\n {{group.Records.length}} modified\n </span>\n </div>\n @if (group.IsExpanded) {\n <div class=\"diff-group-content\">\n @for (record of group.Records; track record) {\n <div class=\"diff-record\">\n <div class=\"diff-record-header\">\n <i [class]=\"GetChangeTypeIcon(record.ChangeType)\" [ngClass]=\"GetChangeTypeClass(record.ChangeType)\"></i>\n <span class=\"diff-record-id\">{{record.RecordID | slice:0:20}}...</span>\n </div>\n @if (record.FieldChanges.length > 0) {\n <div class=\"diff-fields\">\n @for (field of record.FieldChanges; track field) {\n <div class=\"diff-field\"\n [ngClass]=\"GetChangeTypeClass(field.ChangeType)\">\n <span class=\"diff-field-name\">{{field.FieldName}}</span>\n @if (field.OldValue) {\n <span class=\"diff-field-old\">{{field.OldValue | slice:0:40}}</span>\n }\n @if (field.OldValue && field.NewValue) {\n <i class=\"fa-solid fa-arrow-right diff-field-arrow\"></i>\n }\n @if (field.NewValue) {\n <span class=\"diff-field-new\">{{field.NewValue | slice:0:40}}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n <!-- No changes -->\n @if (DiffResult.EntityGroups.length === 0 && DiffResult.Summary.Changed === 0) {\n <div class=\"tab-empty\">\n <i class=\"fa-solid fa-circle-check tab-empty-icon\" style=\"color: #10b981;\"></i>\n <p>No changes detected since this label was created.</p>\n </div>\n }\n }\n </div>\n }\n <!-- ======================================================== -->\n <!-- HISTORY TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'history') {\n <div class=\"tab-pane\">\n @if (IsLoadingHistory) {\n <mj-loading text=\"Loading history...\"></mj-loading>\n }\n @if (!IsLoadingHistory) {\n <!-- Restores -->\n @if (Restores.length > 0) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock-rotate-left section-icon\"></i> Restore Operations\n </h3>\n <div class=\"history-list\">\n @for (restore of Restores; track restore) {\n <div class=\"history-item\">\n <div class=\"history-item-icon\" [ngClass]=\"'status-' + (restore.Status ?? '').toLowerCase().replace(' ', '-')\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n </div>\n <div class=\"history-item-content\">\n <span class=\"history-item-title\">Restore {{restore.Status}}</span>\n <span class=\"history-item-meta\">\n {{restore.CompletedItems ?? 0}}/{{restore.TotalItems ?? 0}} items\n @if (restore.FailedItems) {\n <span> · {{restore.FailedItems}} failed</span>\n }\n </span>\n </div>\n <span class=\"history-item-date\">{{FormatRelativeDate(restore.__mj_CreatedAt)}}</span>\n </div>\n }\n </div>\n </div>\n }\n <!-- Related labels -->\n @if (RelatedLabels.length > 0) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-tags section-icon\"></i> Related Labels\n </h3>\n <div class=\"history-list\">\n @for (related of RelatedLabels; track related) {\n <div class=\"history-item\">\n <div class=\"history-item-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary);\">\n <i class=\"fa-solid fa-tag\"></i>\n </div>\n <div class=\"history-item-content\">\n <span class=\"history-item-title\">{{related.Name}}</span>\n <span class=\"history-item-meta\">\n <span class=\"inline-badge small\" [ngClass]=\"GetStatusClass(related.Status)\">{{related.Status}}</span>\n </span>\n </div>\n <span class=\"history-item-date\">{{FormatRelativeDate(related.__mj_CreatedAt)}}</span>\n </div>\n }\n </div>\n </div>\n }\n <!-- Empty -->\n @if (Restores.length === 0 && RelatedLabels.length === 0) {\n <div class=\"tab-empty\">\n <i class=\"fa-solid fa-clock-rotate-left tab-empty-icon\"></i>\n <p>No restore history or related labels found.</p>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n\n <!-- ============================================================ -->\n <!-- INLINE MICRO VIEW (replaces tab content when active) -->\n <!-- ============================================================ -->\n @if (ShowMicroView && MicroViewRecord) {\n <div class=\"tab-content\">\n <mj-record-micro-view\n [Data]=\"MicroViewRecord\"\n [Inline]=\"true\"\n (Close)=\"OnBackFromMicroView()\"\n (EntityLinkClick)=\"OnEntityLinkClick($event)\"\n (OpenRecord)=\"OnOpenRecordClick($event)\">\n </mj-record-micro-view>\n </div>\n }\n</div>\n", styles: ["/* ================================================================= */\n/* BACKDROP */\n/* ================================================================= */\n\n.panel-backdrop {\n position: fixed;\n inset: 0;\n background: transparent;\n z-index: 1000;\n transition: background 0.3s ease;\n pointer-events: none;\n}\n\n.panel-backdrop.visible {\n background: var(--mj-bg-overlay);\n pointer-events: auto;\n}\n\n/* ================================================================= */\n/* PANEL */\n/* ================================================================= */\n\n.detail-panel {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-lg);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);\n /* Width is set dynamically via [style.width.px] */\n min-width: 400px;\n max-width: 92vw;\n}\n\n.detail-panel.visible {\n transform: translateX(0);\n}\n\n/* ================================================================= */\n/* RESIZE HANDLE */\n/* ================================================================= */\n\n.resize-handle {\n position: absolute;\n left: -4px;\n top: 0;\n width: 8px;\n height: 100%;\n cursor: col-resize;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.resize-handle:hover .resize-handle-grip,\n.resize-handle:active .resize-handle-grip {\n opacity: 1;\n background: var(--mj-brand-primary);\n}\n\n.resize-handle-grip {\n width: 3px;\n height: 40px;\n background: var(--mj-border-strong);\n border-radius: 3px;\n opacity: 0;\n transition: opacity 0.2s ease, background 0.2s ease;\n}\n\n.resize-handle:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n/* ================================================================= */\n/* BREADCRUMB BAR */\n/* ================================================================= */\n\n.breadcrumb-bar {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n background: var(--mj-bg-surface-sunken);\n}\n\n.breadcrumb-back {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n font-size: 13px;\n flex-shrink: 0;\n}\n\n.breadcrumb-back:hover {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.breadcrumb-trail {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n overflow: hidden;\n}\n\n.breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 5px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.breadcrumb-item.clickable {\n cursor: pointer;\n transition: color 0.15s ease;\n}\n\n.breadcrumb-item.clickable:hover {\n color: var(--mj-brand-primary);\n}\n\n.breadcrumb-item.current {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.breadcrumb-separator {\n font-size: 9px;\n color: var(--mj-border-strong);\n flex-shrink: 0;\n}\n\n.breadcrumb-icon {\n font-size: 12px;\n flex-shrink: 0;\n}\n\n/* ================================================================= */\n/* HEADER */\n/* ================================================================= */\n\n.panel-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.header-info {\n flex: 1;\n min-width: 0;\n}\n\n.header-title-row {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.header-scope-icon {\n color: var(--mj-brand-primary);\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.header-title {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.header-status {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.header-scope-badge {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n color: var(--mj-brand-primary);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.header-description {\n margin: 8px 0 0 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n align-items: center;\n flex-shrink: 0;\n margin-left: 16px;\n}\n\n.header-action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n font-size: 14px;\n}\n\n.header-action-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.header-action-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.close-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: none;\n border: none;\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n font-size: 16px;\n}\n\n.close-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n/* Status badges (reused) */\n.status-active { background: color-mix(in srgb, var(--mj-status-success) 10%, transparent); color: var(--mj-status-success); }\n.status-archived { background: color-mix(in srgb, var(--mj-text-muted) 10%, transparent); color: var(--mj-text-muted); }\n.status-restored { background: color-mix(in srgb, var(--mj-status-warning) 10%, transparent); color: var(--mj-status-warning); }\n\n/* ================================================================= */\n/* SUMMARY KPIs */\n/* ================================================================= */\n\n.summary-kpis {\n display: flex;\n gap: 12px;\n padding: 16px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n overflow-x: auto;\n}\n\n.summary-kpi {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n flex-shrink: 0;\n}\n\n.kpi-mini-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n font-size: 15px;\n flex-shrink: 0;\n}\n\n.kpi-mini-content {\n display: flex;\n flex-direction: column;\n}\n\n.kpi-mini-value {\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.kpi-mini-label {\n font-size: 11px;\n color: var(--mj-text-disabled);\n margin-top: 2px;\n}\n\n/* ================================================================= */\n/* TAB BAR */\n/* ================================================================= */\n\n.tab-bar {\n display: flex;\n gap: 0;\n padding: 0 24px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n overflow-x: auto;\n}\n\n.tab {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 12px 16px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.tab:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.tab.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.tab-icon {\n font-size: 13px;\n}\n\n.tab-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n}\n\n/* ================================================================= */\n/* TAB CONTENT */\n/* ================================================================= */\n\n.tab-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.tab-pane {\n padding: 20px 24px;\n animation: tabFadeIn 0.2s ease;\n}\n\n@keyframes tabFadeIn {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.tab-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n}\n\n.tab-empty-icon {\n font-size: 40px;\n color: var(--mj-border-strong);\n margin-bottom: 12px;\n}\n\n.tab-empty p {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin: 0;\n}\n\n/* ================================================================= */\n/* OVERVIEW TAB */\n/* ================================================================= */\n\n.detail-section {\n margin-bottom: 24px;\n}\n\n.section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 14px 0;\n padding-bottom: 10px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.section-icon {\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.detail-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 14px;\n}\n\n.detail-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.field-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.field-value {\n font-size: 14px;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n}\n\n.field-mono {\n font-family: 'SF Mono', 'Fira Code', monospace;\n font-size: 13px;\n word-break: break-all;\n}\n\n.field-record-name {\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n/* Record card for Record-scoped labels on overview tab */\n.record-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 16px 18px;\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n border-radius: 12px;\n margin-bottom: 24px;\n}\n\n.record-card-main {\n display: flex;\n align-items: center;\n gap: 14px;\n min-width: 0;\n flex: 1;\n}\n\n.record-card-icon {\n font-size: 22px;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.record-card-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.record-card-name {\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.record-card-name-loading {\n color: var(--mj-text-disabled);\n font-weight: 500;\n font-style: italic;\n}\n\n.record-card-entity {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.record-card-id {\n font-size: 12px;\n color: var(--mj-text-disabled);\n font-family: 'SF Mono', 'Fira Code', monospace;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.record-card-open-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n flex-shrink: 0;\n white-space: nowrap;\n}\n\n.record-card-open-btn:hover {\n background: var(--mj-brand-primary-hover);\n box-shadow: var(--mj-shadow-md);\n}\n\n.inline-badge {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.inline-badge.small {\n padding: 2px 8px;\n font-size: 11px;\n}\n\n.description-text {\n font-size: 14px;\n color: var(--mj-text-secondary);\n line-height: 1.6;\n margin: 0;\n}\n\n/* Hierarchy */\n.hierarchy-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 12px;\n border-radius: 8px;\n font-size: 14px;\n transition: background 0.15s ease;\n}\n\n.hierarchy-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.hierarchy-icon {\n color: var(--mj-text-disabled);\n font-size: 13px;\n width: 16px;\n text-align: center;\n}\n\n.hierarchy-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n}\n\n.hierarchy-name {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.hierarchy-meta {\n font-size: 12px;\n color: var(--mj-text-disabled);\n font-family: monospace;\n}\n\n.hierarchy-children {\n margin-left: 16px;\n border-left: 2px solid var(--mj-border-default);\n padding-left: 8px;\n}\n\n/* ================================================================= */\n/* SNAPSHOTS TAB */\n/* ================================================================= */\n\n.snapshot-toolbar {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.snapshot-search {\n position: relative;\n flex: 1;\n}\n\n.snapshot-search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n.snapshot-search-input {\n width: 100%;\n padding: 8px 12px 8px 36px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n color: var(--mj-text-primary);\n outline: none;\n box-sizing: border-box;\n transition: border-color 0.15s ease;\n}\n\n.snapshot-search-input:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.snapshot-sort-toggle,\n.snapshot-view-toggle {\n display: flex;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.toggle-btn-sm {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n background: transparent;\n border: none;\n cursor: pointer;\n color: var(--mj-text-disabled);\n transition: all 0.15s ease;\n font-size: 12px;\n}\n\n.toggle-btn-sm:hover {\n color: var(--mj-text-primary);\n}\n\n.toggle-btn-sm.active {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.toggle-btn-sm + .toggle-btn-sm {\n border-left: 1px solid var(--mj-border-default);\n}\n\n/* Snapshot groups */\n.snapshot-groups {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.snapshot-group {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n overflow: hidden;\n}\n\n.group-header {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 14px;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.group-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.group-chevron {\n font-size: 11px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n width: 14px;\n text-align: center;\n}\n\n.group-chevron.expanded {\n transform: rotate(90deg);\n}\n\n.group-entity-icon {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.group-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n.group-count-inline {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n margin-left: 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n border-radius: 10px;\n font-size: 12px;\n font-weight: 600;\n vertical-align: middle;\n}\n\n.group-content {\n border-top: 1px solid var(--mj-border-default);\n animation: tabFadeIn 0.15s ease;\n}\n\n.group-names-loading {\n display: flex;\n justify-content: center;\n padding: 8px 14px;\n}\n\n/* Snapshot list items */\n.snapshot-list-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px 10px 40px;\n cursor: pointer;\n transition: background 0.15s ease;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.snapshot-list-item:last-child {\n border-bottom: none;\n}\n\n.snapshot-list-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n.snapshot-item-icon {\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n.snapshot-item-name {\n flex: 1;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.snapshot-item-id {\n font-size: 12px;\n color: var(--mj-text-disabled);\n font-family: monospace;\n}\n\n.snapshot-item-arrow {\n color: var(--mj-border-strong);\n font-size: 11px;\n transition: transform 0.15s ease, color 0.15s ease;\n}\n\n.snapshot-list-item:hover .snapshot-item-arrow {\n color: var(--mj-brand-primary);\n transform: translateX(2px);\n}\n\n/* Snapshot cards */\n.snapshot-cards {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 10px;\n padding: 12px 14px;\n}\n\n.snapshot-card {\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.snapshot-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.snapshot-card-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.snapshot-card-header i {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.snapshot-card-name {\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.snapshot-card-meta {\n font-size: 11px;\n color: var(--mj-text-disabled);\n font-family: monospace;\n}\n\n/* ================================================================= */\n/* DEPENDENCIES TAB */\n/* ================================================================= */\n\n.dep-root {\n padding: 4px 0;\n}\n\n.dep-root-entity {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 14px;\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n border-radius: 10px;\n margin-bottom: 12px;\n}\n\n.dep-root-icon {\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.dep-root-name {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n.dep-root-badge {\n padding: 2px 10px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n}\n\n.dep-node {\n margin-left: 8px;\n border-left: 2px solid var(--mj-border-default);\n}\n\n.dep-node-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n transition: background 0.15s ease;\n border-radius: 6px;\n}\n\n.dep-node-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.dep-chevron {\n font-size: 10px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n width: 12px;\n text-align: center;\n}\n\n.dep-chevron.expanded {\n transform: rotate(90deg);\n}\n\n.dep-node-spacer {\n width: 12px;\n}\n\n.dep-node-icon {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n.dep-node-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.dep-node-field {\n font-size: 11px;\n color: var(--mj-text-disabled);\n font-style: italic;\n}\n\n.dep-node-count {\n font-size: 11px;\n color: var(--mj-text-disabled);\n padding: 1px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n}\n\n.dep-empty {\n padding: 20px;\n text-align: center;\n}\n\n.dep-empty p {\n font-size: 14px;\n color: var(--mj-text-disabled);\n margin: 0;\n}\n\n/* ================================================================= */\n/* CHANGES TAB */\n/* ================================================================= */\n\n.diff-summary {\n display: flex;\n gap: 16px;\n margin-bottom: 20px;\n}\n\n.diff-stat {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 12px 20px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n min-width: 80px;\n}\n\n.diff-stat-value {\n font-size: 24px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.diff-stat-label {\n font-size: 12px;\n color: var(--mj-text-disabled);\n margin-top: 4px;\n}\n\n/* Diff toolbar */\n.diff-toolbar {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.toolbar-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.toolbar-action-btn i {\n font-size: 11px;\n}\n\n.toolbar-action-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n}\n\n.diff-groups {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.diff-group {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n overflow: hidden;\n}\n\n.diff-group-header {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 14px;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.diff-group-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.diff-chevron {\n font-size: 11px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n width: 14px;\n text-align: center;\n}\n\n.diff-chevron.expanded {\n transform: rotate(90deg);\n}\n\n.diff-group-icon {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.diff-group-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n.diff-group-count {\n font-size: 12px;\n font-weight: 600;\n padding: 2px 10px;\n border-radius: 10px;\n}\n\n.diff-group-content {\n border-top: 1px solid var(--mj-border-default);\n animation: tabFadeIn 0.15s ease;\n}\n\n.diff-record {\n padding: 10px 14px 10px 40px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.diff-record:last-child {\n border-bottom: none;\n}\n\n.diff-record-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.diff-record-id {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n font-family: monospace;\n}\n\n.diff-fields {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin-left: 22px;\n}\n\n.diff-field {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n}\n\n.diff-field-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n min-width: 100px;\n}\n\n.diff-field-old {\n color: var(--mj-status-error);\n text-decoration: line-through;\n opacity: 0.7;\n font-family: monospace;\n font-size: 12px;\n}\n\n.diff-field-arrow {\n color: var(--mj-text-disabled);\n font-size: 10px;\n}\n\n.diff-field-new {\n color: var(--mj-status-success);\n font-family: monospace;\n font-size: 12px;\n}\n\n/* Change type colors */\n.change-added { color: var(--mj-status-success); }\n.change-modified { color: var(--mj-status-warning); }\n.change-removed { color: var(--mj-status-error); }\n\n.diff-field.change-added { background: color-mix(in srgb, var(--mj-status-success) 6%, transparent); }\n.diff-field.change-modified { background: color-mix(in srgb, var(--mj-status-warning) 6%, transparent); }\n.diff-field.change-removed { background: color-mix(in srgb, var(--mj-status-error) 6%, transparent); }\n\n/* ================================================================= */\n/* HISTORY TAB */\n/* ================================================================= */\n\n.history-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.history-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 8px;\n transition: background 0.15s ease;\n}\n\n.history-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.history-item-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: 8px;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.history-item-icon.status-complete { background: color-mix(in srgb, var(--mj-status-success) 10%, transparent); color: var(--mj-status-success); }\n.history-item-icon.status-error { background: color-mix(in srgb, var(--mj-status-error) 10%, transparent); color: var(--mj-status-error); }\n.history-item-icon.status-partial { background: color-mix(in srgb, var(--mj-status-warning) 10%, transparent); color: var(--mj-status-warning); }\n.history-item-icon.status-in-progress { background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary); }\n.history-item-icon.status-pending { background: color-mix(in srgb, var(--mj-text-muted) 10%, transparent); color: var(--mj-text-muted); }\n\n.history-item-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.history-item-title {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.history-item-meta {\n font-size: 12px;\n color: var(--mj-text-disabled);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.history-item-date {\n font-size: 12px;\n color: var(--mj-text-disabled);\n flex-shrink: 0;\n}\n\n/* ================================================================= */\n/* RESPONSIVE */\n/* ================================================================= */\n\n@media (max-width: 1024px) {\n .detail-panel {\n min-width: 360px;\n }\n\n .summary-kpis {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 768px) {\n .detail-panel {\n width: 100% !important;\n min-width: unset;\n }\n\n .resize-handle {\n display: none;\n }\n\n .detail-grid {\n grid-template-columns: 1fr;\n }\n\n .summary-kpis {\n flex-wrap: wrap;\n gap: 8px;\n padding: 12px 16px;\n }\n\n .summary-kpi {\n padding: 8px 10px;\n }\n\n .panel-header {\n padding: 16px 16px 12px;\n }\n\n .tab-bar {\n padding: 0 16px;\n }\n\n .tab-pane {\n padding: 16px;\n }\n\n .breadcrumb-bar {\n padding: 8px 16px;\n }\n\n .snapshot-toolbar {\n flex-direction: column;\n align-items: stretch;\n }\n\n .diff-summary {\n flex-wrap: wrap;\n gap: 8px;\n }\n\n .diff-stat {\n padding: 10px 14px;\n min-width: 60px;\n }\n}\n\n@media (max-width: 480px) {\n .header-title {\n font-size: 16px;\n }\n\n .header-title-row {\n gap: 6px;\n }\n\n .header-actions {\n margin-left: 8px;\n }\n\n .tab {\n padding: 10px 10px;\n font-size: 12px;\n }\n\n .snapshot-cards {\n grid-template-columns: 1fr;\n }\n}\n"] }]
|
|
2062
|
+
args: [{ standalone: false, selector: 'mj-label-detail-panel', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Backdrop overlay -->\n<div class=\"panel-backdrop\" [class.visible]=\"IsVisible\" (click)=\"OnBackdropClick()\"></div>\n\n<!-- Slide-in panel -->\n<div class=\"detail-panel\" [class.visible]=\"IsVisible\" [style.width.px]=\"PanelWidthPx\">\n <!-- Resize handle -->\n <div class=\"resize-handle\" (mousedown)=\"OnResizeStart($event)\">\n <div class=\"resize-handle-grip\"></div>\n </div>\n\n <!-- ============================================================ -->\n <!-- HEADER -->\n <!-- ============================================================ -->\n <div class=\"panel-header\">\n <div class=\"header-info\">\n <div class=\"header-title-row\">\n <i [class]=\"GetScopeIcon(Label.Scope)\" class=\"header-scope-icon\"></i>\n <h2 class=\"header-title\">{{Label.Name}}</h2>\n <span class=\"header-status\" [ngClass]=\"GetStatusClass(Label.Status)\">\n {{Label.Status}}\n </span>\n <span class=\"header-scope-badge\">{{Label.Scope}}</span>\n </div>\n @if (Label.Description) {\n <p class=\"header-description\">{{Label.Description}}</p>\n }\n </div>\n <div class=\"header-actions\">\n <button class=\"header-action-btn\" (click)=\"OnArchive()\"\n [disabled]=\"IsArchiving || Label.Status === 'Archived'\"\n title=\"Archive this label\">\n <i class=\"fa-solid fa-box-archive\"></i>\n </button>\n <button class=\"header-action-btn\" (click)=\"OnTabChange('changes')\" title=\"View changes\">\n <i class=\"fa-solid fa-code-compare\"></i>\n </button>\n <button class=\"close-btn\" (click)=\"OnClose()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n\n <!-- ============================================================ -->\n <!-- SUMMARY KPIs -->\n <!-- ============================================================ -->\n <div class=\"summary-kpis\">\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary);\">\n <i class=\"fa-solid fa-camera\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{LabelItems.length || Label.ItemCount || GetItemCount(Label.ID)}}</span>\n <span class=\"kpi-mini-label\">Items</span>\n </div>\n </div>\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary);\">\n <i class=\"fa-solid fa-table\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{UniqueEntityCount}}</span>\n <span class=\"kpi-mini-label\">Entities</span>\n </div>\n </div>\n @if (Label.CreationDurationMS) {\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: rgba(16, 185, 129, 0.1); color: #10b981;\">\n <i class=\"fa-solid fa-stopwatch\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{FormatDuration(Label.CreationDurationMS)}}</span>\n <span class=\"kpi-mini-label\">Duration</span>\n </div>\n </div>\n }\n @if (ChildLabels.length > 0) {\n <div class=\"summary-kpi\">\n <div class=\"kpi-mini-icon\" style=\"background: rgba(245, 158, 11, 0.1); color: #f59e0b;\">\n <i class=\"fa-solid fa-layer-group\"></i>\n </div>\n <div class=\"kpi-mini-content\">\n <span class=\"kpi-mini-value\">{{ChildLabels.length}}</span>\n <span class=\"kpi-mini-label\">Children</span>\n </div>\n </div>\n }\n </div>\n\n <!-- ============================================================ -->\n <!-- TAB BAR (hidden when micro-view is active) -->\n <!-- ============================================================ -->\n @if (!ShowMicroView) {\n <div class=\"tab-bar\">\n <button class=\"tab\" [class.active]=\"ActiveTab === 'overview'\" (click)=\"OnTabChange('overview')\">\n <i class=\"fa-solid fa-info-circle tab-icon\"></i> Overview\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'snapshots'\" (click)=\"OnTabChange('snapshots')\">\n <i class=\"fa-solid fa-camera tab-icon\"></i> Snapshots\n @if (LabelItems.length > 0) {\n <span class=\"tab-count\">{{LabelItems.length}}</span>\n }\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'dependencies'\" (click)=\"OnTabChange('dependencies')\">\n <i class=\"fa-solid fa-diagram-project tab-icon\"></i> Dependencies\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'changes'\" (click)=\"OnTabChange('changes')\">\n <i class=\"fa-solid fa-code-compare tab-icon\"></i> Changes\n </button>\n <button class=\"tab\" [class.active]=\"ActiveTab === 'history'\" (click)=\"OnTabChange('history')\">\n <i class=\"fa-solid fa-clock-rotate-left tab-icon\"></i> History\n </button>\n </div>\n }\n\n <!-- ============================================================ -->\n <!-- BREADCRUMB (shown when micro-view is active) -->\n <!-- ============================================================ -->\n @if (ShowMicroView) {\n <div class=\"breadcrumb-bar\">\n <button class=\"breadcrumb-back\" (click)=\"OnBackFromMicroView()\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n </button>\n <div class=\"breadcrumb-trail\">\n <span class=\"breadcrumb-item clickable\" (click)=\"OnBackFromMicroView()\">\n <i class=\"fa-solid fa-camera breadcrumb-icon\"></i> Snapshots\n </span>\n <i class=\"fa-solid fa-chevron-right breadcrumb-separator\"></i>\n <span class=\"breadcrumb-item current\">\n <i class=\"fa-solid fa-file-lines breadcrumb-icon\"></i> {{BreadcrumbLabel}}\n </span>\n </div>\n </div>\n }\n\n <!-- ============================================================ -->\n <!-- TAB CONTENT (scrollable) - or inline micro-view -->\n <!-- ============================================================ -->\n @if (!ShowMicroView) {\n <div class=\"tab-content\">\n <!-- Loading state for items -->\n @if (IsLoadingItems && ActiveTab !== 'dependencies') {\n <mj-loading text=\"Loading label data...\"></mj-loading>\n }\n <!-- ======================================================== -->\n <!-- OVERVIEW TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'overview' && !IsLoadingItems) {\n <div class=\"tab-pane\">\n <!-- Metadata section -->\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-info-circle section-icon\"></i> Label Details\n </h3>\n <div class=\"detail-grid\">\n <div class=\"detail-field\">\n <span class=\"field-label\">Name</span>\n <span class=\"field-value\">{{Label.Name}}</span>\n </div>\n <div class=\"detail-field\">\n <span class=\"field-label\">Status</span>\n <span class=\"field-value\">\n <span class=\"inline-badge\" [ngClass]=\"GetStatusClass(Label.Status)\">{{Label.Status}}</span>\n </span>\n </div>\n <div class=\"detail-field\">\n <span class=\"field-label\">Scope</span>\n <span class=\"field-value\">\n <i [class]=\"GetScopeIcon(Label.Scope)\" style=\"margin-right: 6px;\"></i>{{Label.Scope}}\n </span>\n </div>\n @if (Label.EntityID) {\n <div class=\"detail-field\">\n <span class=\"field-label\">Entity</span>\n <span class=\"field-value\">\n <i [class]=\"OverviewEntityIcon\" style=\"margin-right: 6px; color: var(--mj-brand-primary);\"></i>{{Label.Entity ?? resolveEntityName(Label.EntityID)}}\n </span>\n </div>\n }\n @if (Label.RecordID && Label.Scope !== 'Record') {\n <div class=\"detail-field\">\n <span class=\"field-label\">Record ID</span>\n <span class=\"field-value field-mono\">{{FormatRecordID(Label.RecordID)}}</span>\n </div>\n }\n @if (Label.ExternalSystemID) {\n <div class=\"detail-field\">\n <span class=\"field-label\">External Ref</span>\n <span class=\"field-value field-mono\">{{Label.ExternalSystemID}}</span>\n </div>\n }\n </div>\n </div>\n <!-- Record card (Record-scoped labels) -->\n @if (Label.Scope === 'Record' && Label.RecordID) {\n <div class=\"record-card\">\n <div class=\"record-card-main\">\n <i [class]=\"OverviewEntityIcon\" class=\"record-card-icon\"></i>\n <div class=\"record-card-info\">\n @if (OverviewRecordName) {\n <span class=\"record-card-name\">{{OverviewRecordName}}</span>\n }\n @if (!OverviewRecordName) {\n <span class=\"record-card-name record-card-name-loading\">Loading...</span>\n }\n <span class=\"record-card-entity\">{{Label.Entity ?? resolveEntityName(Label.EntityID)}}</span>\n <span class=\"record-card-id\">{{FormatRecordID(Label.RecordID)}}</span>\n </div>\n </div>\n <button class=\"record-card-open-btn\" (click)=\"OnOpenOverviewRecord()\" title=\"Open record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open\n </button>\n </div>\n }\n <!-- Description -->\n @if (Label.Description) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-align-left section-icon\"></i> Description\n </h3>\n <p class=\"description-text\">{{Label.Description}}</p>\n </div>\n }\n <!-- Creation info -->\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock section-icon\"></i> Creation\n </h3>\n <div class=\"detail-grid\">\n <div class=\"detail-field\">\n <span class=\"field-label\">Created</span>\n <span class=\"field-value\">{{FormatDate(Label.__mj_CreatedAt)}}</span>\n </div>\n @if (Label.CreatedByUser) {\n <div class=\"detail-field\">\n <span class=\"field-label\">Created By</span>\n <span class=\"field-value\">\n <i class=\"fa-solid fa-user\" style=\"margin-right: 6px; opacity: 0.5;\"></i>{{Label.CreatedByUser}}\n </span>\n </div>\n }\n @if (Label.CreationDurationMS) {\n <div class=\"detail-field\">\n <span class=\"field-label\">Capture Duration</span>\n <span class=\"field-value\">{{FormatDuration(Label.CreationDurationMS)}}</span>\n </div>\n }\n <div class=\"detail-field\">\n <span class=\"field-label\">Items Captured</span>\n <span class=\"field-value\">{{LabelItems.length}}</span>\n </div>\n </div>\n </div>\n <!-- Parent / Children -->\n @if (Label.ParentID || ChildLabels.length > 0) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-sitemap section-icon\"></i> Hierarchy\n </h3>\n <!-- Parent reference -->\n @if (Label.ParentID) {\n <div class=\"hierarchy-item parent\">\n <i class=\"fa-solid fa-arrow-up hierarchy-icon\"></i>\n <span class=\"hierarchy-label\">Parent:</span>\n <span class=\"hierarchy-name\">\n @for (pl of AllLabels; track pl) {\n @if (IsParentLabel(pl)) {\n <span>{{pl.Name}}</span>\n }\n }\n </span>\n </div>\n }\n <!-- Children -->\n @if (ChildLabels.length > 0) {\n <div class=\"hierarchy-children\">\n @for (child of ChildLabels; track child) {\n <div class=\"hierarchy-item child\">\n <i class=\"fa-solid fa-arrow-turn-down-right hierarchy-icon\"></i>\n <span class=\"hierarchy-name\">{{child.Name}}</span>\n @if (child.RecordID) {\n <span class=\"hierarchy-meta\">{{child.RecordID | slice:0:12}}...</span>\n }\n @if (child.ItemCount) {\n <span class=\"hierarchy-meta\">{{child.ItemCount}} items</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n <!-- ======================================================== -->\n <!-- SNAPSHOTS TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'snapshots' && !IsLoadingItems) {\n <div class=\"tab-pane\">\n <!-- Snapshot toolbar -->\n <div class=\"snapshot-toolbar\">\n <div class=\"snapshot-search\">\n <i class=\"fa-solid fa-search snapshot-search-icon\"></i>\n <input type=\"text\" class=\"snapshot-search-input\"\n placeholder=\"Search by entity or record...\"\n [ngModel]=\"SnapshotSearch\"\n (ngModelChange)=\"OnSnapshotSearchChange($event)\" />\n </div>\n <div class=\"snapshot-sort-toggle\">\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotSortBy === 'name'\"\n (click)=\"OnSnapshotSortChange('name')\" title=\"Sort by name\">\n @if (SnapshotSortBy === 'name' && SnapshotSortDir === 'asc') {\n <i class=\"fa-solid fa-arrow-down-a-z\"></i>\n }\n @if (SnapshotSortBy === 'name' && SnapshotSortDir === 'desc') {\n <i class=\"fa-solid fa-arrow-up-z-a\"></i>\n }\n @if (SnapshotSortBy !== 'name') {\n <i class=\"fa-solid fa-arrow-down-a-z\"></i>\n }\n </button>\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotSortBy === 'count'\"\n (click)=\"OnSnapshotSortChange('count')\" title=\"Sort by record count\">\n @if (SnapshotSortBy === 'count' && SnapshotSortDir === 'desc') {\n <i class=\"fa-solid fa-arrow-down-9-1\"></i>\n }\n @if (SnapshotSortBy === 'count' && SnapshotSortDir === 'asc') {\n <i class=\"fa-solid fa-arrow-up-1-9\"></i>\n }\n @if (SnapshotSortBy !== 'count') {\n <i class=\"fa-solid fa-arrow-down-9-1\"></i>\n }\n </button>\n </div>\n <div class=\"snapshot-view-toggle\">\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotViewMode === 'list'\" (click)=\"SnapshotViewMode = 'list'\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n <button class=\"toggle-btn-sm\" [class.active]=\"SnapshotViewMode === 'card'\" (click)=\"SnapshotViewMode = 'card'\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n </div>\n </div>\n <!-- Entity groups -->\n <div class=\"snapshot-groups\">\n @for (group of FilteredSnapshotGroups; track group) {\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"group.IsExpanded\" (ExpandedChange)=\"ToggleSnapshotGroup(group)\">\n <ng-template mjAccordionTitle>\n <i [class]=\"group.EntityIcon\" class=\"group-entity-icon\"></i>\n <span class=\"group-name\">{{group.EntityName}}</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{group.Items.length}}</span>\n </ng-template>\n <ng-template mjAccordionBody>\n <div class=\"group-content\">\n <!-- Loading names indicator -->\n @if (group.IsLoadingNames) {\n <div class=\"group-names-loading\">\n <mj-loading text=\"Loading record names...\" size=\"small\"></mj-loading>\n </div>\n }\n <!-- List mode -->\n @if (SnapshotViewMode === 'list') {\n @for (item of group.Items; track item) {\n <div class=\"snapshot-list-item\"\n (click)=\"OpenMicroView(group.EntityName, item.RecordID, item.RecordChangeID, item.DisplayName)\">\n <i class=\"fa-solid fa-file-lines snapshot-item-icon\"></i>\n <span class=\"snapshot-item-name\">{{item.DisplayName}}</span>\n <i class=\"fa-solid fa-chevron-right snapshot-item-arrow\"></i>\n </div>\n }\n }\n <!-- Card mode -->\n @if (SnapshotViewMode === 'card') {\n <div class=\"snapshot-cards\">\n @for (item of group.Items; track item) {\n <div class=\"snapshot-card\"\n (click)=\"OpenMicroView(group.EntityName, item.RecordID, item.RecordChangeID, item.DisplayName)\">\n <div class=\"snapshot-card-header\">\n <i class=\"fa-solid fa-file-lines\"></i>\n <span class=\"snapshot-card-name\">{{item.DisplayName}}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n </mj-accordion-panel>\n }\n </div>\n <!-- Empty state -->\n @if (FilteredSnapshotGroups.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-camera\"\n Title=\"No snapshot items found.\" />\n }\n </div>\n }\n <!-- ======================================================== -->\n <!-- DEPENDENCIES TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'dependencies') {\n <div class=\"tab-pane\">\n @if (IsLoadingDependencies) {\n <mj-loading text=\"Loading dependencies...\"></mj-loading>\n }\n @if (!IsLoadingDependencies && Label.EntityID) {\n <div class=\"dep-root\">\n <div class=\"dep-root-entity\">\n <i [class]=\"GetScopeIcon(Label.Scope)\" class=\"dep-root-icon\"></i>\n <span class=\"dep-root-name\">{{Label.Entity ?? resolveEntityName(Label.EntityID)}}</span>\n <span class=\"dep-root-badge\">Root</span>\n </div>\n @if (DependencyTree.length > 0) {\n @for (node of DependencyTree; track node) {\n <ng-container *ngTemplateOutlet=\"depNode; context: { $implicit: node }\"></ng-container>\n }\n }\n @if (DependencyTree.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-diagram-project\"\n Title=\"No dependent entities found.\" />\n }\n </div>\n }\n @if (!IsLoadingDependencies && !Label.EntityID) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-diagram-project\"\n Title=\"No entity associated with this label.\" />\n }\n </div>\n }\n <!-- Dependency tree node template -->\n <ng-template #depNode let-node>\n <div class=\"dep-node\" [style.padding-left.px]=\"node.Depth * 24\">\n <div class=\"dep-node-header\" (click)=\"ToggleDependencyNode(node)\">\n @if (node.Children.length > 0) {\n <i class=\"fa-solid fa-chevron-right dep-chevron\"\n [class.expanded]=\"node.IsExpanded\"\n ></i>\n }\n @if (node.Children.length === 0) {\n <span class=\"dep-node-spacer\"></span>\n }\n <i [class]=\"resolveEntityIconByName(node.EntityName)\" class=\"dep-node-icon\"></i>\n <span class=\"dep-node-name\">{{node.EntityName}}</span>\n <span class=\"dep-node-field\">via {{node.RelationshipField}}</span>\n @if (node.Children.length > 0) {\n <span class=\"dep-node-count\">\n {{node.Children.length}} dep{{node.Children.length !== 1 ? 's' : ''}}\n </span>\n }\n </div>\n @if (node.IsExpanded && node.Children.length > 0) {\n @for (child of node.Children; track child) {\n <ng-container *ngTemplateOutlet=\"depNode; context: { $implicit: child }\"></ng-container>\n }\n }\n </div>\n </ng-template>\n <!-- ======================================================== -->\n <!-- CHANGES TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'changes') {\n <div class=\"tab-pane\">\n @if (IsLoadingDiff) {\n <mj-loading text=\"Computing differences...\"></mj-loading>\n }\n @if (!IsLoadingDiff && DiffResult) {\n <!-- Diff summary -->\n <div class=\"diff-summary\">\n <div class=\"diff-stat\">\n <span class=\"diff-stat-value change-modified\">{{DiffResult.Summary.Changed}}</span>\n <span class=\"diff-stat-label\">Changed</span>\n </div>\n <div class=\"diff-stat\">\n <span class=\"diff-stat-value\">{{DiffResult.Summary.Unchanged}}</span>\n <span class=\"diff-stat-label\">Unchanged</span>\n </div>\n <div class=\"diff-stat\">\n <span class=\"diff-stat-value\">{{DiffResult.Summary.EntitiesAffected}}</span>\n <span class=\"diff-stat-label\">Entities</span>\n </div>\n </div>\n <!-- Expand/collapse all -->\n @if (DiffResult.EntityGroups.length > 0) {\n <div class=\"diff-toolbar\">\n <button class=\"toolbar-action-btn\" (click)=\"ExpandAllDiffGroups()\" title=\"Expand all\">\n <i class=\"fa-solid fa-angles-down\"></i>\n <span>Expand All</span>\n </button>\n <button class=\"toolbar-action-btn\" (click)=\"CollapseAllDiffGroups()\" title=\"Collapse all\">\n <i class=\"fa-solid fa-angles-up\"></i>\n <span>Collapse All</span>\n </button>\n </div>\n }\n <!-- Entity diff groups -->\n @if (DiffResult.EntityGroups.length > 0) {\n <div class=\"diff-groups\">\n @for (group of DiffResult.EntityGroups; track group) {\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"group.IsExpanded\" (ExpandedChange)=\"ToggleDiffGroup(group)\">\n <ng-template mjAccordionTitle>\n <i [class]=\"resolveEntityIconByName(group.EntityName)\" class=\"diff-group-icon\"></i>\n <span class=\"diff-group-name\">{{group.EntityName}}</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--warning mj-accordion-badge--right\">\n {{group.Records.length}} modified\n </span>\n </ng-template>\n <ng-template mjAccordionBody>\n <div class=\"diff-group-content\">\n @for (record of group.Records; track record) {\n <div class=\"diff-record\">\n <div class=\"diff-record-header\">\n <i [class]=\"GetChangeTypeIcon(record.ChangeType)\" [ngClass]=\"GetChangeTypeClass(record.ChangeType)\"></i>\n <span class=\"diff-record-id\">{{record.RecordID | slice:0:20}}...</span>\n </div>\n @if (record.FieldChanges.length > 0) {\n <div class=\"diff-fields\">\n @for (field of record.FieldChanges; track field) {\n <div class=\"diff-field\"\n [ngClass]=\"GetChangeTypeClass(field.ChangeType)\">\n <span class=\"diff-field-name\">{{field.FieldName}}</span>\n @if (field.OldValue) {\n <span class=\"diff-field-old\">{{field.OldValue | slice:0:40}}</span>\n }\n @if (field.OldValue && field.NewValue) {\n <i class=\"fa-solid fa-arrow-right diff-field-arrow\"></i>\n }\n @if (field.NewValue) {\n <span class=\"diff-field-new\">{{field.NewValue | slice:0:40}}</span>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n </mj-accordion-panel>\n }\n </div>\n }\n <!-- No changes -->\n @if (DiffResult.EntityGroups.length === 0 && DiffResult.Summary.Changed === 0) {\n <mj-empty-state\n Size=\"compact\"\n Variant=\"success\"\n Title=\"No changes detected since this label was created.\" />\n }\n }\n </div>\n }\n <!-- ======================================================== -->\n <!-- HISTORY TAB -->\n <!-- ======================================================== -->\n @if (ActiveTab === 'history') {\n <div class=\"tab-pane\">\n @if (IsLoadingHistory) {\n <mj-loading text=\"Loading history...\"></mj-loading>\n }\n @if (!IsLoadingHistory) {\n <!-- Restores -->\n @if (Restores.length > 0) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-clock-rotate-left section-icon\"></i> Restore Operations\n </h3>\n <div class=\"history-list\">\n @for (restore of Restores; track restore) {\n <div class=\"history-item\">\n <div class=\"history-item-icon\" [ngClass]=\"'status-' + (restore.Status ?? '').toLowerCase().replace(' ', '-')\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n </div>\n <div class=\"history-item-content\">\n <span class=\"history-item-title\">Restore {{restore.Status}}</span>\n <span class=\"history-item-meta\">\n {{restore.CompletedItems ?? 0}}/{{restore.TotalItems ?? 0}} items\n @if (restore.FailedItems) {\n <span> · {{restore.FailedItems}} failed</span>\n }\n </span>\n </div>\n <span class=\"history-item-date\">{{FormatRelativeDate(restore.__mj_CreatedAt)}}</span>\n </div>\n }\n </div>\n </div>\n }\n <!-- Related labels -->\n @if (RelatedLabels.length > 0) {\n <div class=\"detail-section\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-tags section-icon\"></i> Related Labels\n </h3>\n <div class=\"history-list\">\n @for (related of RelatedLabels; track related) {\n <div class=\"history-item\">\n <div class=\"history-item-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary);\">\n <i class=\"fa-solid fa-tag\"></i>\n </div>\n <div class=\"history-item-content\">\n <span class=\"history-item-title\">{{related.Name}}</span>\n <span class=\"history-item-meta\">\n <span class=\"inline-badge small\" [ngClass]=\"GetStatusClass(related.Status)\">{{related.Status}}</span>\n </span>\n </div>\n <span class=\"history-item-date\">{{FormatRelativeDate(related.__mj_CreatedAt)}}</span>\n </div>\n }\n </div>\n </div>\n }\n <!-- Empty -->\n @if (Restores.length === 0 && RelatedLabels.length === 0) {\n <mj-empty-state\n Size=\"compact\"\n Icon=\"fa-solid fa-clock-rotate-left\"\n Title=\"No restore history or related labels found.\" />\n }\n }\n </div>\n }\n </div>\n }\n\n <!-- ============================================================ -->\n <!-- INLINE MICRO VIEW (replaces tab content when active) -->\n <!-- ============================================================ -->\n @if (ShowMicroView && MicroViewRecord) {\n <div class=\"tab-content\">\n <mj-record-micro-view\n [Data]=\"MicroViewRecord\"\n [Inline]=\"true\"\n (Close)=\"OnBackFromMicroView()\"\n (EntityLinkClick)=\"OnEntityLinkClick($event)\"\n (OpenRecord)=\"OnOpenRecordClick($event)\">\n </mj-record-micro-view>\n </div>\n }\n</div>\n", styles: ["/* ================================================================= */\n/* BACKDROP */\n/* ================================================================= */\n\n.panel-backdrop {\n position: fixed;\n inset: 0;\n background: transparent;\n z-index: 1000;\n transition: background 0.3s ease;\n pointer-events: none;\n}\n\n.panel-backdrop.visible {\n background: var(--mj-bg-overlay);\n pointer-events: auto;\n}\n\n/* ================================================================= */\n/* PANEL */\n/* ================================================================= */\n\n.detail-panel {\n position: fixed;\n top: 0;\n right: 0;\n height: 100vh;\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-lg);\n z-index: 1001;\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);\n /* Width is set dynamically via [style.width.px] */\n min-width: 400px;\n max-width: 92vw;\n}\n\n.detail-panel.visible {\n transform: translateX(0);\n}\n\n/* ================================================================= */\n/* RESIZE HANDLE */\n/* ================================================================= */\n\n.resize-handle {\n position: absolute;\n left: -4px;\n top: 0;\n width: 8px;\n height: 100%;\n cursor: col-resize;\n z-index: 10;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.resize-handle:hover .resize-handle-grip,\n.resize-handle:active .resize-handle-grip {\n opacity: 1;\n background: var(--mj-brand-primary);\n}\n\n.resize-handle-grip {\n width: 3px;\n height: 40px;\n background: var(--mj-border-strong);\n border-radius: 3px;\n opacity: 0;\n transition: opacity 0.2s ease, background 0.2s ease;\n}\n\n.resize-handle:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n/* ================================================================= */\n/* BREADCRUMB BAR */\n/* ================================================================= */\n\n.breadcrumb-bar {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n background: var(--mj-bg-surface-sunken);\n}\n\n.breadcrumb-back {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n font-size: 13px;\n flex-shrink: 0;\n}\n\n.breadcrumb-back:hover {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.breadcrumb-trail {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n overflow: hidden;\n}\n\n.breadcrumb-item {\n display: flex;\n align-items: center;\n gap: 5px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.breadcrumb-item.clickable {\n cursor: pointer;\n transition: color 0.15s ease;\n}\n\n.breadcrumb-item.clickable:hover {\n color: var(--mj-brand-primary);\n}\n\n.breadcrumb-item.current {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.breadcrumb-separator {\n font-size: 9px;\n color: var(--mj-border-strong);\n flex-shrink: 0;\n}\n\n.breadcrumb-icon {\n font-size: 12px;\n flex-shrink: 0;\n}\n\n/* ================================================================= */\n/* HEADER */\n/* ================================================================= */\n\n.panel-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.header-info {\n flex: 1;\n min-width: 0;\n}\n\n.header-title-row {\n display: flex;\n align-items: center;\n gap: 10px;\n flex-wrap: wrap;\n}\n\n.header-scope-icon {\n color: var(--mj-brand-primary);\n font-size: 18px;\n flex-shrink: 0;\n}\n\n.header-title {\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.header-status {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.header-scope-badge {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n color: var(--mj-brand-primary);\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.header-description {\n margin: 8px 0 0 0;\n font-size: 14px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.header-actions {\n display: flex;\n gap: 8px;\n align-items: center;\n flex-shrink: 0;\n margin-left: 16px;\n}\n\n.header-action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n font-size: 14px;\n}\n\n.header-action-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n}\n\n.header-action-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.close-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: none;\n border: none;\n border-radius: 8px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n font-size: 16px;\n}\n\n.close-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n/* Status badges (reused) */\n.status-active { background: color-mix(in srgb, var(--mj-status-success) 10%, transparent); color: var(--mj-status-success); }\n.status-archived { background: color-mix(in srgb, var(--mj-text-muted) 10%, transparent); color: var(--mj-text-muted); }\n.status-restored { background: color-mix(in srgb, var(--mj-status-warning) 10%, transparent); color: var(--mj-status-warning); }\n\n/* ================================================================= */\n/* SUMMARY KPIs */\n/* ================================================================= */\n\n.summary-kpis {\n display: flex;\n gap: 12px;\n padding: 16px 24px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n overflow-x: auto;\n}\n\n.summary-kpi {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n flex-shrink: 0;\n}\n\n.kpi-mini-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n font-size: 15px;\n flex-shrink: 0;\n}\n\n.kpi-mini-content {\n display: flex;\n flex-direction: column;\n}\n\n.kpi-mini-value {\n font-size: 18px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.kpi-mini-label {\n font-size: 11px;\n color: var(--mj-text-disabled);\n margin-top: 2px;\n}\n\n/* ================================================================= */\n/* TAB BAR */\n/* ================================================================= */\n\n.tab-bar {\n display: flex;\n gap: 0;\n padding: 0 24px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n overflow-x: auto;\n}\n\n.tab {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 12px 16px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n white-space: nowrap;\n}\n\n.tab:hover {\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.tab.active {\n color: var(--mj-brand-primary);\n border-bottom-color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.tab-icon {\n font-size: 13px;\n}\n\n.tab-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n}\n\n/* ================================================================= */\n/* TAB CONTENT */\n/* ================================================================= */\n\n.tab-content {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n.tab-pane {\n padding: 20px 24px;\n animation: tabFadeIn 0.2s ease;\n}\n\n@keyframes tabFadeIn {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* ================================================================= */\n/* OVERVIEW TAB */\n/* ================================================================= */\n\n.detail-section {\n margin-bottom: 24px;\n}\n\n.section-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 14px 0;\n padding-bottom: 10px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.section-icon {\n color: var(--mj-text-disabled);\n font-size: 14px;\n}\n\n.detail-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 14px;\n}\n\n.detail-field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.field-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.field-value {\n font-size: 14px;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n}\n\n.field-mono {\n font-family: 'SF Mono', 'Fira Code', monospace;\n font-size: 13px;\n word-break: break-all;\n}\n\n.field-record-name {\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n/* Record card for Record-scoped labels on overview tab */\n.record-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 16px 18px;\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n border-radius: 12px;\n margin-bottom: 24px;\n}\n\n.record-card-main {\n display: flex;\n align-items: center;\n gap: 14px;\n min-width: 0;\n flex: 1;\n}\n\n.record-card-icon {\n font-size: 22px;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.record-card-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.record-card-name {\n font-size: 16px;\n font-weight: 700;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.record-card-name-loading {\n color: var(--mj-text-disabled);\n font-weight: 500;\n font-style: italic;\n}\n\n.record-card-entity {\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.record-card-id {\n font-size: 12px;\n color: var(--mj-text-disabled);\n font-family: 'SF Mono', 'Fira Code', monospace;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.record-card-open-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.15s ease;\n flex-shrink: 0;\n white-space: nowrap;\n}\n\n.record-card-open-btn:hover {\n background: var(--mj-brand-primary-hover);\n box-shadow: var(--mj-shadow-md);\n}\n\n.inline-badge {\n display: inline-flex;\n align-items: center;\n padding: 3px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.inline-badge.small {\n padding: 2px 8px;\n font-size: 11px;\n}\n\n.description-text {\n font-size: 14px;\n color: var(--mj-text-secondary);\n line-height: 1.6;\n margin: 0;\n}\n\n/* Hierarchy */\n.hierarchy-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 12px;\n border-radius: 8px;\n font-size: 14px;\n transition: background 0.15s ease;\n}\n\n.hierarchy-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.hierarchy-icon {\n color: var(--mj-text-disabled);\n font-size: 13px;\n width: 16px;\n text-align: center;\n}\n\n.hierarchy-label {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n}\n\n.hierarchy-name {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.hierarchy-meta {\n font-size: 12px;\n color: var(--mj-text-disabled);\n font-family: monospace;\n}\n\n.hierarchy-children {\n margin-left: 16px;\n border-left: 2px solid var(--mj-border-default);\n padding-left: 8px;\n}\n\n/* ================================================================= */\n/* SNAPSHOTS TAB */\n/* ================================================================= */\n\n.snapshot-toolbar {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 16px;\n}\n\n.snapshot-search {\n position: relative;\n flex: 1;\n}\n\n.snapshot-search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n.snapshot-search-input {\n width: 100%;\n padding: 8px 12px 8px 36px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 13px;\n color: var(--mj-text-primary);\n outline: none;\n box-sizing: border-box;\n transition: border-color 0.15s ease;\n}\n\n.snapshot-search-input:focus {\n border-color: var(--mj-brand-primary);\n}\n\n.snapshot-sort-toggle,\n.snapshot-view-toggle {\n display: flex;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n overflow: hidden;\n}\n\n.toggle-btn-sm {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n background: transparent;\n border: none;\n cursor: pointer;\n color: var(--mj-text-disabled);\n transition: all 0.15s ease;\n font-size: 12px;\n}\n\n.toggle-btn-sm:hover {\n color: var(--mj-text-primary);\n}\n\n.toggle-btn-sm.active {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.toggle-btn-sm + .toggle-btn-sm {\n border-left: 1px solid var(--mj-border-default);\n}\n\n/* Snapshot groups */\n.snapshot-groups {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* .snapshot-group chrome is now owned by <mj-accordion-panel>. */\n\n/* .group-header / .group-chevron chrome is now owned by <mj-accordion-panel>. */\n.group-entity-icon {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.group-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n/* .group-count-inline removed \u2014 replaced by the standard .mj-accordion-badge--right. */\n\n.group-content {\n border-top: 1px solid var(--mj-border-default);\n animation: tabFadeIn 0.15s ease;\n}\n\n.group-names-loading {\n display: flex;\n justify-content: center;\n padding: 8px 14px;\n}\n\n/* Snapshot list items */\n.snapshot-list-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px 10px 40px;\n cursor: pointer;\n transition: background 0.15s ease;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.snapshot-list-item:last-child {\n border-bottom: none;\n}\n\n.snapshot-list-item:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n.snapshot-item-icon {\n color: var(--mj-text-disabled);\n font-size: 13px;\n}\n\n.snapshot-item-name {\n flex: 1;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.snapshot-item-id {\n font-size: 12px;\n color: var(--mj-text-disabled);\n font-family: monospace;\n}\n\n.snapshot-item-arrow {\n color: var(--mj-border-strong);\n font-size: 11px;\n transition: transform 0.15s ease, color 0.15s ease;\n}\n\n.snapshot-list-item:hover .snapshot-item-arrow {\n color: var(--mj-brand-primary);\n transform: translateX(2px);\n}\n\n/* Snapshot cards */\n.snapshot-cards {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n gap: 10px;\n padding: 12px 14px;\n}\n\n.snapshot-card {\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.snapshot-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.snapshot-card-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.snapshot-card-header i {\n color: var(--mj-text-disabled);\n font-size: 12px;\n}\n\n.snapshot-card-name {\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.snapshot-card-meta {\n font-size: 11px;\n color: var(--mj-text-disabled);\n font-family: monospace;\n}\n\n/* ================================================================= */\n/* DEPENDENCIES TAB */\n/* ================================================================= */\n\n.dep-root {\n padding: 4px 0;\n}\n\n.dep-root-entity {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 14px;\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n border-radius: 10px;\n margin-bottom: 12px;\n}\n\n.dep-root-icon {\n color: var(--mj-brand-primary);\n font-size: 16px;\n}\n\n.dep-root-name {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n.dep-root-badge {\n padding: 2px 10px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n}\n\n.dep-node {\n margin-left: 8px;\n border-left: 2px solid var(--mj-border-default);\n}\n\n.dep-node-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n transition: background 0.15s ease;\n border-radius: 6px;\n}\n\n.dep-node-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.dep-chevron {\n font-size: 10px;\n color: var(--mj-text-disabled);\n transition: transform 0.2s ease;\n width: 12px;\n text-align: center;\n}\n\n.dep-chevron.expanded {\n transform: rotate(90deg);\n}\n\n.dep-node-spacer {\n width: 12px;\n}\n\n.dep-node-icon {\n color: var(--mj-brand-primary);\n font-size: 13px;\n}\n\n.dep-node-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.dep-node-field {\n font-size: 11px;\n color: var(--mj-text-disabled);\n font-style: italic;\n}\n\n.dep-node-count {\n font-size: 11px;\n color: var(--mj-text-disabled);\n padding: 1px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 8px;\n}\n\n/* ================================================================= */\n/* CHANGES TAB */\n/* ================================================================= */\n\n.diff-summary {\n display: flex;\n gap: 16px;\n margin-bottom: 20px;\n}\n\n.diff-stat {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 12px 20px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n min-width: 80px;\n}\n\n.diff-stat-value {\n font-size: 24px;\n font-weight: 700;\n color: var(--mj-text-primary);\n line-height: 1;\n}\n\n.diff-stat-label {\n font-size: 12px;\n color: var(--mj-text-disabled);\n margin-top: 4px;\n}\n\n/* Diff toolbar */\n.diff-toolbar {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.toolbar-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.toolbar-action-btn i {\n font-size: 11px;\n}\n\n.toolbar-action-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n}\n\n.diff-groups {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n/* .diff-group chrome (border / header / chevron) is now owned by <mj-accordion-panel>. */\n.diff-group-icon {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.diff-group-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n/* .diff-group-count removed \u2014 the \"N modified\" count now uses the standard\n .mj-accordion-badge--warning --right (warning-tinted status count). */\n\n.diff-group-content {\n border-top: 1px solid var(--mj-border-default);\n animation: tabFadeIn 0.15s ease;\n}\n\n.diff-record {\n padding: 10px 14px 10px 40px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.diff-record:last-child {\n border-bottom: none;\n}\n\n.diff-record-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 8px;\n}\n\n.diff-record-id {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n font-family: monospace;\n}\n\n.diff-fields {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin-left: 22px;\n}\n\n.diff-field {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n}\n\n.diff-field-name {\n font-weight: 600;\n color: var(--mj-text-primary);\n min-width: 100px;\n}\n\n.diff-field-old {\n color: var(--mj-status-error);\n text-decoration: line-through;\n opacity: 0.7;\n font-family: monospace;\n font-size: 12px;\n}\n\n.diff-field-arrow {\n color: var(--mj-text-disabled);\n font-size: 10px;\n}\n\n.diff-field-new {\n color: var(--mj-status-success);\n font-family: monospace;\n font-size: 12px;\n}\n\n/* Change type colors */\n.change-added { color: var(--mj-status-success); }\n.change-modified { color: var(--mj-status-warning); }\n.change-removed { color: var(--mj-status-error); }\n\n.diff-field.change-added { background: color-mix(in srgb, var(--mj-status-success) 6%, transparent); }\n.diff-field.change-modified { background: color-mix(in srgb, var(--mj-status-warning) 6%, transparent); }\n.diff-field.change-removed { background: color-mix(in srgb, var(--mj-status-error) 6%, transparent); }\n\n/* ================================================================= */\n/* HISTORY TAB */\n/* ================================================================= */\n\n.history-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.history-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 8px;\n transition: background 0.15s ease;\n}\n\n.history-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.history-item-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: 8px;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.history-item-icon.status-complete { background: color-mix(in srgb, var(--mj-status-success) 10%, transparent); color: var(--mj-status-success); }\n.history-item-icon.status-error { background: color-mix(in srgb, var(--mj-status-error) 10%, transparent); color: var(--mj-status-error); }\n.history-item-icon.status-partial { background: color-mix(in srgb, var(--mj-status-warning) 10%, transparent); color: var(--mj-status-warning); }\n.history-item-icon.status-in-progress { background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent); color: var(--mj-brand-primary); }\n.history-item-icon.status-pending { background: color-mix(in srgb, var(--mj-text-muted) 10%, transparent); color: var(--mj-text-muted); }\n\n.history-item-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.history-item-title {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.history-item-meta {\n font-size: 12px;\n color: var(--mj-text-disabled);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.history-item-date {\n font-size: 12px;\n color: var(--mj-text-disabled);\n flex-shrink: 0;\n}\n\n/* ================================================================= */\n/* RESPONSIVE */\n/* ================================================================= */\n\n@media (max-width: 1024px) {\n .detail-panel {\n min-width: 360px;\n }\n\n .summary-kpis {\n flex-wrap: wrap;\n }\n}\n\n@media (max-width: 768px) {\n .detail-panel {\n width: 100% !important;\n min-width: unset;\n }\n\n .resize-handle {\n display: none;\n }\n\n .detail-grid {\n grid-template-columns: 1fr;\n }\n\n .summary-kpis {\n flex-wrap: wrap;\n gap: 8px;\n padding: 12px 16px;\n }\n\n .summary-kpi {\n padding: 8px 10px;\n }\n\n .panel-header {\n padding: 16px 16px 12px;\n }\n\n .tab-bar {\n padding: 0 16px;\n }\n\n .tab-pane {\n padding: 16px;\n }\n\n .breadcrumb-bar {\n padding: 8px 16px;\n }\n\n .snapshot-toolbar {\n flex-direction: column;\n align-items: stretch;\n }\n\n .diff-summary {\n flex-wrap: wrap;\n gap: 8px;\n }\n\n .diff-stat {\n padding: 10px 14px;\n min-width: 60px;\n }\n}\n\n@media (max-width: 480px) {\n .header-title {\n font-size: 16px;\n }\n\n .header-title-row {\n gap: 6px;\n }\n\n .header-actions {\n margin-left: 8px;\n }\n\n .tab {\n padding: 10px 10px;\n font-size: 12px;\n }\n\n .snapshot-cards {\n grid-template-columns: 1fr;\n }\n}\n"] }]
|
|
2079
2063
|
}], () => [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i0.ElementRef }], { Label: [{
|
|
2080
2064
|
type: Input
|
|
2081
2065
|
}], AllLabels: [{
|