@memberjunction/ng-base-forms 6.1.0-edge.5 → 6.1.0-edge.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/lib/chrome/form-chrome-rail-pref.d.ts +22 -0
  2. package/dist/lib/chrome/form-chrome-rail-pref.d.ts.map +1 -1
  3. package/dist/lib/chrome/form-chrome-rail-pref.js +29 -0
  4. package/dist/lib/chrome/form-chrome-rail-pref.js.map +1 -1
  5. package/dist/lib/chrome/form-chrome.d.ts +19 -0
  6. package/dist/lib/chrome/form-chrome.d.ts.map +1 -1
  7. package/dist/lib/chrome/form-chrome.js +26 -0
  8. package/dist/lib/chrome/form-chrome.js.map +1 -1
  9. package/dist/lib/container/record-form-container.component.d.ts +52 -2
  10. package/dist/lib/container/record-form-container.component.d.ts.map +1 -1
  11. package/dist/lib/container/record-form-container.component.js +485 -161
  12. package/dist/lib/container/record-form-container.component.js.map +1 -1
  13. package/dist/lib/explorer-entity-data-grid.component.d.ts +36 -0
  14. package/dist/lib/explorer-entity-data-grid.component.d.ts.map +1 -1
  15. package/dist/lib/explorer-entity-data-grid.component.js +112 -3
  16. package/dist/lib/explorer-entity-data-grid.component.js.map +1 -1
  17. package/dist/lib/field/form-field.component.d.ts +59 -0
  18. package/dist/lib/field/form-field.component.d.ts.map +1 -1
  19. package/dist/lib/field/form-field.component.js +710 -294
  20. package/dist/lib/field/form-field.component.js.map +1 -1
  21. package/dist/lib/overlays/base-form-overlay.d.ts.map +1 -1
  22. package/dist/lib/overlays/base-form-overlay.js +3 -1
  23. package/dist/lib/overlays/base-form-overlay.js.map +1 -1
  24. package/dist/lib/overlays/form-slide-in.component.js +10 -11
  25. package/dist/lib/overlays/form-slide-in.component.js.map +1 -1
  26. package/dist/lib/panel/collapsible-panel.component.d.ts +84 -3
  27. package/dist/lib/panel/collapsible-panel.component.d.ts.map +1 -1
  28. package/dist/lib/panel/collapsible-panel.component.js +253 -37
  29. package/dist/lib/panel/collapsible-panel.component.js.map +1 -1
  30. package/dist/lib/panel-slot/base-form-panel.d.ts +12 -0
  31. package/dist/lib/panel-slot/base-form-panel.d.ts.map +1 -1
  32. package/dist/lib/panel-slot/base-form-panel.js.map +1 -1
  33. package/dist/lib/related-grid-height.d.ts +48 -11
  34. package/dist/lib/related-grid-height.d.ts.map +1 -1
  35. package/dist/lib/related-grid-height.js +53 -12
  36. package/dist/lib/related-grid-height.js.map +1 -1
  37. package/dist/lib/section-indicators/form-section-indicator-coordinator.service.d.ts +80 -0
  38. package/dist/lib/section-indicators/form-section-indicator-coordinator.service.d.ts.map +1 -0
  39. package/dist/lib/section-indicators/form-section-indicator-coordinator.service.js +99 -0
  40. package/dist/lib/section-indicators/form-section-indicator-coordinator.service.js.map +1 -0
  41. package/dist/lib/section-indicators/form-section-indicators.d.ts +97 -0
  42. package/dist/lib/section-indicators/form-section-indicators.d.ts.map +1 -0
  43. package/dist/lib/section-indicators/form-section-indicators.js +132 -0
  44. package/dist/lib/section-indicators/form-section-indicators.js.map +1 -0
  45. package/dist/lib/section-manager/section-manager.component.js +2 -2
  46. package/dist/lib/section-manager/section-manager.component.js.map +1 -1
  47. package/dist/lib/toolbar/form-toolbar.component.js +4 -4
  48. package/dist/lib/toolbar/form-toolbar.component.js.map +1 -1
  49. package/dist/public-api.d.ts +2 -0
  50. package/dist/public-api.d.ts.map +1 -1
  51. package/dist/public-api.js +3 -0
  52. package/dist/public-api.js.map +1 -1
  53. package/package.json +25 -27
@@ -15,13 +15,15 @@ import { FormSlotCoordinator } from '../panel-slot/form-slot-coordinator.service
15
15
  import { FormChromeCoordinator } from '../chrome/form-chrome-coordinator.service';
16
16
  import { ResolveFormChrome, OrderChromeGroups, OrderMoreSectionKeys, MoveChromeGroupInSectionOrder, OverlayChromeSectionOrder } from '../chrome/resolve-form-chrome';
17
17
  import { LoadFormChromeRules } from '../chrome/load-form-chrome-rules';
18
- import { MORE_SECTION_KEY, HumanizeEntityTitle, IsAlwaysMoreSection } from '../chrome/form-chrome';
19
- import { ClampRailWidth, FORM_CHROME_RAIL_PINNED_DEFAULT, FORM_CHROME_RAIL_WIDTH_DEFAULT, FORM_CHROME_RAIL_WIDTH_MAX, FORM_CHROME_RAIL_WIDTH_MIN, ParseRailPinnedSetting, ParseRailWidthSetting, SerializeRailPinnedSetting, SerializeRailWidthSetting, ShouldPersistChromeActiveGroup, } from '../chrome/form-chrome-rail-pref';
18
+ import { MORE_SECTION_KEY, HumanizeEntityTitle, IsAlwaysMoreSection, IsDetailsSectionKey, DetailsCardEdges } from '../chrome/form-chrome';
19
+ import { ClampRailWidth, FORM_CHROME_RAIL_PINNED_DEFAULT, FORM_CHROME_RAIL_WIDTH_DEFAULT, FORM_CHROME_RAIL_WIDTH_MAX, FORM_CHROME_RAIL_WIDTH_MIN, ParseRailPinnedSetting, ParseRailWidthSetting, SerializeRailPinnedSetting, SerializeRailWidthSetting, ShouldPersistChromeActiveGroup, UnsavedLeadGroupKey, } from '../chrome/form-chrome-rail-pref';
20
20
  import { ApplyClippedTitle } from '../chrome/clipped-title';
21
21
  import { CollectFormPanelRegistrations } from '../panel-slot/collect-form-panel-registrations';
22
22
  import { ContributionHiddenSectionKeys, ResolveFormContributions } from '../panel-slot/form-contribution';
23
23
  import { IsFormSectionHidden } from '../types/entity-form-config';
24
24
  import { FormRecordRefreshCoordinator } from '../form-record-refresh.coordinator';
25
+ import { FormSectionIndicatorCoordinator } from '../section-indicators/form-section-indicator-coordinator.service';
26
+ import { DescribeSectionDirty, DescribeSectionErrors, DescribeSectionWarnings, SumSectionIndicators, TallyValidationErrors, } from '../section-indicators/form-section-indicators';
25
27
  import * as i0 from "@angular/core";
26
28
  import * as i1 from "@memberjunction/ng-ui-components";
27
29
  import * as i2 from "@memberjunction/ng-record-changes";
@@ -40,22 +42,61 @@ const _c3 = (a0, a1, a2) => ({ mode: "manage", entityId: a0, entityName: a1, rec
40
42
  const _forTrack0 = ($index, $item) => $item.Key;
41
43
  function MjRecordFormContainerComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
42
44
  const _r1 = i0.ɵɵgetCurrentView();
43
- i0.ɵɵelementStart(0, "mj-form-toolbar", 16);
45
+ i0.ɵɵelementStart(0, "mj-form-toolbar", 17);
44
46
  i0.ɵɵlistener("Navigate", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_Navigate_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnNavigate($event)); })("EditModeChange", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_EditModeChange_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnEditModeChange($event)); })("BeforeSave", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_BeforeSave_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.BeforeSave.emit($event)); })("SaveRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_SaveRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnSaveRequested()); })("BeforeCancel", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_BeforeCancel_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.BeforeCancel.emit($event)); })("CancelRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_CancelRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnCancelRequested()); })("BeforeDelete", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_BeforeDelete_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.BeforeDelete.emit($event)); })("DeleteRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_DeleteRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDeleteRequested()); })("BeforeRefresh", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_BeforeRefresh_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.BeforeRefresh.emit($event)); })("RefreshRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_RefreshRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnRefreshRequested()); })("FavoriteToggled", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_FavoriteToggled_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFavoriteToggled()); })("BeforeHistoryView", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_BeforeHistoryView_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.BeforeHistoryView.emit($event)); })("HistoryRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_HistoryRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnHistoryRequested()); })("BeforeListManagement", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_BeforeListManagement_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.BeforeListManagement.emit($event)); })("ListManagementRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_ListManagementRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnListManagementRequested()); })("ShowChangesRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_ShowChangesRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnShowChangesRequested()); })("CustomButtonClick", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_CustomButtonClick_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CustomButtonClick.emit($event)); })("ToolbarItemClick", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_ToolbarItemClick_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ToolbarItemClick.emit($event)); })("FilterChange", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_FilterChange_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFilterChange($event)); })("ExpandAllRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_ExpandAllRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnExpandAll()); })("CollapseAllRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_CollapseAllRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnCollapseAll()); })("ShowEmptyFieldsChange", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_ShowEmptyFieldsChange_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnShowEmptyFieldsChange($event)); })("WidthModeChange", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_WidthModeChange_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnWidthModeChange($event)); })("ResetSectionOrderRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_ResetSectionOrderRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnResetSectionOrder()); })("ManageSectionsRequested", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_ManageSectionsRequested_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnManageSections()); })("TagsPanelToggled", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_TagsPanelToggled_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnTagsPanelToggled()); })("AttachmentsPanelToggled", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_AttachmentsPanelToggled_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnAttachmentsPanelToggled()); })("VariantPicked", function MjRecordFormContainerComponent_Conditional_1_Template_mj_form_toolbar_VariantPicked_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnVariantPicked($event)); });
45
47
  i0.ɵɵelementEnd();
46
48
  } if (rf & 2) {
47
49
  const ctx_r1 = i0.ɵɵnextContext();
48
50
  i0.ɵɵproperty("Record", ctx_r1.EffectiveRecord)("EditMode", ctx_r1.EffectiveEditMode)("UserCanEdit", ctx_r1.EffectiveUserCanEdit)("UserCanDelete", ctx_r1.EffectiveUserCanDelete)("IsFavorite", ctx_r1.EffectiveIsFavorite)("FavoriteInitDone", ctx_r1.EffectiveFavoriteInitDone)("IsDirty", ctx_r1.EffectiveIsDirty)("DirtyFieldNames", ctx_r1.EffectiveDirtyFieldNames)("ListCount", ctx_r1.ListCount)("TagCount", ctx_r1.TagCount)("AttachmentCount", ctx_r1.AttachmentCount)("AttachmentsAvailable", ctx_r1.AttachmentsAvailable)("IsAttachmentsPanelOpen", ctx_r1.ShowAttachmentsPanel)("VersionCount", ctx_r1.VersionCount)("EntityInfo", ctx_r1.EffectiveEntityInfo)("Config", ctx_r1.EffectiveToolbarConfig)("IsSaving", ctx_r1.EffectiveIsSaving)("IsRefreshing", ctx_r1.EffectiveIsRefreshing)("VisibleSectionCount", ctx_r1.VisibleSectionCount)("TotalSectionCount", ctx_r1.TotalSectionCount)("ExpandedSectionCount", ctx_r1.ExpandedSectionCount)("SearchFilter", ctx_r1.EffectiveSearchFilter)("ShowEmptyFields", ctx_r1.EffectiveShowEmptyFields)("WidthMode", ctx_r1.EffectiveWidthMode)("HasCustomSectionOrder", ctx_r1.EffectiveHasCustomSectionOrder)("ChromeLayout", ctx_r1.ChromeLayout)("Variants", ctx_r1.EffectiveVariants)("CurrentVariantID", ctx_r1.EffectiveCurrentVariantID)("RegisteredItems", ctx_r1.EffectiveRegisteredToolbarItems)("ItemOverrides", ctx_r1.EffectiveToolbarItemOverrides)("FormComponent", ctx_r1.fc);
49
51
  } }
50
- function MjRecordFormContainerComponent_Conditional_5_Conditional_1_Template(rf, ctx) { if (rf & 1) {
52
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
53
+ i0.ɵɵelementStart(0, "span", 22);
54
+ i0.ɵɵtext(1);
55
+ i0.ɵɵelementEnd();
56
+ } if (rf & 2) {
57
+ i0.ɵɵnextContext();
58
+ const formIndicators_r4 = i0.ɵɵreadContextLet(4);
59
+ const ctx_r1 = i0.ɵɵnextContext(2);
60
+ i0.ɵɵproperty("title", ctx_r1.RailErrorTitle(formIndicators_r4.ErrorCount, "this record"));
61
+ i0.ɵɵattribute("aria-label", ctx_r1.RailErrorTitle(formIndicators_r4.ErrorCount, "this record"));
62
+ i0.ɵɵadvance();
63
+ i0.ɵɵtextInterpolate(formIndicators_r4.ErrorCount);
64
+ } }
65
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
66
+ i0.ɵɵelementStart(0, "span", 23);
67
+ i0.ɵɵtext(1);
68
+ i0.ɵɵelementEnd();
69
+ } if (rf & 2) {
70
+ i0.ɵɵnextContext();
71
+ const formIndicators_r4 = i0.ɵɵreadContextLet(4);
72
+ const ctx_r1 = i0.ɵɵnextContext(2);
73
+ i0.ɵɵproperty("title", ctx_r1.RailWarningTitle(formIndicators_r4.WarningCount, "this record"));
74
+ i0.ɵɵattribute("aria-label", ctx_r1.RailWarningTitle(formIndicators_r4.WarningCount, "this record"));
75
+ i0.ɵɵadvance();
76
+ i0.ɵɵtextInterpolate(formIndicators_r4.WarningCount);
77
+ } }
78
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
79
+ i0.ɵɵelement(0, "span", 24);
80
+ } if (rf & 2) {
81
+ i0.ɵɵnextContext();
82
+ const formIndicators_r4 = i0.ɵɵreadContextLet(4);
83
+ const ctx_r1 = i0.ɵɵnextContext(2);
84
+ i0.ɵɵproperty("title", ctx_r1.RailDirtyTitle(formIndicators_r4.DirtyCount, "this record"));
85
+ i0.ɵɵattribute("aria-label", ctx_r1.RailDirtyTitle(formIndicators_r4.DirtyCount, "this record"));
86
+ } }
87
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
51
88
  const _r3 = i0.ɵɵgetCurrentView();
52
- i0.ɵɵelementStart(0, "button", 19);
53
- i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_5_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnChromeRailExpand()); });
89
+ i0.ɵɵelementStart(0, "button", 20);
90
+ i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnChromeRailExpand()); });
54
91
  i0.ɵɵelement(1, "i");
55
- i0.ɵɵelementStart(2, "span", 20);
56
- i0.ɵɵlistener("mouseenter", function MjRecordFormContainerComponent_Conditional_5_Conditional_1_Template_span_mouseenter_2_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRailLabelHover($event, ctx_r1.ChromeActiveTitle)); });
92
+ i0.ɵɵelementStart(2, "span", 21);
93
+ i0.ɵɵlistener("mouseenter", function MjRecordFormContainerComponent_Conditional_7_Conditional_1_Template_span_mouseenter_2_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRailLabelHover($event, ctx_r1.ChromeActiveTitle)); });
57
94
  i0.ɵɵtext(3);
58
- i0.ɵɵelementEnd()();
95
+ i0.ɵɵelementEnd();
96
+ i0.ɵɵdeclareLet(4);
97
+ i0.ɵɵconditionalCreate(5, MjRecordFormContainerComponent_Conditional_7_Conditional_1_Conditional_5_Template, 2, 3, "span", 22)(6, MjRecordFormContainerComponent_Conditional_7_Conditional_1_Conditional_6_Template, 2, 3, "span", 23);
98
+ i0.ɵɵconditionalCreate(7, MjRecordFormContainerComponent_Conditional_7_Conditional_1_Conditional_7_Template, 1, 2, "span", 24);
99
+ i0.ɵɵelementEnd();
59
100
  } if (rf & 2) {
60
101
  const ctx_r1 = i0.ɵɵnextContext(2);
61
102
  i0.ɵɵproperty("title", "Show sections \u2014 " + ctx_r1.ChromeActiveTitle);
@@ -64,149 +105,294 @@ function MjRecordFormContainerComponent_Conditional_5_Conditional_1_Template(rf,
64
105
  i0.ɵɵclassMap(ctx_r1.ChromeActiveIcon);
65
106
  i0.ɵɵadvance(2);
66
107
  i0.ɵɵtextInterpolate(ctx_r1.ChromeActiveTitle);
108
+ i0.ɵɵadvance();
109
+ const formIndicators_r5 = i0.ɵɵstoreLet(ctx_r1.FormIndicators);
110
+ i0.ɵɵadvance();
111
+ i0.ɵɵconditional(formIndicators_r5.ErrorCount > 0 ? 5 : formIndicators_r5.WarningCount > 0 ? 6 : -1);
112
+ i0.ɵɵadvance(2);
113
+ i0.ɵɵconditional(formIndicators_r5.DirtyCount > 0 ? 7 : -1);
67
114
  } }
68
- function MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
69
- const _r7 = i0.ɵɵgetCurrentView();
70
- i0.ɵɵelementStart(0, "span", 32);
71
- i0.ɵɵlistener("dragstart", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Conditional_1_Template_span_dragstart_0_listener($event) { i0.ɵɵrestoreView(_r7); const group_r6 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailDragStart($event, group_r6.Key)); })("dragend", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Conditional_1_Template_span_dragend_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnRailDragEnd()); })("click", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Conditional_1_Template_span_click_0_listener($event) { i0.ɵɵrestoreView(_r7); return i0.ɵɵresetView($event.stopPropagation()); });
72
- i0.ɵɵelement(1, "i", 33);
115
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
116
+ const _r9 = i0.ɵɵgetCurrentView();
117
+ i0.ɵɵelementStart(0, "span", 40);
118
+ i0.ɵɵlistener("dragstart", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_1_Template_span_dragstart_0_listener($event) { i0.ɵɵrestoreView(_r9); const group_r8 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailDragStart($event, group_r8.Key)); })("dragend", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_1_Template_span_dragend_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnRailDragEnd()); })("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_1_Template_span_click_0_listener($event) { return $event.stopPropagation(); });
119
+ i0.ɵɵelement(1, "i", 41);
120
+ i0.ɵɵelementEnd();
121
+ } }
122
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
123
+ i0.ɵɵelement(0, "span", 36);
124
+ } if (rf & 2) {
125
+ const group_r8 = i0.ɵɵnextContext().$implicit;
126
+ const groupIndicators_r10 = i0.ɵɵreadContextLet(5);
127
+ const ctx_r1 = i0.ɵɵnextContext(3);
128
+ i0.ɵɵproperty("title", ctx_r1.RailDirtyTitle(groupIndicators_r10.DirtyCount, group_r8.Title));
129
+ i0.ɵɵattribute("aria-label", ctx_r1.RailDirtyTitle(groupIndicators_r10.DirtyCount, group_r8.Title));
130
+ } }
131
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_7_Template(rf, ctx) { if (rf & 1) {
132
+ i0.ɵɵelementStart(0, "span", 37);
133
+ i0.ɵɵelement(1, "i", 42);
134
+ i0.ɵɵtext(2);
135
+ i0.ɵɵelementEnd();
136
+ } if (rf & 2) {
137
+ const group_r8 = i0.ɵɵnextContext().$implicit;
138
+ const groupIndicators_r10 = i0.ɵɵreadContextLet(5);
139
+ const ctx_r1 = i0.ɵɵnextContext(3);
140
+ i0.ɵɵproperty("title", ctx_r1.RailErrorTitle(groupIndicators_r10.ErrorCount, group_r8.Title));
141
+ i0.ɵɵattribute("aria-label", ctx_r1.RailErrorTitle(groupIndicators_r10.ErrorCount, group_r8.Title));
142
+ i0.ɵɵadvance(2);
143
+ i0.ɵɵtextInterpolate1("", groupIndicators_r10.ErrorCount, " ");
144
+ } }
145
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_8_Template(rf, ctx) { if (rf & 1) {
146
+ i0.ɵɵelementStart(0, "span", 38);
147
+ i0.ɵɵelement(1, "i", 43);
148
+ i0.ɵɵtext(2);
73
149
  i0.ɵɵelementEnd();
150
+ } if (rf & 2) {
151
+ const group_r8 = i0.ɵɵnextContext().$implicit;
152
+ const groupIndicators_r10 = i0.ɵɵreadContextLet(5);
153
+ const ctx_r1 = i0.ɵɵnextContext(3);
154
+ i0.ɵɵproperty("title", ctx_r1.RailWarningTitle(groupIndicators_r10.WarningCount, group_r8.Title));
155
+ i0.ɵɵattribute("aria-label", ctx_r1.RailWarningTitle(groupIndicators_r10.WarningCount, group_r8.Title));
156
+ i0.ɵɵadvance(2);
157
+ i0.ɵɵtextInterpolate1("", groupIndicators_r10.WarningCount, " ");
74
158
  } }
75
- function MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Conditional_6_Template(rf, ctx) { if (rf & 1) {
76
- i0.ɵɵelementStart(0, "span", 34);
159
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_10_Template(rf, ctx) { if (rf & 1) {
160
+ i0.ɵɵelementStart(0, "span", 39);
77
161
  i0.ɵɵtext(1);
78
162
  i0.ɵɵelementEnd();
79
163
  } if (rf & 2) {
80
164
  i0.ɵɵnextContext();
81
- const rowCount_r8 = i0.ɵɵreadContextLet(5);
82
- i0.ɵɵclassProp("is-zero", rowCount_r8 === 0);
165
+ const rowCount_r11 = i0.ɵɵreadContextLet(9);
83
166
  i0.ɵɵadvance();
84
- i0.ɵɵtextInterpolate(rowCount_r8);
167
+ i0.ɵɵtextInterpolate(rowCount_r11);
85
168
  } }
86
- function MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Template(rf, ctx) { if (rf & 1) {
87
- const _r5 = i0.ɵɵgetCurrentView();
88
- i0.ɵɵelementStart(0, "div", 28);
89
- i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Template_div_click_0_listener() { const group_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(group_r6.Key)); })("keydown.enter", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Template_div_keydown_enter_0_listener() { const group_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(group_r6.Key)); })("keydown.space", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Template_div_keydown_space_0_listener($event) { const group_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); $event.preventDefault(); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(group_r6.Key)); })("dragover", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Template_div_dragover_0_listener($event) { const group_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailDragOver($event, group_r6.Key)); })("dragleave", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Template_div_dragleave_0_listener($event) { const group_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailDragLeave($event, group_r6.Key)); })("drop", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Template_div_drop_0_listener($event) { const group_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailDrop($event, group_r6.Key)); });
90
- i0.ɵɵconditionalCreate(1, MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Conditional_1_Template, 2, 0, "span", 29);
169
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template(rf, ctx) { if (rf & 1) {
170
+ const _r7 = i0.ɵɵgetCurrentView();
171
+ i0.ɵɵelementStart(0, "div", 33);
172
+ i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template_div_click_0_listener() { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(group_r8.Key)); })("keydown.enter", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template_div_keydown_enter_0_listener() { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(group_r8.Key)); })("keydown.space", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template_div_keydown_space_0_listener($event) { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); $event.preventDefault(); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(group_r8.Key)); })("dragover", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template_div_dragover_0_listener($event) { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailDragOver($event, group_r8.Key)); })("dragleave", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template_div_dragleave_0_listener($event) { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailDragLeave($event, group_r8.Key)); })("drop", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template_div_drop_0_listener($event) { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailDrop($event, group_r8.Key)); });
173
+ i0.ɵɵconditionalCreate(1, MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_1_Template, 2, 0, "span", 34);
91
174
  i0.ɵɵelement(2, "i");
92
- i0.ɵɵelementStart(3, "span", 30);
93
- i0.ɵɵlistener("mouseenter", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Template_span_mouseenter_3_listener($event) { const group_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailLabelHover($event, group_r6.Title)); });
175
+ i0.ɵɵelementStart(3, "span", 35);
176
+ i0.ɵɵlistener("mouseenter", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template_span_mouseenter_3_listener($event) { const group_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailLabelHover($event, group_r8.Title)); });
94
177
  i0.ɵɵtext(4);
95
178
  i0.ɵɵelementEnd();
96
179
  i0.ɵɵdeclareLet(5);
97
- i0.ɵɵconditionalCreate(6, MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Conditional_6_Template, 2, 3, "span", 31);
180
+ i0.ɵɵconditionalCreate(6, MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_6_Template, 1, 2, "span", 36);
181
+ i0.ɵɵconditionalCreate(7, MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_7_Template, 3, 3, "span", 37)(8, MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_8_Template, 3, 3, "span", 38);
182
+ i0.ɵɵdeclareLet(9);
183
+ i0.ɵɵconditionalCreate(10, MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Conditional_10_Template, 2, 1, "span", 39);
98
184
  i0.ɵɵelementEnd();
99
185
  } if (rf & 2) {
100
- const group_r6 = ctx.$implicit;
186
+ const group_r8 = ctx.$implicit;
101
187
  const ctx_r1 = i0.ɵɵnextContext(3);
102
- i0.ɵɵclassProp("is-active", ctx_r1.ChromeActiveGroupKey === group_r6.Key)("is-drag-over", ctx_r1.RailDragOverKey === group_r6.Key);
103
- i0.ɵɵattribute("aria-current", ctx_r1.ChromeActiveGroupKey === group_r6.Key ? "page" : null);
188
+ i0.ɵɵclassProp("is-active", ctx_r1.ChromeActiveGroupKey === group_r8.Key)("is-drag-over", ctx_r1.RailDragOverKey === group_r8.Key)("has-errors", ctx_r1.ChromeGroupIndicators(group_r8).ErrorCount > 0)("is-dirty", ctx_r1.ChromeGroupIndicators(group_r8).DirtyCount > 0);
189
+ i0.ɵɵattribute("aria-current", ctx_r1.ChromeActiveGroupKey === group_r8.Key ? "page" : null);
104
190
  i0.ɵɵadvance();
105
191
  i0.ɵɵconditional(ctx_r1.ChromeReorderAllowed ? 1 : -1);
106
192
  i0.ɵɵadvance();
107
- i0.ɵɵclassMap(group_r6.Icon);
193
+ i0.ɵɵclassMap(group_r8.Icon);
108
194
  i0.ɵɵadvance(2);
109
- i0.ɵɵtextInterpolate(group_r6.Title);
195
+ i0.ɵɵtextInterpolate(group_r8.Title);
196
+ i0.ɵɵadvance();
197
+ const groupIndicators_r12 = i0.ɵɵstoreLet(ctx_r1.ChromeGroupIndicators(group_r8));
110
198
  i0.ɵɵadvance();
111
- const rowCount_r9 = i0.ɵɵstoreLet(ctx_r1.ChromeGroupRowCount(group_r6));
199
+ i0.ɵɵconditional(groupIndicators_r12.DirtyCount > 0 ? 6 : -1);
112
200
  i0.ɵɵadvance();
113
- i0.ɵɵconditional(rowCount_r9 != null ? 6 : -1);
201
+ i0.ɵɵconditional(groupIndicators_r12.ErrorCount > 0 ? 7 : groupIndicators_r12.WarningCount > 0 ? 8 : -1);
202
+ i0.ɵɵadvance(2);
203
+ const rowCount_r13 = i0.ɵɵstoreLet(ctx_r1.ChromeGroupRowCount(group_r8));
204
+ i0.ɵɵadvance();
205
+ i0.ɵɵconditional(rowCount_r13 != null && rowCount_r13 > 0 ? 10 : -1);
114
206
  } }
115
- function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
116
- const _r14 = i0.ɵɵgetCurrentView();
117
- i0.ɵɵelementStart(0, "span", 32);
118
- i0.ɵɵlistener("dragstart", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Conditional_1_Template_span_dragstart_0_listener($event) { i0.ɵɵrestoreView(_r14); const child_r13 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnRailDragStart($event, child_r13.Key)); })("dragend", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Conditional_1_Template_span_dragend_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r1.OnRailDragEnd()); })("click", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Conditional_1_Template_span_click_0_listener($event) { i0.ɵɵrestoreView(_r14); return i0.ɵɵresetView($event.stopPropagation()); });
119
- i0.ɵɵelement(1, "i", 33);
207
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_6_Template(rf, ctx) { if (rf & 1) {
208
+ i0.ɵɵelement(0, "span", 36);
209
+ } if (rf & 2) {
210
+ const more_r15 = i0.ɵɵnextContext();
211
+ const moreIndicators_r16 = i0.ɵɵreadContextLet(5);
212
+ const ctx_r1 = i0.ɵɵnextContext(3);
213
+ i0.ɵɵproperty("title", ctx_r1.RailDirtyTitle(moreIndicators_r16.DirtyCount, more_r15.Title));
214
+ i0.ɵɵattribute("aria-label", ctx_r1.RailDirtyTitle(moreIndicators_r16.DirtyCount, more_r15.Title));
215
+ } }
216
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_7_Template(rf, ctx) { if (rf & 1) {
217
+ i0.ɵɵelementStart(0, "span", 37);
218
+ i0.ɵɵelement(1, "i", 42);
219
+ i0.ɵɵtext(2);
220
+ i0.ɵɵelementEnd();
221
+ } if (rf & 2) {
222
+ const more_r15 = i0.ɵɵnextContext();
223
+ const moreIndicators_r16 = i0.ɵɵreadContextLet(5);
224
+ const ctx_r1 = i0.ɵɵnextContext(3);
225
+ i0.ɵɵproperty("title", ctx_r1.RailErrorTitle(moreIndicators_r16.ErrorCount, more_r15.Title));
226
+ i0.ɵɵattribute("aria-label", ctx_r1.RailErrorTitle(moreIndicators_r16.ErrorCount, more_r15.Title));
227
+ i0.ɵɵadvance(2);
228
+ i0.ɵɵtextInterpolate1("", moreIndicators_r16.ErrorCount, " ");
229
+ } }
230
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_8_Template(rf, ctx) { if (rf & 1) {
231
+ i0.ɵɵelementStart(0, "span", 38);
232
+ i0.ɵɵelement(1, "i", 43);
233
+ i0.ɵɵtext(2);
234
+ i0.ɵɵelementEnd();
235
+ } if (rf & 2) {
236
+ const more_r15 = i0.ɵɵnextContext();
237
+ const moreIndicators_r16 = i0.ɵɵreadContextLet(5);
238
+ const ctx_r1 = i0.ɵɵnextContext(3);
239
+ i0.ɵɵproperty("title", ctx_r1.RailWarningTitle(moreIndicators_r16.WarningCount, more_r15.Title));
240
+ i0.ɵɵattribute("aria-label", ctx_r1.RailWarningTitle(moreIndicators_r16.WarningCount, more_r15.Title));
241
+ i0.ɵɵadvance(2);
242
+ i0.ɵɵtextInterpolate1("", moreIndicators_r16.WarningCount, " ");
243
+ } }
244
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
245
+ const _r19 = i0.ɵɵgetCurrentView();
246
+ i0.ɵɵelementStart(0, "span", 40);
247
+ i0.ɵɵlistener("dragstart", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_1_Template_span_dragstart_0_listener($event) { i0.ɵɵrestoreView(_r19); const child_r18 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnRailDragStart($event, child_r18.Key)); })("dragend", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_1_Template_span_dragend_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r1.OnRailDragEnd()); })("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_1_Template_span_click_0_listener($event) { return $event.stopPropagation(); });
248
+ i0.ɵɵelement(1, "i", 41);
120
249
  i0.ɵɵelementEnd();
121
250
  } }
122
- function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
123
- i0.ɵɵelementStart(0, "span", 34);
251
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_6_Template(rf, ctx) { if (rf & 1) {
252
+ i0.ɵɵelement(0, "span", 36);
253
+ } if (rf & 2) {
254
+ const child_r18 = i0.ɵɵnextContext().$implicit;
255
+ const childIndicators_r20 = i0.ɵɵreadContextLet(5);
256
+ const ctx_r1 = i0.ɵɵnextContext(5);
257
+ i0.ɵɵproperty("title", ctx_r1.RailDirtyTitle(childIndicators_r20.DirtyCount, child_r18.Title));
258
+ i0.ɵɵattribute("aria-label", ctx_r1.RailDirtyTitle(childIndicators_r20.DirtyCount, child_r18.Title));
259
+ } }
260
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
261
+ i0.ɵɵelementStart(0, "span", 37);
262
+ i0.ɵɵelement(1, "i", 42);
263
+ i0.ɵɵtext(2);
264
+ i0.ɵɵelementEnd();
265
+ } if (rf & 2) {
266
+ const child_r18 = i0.ɵɵnextContext().$implicit;
267
+ const childIndicators_r20 = i0.ɵɵreadContextLet(5);
268
+ const ctx_r1 = i0.ɵɵnextContext(5);
269
+ i0.ɵɵproperty("title", ctx_r1.RailErrorTitle(childIndicators_r20.ErrorCount, child_r18.Title));
270
+ i0.ɵɵattribute("aria-label", ctx_r1.RailErrorTitle(childIndicators_r20.ErrorCount, child_r18.Title));
271
+ i0.ɵɵadvance(2);
272
+ i0.ɵɵtextInterpolate1("", childIndicators_r20.ErrorCount, " ");
273
+ } }
274
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
275
+ i0.ɵɵelementStart(0, "span", 38);
276
+ i0.ɵɵelement(1, "i", 43);
277
+ i0.ɵɵtext(2);
278
+ i0.ɵɵelementEnd();
279
+ } if (rf & 2) {
280
+ const child_r18 = i0.ɵɵnextContext().$implicit;
281
+ const childIndicators_r20 = i0.ɵɵreadContextLet(5);
282
+ const ctx_r1 = i0.ɵɵnextContext(5);
283
+ i0.ɵɵproperty("title", ctx_r1.RailWarningTitle(childIndicators_r20.WarningCount, child_r18.Title));
284
+ i0.ɵɵattribute("aria-label", ctx_r1.RailWarningTitle(childIndicators_r20.WarningCount, child_r18.Title));
285
+ i0.ɵɵadvance(2);
286
+ i0.ɵɵtextInterpolate1("", childIndicators_r20.WarningCount, " ");
287
+ } }
288
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_10_Template(rf, ctx) { if (rf & 1) {
289
+ i0.ɵɵelementStart(0, "span", 39);
124
290
  i0.ɵɵtext(1);
125
291
  i0.ɵɵelementEnd();
126
292
  } if (rf & 2) {
127
293
  i0.ɵɵnextContext();
128
- const childCount_r15 = i0.ɵɵreadContextLet(5);
129
- i0.ɵɵclassProp("is-zero", childCount_r15 === 0);
294
+ const childCount_r21 = i0.ɵɵreadContextLet(9);
130
295
  i0.ɵɵadvance();
131
- i0.ɵɵtextInterpolate(childCount_r15);
296
+ i0.ɵɵtextInterpolate(childCount_r21);
132
297
  } }
133
- function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
134
- const _r12 = i0.ɵɵgetCurrentView();
135
- i0.ɵɵelementStart(0, "div", 40);
136
- i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Template_div_click_0_listener() { const child_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(child_r13.Key)); })("keydown.enter", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Template_div_keydown_enter_0_listener() { const child_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(child_r13.Key)); })("keydown.space", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Template_div_keydown_space_0_listener($event) { const child_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); $event.preventDefault(); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(child_r13.Key)); })("dragover", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Template_div_dragover_0_listener($event) { const child_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnRailDragOver($event, child_r13.Key)); })("dragleave", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Template_div_dragleave_0_listener($event) { const child_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnRailDragLeave($event, child_r13.Key)); })("drop", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Template_div_drop_0_listener($event) { const child_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnRailDrop($event, child_r13.Key)); });
137
- i0.ɵɵconditionalCreate(1, MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Conditional_1_Template, 2, 0, "span", 29);
298
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template(rf, ctx) { if (rf & 1) {
299
+ const _r17 = i0.ɵɵgetCurrentView();
300
+ i0.ɵɵelementStart(0, "div", 49);
301
+ i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template_div_click_0_listener() { const child_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(child_r18.Key)); })("keydown.enter", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template_div_keydown_enter_0_listener() { const child_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(child_r18.Key)); })("keydown.space", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template_div_keydown_space_0_listener($event) { const child_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); $event.preventDefault(); return i0.ɵɵresetView(ctx_r1.OnChromeGroupActivate(child_r18.Key)); })("dragover", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template_div_dragover_0_listener($event) { const child_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnRailDragOver($event, child_r18.Key)); })("dragleave", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template_div_dragleave_0_listener($event) { const child_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnRailDragLeave($event, child_r18.Key)); })("drop", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template_div_drop_0_listener($event) { const child_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnRailDrop($event, child_r18.Key)); });
302
+ i0.ɵɵconditionalCreate(1, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_1_Template, 2, 0, "span", 34);
138
303
  i0.ɵɵelement(2, "i");
139
- i0.ɵɵelementStart(3, "span", 30);
140
- i0.ɵɵlistener("mouseenter", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Template_span_mouseenter_3_listener($event) { const child_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnRailLabelHover($event, child_r13.Title)); });
304
+ i0.ɵɵelementStart(3, "span", 35);
305
+ i0.ɵɵlistener("mouseenter", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template_span_mouseenter_3_listener($event) { const child_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.OnRailLabelHover($event, child_r18.Title)); });
141
306
  i0.ɵɵtext(4);
142
307
  i0.ɵɵelementEnd();
143
308
  i0.ɵɵdeclareLet(5);
144
- i0.ɵɵconditionalCreate(6, MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Conditional_6_Template, 2, 3, "span", 31);
309
+ i0.ɵɵconditionalCreate(6, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_6_Template, 1, 2, "span", 36);
310
+ i0.ɵɵconditionalCreate(7, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_7_Template, 3, 3, "span", 37)(8, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_8_Template, 3, 3, "span", 38);
311
+ i0.ɵɵdeclareLet(9);
312
+ i0.ɵɵconditionalCreate(10, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Conditional_10_Template, 2, 1, "span", 39);
145
313
  i0.ɵɵelementEnd();
146
314
  } if (rf & 2) {
147
- const child_r13 = ctx.$implicit;
315
+ const child_r18 = ctx.$implicit;
148
316
  const ctx_r1 = i0.ɵɵnextContext(5);
149
- i0.ɵɵclassProp("is-active", ctx_r1.ChromeActiveGroupKey === child_r13.Key)("is-drag-over", ctx_r1.RailDragOverKey === child_r13.Key);
150
- i0.ɵɵattribute("aria-current", ctx_r1.ChromeActiveGroupKey === child_r13.Key ? "page" : null);
317
+ i0.ɵɵclassProp("is-active", ctx_r1.ChromeActiveGroupKey === child_r18.Key)("is-drag-over", ctx_r1.RailDragOverKey === child_r18.Key)("has-errors", ctx_r1.ChromeGroupIndicators(child_r18).ErrorCount > 0)("is-dirty", ctx_r1.ChromeGroupIndicators(child_r18).DirtyCount > 0);
318
+ i0.ɵɵattribute("aria-current", ctx_r1.ChromeActiveGroupKey === child_r18.Key ? "page" : null);
151
319
  i0.ɵɵadvance();
152
320
  i0.ɵɵconditional(ctx_r1.ChromeReorderAllowed ? 1 : -1);
153
321
  i0.ɵɵadvance();
154
- i0.ɵɵclassMap(child_r13.Icon);
322
+ i0.ɵɵclassMap(child_r18.Icon);
155
323
  i0.ɵɵadvance(2);
156
- i0.ɵɵtextInterpolate(child_r13.Title);
324
+ i0.ɵɵtextInterpolate(child_r18.Title);
325
+ i0.ɵɵadvance();
326
+ const childIndicators_r22 = i0.ɵɵstoreLet(ctx_r1.ChromeGroupIndicators(child_r18));
157
327
  i0.ɵɵadvance();
158
- const childCount_r16 = i0.ɵɵstoreLet(ctx_r1.ChromeGroupRowCount(child_r13));
328
+ i0.ɵɵconditional(childIndicators_r22.DirtyCount > 0 ? 6 : -1);
159
329
  i0.ɵɵadvance();
160
- i0.ɵɵconditional(childCount_r16 != null ? 6 : -1);
330
+ i0.ɵɵconditional(childIndicators_r22.ErrorCount > 0 ? 7 : childIndicators_r22.WarningCount > 0 ? 8 : -1);
331
+ i0.ɵɵadvance(2);
332
+ const childCount_r23 = i0.ɵɵstoreLet(ctx_r1.ChromeGroupRowCount(child_r18));
333
+ i0.ɵɵadvance();
334
+ i0.ɵɵconditional(childCount_r23 != null && childCount_r23 > 0 ? 10 : -1);
161
335
  } }
162
- function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
163
- i0.ɵɵelementStart(0, "div", 38);
164
- i0.ɵɵrepeaterCreate(1, MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_For_2_Template, 7, 11, "div", 39, _forTrack0);
336
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_Template(rf, ctx) { if (rf & 1) {
337
+ i0.ɵɵelementStart(0, "div", 47);
338
+ i0.ɵɵrepeaterCreate(1, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_For_2_Template, 11, 18, "div", 48, _forTrack0);
165
339
  i0.ɵɵelementEnd();
166
340
  } if (rf & 2) {
167
341
  const ctx_r1 = i0.ɵɵnextContext(4);
168
342
  i0.ɵɵadvance();
169
343
  i0.ɵɵrepeater(ctx_r1.ChromeMoreItems);
170
344
  } }
171
- function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
172
- const _r10 = i0.ɵɵgetCurrentView();
173
- i0.ɵɵelementStart(0, "div", 35);
174
- i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMoreFolderToggle()); })("keydown.enter", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Template_div_keydown_enter_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMoreFolderToggle()); })("keydown.space", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Template_div_keydown_space_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); $event.preventDefault(); return i0.ɵɵresetView(ctx_r1.OnMoreFolderToggle()); });
175
- i0.ɵɵelement(1, "span", 36)(2, "i");
176
- i0.ɵɵelementStart(3, "span", 30);
177
- i0.ɵɵlistener("mouseenter", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Template_span_mouseenter_3_listener($event) { const more_r11 = i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailLabelHover($event, more_r11.Title)); });
345
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
346
+ const _r14 = i0.ɵɵgetCurrentView();
347
+ i0.ɵɵelementStart(0, "div", 44);
348
+ i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMoreFolderToggle()); })("keydown.enter", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Template_div_keydown_enter_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMoreFolderToggle()); })("keydown.space", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Template_div_keydown_space_0_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); $event.preventDefault(); return i0.ɵɵresetView(ctx_r1.OnMoreFolderToggle()); });
349
+ i0.ɵɵelement(1, "span", 45)(2, "i");
350
+ i0.ɵɵelementStart(3, "span", 35);
351
+ i0.ɵɵlistener("mouseenter", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Template_span_mouseenter_3_listener($event) { const more_r15 = i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnRailLabelHover($event, more_r15.Title)); });
178
352
  i0.ɵɵtext(4);
179
353
  i0.ɵɵelementEnd();
180
- i0.ɵɵelement(5, "i", 37);
354
+ i0.ɵɵdeclareLet(5);
355
+ i0.ɵɵconditionalCreate(6, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_6_Template, 1, 2, "span", 36);
356
+ i0.ɵɵconditionalCreate(7, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_7_Template, 3, 3, "span", 37)(8, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_8_Template, 3, 3, "span", 38);
357
+ i0.ɵɵelement(9, "i", 46);
181
358
  i0.ɵɵelementEnd();
182
- i0.ɵɵconditionalCreate(6, MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Conditional_6_Template, 3, 0, "div", 38);
359
+ i0.ɵɵconditionalCreate(10, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Conditional_10_Template, 3, 0, "div", 47);
183
360
  } if (rf & 2) {
361
+ const more_r15 = ctx;
184
362
  const ctx_r1 = i0.ɵɵnextContext(3);
185
- i0.ɵɵclassProp("is-expanded", ctx_r1.MoreExpanded);
363
+ i0.ɵɵclassProp("is-expanded", ctx_r1.MoreExpanded)("has-errors", ctx_r1.ChromeGroupIndicators(more_r15).ErrorCount > 0);
186
364
  i0.ɵɵadvance(2);
187
365
  i0.ɵɵclassMap(ctx_r1.MoreExpanded ? "fa-solid fa-folder-open" : "fa-solid fa-folder");
188
366
  i0.ɵɵadvance(2);
189
- i0.ɵɵtextInterpolate(ctx.Title);
367
+ i0.ɵɵtextInterpolate(more_r15.Title);
368
+ i0.ɵɵadvance();
369
+ const moreIndicators_r24 = i0.ɵɵstoreLet(ctx_r1.ChromeGroupIndicators(more_r15));
190
370
  i0.ɵɵadvance();
371
+ i0.ɵɵconditional(moreIndicators_r24.DirtyCount > 0 ? 6 : -1);
372
+ i0.ɵɵadvance();
373
+ i0.ɵɵconditional(moreIndicators_r24.ErrorCount > 0 ? 7 : moreIndicators_r24.WarningCount > 0 ? 8 : -1);
374
+ i0.ɵɵadvance(2);
191
375
  i0.ɵɵclassProp("fa-minus", ctx_r1.MoreExpanded)("fa-plus", !ctx_r1.MoreExpanded);
192
376
  i0.ɵɵadvance();
193
- i0.ɵɵconditional(ctx_r1.MoreExpanded ? 6 : -1);
377
+ i0.ɵɵconditional(ctx_r1.MoreExpanded ? 10 : -1);
194
378
  } }
195
- function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Template(rf, ctx) { if (rf & 1) {
196
- const _r4 = i0.ɵɵgetCurrentView();
197
- i0.ɵɵelementStart(0, "div", 21);
198
- i0.ɵɵlistener("pointerdown", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Template_div_pointerdown_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRailResizeStart($event)); })("pointermove", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Template_div_pointermove_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRailResizeMove($event)); })("pointerup", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Template_div_pointerup_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRailResizeEnd()); })("pointercancel", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Template_div_pointercancel_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRailResizeEnd()); });
379
+ function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
380
+ const _r6 = i0.ɵɵgetCurrentView();
381
+ i0.ɵɵelementStart(0, "div", 25);
382
+ i0.ɵɵlistener("pointerdown", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template_div_pointerdown_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRailResizeStart($event)); })("pointermove", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template_div_pointermove_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRailResizeMove($event)); })("pointerup", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template_div_pointerup_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRailResizeEnd()); })("pointercancel", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template_div_pointercancel_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnRailResizeEnd()); });
199
383
  i0.ɵɵelementEnd();
200
- i0.ɵɵelementStart(1, "div", 22)(2, "button", 23);
201
- i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnChromeRailPinToggle()); });
202
- i0.ɵɵelement(3, "i", 24);
384
+ i0.ɵɵelementStart(1, "div", 26)(2, "button", 27);
385
+ i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnChromeRailPinToggle()); });
386
+ i0.ɵɵelement(3, "i", 28);
203
387
  i0.ɵɵelementEnd();
204
- i0.ɵɵelementStart(4, "button", 25);
205
- i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnChromeRailCollapse()); });
206
- i0.ɵɵelement(5, "i", 26);
388
+ i0.ɵɵelementStart(4, "button", 29);
389
+ i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnChromeRailCollapse()); });
390
+ i0.ɵɵelement(5, "i", 30);
207
391
  i0.ɵɵelementEnd()();
208
- i0.ɵɵrepeaterCreate(6, MjRecordFormContainerComponent_Conditional_5_Conditional_2_For_7_Template, 7, 11, "div", 27, _forTrack0);
209
- i0.ɵɵconditionalCreate(8, MjRecordFormContainerComponent_Conditional_5_Conditional_2_Conditional_8_Template, 7, 10);
392
+ i0.ɵɵelementStart(6, "div", 31);
393
+ i0.ɵɵrepeaterCreate(7, MjRecordFormContainerComponent_Conditional_7_Conditional_2_For_8_Template, 11, 18, "div", 32, _forTrack0);
394
+ i0.ɵɵconditionalCreate(9, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Conditional_9_Template, 11, 15);
395
+ i0.ɵɵelementEnd();
210
396
  } if (rf & 2) {
211
397
  let tmp_9_0;
212
398
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -215,14 +401,14 @@ function MjRecordFormContainerComponent_Conditional_5_Conditional_2_Template(rf,
215
401
  i0.ɵɵclassProp("is-pinned", ctx_r1.ChromeRailPinned);
216
402
  i0.ɵɵproperty("title", ctx_r1.ChromeRailPinned ? "Unpin sections \u2014 they hide after you switch" : "Pin sections open");
217
403
  i0.ɵɵattribute("aria-pressed", ctx_r1.ChromeRailPinned);
218
- i0.ɵɵadvance(4);
404
+ i0.ɵɵadvance(5);
219
405
  i0.ɵɵrepeater(ctx_r1.ChromeFirstClassGroups);
220
406
  i0.ɵɵadvance(2);
221
- i0.ɵɵconditional((tmp_9_0 = ctx_r1.ChromeMoreFolder) ? 8 : -1, tmp_9_0);
407
+ i0.ɵɵconditional((tmp_9_0 = ctx_r1.ChromeMoreFolder) ? 9 : -1, tmp_9_0);
222
408
  } }
223
- function MjRecordFormContainerComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
224
- i0.ɵɵelementStart(0, "nav", 17);
225
- i0.ɵɵconditionalCreate(1, MjRecordFormContainerComponent_Conditional_5_Conditional_1_Template, 4, 5, "button", 18)(2, MjRecordFormContainerComponent_Conditional_5_Conditional_2_Template, 9, 8);
409
+ function MjRecordFormContainerComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
410
+ i0.ɵɵelementStart(0, "nav", 18);
411
+ i0.ɵɵconditionalCreate(1, MjRecordFormContainerComponent_Conditional_7_Conditional_1_Template, 8, 8, "button", 19)(2, MjRecordFormContainerComponent_Conditional_7_Conditional_2_Template, 10, 8);
226
412
  i0.ɵɵelementEnd();
227
413
  } if (rf & 2) {
228
414
  const ctx_r1 = i0.ɵɵnextContext();
@@ -232,14 +418,14 @@ function MjRecordFormContainerComponent_Conditional_5_Template(rf, ctx) { if (rf
232
418
  i0.ɵɵadvance();
233
419
  i0.ɵɵconditional(ctx_r1.ChromeRailCollapsed ? 1 : 2);
234
420
  } }
235
- function MjRecordFormContainerComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
236
- i0.ɵɵelement(0, "mj-form-contributions", 6);
421
+ function MjRecordFormContainerComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
422
+ i0.ɵɵelement(0, "mj-form-contributions", 7);
237
423
  } if (rf & 2) {
238
424
  const ctx_r1 = i0.ɵɵnextContext();
239
425
  i0.ɵɵproperty("Record", ctx_r1.Record)("FormComponent", ctx_r1.FormComponent)("FormContext", ctx_r1.FormComponent.formContext)("BakedSectionKeys", ctx_r1.BakedRelatedSectionKeys)("ShowRelatedEntities", ctx_r1.EffectiveShowRelatedEntities);
240
426
  } }
241
- function MjRecordFormContainerComponent_Conditional_9_Conditional_5_Template(rf, ctx) { if (rf & 1) {
242
- i0.ɵɵelementStart(0, "span", 44);
427
+ function MjRecordFormContainerComponent_Conditional_11_Conditional_5_Template(rf, ctx) { if (rf & 1) {
428
+ i0.ɵɵelementStart(0, "span", 53);
243
429
  i0.ɵɵtext(1);
244
430
  i0.ɵɵelementEnd();
245
431
  } if (rf & 2) {
@@ -247,16 +433,16 @@ function MjRecordFormContainerComponent_Conditional_9_Conditional_5_Template(rf,
247
433
  i0.ɵɵadvance();
248
434
  i0.ɵɵtextInterpolate(ctx_r1.MorePreview);
249
435
  } }
250
- function MjRecordFormContainerComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
251
- const _r17 = i0.ɵɵgetCurrentView();
252
- i0.ɵɵelementStart(0, "div", 41)(1, "button", 42);
253
- i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_9_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnMoreToggle()); });
436
+ function MjRecordFormContainerComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
437
+ const _r25 = i0.ɵɵgetCurrentView();
438
+ i0.ɵɵelementStart(0, "div", 50)(1, "button", 51);
439
+ i0.ɵɵlistener("click", function MjRecordFormContainerComponent_Conditional_11_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnMoreToggle()); });
254
440
  i0.ɵɵelement(2, "i");
255
- i0.ɵɵelementStart(3, "span", 43);
441
+ i0.ɵɵelementStart(3, "span", 52);
256
442
  i0.ɵɵtext(4);
257
443
  i0.ɵɵelementEnd();
258
- i0.ɵɵconditionalCreate(5, MjRecordFormContainerComponent_Conditional_9_Conditional_5_Template, 2, 1, "span", 44);
259
- i0.ɵɵelement(6, "i", 45);
444
+ i0.ɵɵconditionalCreate(5, MjRecordFormContainerComponent_Conditional_11_Conditional_5_Template, 2, 1, "span", 53);
445
+ i0.ɵɵelement(6, "i", 54);
260
446
  i0.ɵɵelementEnd()();
261
447
  } if (rf & 2) {
262
448
  const ctx_r1 = i0.ɵɵnextContext();
@@ -270,52 +456,52 @@ function MjRecordFormContainerComponent_Conditional_9_Template(rf, ctx) { if (rf
270
456
  i0.ɵɵadvance();
271
457
  i0.ɵɵclassProp("fa-chevron-down", ctx_r1.MoreExpanded)("fa-chevron-right", !ctx_r1.MoreExpanded);
272
458
  } }
273
- function MjRecordFormContainerComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
274
- i0.ɵɵelement(0, "mj-form-panel-slot", 8);
459
+ function MjRecordFormContainerComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
460
+ i0.ɵɵelement(0, "mj-form-panel-slot", 9);
275
461
  } if (rf & 2) {
276
462
  const ctx_r1 = i0.ɵɵnextContext();
277
463
  i0.ɵɵproperty("Entity", ctx_r1.Record.EntityInfo.Name)("Record", ctx_r1.Record)("FormComponent", ctx_r1.FormComponent);
278
464
  } }
279
- function MjRecordFormContainerComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
280
- const _r18 = i0.ɵɵgetCurrentView();
281
- i0.ɵɵelementStart(0, "mj-empty-state", 46);
282
- i0.ɵɵlistener("Action", function MjRecordFormContainerComponent_Conditional_11_Template_mj_empty_state_Action_0_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFilterChange("")); });
465
+ function MjRecordFormContainerComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
466
+ const _r26 = i0.ɵɵgetCurrentView();
467
+ i0.ɵɵelementStart(0, "mj-empty-state", 55);
468
+ i0.ɵɵlistener("Action", function MjRecordFormContainerComponent_Conditional_13_Template_mj_empty_state_Action_0_listener() { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnFilterChange("")); });
283
469
  i0.ɵɵelementEnd();
284
470
  } if (rf & 2) {
285
471
  const ctx_r1 = i0.ɵɵnextContext();
286
472
  i0.ɵɵproperty("Message", "No sections match \"" + ctx_r1.EffectiveSearchFilter + "\". Try a different search term.");
287
473
  } }
288
- function MjRecordFormContainerComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
289
- const _r19 = i0.ɵɵgetCurrentView();
290
- i0.ɵɵelementStart(0, "mj-record-changes", 47);
291
- i0.ɵɵlistener("RestoreRequested", function MjRecordFormContainerComponent_Conditional_13_Template_mj_record_changes_RestoreRequested_0_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnRestoreRequested($event)); })("dialogClosed", function MjRecordFormContainerComponent_Conditional_13_Template_mj_record_changes_dialogClosed_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnRecordChangesClosed()); });
474
+ function MjRecordFormContainerComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
475
+ const _r27 = i0.ɵɵgetCurrentView();
476
+ i0.ɵɵelementStart(0, "mj-record-changes", 56);
477
+ i0.ɵɵlistener("RestoreRequested", function MjRecordFormContainerComponent_Conditional_15_Template_mj_record_changes_RestoreRequested_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnRestoreRequested($event)); })("dialogClosed", function MjRecordFormContainerComponent_Conditional_15_Template_mj_record_changes_dialogClosed_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnRecordChangesClosed()); });
292
478
  i0.ɵɵelementEnd();
293
479
  } if (rf & 2) {
294
480
  const ctx_r1 = i0.ɵɵnextContext();
295
481
  i0.ɵɵproperty("record", ctx_r1.EffectiveRecord)("AllowRestore", ctx_r1.EffectiveUserCanEdit);
296
482
  } }
297
- function MjRecordFormContainerComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
298
- const _r20 = i0.ɵɵgetCurrentView();
299
- i0.ɵɵelementStart(0, "mj-record-tags", 48);
300
- i0.ɵɵlistener("PanelClosed", function MjRecordFormContainerComponent_Conditional_14_Template_mj_record_tags_PanelClosed_0_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnTagsPanelClosed()); })("TagCountChanged", function MjRecordFormContainerComponent_Conditional_14_Template_mj_record_tags_TagCountChanged_0_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnTagCountChanged($event)); })("RecordNavigate", function MjRecordFormContainerComponent_Conditional_14_Template_mj_record_tags_RecordNavigate_0_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnTagsRecordNavigate($event)); })("WidthChanged", function MjRecordFormContainerComponent_Conditional_14_Template_mj_record_tags_WidthChanged_0_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnTagsPanelWidthChanged($event)); });
483
+ function MjRecordFormContainerComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
484
+ const _r28 = i0.ɵɵgetCurrentView();
485
+ i0.ɵɵelementStart(0, "mj-record-tags", 57);
486
+ i0.ɵɵlistener("PanelClosed", function MjRecordFormContainerComponent_Conditional_16_Template_mj_record_tags_PanelClosed_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnTagsPanelClosed()); })("TagCountChanged", function MjRecordFormContainerComponent_Conditional_16_Template_mj_record_tags_TagCountChanged_0_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnTagCountChanged($event)); })("RecordNavigate", function MjRecordFormContainerComponent_Conditional_16_Template_mj_record_tags_RecordNavigate_0_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnTagsRecordNavigate($event)); })("WidthChanged", function MjRecordFormContainerComponent_Conditional_16_Template_mj_record_tags_WidthChanged_0_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnTagsPanelWidthChanged($event)); });
301
487
  i0.ɵɵelementEnd();
302
488
  } if (rf & 2) {
303
489
  const ctx_r1 = i0.ɵɵnextContext();
304
490
  i0.ɵɵproperty("Record", ctx_r1.EffectiveRecord)("WidthPx", ctx_r1.TagsPanelWidth);
305
491
  } }
306
- function MjRecordFormContainerComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
307
- const _r21 = i0.ɵɵgetCurrentView();
308
- i0.ɵɵelementStart(0, "mj-record-attachments", 49);
309
- i0.ɵɵlistener("PanelClosed", function MjRecordFormContainerComponent_Conditional_15_Template_mj_record_attachments_PanelClosed_0_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnAttachmentsPanelClosed()); })("AttachmentCountChanged", function MjRecordFormContainerComponent_Conditional_15_Template_mj_record_attachments_AttachmentCountChanged_0_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnAttachmentCountChanged($event)); });
492
+ function MjRecordFormContainerComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
493
+ const _r29 = i0.ɵɵgetCurrentView();
494
+ i0.ɵɵelementStart(0, "mj-record-attachments", 58);
495
+ i0.ɵɵlistener("PanelClosed", function MjRecordFormContainerComponent_Conditional_17_Template_mj_record_attachments_PanelClosed_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnAttachmentsPanelClosed()); })("AttachmentCountChanged", function MjRecordFormContainerComponent_Conditional_17_Template_mj_record_attachments_AttachmentCountChanged_0_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnAttachmentCountChanged($event)); });
310
496
  i0.ɵɵelementEnd();
311
497
  } if (rf & 2) {
312
498
  const ctx_r1 = i0.ɵɵnextContext();
313
499
  i0.ɵɵproperty("Record", ctx_r1.EffectiveRecord)("Visible", true);
314
500
  } }
315
- function MjRecordFormContainerComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
316
- const _r22 = i0.ɵɵgetCurrentView();
317
- i0.ɵɵelementStart(0, "mj-list-management-dialog", 50);
318
- i0.ɵɵlistener("complete", function MjRecordFormContainerComponent_Conditional_16_Template_mj_list_management_dialog_complete_0_listener($event) { i0.ɵɵrestoreView(_r22); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnListManagementComplete($event)); })("cancel", function MjRecordFormContainerComponent_Conditional_16_Template_mj_list_management_dialog_cancel_0_listener() { i0.ɵɵrestoreView(_r22); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnListManagementClosed()); });
501
+ function MjRecordFormContainerComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
502
+ const _r30 = i0.ɵɵgetCurrentView();
503
+ i0.ɵɵelementStart(0, "mj-list-management-dialog", 59);
504
+ i0.ɵɵlistener("complete", function MjRecordFormContainerComponent_Conditional_18_Template_mj_list_management_dialog_complete_0_listener($event) { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnListManagementComplete($event)); })("cancel", function MjRecordFormContainerComponent_Conditional_18_Template_mj_list_management_dialog_cancel_0_listener() { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnListManagementClosed()); });
319
505
  i0.ɵɵelementEnd();
320
506
  } if (rf & 2) {
321
507
  const ctx_r1 = i0.ɵɵnextContext();
@@ -356,12 +542,17 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
356
542
  ngZone = inject(NgZone);
357
543
  notificationService = inject(MJNotificationService);
358
544
  chrome = inject(FormChromeCoordinator);
545
+ sectionIndicators = inject(FormSectionIndicatorCoordinator);
359
546
  slots = inject(FormSlotCoordinator);
360
547
  recordRefresh = inject(FormRecordRefreshCoordinator);
361
548
  host = inject((ElementRef));
362
549
  destroy$ = new Subject();
363
550
  panelNavReset$ = new Subject();
364
551
  chromeResolveTimer = null;
552
+ /** Last values `ngDoCheck` resolved the rail for — see that method. */
553
+ lastRailEditMode = false;
554
+ lastRailShowEmptyFields = false;
555
+ lastRailSearchFilter = '';
365
556
  chromeRules = [];
366
557
  chromeRulesForEntityId = null;
367
558
  // ---- Internal State ----
@@ -800,11 +991,45 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
800
991
  this.slots.changes.pipe(takeUntil(this.destroy$)).subscribe(() => {
801
992
  this.scheduleChromeResolve();
802
993
  });
994
+ // A section registering / leaving, or reporting an edit, changes what the rail
995
+ // shows; the container is OnPush, so re-read on the next pass rather than on the
996
+ // 200ms dirty poll below.
997
+ this.sectionIndicators.Changes.pipe(takeUntil(this.destroy$)).subscribe(() => {
998
+ this.cdr.markForCheck();
999
+ });
803
1000
  this.RestoreChromePrefs();
804
1001
  this.scheduleChromeResolve();
805
1002
  // Watch for changes to record dirty state
806
1003
  this.watchRecordChanges();
807
1004
  }
1005
+ /**
1006
+ * Edit mode and Show Empty Fields both flip `mj-panel-empty` on a panel whose
1007
+ * fields are all blank (see `MjFormFieldComponent.ShouldHideField`), and
1008
+ * `domPanelSnapshots()` drops those panels from the rail. The panel itself
1009
+ * recomputes live, but the rail is only resolved on structural changes — so
1010
+ * without this the nav entry never comes back on switching to edit.
1011
+ *
1012
+ * Watched here rather than in `OnEditModeChange` because the toolbar is not
1013
+ * the only writer: `SaveRecord()` and `CancelEdit()` call `EndEditMode()` on
1014
+ * the form component directly, bypassing that handler entirely.
1015
+ */
1016
+ ngDoCheck() {
1017
+ const editMode = this.EffectiveEditMode;
1018
+ const showEmptyFields = this.EffectiveShowEmptyFields;
1019
+ // The section filter hides panels through their own host class, which is
1020
+ // applied during change detection — after OnFilterChange's synchronous
1021
+ // re-apply. Watching it here re-runs the chrome pass (setTimeout 0) once
1022
+ // those classes are current, so the Details card edges skip hidden panels.
1023
+ const searchFilter = this.EffectiveSearchFilter;
1024
+ if (editMode === this.lastRailEditMode
1025
+ && showEmptyFields === this.lastRailShowEmptyFields
1026
+ && searchFilter === this.lastRailSearchFilter)
1027
+ return;
1028
+ this.lastRailEditMode = editMode;
1029
+ this.lastRailShowEmptyFields = showEmptyFields;
1030
+ this.lastRailSearchFilter = searchFilter;
1031
+ this.scheduleChromeResolve();
1032
+ }
808
1033
  ngOnDestroy() {
809
1034
  if (this.chromeResolveTimer) {
810
1035
  clearTimeout(this.chromeResolveTimer);
@@ -820,6 +1045,68 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
820
1045
  this.PersistChromePrefs();
821
1046
  this.cdr.detectChanges();
822
1047
  }
1048
+ // ---- Section indicators on the rail ----
1049
+ /**
1050
+ * Unsaved-edit / invalid-field / warning counts for a rail group — summed over the
1051
+ * section keys it fronts, since one group (notably `Details`) fronts many panels.
1052
+ * Read live from each panel through {@link FormSectionIndicatorCoordinator}, so the
1053
+ * rail can never disagree with the fields' own dot and underline.
1054
+ */
1055
+ ChromeGroupIndicators(group) {
1056
+ return this.sectionIndicators.IndicatorsForKeys(group.SectionKeys);
1057
+ }
1058
+ /**
1059
+ * Whole-form totals — what the COLLAPSED rail spine shows, since no individual
1060
+ * rail item is visible there. Summed over the RAIL GROUPS (first-class + More), not
1061
+ * over every registered panel: a panel the chrome dropped from the rail (System
1062
+ * Metadata in left-nav, a claimed baked grid) is not something the user can reach
1063
+ * from the rail, so the spine must add up to exactly what the expanded rail shows.
1064
+ * Includes form-level validation failures no section claims, so a rejected save
1065
+ * never leaves the user with a clean-looking rail.
1066
+ */
1067
+ get FormIndicators() {
1068
+ return SumSectionIndicators(...this.ChromeGroups.map((group) => this.ChromeGroupIndicators(group)), TallyValidationErrors(this.unroutedValidationErrors()));
1069
+ }
1070
+ /** Failures no registered section claims — kept visible on the spine total. */
1071
+ get UnroutedValidationErrorCount() {
1072
+ return TallyValidationErrors(this.unroutedValidationErrors()).ErrorCount;
1073
+ }
1074
+ unroutedValidationErrors() {
1075
+ const ctx = this.fc?.formContext;
1076
+ if (!ctx?.showValidation || !ctx.validationErrors?.length)
1077
+ return [];
1078
+ // Only a section with a rail item may claim: a registered section the chrome dropped
1079
+ // (hidden by config, in no group) has no badge anywhere, so its failures must stay
1080
+ // in the whole-form total rather than disappear.
1081
+ const reachable = new Set(this.ChromeGroups.flatMap((group) => group.SectionKeys));
1082
+ return this.sectionIndicators.UnroutedValidationErrors(ctx.validationErrors, reachable);
1083
+ }
1084
+ /**
1085
+ * One sentence for the persistent polite live region. The badges themselves are
1086
+ * plain indicators (`role="img"`): they are inserted together with their text, which
1087
+ * screen readers announce unreliably, and one edit can add three at once. A single
1088
+ * region that exists from the start and changes its text announces once, reliably.
1089
+ */
1090
+ get FormIndicatorsAnnouncement() {
1091
+ const totals = this.FormIndicators;
1092
+ const parts = [];
1093
+ if (totals.ErrorCount > 0)
1094
+ parts.push(DescribeSectionErrors(totals.ErrorCount, 'this record'));
1095
+ else if (totals.WarningCount > 0)
1096
+ parts.push(DescribeSectionWarnings(totals.WarningCount, 'this record'));
1097
+ if (totals.DirtyCount > 0)
1098
+ parts.push(DescribeSectionDirty(totals.DirtyCount, 'this record'));
1099
+ return parts.join('. ');
1100
+ }
1101
+ RailDirtyTitle(count, where) {
1102
+ return DescribeSectionDirty(count, where);
1103
+ }
1104
+ RailErrorTitle(count, where) {
1105
+ return DescribeSectionErrors(count, where);
1106
+ }
1107
+ RailWarningTitle(count, where) {
1108
+ return DescribeSectionWarnings(count, where);
1109
+ }
823
1110
  ChromeGroupRowCount(group) {
824
1111
  if (!this.fc?.GetSectionRowCount)
825
1112
  return undefined;
@@ -1142,6 +1429,7 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
1142
1429
  if (!host)
1143
1430
  return;
1144
1431
  const layout = this.chrome.Spec.Layout;
1432
+ const detailsKeys = [];
1145
1433
  host.querySelectorAll('mj-collapsible-panel').forEach((node) => {
1146
1434
  const key = node.getAttribute('data-section-key') ?? '';
1147
1435
  const variant = node.getAttribute('data-variant') ?? 'default';
@@ -1150,6 +1438,32 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
1150
1438
  node.classList.toggle('mj-chrome-show', layout === 'left-nav' && visible);
1151
1439
  node.classList.toggle('mj-chrome-hidden', !visible);
1152
1440
  node.classList.toggle('mj-form-role-more', inMore);
1441
+ // Details shows several panels under one rail item; its FIELD panels
1442
+ // render as ONE card (see the left-nav rules in the component CSS). A
1443
+ // related grid pinned into Details (`ChromeGroup: 'details'`) keeps the
1444
+ // chrome-less grid treatment and sits outside the card — the segment
1445
+ // padding is sized for field rows, not for AG Grid.
1446
+ const isDetails = layout === 'left-nav' && visible
1447
+ && variant !== 'related-entity'
1448
+ && IsDetailsSectionKey(this.chrome.Spec, key);
1449
+ node.classList.toggle('mj-chrome-details', isDetails);
1450
+ // A panel that hid ITSELF (`mj-search-hidden`: the section filter
1451
+ // excludes it, or it has no renderable content while empty fields are
1452
+ // hidden) is display: none — it must not hold a card edge, or the
1453
+ // visible card loses that border, radius and edge padding.
1454
+ if (isDetails && !node.classList.contains('mj-search-hidden'))
1455
+ detailsKeys.push(key);
1456
+ });
1457
+ // The card's top and bottom edges follow the VISUAL order (CSS `order`
1458
+ // = the form's section display order), not DOM order.
1459
+ const edges = DetailsCardEdges(detailsKeys, (k) => this.FormComponent?.getSectionDisplayOrder(k) ?? 0);
1460
+ host.querySelectorAll('mj-collapsible-panel.mj-chrome-details').forEach((node) => {
1461
+ const key = node.getAttribute('data-section-key') ?? '';
1462
+ node.classList.toggle('mj-chrome-details-first', key === edges.First);
1463
+ node.classList.toggle('mj-chrome-details-last', key === edges.Last);
1464
+ });
1465
+ host.querySelectorAll('mj-collapsible-panel:not(.mj-chrome-details)').forEach((node) => {
1466
+ node.classList.remove('mj-chrome-details-first', 'mj-chrome-details-last');
1153
1467
  });
1154
1468
  }
1155
1469
  isChromeKeyVisible(sectionKey, variant) {
@@ -1319,12 +1633,24 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
1319
1633
  const name = (this.EffectiveEntityInfo?.Name ?? 'entity').trim().toLowerCase();
1320
1634
  return `mj.formChrome.${name}.${suffix}`;
1321
1635
  }
1636
+ /** Delegates to the pure decision in `form-chrome-rail-pref`, supplying this form's registrations. */
1637
+ UnsavedLeadGroupKey() {
1638
+ return UnsavedLeadGroupKey(this.EffectiveEntityInfo?.Name, CollectFormPanelRegistrations(), contributionRailKey);
1639
+ }
1322
1640
  RestoreChromePrefs() {
1323
1641
  if (ShouldPersistChromeActiveGroup(this.EffectiveRecord?.IsSaved)) {
1324
1642
  const group = UserInfoEngine.Instance.GetSetting(this.chromePrefKey('activeGroup'));
1325
1643
  if (group)
1326
1644
  this.chrome.ActiveGroupKey = group;
1327
1645
  }
1646
+ else {
1647
+ // A new record has no stored position to restore, so without this it opens on the lead
1648
+ // group -- which is usually a summary, and a summary of a record with no data is a page of
1649
+ // blanks. A contribution can opt out of that by declaring `leadsWhenUnsaved`.
1650
+ const lead = this.UnsavedLeadGroupKey();
1651
+ if (lead)
1652
+ this.chrome.ActiveGroupKey = lead;
1653
+ }
1328
1654
  const more = UserInfoEngine.Instance.GetSetting(this.chromePrefKey('moreExpanded'));
1329
1655
  if (more === '1')
1330
1656
  this.chrome.MoreExpanded = true;
@@ -1676,14 +2002,7 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
1676
2002
  }
1677
2003
  OnTagsRecordNavigate(event) {
1678
2004
  const md = this.ProviderToUse;
1679
- const entityInfo = md.Entities.find(e => e.Name === event.EntityName);
1680
- const pkey = new CompositeKey();
1681
- if (entityInfo) {
1682
- pkey.LoadFromURLSegment(entityInfo, event.RecordID);
1683
- }
1684
- else {
1685
- pkey.KeyValuePairs = [{ FieldName: 'ID', Value: event.RecordID }];
1686
- }
2005
+ const pkey = CompositeKey.FromURLSegment(md.EntityByName(event.EntityName), event.RecordID);
1687
2006
  this.Navigate.emit({ Kind: 'record', EntityName: event.EntityName, PrimaryKey: pkey });
1688
2007
  }
1689
2008
  OnRecordChangesClosed() {
@@ -1907,63 +2226,68 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
1907
2226
  } if (rf & 2) {
1908
2227
  let _t;
1909
2228
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.recordChangesDrawer = _t.first);
1910
- } }, inputs: { Record: "Record", FormComponent: "FormComponent", EntityInfo: "EntityInfo", EditMode: "EditMode", UserCanEdit: "UserCanEdit", UserCanDelete: "UserCanDelete", IsFavorite: "IsFavorite", FavoriteInitDone: "FavoriteInitDone", IsDirty: "IsDirty", DirtyFieldNames: "DirtyFieldNames", ListCount: "ListCount", IsSaving: "IsSaving", IsRefreshing: "IsRefreshing", ToolbarConfig: "ToolbarConfig", RegisteredToolbarItems: "RegisteredToolbarItems", ToolbarItemOverrides: "ToolbarItemOverrides", WidthMode: "WidthMode", Variants: "Variants", CurrentVariantID: "CurrentVariantID" }, outputs: { Navigate: "Navigate", EditModeChange: "EditModeChange", BeforeSave: "BeforeSave", SaveRequested: "SaveRequested", BeforeCancel: "BeforeCancel", CancelRequested: "CancelRequested", BeforeDelete: "BeforeDelete", DeleteRequested: "DeleteRequested", BeforeRefresh: "BeforeRefresh", RefreshRequested: "RefreshRequested", FavoriteToggled: "FavoriteToggled", BeforeHistoryView: "BeforeHistoryView", HistoryRequested: "HistoryRequested", BeforeListManagement: "BeforeListManagement", ListManagementRequested: "ListManagementRequested", ShowChangesRequested: "ShowChangesRequested", CustomButtonClick: "CustomButtonClick", ToolbarItemClick: "ToolbarItemClick", VariantChange: "VariantChange", BeforeLayoutResolve: "BeforeLayoutResolve", AfterLayoutResolved: "AfterLayoutResolved", BeforeSectionActivate: "BeforeSectionActivate", AfterSectionActivated: "AfterSectionActivated" }, standalone: false, features: [i0.ɵɵProvidersFeature([FormSlotCoordinator, FormChromeCoordinator, FormRecordRefreshCoordinator]), i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c1, decls: 18, vars: 30, consts: [[3, "Record", "EditMode", "UserCanEdit", "UserCanDelete", "IsFavorite", "FavoriteInitDone", "IsDirty", "DirtyFieldNames", "ListCount", "TagCount", "AttachmentCount", "AttachmentsAvailable", "IsAttachmentsPanelOpen", "VersionCount", "EntityInfo", "Config", "IsSaving", "IsRefreshing", "VisibleSectionCount", "TotalSectionCount", "ExpandedSectionCount", "SearchFilter", "ShowEmptyFields", "WidthMode", "HasCustomSectionOrder", "ChromeLayout", "Variants", "CurrentVariantID", "RegisteredItems", "ItemOverrides", "FormComponent"], [1, "mj-forms-scroll-area"], [1, "mj-forms-panels-container"], [1, "mj-forms-layout-row"], ["aria-label", "Form sections", 1, "mj-forms-chrome-rail", 3, "is-collapsed", "is-resizing", "width"], [1, "mj-forms-all-panels"], [3, "Record", "FormComponent", "FormContext", "BakedSectionKeys", "ShowRelatedEntities"], [1, "mj-forms-more-overflow", 3, "is-expanded"], ["Slot", "after-everything", 3, "Entity", "Record", "FormComponent"], ["Variant", "no-results", "Title", "No sections found", "ActionText", "Clear search", "ActionIcon", "fa-solid fa-rotate-left", "ActionVariant", "flat", 1, "mj-forms-empty-search-state", 3, "Message"], [3, "Navigate", "Record", "EditMode", "Collapsed"], [3, "record", "AllowRestore"], [3, "Record", "WidthPx"], [3, "Record", "Visible"], [3, "visible", "config"], [3, "SectionOrderChange", "MembershipChange", "ResetRequested", "Closed", "Sections", "SectionOrder", "MoreSectionKeys", "LockedMoreKeys", "Visible"], [3, "Navigate", "EditModeChange", "BeforeSave", "SaveRequested", "BeforeCancel", "CancelRequested", "BeforeDelete", "DeleteRequested", "BeforeRefresh", "RefreshRequested", "FavoriteToggled", "BeforeHistoryView", "HistoryRequested", "BeforeListManagement", "ListManagementRequested", "ShowChangesRequested", "CustomButtonClick", "ToolbarItemClick", "FilterChange", "ExpandAllRequested", "CollapseAllRequested", "ShowEmptyFieldsChange", "WidthModeChange", "ResetSectionOrderRequested", "ManageSectionsRequested", "TagsPanelToggled", "AttachmentsPanelToggled", "VariantPicked", "Record", "EditMode", "UserCanEdit", "UserCanDelete", "IsFavorite", "FavoriteInitDone", "IsDirty", "DirtyFieldNames", "ListCount", "TagCount", "AttachmentCount", "AttachmentsAvailable", "IsAttachmentsPanelOpen", "VersionCount", "EntityInfo", "Config", "IsSaving", "IsRefreshing", "VisibleSectionCount", "TotalSectionCount", "ExpandedSectionCount", "SearchFilter", "ShowEmptyFields", "WidthMode", "HasCustomSectionOrder", "ChromeLayout", "Variants", "CurrentVariantID", "RegisteredItems", "ItemOverrides", "FormComponent"], ["aria-label", "Form sections", 1, "mj-forms-chrome-rail"], ["type", "button", 1, "mj-forms-chrome-rail-spine", 3, "title"], ["type", "button", 1, "mj-forms-chrome-rail-spine", 3, "click", "title"], [1, "mj-forms-chrome-rail-spine-label", 3, "mouseenter"], ["role", "separator", "aria-orientation", "vertical", "title", "Drag to resize sections", 1, "mj-forms-chrome-rail-resizer", 3, "pointerdown", "pointermove", "pointerup", "pointercancel"], [1, "mj-forms-chrome-rail-toolbar"], ["type", "button", 1, "mj-forms-chrome-rail-pin", 3, "click", "title"], [1, "fa-solid", "fa-thumbtack"], ["type", "button", "title", "Hide sections", "aria-label", "Hide form sections", 1, "mj-forms-chrome-rail-collapse", 3, "click"], [1, "fa-solid", "fa-angles-left"], ["role", "button", "tabindex", "0", 1, "mj-forms-chrome-rail-item", 3, "is-active", "is-drag-over"], ["role", "button", "tabindex", "0", 1, "mj-forms-chrome-rail-item", 3, "click", "keydown.enter", "keydown.space", "dragover", "dragleave", "drop"], ["title", "Drag to reorder", "draggable", "true", 1, "mj-forms-chrome-rail-handle"], [1, "mj-forms-chrome-rail-label", 3, "mouseenter"], [1, "mj-forms-chrome-rail-count", 3, "is-zero"], ["title", "Drag to reorder", "draggable", "true", 1, "mj-forms-chrome-rail-handle", 3, "dragstart", "dragend", "click"], [1, "fa-solid", "fa-grip-vertical"], [1, "mj-forms-chrome-rail-count"], ["role", "button", "tabindex", "0", 1, "mj-forms-chrome-rail-item", "is-more-folder", 3, "click", "keydown.enter", "keydown.space"], ["aria-hidden", "true", 1, "mj-forms-chrome-rail-handle", "is-spacer"], ["aria-hidden", "true", 1, "fa-solid", "mj-forms-chrome-rail-more-toggle"], [1, "mj-forms-chrome-rail-more-tree"], ["role", "button", "tabindex", "0", 1, "mj-forms-chrome-rail-item", "is-more-child", 3, "is-active", "is-drag-over"], ["role", "button", "tabindex", "0", 1, "mj-forms-chrome-rail-item", "is-more-child", 3, "click", "keydown.enter", "keydown.space", "dragover", "dragleave", "drop"], [1, "mj-forms-more-overflow"], ["type", "button", 1, "mj-forms-more-overflow-toggle", 3, "click"], [1, "mj-forms-more-overflow-label"], [1, "mj-forms-more-overflow-preview"], [1, "fa-solid"], ["Variant", "no-results", "Title", "No sections found", "ActionText", "Clear search", "ActionIcon", "fa-solid fa-rotate-left", "ActionVariant", "flat", 1, "mj-forms-empty-search-state", 3, "Action", "Message"], [3, "RestoreRequested", "dialogClosed", "record", "AllowRestore"], [3, "PanelClosed", "TagCountChanged", "RecordNavigate", "WidthChanged", "Record", "WidthPx"], [3, "PanelClosed", "AttachmentCountChanged", "Record", "Visible"], [3, "complete", "cancel", "visible", "config"]], template: function MjRecordFormContainerComponent_Template(rf, ctx) { if (rf & 1) {
2229
+ } }, inputs: { Record: "Record", FormComponent: "FormComponent", EntityInfo: "EntityInfo", EditMode: "EditMode", UserCanEdit: "UserCanEdit", UserCanDelete: "UserCanDelete", IsFavorite: "IsFavorite", FavoriteInitDone: "FavoriteInitDone", IsDirty: "IsDirty", DirtyFieldNames: "DirtyFieldNames", ListCount: "ListCount", IsSaving: "IsSaving", IsRefreshing: "IsRefreshing", ToolbarConfig: "ToolbarConfig", RegisteredToolbarItems: "RegisteredToolbarItems", ToolbarItemOverrides: "ToolbarItemOverrides", WidthMode: "WidthMode", Variants: "Variants", CurrentVariantID: "CurrentVariantID" }, outputs: { Navigate: "Navigate", EditModeChange: "EditModeChange", BeforeSave: "BeforeSave", SaveRequested: "SaveRequested", BeforeCancel: "BeforeCancel", CancelRequested: "CancelRequested", BeforeDelete: "BeforeDelete", DeleteRequested: "DeleteRequested", BeforeRefresh: "BeforeRefresh", RefreshRequested: "RefreshRequested", FavoriteToggled: "FavoriteToggled", BeforeHistoryView: "BeforeHistoryView", HistoryRequested: "HistoryRequested", BeforeListManagement: "BeforeListManagement", ListManagementRequested: "ListManagementRequested", ShowChangesRequested: "ShowChangesRequested", CustomButtonClick: "CustomButtonClick", ToolbarItemClick: "ToolbarItemClick", VariantChange: "VariantChange", BeforeLayoutResolve: "BeforeLayoutResolve", AfterLayoutResolved: "AfterLayoutResolved", BeforeSectionActivate: "BeforeSectionActivate", AfterSectionActivated: "AfterSectionActivated" }, standalone: false, features: [i0.ɵɵProvidersFeature([FormSlotCoordinator, FormChromeCoordinator, FormRecordRefreshCoordinator, FormSectionIndicatorCoordinator]), i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c1, decls: 20, vars: 31, consts: [[3, "Record", "EditMode", "UserCanEdit", "UserCanDelete", "IsFavorite", "FavoriteInitDone", "IsDirty", "DirtyFieldNames", "ListCount", "TagCount", "AttachmentCount", "AttachmentsAvailable", "IsAttachmentsPanelOpen", "VersionCount", "EntityInfo", "Config", "IsSaving", "IsRefreshing", "VisibleSectionCount", "TotalSectionCount", "ExpandedSectionCount", "SearchFilter", "ShowEmptyFields", "WidthMode", "HasCustomSectionOrder", "ChromeLayout", "Variants", "CurrentVariantID", "RegisteredItems", "ItemOverrides", "FormComponent"], ["aria-live", "polite", "aria-atomic", "true", 1, "mj-forms-visually-hidden"], [1, "mj-forms-scroll-area"], [1, "mj-forms-panels-container"], [1, "mj-forms-layout-row"], ["aria-label", "Form sections", 1, "mj-forms-chrome-rail", 3, "is-collapsed", "is-resizing", "width"], [1, "mj-forms-all-panels"], [3, "Record", "FormComponent", "FormContext", "BakedSectionKeys", "ShowRelatedEntities"], [1, "mj-forms-more-overflow", 3, "is-expanded"], ["Slot", "after-everything", 3, "Entity", "Record", "FormComponent"], ["Variant", "no-results", "Title", "No sections found", "ActionText", "Clear search", "ActionIcon", "fa-solid fa-rotate-left", "ActionVariant", "flat", 1, "mj-forms-empty-search-state", 3, "Message"], [3, "Navigate", "Record", "EditMode", "Collapsed"], [3, "record", "AllowRestore"], [3, "Record", "WidthPx"], [3, "Record", "Visible"], [3, "visible", "config"], [3, "SectionOrderChange", "MembershipChange", "ResetRequested", "Closed", "Sections", "SectionOrder", "MoreSectionKeys", "LockedMoreKeys", "Visible"], [3, "Navigate", "EditModeChange", "BeforeSave", "SaveRequested", "BeforeCancel", "CancelRequested", "BeforeDelete", "DeleteRequested", "BeforeRefresh", "RefreshRequested", "FavoriteToggled", "BeforeHistoryView", "HistoryRequested", "BeforeListManagement", "ListManagementRequested", "ShowChangesRequested", "CustomButtonClick", "ToolbarItemClick", "FilterChange", "ExpandAllRequested", "CollapseAllRequested", "ShowEmptyFieldsChange", "WidthModeChange", "ResetSectionOrderRequested", "ManageSectionsRequested", "TagsPanelToggled", "AttachmentsPanelToggled", "VariantPicked", "Record", "EditMode", "UserCanEdit", "UserCanDelete", "IsFavorite", "FavoriteInitDone", "IsDirty", "DirtyFieldNames", "ListCount", "TagCount", "AttachmentCount", "AttachmentsAvailable", "IsAttachmentsPanelOpen", "VersionCount", "EntityInfo", "Config", "IsSaving", "IsRefreshing", "VisibleSectionCount", "TotalSectionCount", "ExpandedSectionCount", "SearchFilter", "ShowEmptyFields", "WidthMode", "HasCustomSectionOrder", "ChromeLayout", "Variants", "CurrentVariantID", "RegisteredItems", "ItemOverrides", "FormComponent"], ["aria-label", "Form sections", 1, "mj-forms-chrome-rail"], ["type", "button", 1, "mj-forms-chrome-rail-spine", 3, "title"], ["type", "button", 1, "mj-forms-chrome-rail-spine", 3, "click", "title"], [1, "mj-forms-chrome-rail-spine-label", 3, "mouseenter"], ["role", "img", 1, "mj-forms-chrome-rail-error", "is-spine", 3, "title"], ["role", "img", 1, "mj-forms-chrome-rail-warning", "is-spine", 3, "title"], ["role", "img", 1, "mj-forms-chrome-rail-dirty", "is-spine", 3, "title"], ["role", "separator", "aria-orientation", "vertical", "title", "Drag to resize sections", 1, "mj-forms-chrome-rail-resizer", 3, "pointerdown", "pointermove", "pointerup", "pointercancel"], [1, "mj-forms-chrome-rail-toolbar"], ["type", "button", 1, "mj-forms-chrome-rail-pin", 3, "click", "title"], [1, "fa-solid", "fa-thumbtack"], ["type", "button", "title", "Hide sections", "aria-label", "Hide form sections", 1, "mj-forms-chrome-rail-collapse", 3, "click"], [1, "fa-solid", "fa-angles-left"], [1, "mj-forms-chrome-rail-items"], ["role", "button", "tabindex", "0", 1, "mj-forms-chrome-rail-item", 3, "is-active", "is-drag-over", "has-errors", "is-dirty"], ["role", "button", "tabindex", "0", 1, "mj-forms-chrome-rail-item", 3, "click", "keydown.enter", "keydown.space", "dragover", "dragleave", "drop"], ["title", "Drag to reorder", "draggable", "true", 1, "mj-forms-chrome-rail-handle"], [1, "mj-forms-chrome-rail-label", 3, "mouseenter"], ["role", "img", 1, "mj-forms-chrome-rail-dirty", 3, "title"], ["role", "img", 1, "mj-forms-chrome-rail-error", 3, "title"], ["role", "img", 1, "mj-forms-chrome-rail-warning", 3, "title"], [1, "mj-forms-chrome-rail-count"], ["title", "Drag to reorder", "draggable", "true", 1, "mj-forms-chrome-rail-handle", 3, "dragstart", "dragend", "click"], [1, "fa-solid", "fa-grip-vertical"], ["aria-hidden", "true", 1, "fa-solid", "fa-circle-exclamation"], ["aria-hidden", "true", 1, "fa-solid", "fa-triangle-exclamation"], ["role", "button", "tabindex", "0", 1, "mj-forms-chrome-rail-item", "is-more-folder", 3, "click", "keydown.enter", "keydown.space"], ["aria-hidden", "true", 1, "mj-forms-chrome-rail-handle", "is-spacer"], ["aria-hidden", "true", 1, "fa-solid", "mj-forms-chrome-rail-more-toggle"], [1, "mj-forms-chrome-rail-more-tree"], ["role", "button", "tabindex", "0", 1, "mj-forms-chrome-rail-item", "is-more-child", 3, "is-active", "is-drag-over", "has-errors", "is-dirty"], ["role", "button", "tabindex", "0", 1, "mj-forms-chrome-rail-item", "is-more-child", 3, "click", "keydown.enter", "keydown.space", "dragover", "dragleave", "drop"], [1, "mj-forms-more-overflow"], ["type", "button", 1, "mj-forms-more-overflow-toggle", 3, "click"], [1, "mj-forms-more-overflow-label"], [1, "mj-forms-more-overflow-preview"], [1, "fa-solid"], ["Variant", "no-results", "Title", "No sections found", "ActionText", "Clear search", "ActionIcon", "fa-solid fa-rotate-left", "ActionVariant", "flat", 1, "mj-forms-empty-search-state", 3, "Action", "Message"], [3, "RestoreRequested", "dialogClosed", "record", "AllowRestore"], [3, "PanelClosed", "TagCountChanged", "RecordNavigate", "WidthChanged", "Record", "WidthPx"], [3, "PanelClosed", "AttachmentCountChanged", "Record", "Visible"], [3, "complete", "cancel", "visible", "config"]], template: function MjRecordFormContainerComponent_Template(rf, ctx) { if (rf & 1) {
1911
2230
  i0.ɵɵprojectionDef(_c0);
1912
2231
  i0.ɵɵprojection(0);
1913
2232
  i0.ɵɵconditionalCreate(1, MjRecordFormContainerComponent_Conditional_1_Template, 1, 31, "mj-form-toolbar", 0);
1914
- i0.ɵɵelementStart(2, "div", 1)(3, "div", 2)(4, "div", 3);
1915
- i0.ɵɵconditionalCreate(5, MjRecordFormContainerComponent_Conditional_5_Template, 3, 8, "nav", 4);
1916
- i0.ɵɵelementStart(6, "div", 5);
1917
- i0.ɵɵprojection(7, 1);
1918
- i0.ɵɵconditionalCreate(8, MjRecordFormContainerComponent_Conditional_8_Template, 1, 5, "mj-form-contributions", 6);
1919
- i0.ɵɵconditionalCreate(9, MjRecordFormContainerComponent_Conditional_9_Template, 7, 10, "div", 7);
1920
- i0.ɵɵconditionalCreate(10, MjRecordFormContainerComponent_Conditional_10_Template, 1, 3, "mj-form-panel-slot", 8);
1921
- i0.ɵɵconditionalCreate(11, MjRecordFormContainerComponent_Conditional_11_Template, 1, 1, "mj-empty-state", 9);
2233
+ i0.ɵɵelementStart(2, "span", 1);
2234
+ i0.ɵɵtext(3);
2235
+ i0.ɵɵelementEnd();
2236
+ i0.ɵɵelementStart(4, "div", 2)(5, "div", 3)(6, "div", 4);
2237
+ i0.ɵɵconditionalCreate(7, MjRecordFormContainerComponent_Conditional_7_Template, 3, 8, "nav", 5);
2238
+ i0.ɵɵelementStart(8, "div", 6);
2239
+ i0.ɵɵprojection(9, 1);
2240
+ i0.ɵɵconditionalCreate(10, MjRecordFormContainerComponent_Conditional_10_Template, 1, 5, "mj-form-contributions", 7);
2241
+ i0.ɵɵconditionalCreate(11, MjRecordFormContainerComponent_Conditional_11_Template, 7, 10, "div", 8);
2242
+ i0.ɵɵconditionalCreate(12, MjRecordFormContainerComponent_Conditional_12_Template, 1, 3, "mj-form-panel-slot", 9);
2243
+ i0.ɵɵconditionalCreate(13, MjRecordFormContainerComponent_Conditional_13_Template, 1, 1, "mj-empty-state", 10);
1922
2244
  i0.ɵɵelementEnd();
1923
- i0.ɵɵelementStart(12, "mj-isa-related-panel", 10);
1924
- i0.ɵɵlistener("Navigate", function MjRecordFormContainerComponent_Template_mj_isa_related_panel_Navigate_12_listener($event) { return ctx.OnNavigate($event); });
2245
+ i0.ɵɵelementStart(14, "mj-isa-related-panel", 11);
2246
+ i0.ɵɵlistener("Navigate", function MjRecordFormContainerComponent_Template_mj_isa_related_panel_Navigate_14_listener($event) { return ctx.OnNavigate($event); });
1925
2247
  i0.ɵɵelementEnd()()()();
1926
- i0.ɵɵconditionalCreate(13, MjRecordFormContainerComponent_Conditional_13_Template, 1, 2, "mj-record-changes", 11);
1927
- i0.ɵɵconditionalCreate(14, MjRecordFormContainerComponent_Conditional_14_Template, 1, 2, "mj-record-tags", 12);
1928
- i0.ɵɵconditionalCreate(15, MjRecordFormContainerComponent_Conditional_15_Template, 1, 2, "mj-record-attachments", 13);
1929
- i0.ɵɵconditionalCreate(16, MjRecordFormContainerComponent_Conditional_16_Template, 1, 8, "mj-list-management-dialog", 14);
1930
- i0.ɵɵelementStart(17, "mj-section-manager", 15);
1931
- i0.ɵɵlistener("SectionOrderChange", function MjRecordFormContainerComponent_Template_mj_section_manager_SectionOrderChange_17_listener($event) { return ctx.OnSectionOrderChange($event); })("MembershipChange", function MjRecordFormContainerComponent_Template_mj_section_manager_MembershipChange_17_listener($event) { return ctx.OnChromeMembershipChange($event); })("ResetRequested", function MjRecordFormContainerComponent_Template_mj_section_manager_ResetRequested_17_listener() { return ctx.OnSectionManagerReset(); })("Closed", function MjRecordFormContainerComponent_Template_mj_section_manager_Closed_17_listener() { return ctx.OnSectionManagerClosed(); });
2248
+ i0.ɵɵconditionalCreate(15, MjRecordFormContainerComponent_Conditional_15_Template, 1, 2, "mj-record-changes", 12);
2249
+ i0.ɵɵconditionalCreate(16, MjRecordFormContainerComponent_Conditional_16_Template, 1, 2, "mj-record-tags", 13);
2250
+ i0.ɵɵconditionalCreate(17, MjRecordFormContainerComponent_Conditional_17_Template, 1, 2, "mj-record-attachments", 14);
2251
+ i0.ɵɵconditionalCreate(18, MjRecordFormContainerComponent_Conditional_18_Template, 1, 8, "mj-list-management-dialog", 15);
2252
+ i0.ɵɵelementStart(19, "mj-section-manager", 16);
2253
+ i0.ɵɵlistener("SectionOrderChange", function MjRecordFormContainerComponent_Template_mj_section_manager_SectionOrderChange_19_listener($event) { return ctx.OnSectionOrderChange($event); })("MembershipChange", function MjRecordFormContainerComponent_Template_mj_section_manager_MembershipChange_19_listener($event) { return ctx.OnChromeMembershipChange($event); })("ResetRequested", function MjRecordFormContainerComponent_Template_mj_section_manager_ResetRequested_19_listener() { return ctx.OnSectionManagerReset(); })("Closed", function MjRecordFormContainerComponent_Template_mj_section_manager_Closed_19_listener() { return ctx.OnSectionManagerClosed(); });
1932
2254
  i0.ɵɵelementEnd();
1933
2255
  } if (rf & 2) {
1934
2256
  i0.ɵɵadvance();
1935
2257
  i0.ɵɵconditional(ctx.EffectiveShowToolbar ? 1 : -1);
1936
2258
  i0.ɵɵadvance(2);
2259
+ i0.ɵɵtextInterpolate(ctx.FormIndicatorsAnnouncement);
2260
+ i0.ɵɵadvance(2);
1937
2261
  i0.ɵɵclassProp("mj-forms-panels--full-width", ctx.EffectiveWidthMode === "full-width")("mj-forms-panels--edit-mode", ctx.EffectiveEditMode)("mj-forms-panels--has-isa-panel", ctx.HasIsaRelatedItems);
1938
2262
  i0.ɵɵadvance();
1939
2263
  i0.ɵɵclassProp("mj-forms-layout--left-nav", ctx.ChromeLayout === "left-nav")("mj-forms-layout--accordion", ctx.ChromeLayout === "accordion")("mj-forms-layout--more", ctx.IsChromeMoreActive);
1940
2264
  i0.ɵɵadvance();
1941
- i0.ɵɵconditional(ctx.ShowChromeRail ? 5 : -1);
2265
+ i0.ɵɵconditional(ctx.ShowChromeRail ? 7 : -1);
1942
2266
  i0.ɵɵadvance(3);
1943
- i0.ɵɵconditional(ctx.Record && ctx.FormComponent ? 8 : -1);
2267
+ i0.ɵɵconditional(ctx.Record && ctx.FormComponent ? 10 : -1);
1944
2268
  i0.ɵɵadvance();
1945
- i0.ɵɵconditional(ctx.ShowMoreToggle ? 9 : -1);
2269
+ i0.ɵɵconditional(ctx.ShowMoreToggle ? 11 : -1);
1946
2270
  i0.ɵɵadvance();
1947
- i0.ɵɵconditional(ctx.Record && ctx.FormComponent ? 10 : -1);
2271
+ i0.ɵɵconditional(ctx.Record && ctx.FormComponent ? 12 : -1);
1948
2272
  i0.ɵɵadvance();
1949
- i0.ɵɵconditional(ctx.EffectiveSearchFilter && ctx.SearchHasNoMatches ? 11 : -1);
2273
+ i0.ɵɵconditional(ctx.EffectiveSearchFilter && ctx.SearchHasNoMatches ? 13 : -1);
1950
2274
  i0.ɵɵadvance();
1951
2275
  i0.ɵɵproperty("Record", ctx.EffectiveRecord)("EditMode", ctx.EffectiveEditMode)("Collapsed", ctx.EffectiveWidthMode === "full-width");
1952
2276
  i0.ɵɵadvance();
1953
- i0.ɵɵconditional(ctx.ShowRecordChanges && ctx.EffectiveRecord ? 13 : -1);
2277
+ i0.ɵɵconditional(ctx.ShowRecordChanges && ctx.EffectiveRecord ? 15 : -1);
1954
2278
  i0.ɵɵadvance();
1955
- i0.ɵɵconditional(ctx.ShowTagsPanel && ctx.EffectiveRecord ? 14 : -1);
2279
+ i0.ɵɵconditional(ctx.ShowTagsPanel && ctx.EffectiveRecord ? 16 : -1);
1956
2280
  i0.ɵɵadvance();
1957
- i0.ɵɵconditional(ctx.ShowAttachmentsPanel && ctx.AttachmentsAvailable && ctx.EffectiveRecord ? 15 : -1);
2281
+ i0.ɵɵconditional(ctx.ShowAttachmentsPanel && ctx.AttachmentsAvailable && ctx.EffectiveRecord ? 17 : -1);
1958
2282
  i0.ɵɵadvance();
1959
- i0.ɵɵconditional(ctx.ShowListManagement && ctx.EffectiveRecord ? 16 : -1);
2283
+ i0.ɵɵconditional(ctx.ShowListManagement && ctx.EffectiveRecord ? 18 : -1);
1960
2284
  i0.ɵɵadvance();
1961
2285
  i0.ɵɵproperty("Sections", ctx.SectionManagerItems)("SectionOrder", ctx.SectionManagerOrder)("MoreSectionKeys", ctx.SectionManagerMoreKeys)("LockedMoreKeys", ctx.SectionManagerLockedMoreKeys)("Visible", ctx.ShowSectionManager);
1962
- } }, dependencies: [i1.MJEmptyStateComponent, i2.RecordChangesComponent, i3.ListManagementDialogComponent, i4.RecordTagsComponent, i5.RecordAttachmentsComponent, i6.MjFormToolbarComponent, i7.MjSectionManagerComponent, i8.MjIsaRelatedPanelComponent, i9.FormPanelSlotComponent, i10.FormContributionsComponent], styles: ["/* ============================================\n RECORD FORM CONTAINER \u2014 uses global --mj-* design tokens\n Top-level wrapper: toolbar + scrollable content\n ============================================ */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ViewEncapsulation.None fallback \u2014 ensure the element itself constrains overflow */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ============================================\n SCROLL AREA (full-width so mouse wheel works anywhere)\n ============================================ */\n.mj-forms-scroll-area {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: var(--mj-bg-page);\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n/* ============================================\n PANELS CONTAINER (centered content within scroll area)\n ============================================ */\n.mj-forms-panels-container {\n padding: 24px 32px 48px;\n max-width: 920px;\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n flex: 1;\n min-height: 0;\n}\n\n/* Widen max-width when ISA side panel is present */\n.mj-forms-panels--has-isa-panel {\n max-width: 1240px;\n}\n\n.mj-forms-panels--full-width {\n max-width: none;\n padding-left: 24px;\n padding-right: 24px;\n}\n\n/* Flex row layout: form panels + optional ISA side panel */\n.mj-forms-layout-row {\n display: flex;\n gap: 20px;\n align-items: flex-start;\n}\n\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav) {\n padding: 16px 20px 24px;\n display: flex;\n flex-direction: column;\n /* Definite height = the scroll-area's client box. min-height: 100% alone\n lets the column grow with content and never gives related grids a\n containing-block height, so Height:auto (100%) on the grid collapses. */\n height: 100%;\n max-height: 100%;\n min-height: 0;\n overflow: hidden;\n box-sizing: border-box;\n}\n\n/* Centered left-nav keeps the form column at the same 920px as accordion,\n plus the rail. Full-width still uses .mj-forms-panels--full-width. */\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav):not(.mj-forms-panels--full-width) {\n max-width: 1160px;\n}\n\n.mj-forms-layout-row.mj-forms-layout--left-nav {\n flex: 1;\n min-height: 0;\n /* Wins over .mj-forms-layout-row { align-items: flex-start } so the\n body column stretches to the rail / viewport instead of hugging content. */\n align-items: stretch;\n gap: 16px;\n}\n\n/* Left-nav: only the active rail item is in the body. Slot-mounted\n panels never inject the container coordinator, so host classes set\n from the container are the hide/show channel that always reaches them. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-hidden,\n.mj-forms-layout--accordion mj-collapsible-panel.mj-chrome-hidden {\n display: none;\n}\n\n/* Selected item: no accordion chrome \u2014 the rail is the header. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-header {\n display: none;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel {\n box-shadow: none;\n border: 0;\n background: transparent;\n border-radius: 0;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-body--collapsed {\n max-height: none;\n padding: 0;\n opacity: 1;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-content {\n max-height: none;\n padding: 0;\n overflow: visible;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show {\n /* Content-sized (see RelatedGridHeightPx). Do not flex-fill leftover\n column space \u2014 a form header above the grid can collapse that to 0. */\n flex: 0 0 auto;\n min-height: 0;\n}\n\n/* Accordion related panels use a 400px resizable box. Left-nav grids\n set their own pixel height from row count (RelatedGridHeightPx). */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show .mj-forms-panel-content {\n height: auto;\n max-height: none;\n overflow: hidden;\n resize: none;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels {\n gap: 0;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Details (field panels) can be taller than the viewport \u2014 scroll inside the\n column. Related grids scroll inside AG Grid instead. */\n.mj-forms-layout--left-nav .mj-forms-all-panels:has(mj-collapsible-panel.mj-chrome-show:not(.mj-panel--related-entity)) {\n overflow-y: auto;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels > *:not(mj-collapsible-panel.mj-panel--related-entity) {\n flex-shrink: 0;\n}\n\n.mj-forms-layout--left-nav .biz-hero {\n margin-bottom: 4px;\n}\n\n/* All panels in a single flex container \u2014 CSS order drives sequencing */\n.mj-forms-all-panels {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n min-width: 0;\n}\n\n/* Hide related entity panels in edit mode (variant host class on mj-collapsible-panel) */\n.mj-forms-panels--edit-mode .mj-panel--related-entity,\n.mj-forms-panels--edit-mode .mj-forms-more-overflow {\n display: none;\n}\n\n/* Detail / More panels sort after the overflow footer */\nmj-collapsible-panel.mj-form-role-detail,\nmj-collapsible-panel.mj-form-role-more {\n order: 8500;\n}\n\n.mj-forms-more-overflow {\n order: 8400;\n display: flex;\n flex-direction: column;\n margin-top: 4px;\n padding-top: 12px;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n\n.mj-forms-more-overflow-toggle {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 6px 2px;\n border: 0;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.mj-forms-more-overflow-toggle:hover {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-more-overflow-label {\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-more-overflow-preview {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-disabled);\n font-weight: var(--mj-font-normal);\n}\n\n.mj-forms-more-overflow-toggle .fa-chevron-right,\n.mj-forms-more-overflow-toggle .fa-chevron-down {\n margin-left: auto;\n}\n\n.mj-forms-chrome-rail {\n flex: 0 0 auto;\n width: 200px;\n max-width: 360px;\n min-width: 160px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n position: sticky;\n top: 0;\n align-self: stretch;\n min-height: 0;\n padding: 4px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: var(--mj-radius-md);\n}\n\n.mj-forms-chrome-rail.is-resizing {\n user-select: none;\n}\n\n.mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 36px;\n width: 36px;\n min-width: 36px;\n max-width: 36px;\n padding: 8px 0;\n overflow: hidden;\n}\n\n.mj-forms-chrome-rail-resizer {\n position: absolute;\n top: 0;\n right: -4px;\n width: 8px;\n height: 100%;\n cursor: col-resize;\n z-index: 3;\n touch-action: none;\n}\n\n.mj-forms-chrome-rail-resizer::after {\n content: '';\n position: absolute;\n top: 12px;\n bottom: 12px;\n left: 3px;\n width: 2px;\n border-radius: 1px;\n background: transparent;\n}\n\n.mj-forms-chrome-rail:hover .mj-forms-chrome-rail-resizer::after,\n.mj-forms-chrome-rail.is-resizing .mj-forms-chrome-rail-resizer::after {\n background: var(--mj-border-strong);\n}\n\n.mj-forms-layout--right-nav .mj-forms-chrome-rail-resizer {\n right: auto;\n left: -4px;\n}\n\n.mj-forms-chrome-rail-spine {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n width: 100%;\n height: 100%;\n min-height: 0;\n padding: 8px 0;\n border: 0;\n background: transparent;\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-spine:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-forms-chrome-rail-spine > i {\n flex-shrink: 0;\n}\n\n.mj-forms-chrome-rail-spine-label {\n writing-mode: vertical-rl;\n transform: rotate(180deg);\n letter-spacing: 0.04em;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-height: 100%;\n}\n\n.mj-forms-chrome-rail-toolbar {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 2px;\n padding: 2px 4px 6px;\n}\n\n.mj-forms-chrome-rail-pin,\n.mj-forms-chrome-rail-collapse {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-pin:hover,\n.mj-forms-chrome-rail-collapse:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-pin:not(.is-pinned) i {\n transform: rotate(45deg);\n}\n\n.mj-forms-chrome-rail-pin.is-pinned {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 10px 12px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n text-align: left;\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-item > i {\n width: 1.15em;\n flex-shrink: 0;\n text-align: center;\n color: inherit;\n}\n\n.mj-forms-chrome-rail-item:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-chrome-rail-item.is-active::before {\n content: '';\n position: absolute;\n left: 0;\n top: 6px;\n bottom: 6px;\n width: 3px;\n border-radius: 0 3px 3px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-label {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-drag-over {\n outline: 1px dashed var(--mj-border-focus);\n outline-offset: -1px;\n}\n\n.mj-forms-chrome-rail-handle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 18px;\n margin-left: -4px;\n color: var(--mj-text-muted);\n cursor: grab;\n opacity: 0;\n overflow: hidden;\n flex-shrink: 0;\n transition: opacity var(--mj-transition-base, 0.15s) ease;\n}\n\n.mj-forms-chrome-rail-item:hover .mj-forms-chrome-rail-handle,\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-handle {\n opacity: 1;\n}\n\n.mj-forms-chrome-rail-handle.is-spacer {\n opacity: 0;\n pointer-events: none;\n cursor: default;\n}\n\n.mj-forms-chrome-rail-handle:hover {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-handle:active {\n cursor: grabbing;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder {\n position: relative;\n margin-top: 14px;\n padding-top: 14px;\n color: var(--mj-text-muted);\n border-radius: 0;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder::before {\n content: '';\n position: absolute;\n top: 0;\n left: 8px;\n right: 8px;\n height: 1px;\n background: linear-gradient(\n 90deg,\n transparent 0%,\n var(--mj-border-strong) 18%,\n var(--mj-border-strong) 82%,\n transparent 100%\n );\n}\n\n.mj-forms-chrome-rail-item.is-more-folder:hover {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-item.is-more-folder.is-expanded {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-more-toggle {\n margin-left: auto;\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-chrome-rail-more-tree {\n margin-left: 22px;\n padding-left: 6px;\n border-left: 1px solid var(--mj-border-subtle);\n}\n\n.mj-forms-chrome-rail-item.is-more-child {\n padding-left: 8px;\n}\n\n.mj-forms-chrome-rail-count.is-zero {\n opacity: 0.55;\n}\n\n.mj-forms-chrome-rail-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mj-forms-chrome-rail-count {\n min-width: 1.25rem;\n padding: 0 6px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: var(--mj-text-xs);\n text-align: center;\n}\n\n@media (max-width: 720px) {\n .mj-forms-layout--left-nav {\n flex-direction: column;\n }\n\n .mj-forms-chrome-rail {\n flex: 1 1 auto;\n width: 100%;\n position: static;\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .mj-forms-chrome-rail-resizer {\n display: none;\n }\n\n .mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 auto;\n width: 100%;\n min-width: 0;\n max-width: none;\n height: 36px;\n padding: 0;\n }\n\n .mj-forms-chrome-rail-spine {\n flex-direction: row;\n padding: 0 12px;\n }\n\n .mj-forms-chrome-rail-spine-label {\n writing-mode: horizontal-tb;\n transform: none;\n max-height: none;\n }\n\n .mj-forms-chrome-rail-toolbar {\n width: 100%;\n }\n\n .mj-forms-chrome-rail-item {\n width: auto;\n }\n}\n\n/* ============================================\n EMPTY SEARCH STATE\n ============================================ */\n.mj-forms-empty-search-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px 24px;\n text-align: center;\n min-height: 400px;\n}\n\n.mj-forms-empty-search-icon {\n width: 80px;\n height: 80px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 24px;\n}\n\n.mj-forms-empty-search-icon i {\n font-size: 32px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-empty-search-title {\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n margin: 0 0 12px 0;\n}\n\n.mj-forms-empty-search-message {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n line-height: 1.6;\n max-width: 400px;\n margin: 0;\n}\n\n.mj-forms-empty-search-message strong {\n color: var(--mj-text-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-empty-search-link {\n color: var(--mj-brand-primary);\n text-decoration: none;\n font-weight: var(--mj-font-medium);\n}\n\n.mj-forms-empty-search-link:hover {\n text-decoration: underline;\n}\n\n/* ============================================\n RESPONSIVE\n ============================================ */\n@media (max-width: 768px) {\n .mj-forms-panels-container {\n padding: 16px 12px 32px;\n }\n}\n\n/* ====================================================================\n VARIANT PICKER \u2014 between toolbar and form body\n Compact \"Form: <name> \u25BE\" row that appears when more than one variant\n is applicable for the current entity record.\n ==================================================================== */\n\n.mj-form-variant-picker {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 18px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-icon {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n.mj-form-variant-picker-label {\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-control {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n outline: none;\n user-select: none;\n min-width: 160px;\n}\n.mj-form-variant-picker-control:hover,\n.mj-form-variant-picker-control:focus,\n.mj-form-variant-picker-control.open {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n.mj-form-variant-picker-current {\n font-weight: 600;\n flex: 1;\n}\n.mj-form-variant-picker-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 50;\n min-width: 280px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n box-shadow: var(--mj-shadow-md, 0 4px 12px rgba(15, 23, 42, 0.08));\n padding: 4px;\n max-height: 320px;\n overflow: auto;\n}\n.mj-form-variant-picker-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n.mj-form-variant-picker-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n.mj-form-variant-picker-row.current {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n.mj-form-variant-picker-row.inactive {\n opacity: 0.7;\n}\n.mj-form-variant-picker-row-main {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n.mj-form-variant-picker-row-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.mj-form-variant-picker-row-sub {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-form-variant-picker-check {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n/* Retrospective fix #8 \u2014 visually distinguish the Default row from variants. */\n.mj-form-variant-picker-row.mj-form-variant-picker-default {\n border-bottom: 1px dashed var(--mj-border-default);\n margin-bottom: 4px;\n padding-bottom: 10px;\n}\n.mj-form-variant-picker-default-tag {\n color: var(--mj-text-muted);\n font-weight: 400;\n font-size: 11px;\n margin-left: 4px;\n}\n"], encapsulation: 2, changeDetection: 0 });
2286
+ } }, dependencies: [i1.MJEmptyStateComponent, i2.RecordChangesComponent, i3.ListManagementDialogComponent, i4.RecordTagsComponent, i5.RecordAttachmentsComponent, i6.MjFormToolbarComponent, i7.MjSectionManagerComponent, i8.MjIsaRelatedPanelComponent, i9.FormPanelSlotComponent, i10.FormContributionsComponent], styles: ["/* ============================================\n RECORD FORM CONTAINER \u2014 uses global --mj-* design tokens\n Top-level wrapper: toolbar + scrollable content\n ============================================ */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ViewEncapsulation.None fallback \u2014 ensure the element itself constrains overflow */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ============================================\n SCROLL AREA (full-width so mouse wheel works anywhere)\n ============================================ */\n.mj-forms-scroll-area {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: var(--mj-bg-page);\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n/* ============================================\n PANELS CONTAINER (centered content within scroll area)\n ============================================ */\n.mj-forms-panels-container {\n padding: 24px 32px 48px;\n max-width: 920px;\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n flex: 1;\n min-height: 0;\n}\n\n/* Widen max-width when ISA side panel is present */\n.mj-forms-panels--has-isa-panel {\n max-width: 1240px;\n}\n\n.mj-forms-panels--full-width {\n max-width: none;\n padding-left: 24px;\n padding-right: 24px;\n}\n\n/* Flex row layout: form panels + optional ISA side panel */\n.mj-forms-layout-row {\n display: flex;\n gap: 20px;\n align-items: flex-start;\n}\n\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav) {\n padding: 16px 20px 24px;\n display: flex;\n flex-direction: column;\n /* Definite height = the scroll-area's client box. min-height: 100% alone\n lets the column grow with content and never gives related grids a\n containing-block height, so Height:auto (100%) on the grid collapses. */\n height: 100%;\n max-height: 100%;\n min-height: 0;\n overflow: hidden;\n box-sizing: border-box;\n}\n\n/* Centered left-nav keeps the form column at the same 920px as accordion,\n plus the rail. Full-width still uses .mj-forms-panels--full-width. */\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav):not(.mj-forms-panels--full-width) {\n max-width: 1160px;\n}\n\n.mj-forms-layout-row.mj-forms-layout--left-nav {\n flex: 1;\n min-height: 0;\n /* Wins over .mj-forms-layout-row { align-items: flex-start } so the\n body column stretches to the rail / viewport instead of hugging content. */\n align-items: stretch;\n gap: 16px;\n}\n\n/* Left-nav: only the active rail item is in the body. Slot-mounted\n panels never inject the container coordinator, so host classes set\n from the container are the hide/show channel that always reaches them. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-hidden,\n.mj-forms-layout--accordion mj-collapsible-panel.mj-chrome-hidden {\n display: none;\n}\n\n/* Selected item: no accordion chrome \u2014 the rail is the header. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-header {\n display: none;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel {\n box-shadow: none;\n border: 0;\n background: transparent;\n border-radius: 0;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-body--collapsed {\n max-height: none;\n padding: 0;\n opacity: 1;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-content {\n max-height: none;\n padding: 0;\n overflow: visible;\n}\n\n/* Details: every field panel shows under ONE rail item, and the rail label\n cannot head several loose field lists \u2014 without a surface the rows float\n on the page background. So the Details panels render as ONE card: each\n panel is a segment (surface + side borders, no radius), and the container\n marks the visual first / last (CSS order, not DOM order) to close the top\n and bottom edges. No per-section headers \u2014 the sections are plain groups. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details .mj-forms-panel {\n background: var(--mj-bg-surface-card);\n border-left: 1px solid var(--mj-border-default);\n border-right: 1px solid var(--mj-border-default);\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first {\n margin-top: 8px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first .mj-forms-panel {\n border-top: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md) var(--mj-radius-md) 0 0;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-last .mj-forms-panel {\n border-bottom: 1px solid var(--mj-border-default);\n border-radius: 0 0 var(--mj-radius-md) var(--mj-radius-md);\n box-shadow: var(--mj-shadow-sm);\n}\n\n/* One panel = whole card: both edges on the same element. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first.mj-chrome-details-last .mj-forms-panel {\n border-radius: var(--mj-radius-md);\n}\n\n/* Segment padding: sides always; top / bottom only at the card's edges, and a\n half-step between segments so the groups still read as groups. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details .mj-forms-panel-content {\n padding: 8px 20px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first .mj-forms-panel-content {\n padding-top: 20px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-last .mj-forms-panel-content {\n padding-bottom: 20px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show {\n /* Content-sized (see RelatedGridHeightPx). Do not flex-fill leftover\n column space \u2014 a form header above the grid can collapse that to 0. */\n flex: 0 0 auto;\n min-height: 0;\n}\n\n/* Accordion related panels use a 400px resizable box. Left-nav grids\n set their own pixel height from row count (RelatedGridHeightPx). */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show .mj-forms-panel-content {\n height: auto;\n max-height: none;\n overflow: hidden;\n resize: none;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels {\n gap: 0;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Details (field panels) can be taller than the viewport \u2014 scroll inside the\n column. Related grids scroll inside AG Grid instead. */\n.mj-forms-layout--left-nav .mj-forms-all-panels:has(mj-collapsible-panel.mj-chrome-show:not(.mj-panel--related-entity)) {\n overflow-y: auto;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels > *:not(mj-collapsible-panel.mj-panel--related-entity) {\n flex-shrink: 0;\n}\n\n.mj-forms-layout--left-nav .biz-hero {\n margin-bottom: 4px;\n}\n\n/* All panels in a single flex container \u2014 CSS order drives sequencing */\n.mj-forms-all-panels {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n min-width: 0;\n}\n\n/* Hide related entity panels in edit mode (variant host class on mj-collapsible-panel) */\n.mj-forms-panels--edit-mode .mj-panel--related-entity,\n.mj-forms-panels--edit-mode .mj-forms-more-overflow {\n display: none;\n}\n\n/* Detail / More panels sort after the overflow footer */\nmj-collapsible-panel.mj-form-role-detail,\nmj-collapsible-panel.mj-form-role-more {\n order: 8500;\n}\n\n.mj-forms-more-overflow {\n order: 8400;\n display: flex;\n flex-direction: column;\n margin-top: 4px;\n padding-top: 12px;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n\n.mj-forms-more-overflow-toggle {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 6px 2px;\n border: 0;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.mj-forms-more-overflow-toggle:hover {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-more-overflow-label {\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-more-overflow-preview {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-disabled);\n font-weight: var(--mj-font-normal);\n}\n\n.mj-forms-more-overflow-toggle .fa-chevron-right,\n.mj-forms-more-overflow-toggle .fa-chevron-down {\n margin-left: auto;\n}\n\n.mj-forms-chrome-rail {\n flex: 0 0 auto;\n width: 200px;\n max-width: 360px;\n min-width: 160px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n position: sticky;\n top: 0;\n align-self: stretch;\n min-height: 0;\n padding: 4px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: var(--mj-radius-md);\n}\n\n/* The rail is as tall as the body column; when it has more items than fit,\n the ITEMS scroll (the pin / collapse toolbar above stays fixed). Without\n this the overflow was clipped by the panels container. */\n.mj-forms-chrome-rail-items {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: thin;\n}\n\n.mj-forms-chrome-rail.is-resizing {\n user-select: none;\n}\n\n.mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 36px;\n width: 36px;\n min-width: 36px;\n max-width: 36px;\n padding: 8px 0;\n overflow: hidden;\n}\n\n.mj-forms-chrome-rail-resizer {\n position: absolute;\n top: 0;\n right: -4px;\n width: 8px;\n height: 100%;\n cursor: col-resize;\n z-index: 3;\n touch-action: none;\n}\n\n.mj-forms-chrome-rail-resizer::after {\n content: '';\n position: absolute;\n top: 12px;\n bottom: 12px;\n left: 3px;\n width: 2px;\n border-radius: 1px;\n background: transparent;\n}\n\n.mj-forms-chrome-rail:hover .mj-forms-chrome-rail-resizer::after,\n.mj-forms-chrome-rail.is-resizing .mj-forms-chrome-rail-resizer::after {\n background: var(--mj-border-strong);\n}\n\n.mj-forms-layout--right-nav .mj-forms-chrome-rail-resizer {\n right: auto;\n left: -4px;\n}\n\n.mj-forms-chrome-rail-spine {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n width: 100%;\n height: 100%;\n min-height: 0;\n padding: 8px 0;\n border: 0;\n background: transparent;\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-spine:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-forms-chrome-rail-spine > i {\n flex-shrink: 0;\n}\n\n.mj-forms-chrome-rail-spine-label {\n writing-mode: vertical-rl;\n transform: rotate(180deg);\n letter-spacing: 0.04em;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-height: 100%;\n}\n\n.mj-forms-chrome-rail-toolbar {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 2px;\n padding: 2px 4px 6px;\n}\n\n.mj-forms-chrome-rail-pin,\n.mj-forms-chrome-rail-collapse {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-pin:hover,\n.mj-forms-chrome-rail-collapse:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-pin:not(.is-pinned) i {\n transform: rotate(45deg);\n}\n\n.mj-forms-chrome-rail-pin.is-pinned {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 10px 12px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n text-align: left;\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-item > i {\n width: 1.15em;\n flex-shrink: 0;\n text-align: center;\n color: inherit;\n}\n\n.mj-forms-chrome-rail-item:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-chrome-rail-item.is-active::before {\n content: '';\n position: absolute;\n left: 0;\n top: 6px;\n bottom: 6px;\n width: 3px;\n border-radius: 0 3px 3px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-label {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-drag-over {\n outline: 1px dashed var(--mj-border-focus);\n outline-offset: -1px;\n}\n\n.mj-forms-chrome-rail-handle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 18px;\n margin-left: -4px;\n color: var(--mj-text-muted);\n cursor: grab;\n opacity: 0;\n overflow: hidden;\n flex-shrink: 0;\n transition: opacity var(--mj-transition-base, 0.15s) ease;\n}\n\n.mj-forms-chrome-rail-item:hover .mj-forms-chrome-rail-handle,\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-handle {\n opacity: 1;\n}\n\n.mj-forms-chrome-rail-handle.is-spacer {\n opacity: 0;\n pointer-events: none;\n cursor: default;\n}\n\n.mj-forms-chrome-rail-handle:hover {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-handle:active {\n cursor: grabbing;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder {\n position: relative;\n margin-top: 14px;\n padding-top: 14px;\n color: var(--mj-text-muted);\n border-radius: 0;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder::before {\n content: '';\n position: absolute;\n top: 0;\n left: 8px;\n right: 8px;\n height: 1px;\n background: linear-gradient(\n 90deg,\n transparent 0%,\n var(--mj-border-strong) 18%,\n var(--mj-border-strong) 82%,\n transparent 100%\n );\n}\n\n.mj-forms-chrome-rail-item.is-more-folder:hover {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-item.is-more-folder.is-expanded {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-more-toggle {\n margin-left: auto;\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-chrome-rail-more-tree {\n margin-left: 22px;\n padding-left: 6px;\n border-left: 1px solid var(--mj-border-subtle);\n}\n\n.mj-forms-chrome-rail-item.is-more-child {\n padding-left: 8px;\n}\n\n.mj-forms-chrome-rail-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Related-grid row count. Not rendered at 0 \u2014 an empty grid is not a signal, and a\n grey \"0\" beside the red invalid count reads as one more thing to attend to. */\n.mj-forms-chrome-rail-count {\n min-width: 1.25rem;\n padding: 0 6px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: var(--mj-text-xs);\n text-align: center;\n}\n\n/* Screen-reader-only text (the indicators' live region). */\n.mj-forms-visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n/* ============================================\n RAIL SECTION INDICATORS\n A rail item says WHICH section holds unsaved edits or an invalid field, read\n live from the panels it fronts (FormSectionIndicatorCoordinator). Same idioms\n as the fields themselves: the 6px amber dot an edited field shows after its\n label, and the error colour a failing field paints its underline in.\n ============================================ */\n.mj-forms-chrome-rail-dirty {\n flex: 0 0 auto;\n width: var(--mj-space-1-5);\n height: var(--mj-space-1-5);\n border-radius: var(--mj-radius-full);\n background: var(--mj-status-warning);\n}\n\n.mj-forms-chrome-rail-error,\n.mj-forms-chrome-rail-warning {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-1);\n min-width: var(--mj-space-5);\n padding: var(--mj-space-px) var(--mj-space-1-5);\n border-radius: var(--mj-radius-full);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n line-height: 1.2;\n text-align: center;\n}\n\n.mj-forms-chrome-rail-error {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n.mj-forms-chrome-rail-warning {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border: 1px solid var(--mj-status-warning-border);\n}\n\n.mj-forms-chrome-rail-error i,\n.mj-forms-chrome-rail-warning i {\n font-size: var(--mj-space-2-5);\n}\n\n/* The section's icon takes the error colour too, so the item reads as failing\n even before the badge is noticed \u2014 but never the active item's brand tint. */\n.mj-forms-chrome-rail-item.has-errors:not(.is-active) > i {\n color: var(--mj-status-error);\n}\n\n/* Collapsed spine: a column of icon \u2192 badge / dot \u2192 rotated label. */\n.mj-forms-chrome-rail-error.is-spine,\n.mj-forms-chrome-rail-warning.is-spine {\n order: 1;\n padding: 0 var(--mj-space-1);\n min-width: var(--mj-space-5);\n}\n\n.mj-forms-chrome-rail-dirty.is-spine {\n order: 1;\n}\n\n.mj-forms-chrome-rail-spine > .mj-forms-chrome-rail-spine-label {\n order: 2;\n}\n\n@media (max-width: 720px) {\n .mj-forms-layout--left-nav {\n flex-direction: column;\n }\n\n .mj-forms-chrome-rail {\n flex: 1 1 auto;\n width: 100%;\n position: static;\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .mj-forms-chrome-rail-resizer {\n display: none;\n }\n\n .mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 auto;\n width: 100%;\n min-width: 0;\n max-width: none;\n height: 36px;\n padding: 0;\n }\n\n .mj-forms-chrome-rail-spine {\n flex-direction: row;\n padding: 0 12px;\n }\n\n .mj-forms-chrome-rail-spine-label {\n writing-mode: horizontal-tb;\n transform: none;\n max-height: none;\n }\n\n .mj-forms-chrome-rail-toolbar {\n width: 100%;\n }\n\n .mj-forms-chrome-rail-item {\n width: auto;\n }\n\n /* Phones: the rail is a wrapping row of chips, so the items wrapper must\n wrap too \u2014 a column here stacks one chip per row and grows past the\n rail (no scroll, body pushed out). */\n .mj-forms-chrome-rail-items {\n flex-direction: row;\n flex-wrap: wrap;\n overflow: visible;\n min-height: auto;\n }\n}\n\n/* ============================================\n EMPTY SEARCH STATE\n ============================================ */\n.mj-forms-empty-search-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px 24px;\n text-align: center;\n min-height: 400px;\n}\n\n.mj-forms-empty-search-icon {\n width: 80px;\n height: 80px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 24px;\n}\n\n.mj-forms-empty-search-icon i {\n font-size: 32px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-empty-search-title {\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n margin: 0 0 12px 0;\n}\n\n.mj-forms-empty-search-message {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n line-height: 1.6;\n max-width: 400px;\n margin: 0;\n}\n\n.mj-forms-empty-search-message strong {\n color: var(--mj-text-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-empty-search-link {\n color: var(--mj-brand-primary);\n text-decoration: none;\n font-weight: var(--mj-font-medium);\n}\n\n.mj-forms-empty-search-link:hover {\n text-decoration: underline;\n}\n\n/* ============================================\n RESPONSIVE\n ============================================ */\n@media (max-width: 768px) {\n .mj-forms-panels-container {\n padding: 16px 12px 32px;\n }\n}\n\n/* ====================================================================\n VARIANT PICKER \u2014 between toolbar and form body\n Compact \"Form: <name> \u25BE\" row that appears when more than one variant\n is applicable for the current entity record.\n ==================================================================== */\n\n.mj-form-variant-picker {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 18px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-icon {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n.mj-form-variant-picker-label {\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-control {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n outline: none;\n user-select: none;\n min-width: 160px;\n}\n.mj-form-variant-picker-control:hover,\n.mj-form-variant-picker-control:focus,\n.mj-form-variant-picker-control.open {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n.mj-form-variant-picker-current {\n font-weight: 600;\n flex: 1;\n}\n.mj-form-variant-picker-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 50;\n min-width: 280px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n box-shadow: var(--mj-shadow-md, 0 4px 12px rgba(15, 23, 42, 0.08));\n padding: 4px;\n max-height: 320px;\n overflow: auto;\n}\n.mj-form-variant-picker-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n.mj-form-variant-picker-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n.mj-form-variant-picker-row.current {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n.mj-form-variant-picker-row.inactive {\n opacity: 0.7;\n}\n.mj-form-variant-picker-row-main {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n.mj-form-variant-picker-row-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.mj-form-variant-picker-row-sub {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-form-variant-picker-check {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n/* Retrospective fix #8 \u2014 visually distinguish the Default row from variants. */\n.mj-form-variant-picker-row.mj-form-variant-picker-default {\n border-bottom: 1px dashed var(--mj-border-default);\n margin-bottom: 4px;\n padding-bottom: 10px;\n}\n.mj-form-variant-picker-default-tag {\n color: var(--mj-text-muted);\n font-weight: 400;\n font-size: 11px;\n margin-left: 4px;\n}\n"], encapsulation: 2, changeDetection: 0 });
1963
2287
  }
1964
2288
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MjRecordFormContainerComponent, [{
1965
2289
  type: Component,
1966
- args: [{ standalone: false, selector: 'mj-record-form-container', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [FormSlotCoordinator, FormChromeCoordinator, FormRecordRefreshCoordinator], template: "<!-- ============================================\n BEFORE-TOOLBAR SLOT\n ============================================ -->\n<ng-content select=\"[before-toolbar]\"></ng-content>\n\n<!-- ============================================\n TOOLBAR (bridges FormComponent state \u2192 toolbar inputs)\n Hidden entirely when Config.Toolbar === null (dialog/slide-in surfaces).\n ============================================ -->\n@if (EffectiveShowToolbar) {\n<mj-form-toolbar\n [Record]=\"EffectiveRecord\"\n [EditMode]=\"EffectiveEditMode\"\n [UserCanEdit]=\"EffectiveUserCanEdit\"\n [UserCanDelete]=\"EffectiveUserCanDelete\"\n [IsFavorite]=\"EffectiveIsFavorite\"\n [FavoriteInitDone]=\"EffectiveFavoriteInitDone\"\n [IsDirty]=\"EffectiveIsDirty\"\n [DirtyFieldNames]=\"EffectiveDirtyFieldNames\"\n [ListCount]=\"ListCount\"\n [TagCount]=\"TagCount\"\n [AttachmentCount]=\"AttachmentCount\"\n [AttachmentsAvailable]=\"AttachmentsAvailable\"\n [IsAttachmentsPanelOpen]=\"ShowAttachmentsPanel\"\n [VersionCount]=\"VersionCount\"\n [EntityInfo]=\"EffectiveEntityInfo\"\n [Config]=\"EffectiveToolbarConfig\"\n [IsSaving]=\"EffectiveIsSaving\"\n [IsRefreshing]=\"EffectiveIsRefreshing\"\n [VisibleSectionCount]=\"VisibleSectionCount\"\n [TotalSectionCount]=\"TotalSectionCount\"\n [ExpandedSectionCount]=\"ExpandedSectionCount\"\n [SearchFilter]=\"EffectiveSearchFilter\"\n [ShowEmptyFields]=\"EffectiveShowEmptyFields\"\n [WidthMode]=\"EffectiveWidthMode\"\n [HasCustomSectionOrder]=\"EffectiveHasCustomSectionOrder\"\n [ChromeLayout]=\"ChromeLayout\"\n [Variants]=\"EffectiveVariants\"\n [CurrentVariantID]=\"EffectiveCurrentVariantID\"\n [RegisteredItems]=\"EffectiveRegisteredToolbarItems\"\n [ItemOverrides]=\"EffectiveToolbarItemOverrides\"\n [FormComponent]=\"fc\"\n (Navigate)=\"OnNavigate($event)\"\n (EditModeChange)=\"OnEditModeChange($event)\"\n (BeforeSave)=\"BeforeSave.emit($event)\"\n (SaveRequested)=\"OnSaveRequested()\"\n (BeforeCancel)=\"BeforeCancel.emit($event)\"\n (CancelRequested)=\"OnCancelRequested()\"\n (BeforeDelete)=\"BeforeDelete.emit($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (BeforeRefresh)=\"BeforeRefresh.emit($event)\"\n (RefreshRequested)=\"OnRefreshRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (BeforeHistoryView)=\"BeforeHistoryView.emit($event)\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (BeforeListManagement)=\"BeforeListManagement.emit($event)\"\n (ListManagementRequested)=\"OnListManagementRequested()\"\n (ShowChangesRequested)=\"OnShowChangesRequested()\"\n (CustomButtonClick)=\"CustomButtonClick.emit($event)\"\n (ToolbarItemClick)=\"ToolbarItemClick.emit($event)\"\n (FilterChange)=\"OnFilterChange($event)\"\n (ExpandAllRequested)=\"OnExpandAll()\"\n (CollapseAllRequested)=\"OnCollapseAll()\"\n (ShowEmptyFieldsChange)=\"OnShowEmptyFieldsChange($event)\"\n (WidthModeChange)=\"OnWidthModeChange($event)\"\n (ResetSectionOrderRequested)=\"OnResetSectionOrder()\"\n (ManageSectionsRequested)=\"OnManageSections()\"\n (TagsPanelToggled)=\"OnTagsPanelToggled()\"\n (AttachmentsPanelToggled)=\"OnAttachmentsPanelToggled()\"\n (VariantPicked)=\"OnVariantPicked($event)\">\n</mj-form-toolbar>\n}\n\n<!-- ============================================\n SCROLL AREA (full-width so mouse wheel works anywhere)\n Variant picker is now embedded in <mj-form-toolbar> as a right-side\n button \u2014 see the [Variants]/[CurrentVariantID] inputs + (VariantPicked)\n output on the toolbar above. Inline strip was removed.\n ============================================ -->\n<div class=\"mj-forms-scroll-area\">\n <div class=\"mj-forms-panels-container\"\n [class.mj-forms-panels--full-width]=\"EffectiveWidthMode === 'full-width'\"\n [class.mj-forms-panels--edit-mode]=\"EffectiveEditMode\"\n [class.mj-forms-panels--has-isa-panel]=\"HasIsaRelatedItems\">\n <!-- Flex row: optional left-nav + form panels + ISA side panel -->\n <div class=\"mj-forms-layout-row\"\n [class.mj-forms-layout--left-nav]=\"ChromeLayout === 'left-nav'\"\n [class.mj-forms-layout--accordion]=\"ChromeLayout === 'accordion'\"\n [class.mj-forms-layout--more]=\"IsChromeMoreActive\">\n @if (ShowChromeRail) {\n <nav class=\"mj-forms-chrome-rail\"\n [class.is-collapsed]=\"ChromeRailCollapsed\"\n [class.is-resizing]=\"RailResizing\"\n [style.width.px]=\"ChromeRailCollapsed ? null : ChromeRailWidthPx\"\n [attr.aria-expanded]=\"!ChromeRailCollapsed\"\n aria-label=\"Form sections\">\n @if (ChromeRailCollapsed) {\n <button type=\"button\"\n class=\"mj-forms-chrome-rail-spine\"\n (click)=\"OnChromeRailExpand()\"\n [attr.aria-label]=\"'Show form sections \u2014 ' + ChromeActiveTitle\"\n [title]=\"'Show sections \u2014 ' + ChromeActiveTitle\">\n <i [class]=\"ChromeActiveIcon\"></i>\n <span class=\"mj-forms-chrome-rail-spine-label\"\n (mouseenter)=\"OnRailLabelHover($event, ChromeActiveTitle)\">{{ ChromeActiveTitle }}</span>\n </button>\n } @else {\n <div class=\"mj-forms-chrome-rail-resizer\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n [attr.aria-valuenow]=\"ChromeRailWidthPx\"\n [attr.aria-valuemin]=\"RailWidthMin\"\n [attr.aria-valuemax]=\"RailWidthMax\"\n title=\"Drag to resize sections\"\n (pointerdown)=\"OnRailResizeStart($event)\"\n (pointermove)=\"OnRailResizeMove($event)\"\n (pointerup)=\"OnRailResizeEnd()\"\n (pointercancel)=\"OnRailResizeEnd()\"></div>\n <div class=\"mj-forms-chrome-rail-toolbar\">\n <button type=\"button\"\n class=\"mj-forms-chrome-rail-pin\"\n [class.is-pinned]=\"ChromeRailPinned\"\n [attr.aria-pressed]=\"ChromeRailPinned\"\n [title]=\"ChromeRailPinned ? 'Unpin sections \u2014 they hide after you switch' : 'Pin sections open'\"\n (click)=\"OnChromeRailPinToggle()\">\n <i class=\"fa-solid fa-thumbtack\"></i>\n </button>\n <button type=\"button\"\n class=\"mj-forms-chrome-rail-collapse\"\n title=\"Hide sections\"\n aria-label=\"Hide form sections\"\n (click)=\"OnChromeRailCollapse()\">\n <i class=\"fa-solid fa-angles-left\"></i>\n </button>\n </div>\n @for (group of ChromeFirstClassGroups; track group.Key) {\n <div class=\"mj-forms-chrome-rail-item\"\n role=\"button\"\n tabindex=\"0\"\n [class.is-active]=\"ChromeActiveGroupKey === group.Key\"\n [attr.aria-current]=\"ChromeActiveGroupKey === group.Key ? 'page' : null\"\n [class.is-drag-over]=\"RailDragOverKey === group.Key\"\n (click)=\"OnChromeGroupActivate(group.Key)\"\n (keydown.enter)=\"OnChromeGroupActivate(group.Key)\"\n (keydown.space)=\"$event.preventDefault(); OnChromeGroupActivate(group.Key)\"\n (dragover)=\"OnRailDragOver($event, group.Key)\"\n (dragleave)=\"OnRailDragLeave($event, group.Key)\"\n (drop)=\"OnRailDrop($event, group.Key)\">\n @if (ChromeReorderAllowed) {\n <span class=\"mj-forms-chrome-rail-handle\"\n title=\"Drag to reorder\"\n draggable=\"true\"\n (dragstart)=\"OnRailDragStart($event, group.Key)\"\n (dragend)=\"OnRailDragEnd()\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-grip-vertical\"></i>\n </span>\n }\n <i [class]=\"group.Icon\"></i>\n <span class=\"mj-forms-chrome-rail-label\"\n (mouseenter)=\"OnRailLabelHover($event, group.Title)\">{{ group.Title }}</span>\n @let rowCount = ChromeGroupRowCount(group);\n @if (rowCount != null) {\n <span class=\"mj-forms-chrome-rail-count\"\n [class.is-zero]=\"rowCount === 0\">{{ rowCount }}</span>\n }\n </div>\n }\n @if (ChromeMoreFolder; as more) {\n <div class=\"mj-forms-chrome-rail-item is-more-folder\"\n role=\"button\"\n tabindex=\"0\"\n [class.is-expanded]=\"MoreExpanded\"\n (click)=\"OnMoreFolderToggle()\"\n (keydown.enter)=\"OnMoreFolderToggle()\"\n (keydown.space)=\"$event.preventDefault(); OnMoreFolderToggle()\">\n <span class=\"mj-forms-chrome-rail-handle is-spacer\" aria-hidden=\"true\"></span>\n <i [class]=\"MoreExpanded ? 'fa-solid fa-folder-open' : 'fa-solid fa-folder'\"></i>\n <span class=\"mj-forms-chrome-rail-label\"\n (mouseenter)=\"OnRailLabelHover($event, more.Title)\">{{ more.Title }}</span>\n <i class=\"fa-solid mj-forms-chrome-rail-more-toggle\"\n [class.fa-minus]=\"MoreExpanded\"\n [class.fa-plus]=\"!MoreExpanded\"\n aria-hidden=\"true\"></i>\n </div>\n @if (MoreExpanded) {\n <div class=\"mj-forms-chrome-rail-more-tree\">\n @for (child of ChromeMoreItems; track child.Key) {\n <div class=\"mj-forms-chrome-rail-item is-more-child\"\n role=\"button\"\n tabindex=\"0\"\n [class.is-active]=\"ChromeActiveGroupKey === child.Key\"\n [attr.aria-current]=\"ChromeActiveGroupKey === child.Key ? 'page' : null\"\n [class.is-drag-over]=\"RailDragOverKey === child.Key\"\n (click)=\"OnChromeGroupActivate(child.Key)\"\n (keydown.enter)=\"OnChromeGroupActivate(child.Key)\"\n (keydown.space)=\"$event.preventDefault(); OnChromeGroupActivate(child.Key)\"\n (dragover)=\"OnRailDragOver($event, child.Key)\"\n (dragleave)=\"OnRailDragLeave($event, child.Key)\"\n (drop)=\"OnRailDrop($event, child.Key)\">\n @if (ChromeReorderAllowed) {\n <span class=\"mj-forms-chrome-rail-handle\"\n title=\"Drag to reorder\"\n draggable=\"true\"\n (dragstart)=\"OnRailDragStart($event, child.Key)\"\n (dragend)=\"OnRailDragEnd()\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-grip-vertical\"></i>\n </span>\n }\n <i [class]=\"child.Icon\"></i>\n <span class=\"mj-forms-chrome-rail-label\"\n (mouseenter)=\"OnRailLabelHover($event, child.Title)\">{{ child.Title }}</span>\n @let childCount = ChromeGroupRowCount(child);\n @if (childCount != null) {\n <span class=\"mj-forms-chrome-rail-count\"\n [class.is-zero]=\"childCount === 0\">{{ childCount }}</span>\n }\n </div>\n }\n </div>\n }\n }\n }\n </nav>\n }\n <!-- All panels in a single flex container \u2014 CSS order drives sequencing -->\n <div class=\"mj-forms-all-panels\">\n <ng-content></ng-content>\n\n <!--\n Fill-in related grids for DisplayInForm relationships the template\n did not bake and no registered panel claimed. Claimed / extra panels\n still mount via mj-form-panel-slot. See plans/form-contributions.md.\n -->\n @if (Record && FormComponent) {\n <mj-form-contributions\n [Record]=\"Record\"\n [FormComponent]=\"FormComponent\"\n [FormContext]=\"FormComponent.formContext\"\n [BakedSectionKeys]=\"BakedRelatedSectionKeys\"\n [ShowRelatedEntities]=\"EffectiveShowRelatedEntities\">\n </mj-form-contributions>\n }\n\n <!--\n Container-provided fallback slot. ALWAYS present \u2014 last in document\n order \u2014 so any panel whose registered slot isn't found in the current\n form falls through here via FormSlotCoordinator's chain. Downstream\n consumers that haven't rerun CodeGen against the slot-emitting\n template still see every panel; they just render at the bottom\n instead of at their preferred position.\n -->\n @if (ShowMoreToggle) {\n <div class=\"mj-forms-more-overflow\" [class.is-expanded]=\"MoreExpanded\">\n <button type=\"button\"\n class=\"mj-forms-more-overflow-toggle\"\n (click)=\"OnMoreToggle()\">\n <i [class]=\"MoreExpanded ? 'fa-solid fa-folder-open' : 'fa-solid fa-folder'\"></i>\n <span class=\"mj-forms-more-overflow-label\">{{ MoreExpanded ? 'Hide more' : 'More' }}</span>\n @if (!MoreExpanded && MorePreview) {\n <span class=\"mj-forms-more-overflow-preview\">{{ MorePreview }}</span>\n }\n <i class=\"fa-solid\"\n [class.fa-chevron-down]=\"MoreExpanded\"\n [class.fa-chevron-right]=\"!MoreExpanded\"></i>\n </button>\n </div>\n }\n\n @if (Record && FormComponent) {\n <mj-form-panel-slot\n [Entity]=\"Record.EntityInfo.Name\"\n Slot=\"after-everything\"\n [Record]=\"Record\"\n [FormComponent]=\"FormComponent\">\n </mj-form-panel-slot>\n }\n\n <!-- Empty state when no sections match search -->\n @if (EffectiveSearchFilter && SearchHasNoMatches) {\n <mj-empty-state class=\"mj-forms-empty-search-state\"\n Variant=\"no-results\"\n Title=\"No sections found\"\n [Message]=\"'No sections match &quot;' + EffectiveSearchFilter + '&quot;. Try a different search term.'\"\n ActionText=\"Clear search\"\n ActionIcon=\"fa-solid fa-rotate-left\"\n ActionVariant=\"flat\"\n (Action)=\"OnFilterChange('')\" />\n }\n </div>\n\n <!-- IS-A Related Records Side Panel -->\n <mj-isa-related-panel\n [Record]=\"EffectiveRecord\"\n [EditMode]=\"EffectiveEditMode\"\n [Collapsed]=\"EffectiveWidthMode === 'full-width'\"\n (Navigate)=\"OnNavigate($event)\">\n </mj-isa-related-panel>\n </div>\n </div>\n</div>\n\n<!-- ============================================\n RECORD CHANGES DRAWER (shown when history button clicked)\n ============================================ -->\n@if (ShowRecordChanges && EffectiveRecord) {\n <mj-record-changes\n [record]=\"EffectiveRecord\"\n [AllowRestore]=\"EffectiveUserCanEdit\"\n (RestoreRequested)=\"OnRestoreRequested($event)\"\n (dialogClosed)=\"OnRecordChangesClosed()\">\n </mj-record-changes>\n}\n\n<!-- ============================================\n TAGS PANEL (shown when tags button clicked)\n ============================================ -->\n@if (ShowTagsPanel && EffectiveRecord) {\n <mj-record-tags\n [Record]=\"EffectiveRecord\"\n [WidthPx]=\"TagsPanelWidth\"\n (PanelClosed)=\"OnTagsPanelClosed()\"\n (TagCountChanged)=\"OnTagCountChanged($event)\"\n (RecordNavigate)=\"OnTagsRecordNavigate($event)\"\n (WidthChanged)=\"OnTagsPanelWidthChanged($event)\">\n </mj-record-tags>\n}\n\n<!-- ============================================\n ATTACHMENTS PANEL (shown when attachments button clicked)\n ============================================ -->\n@if (ShowAttachmentsPanel && AttachmentsAvailable && EffectiveRecord) {\n <mj-record-attachments\n [Record]=\"EffectiveRecord\"\n [Visible]=\"true\"\n (PanelClosed)=\"OnAttachmentsPanelClosed()\"\n (AttachmentCountChanged)=\"OnAttachmentCountChanged($event)\">\n </mj-record-attachments>\n}\n\n<!-- ============================================\n LIST MANAGEMENT DIALOG (shown when lists button clicked)\n ============================================ -->\n@if (ShowListManagement && EffectiveRecord) {\n <mj-list-management-dialog\n [visible]=\"ShowListManagement\"\n [config]=\"{\n mode: 'manage',\n entityId: EffectiveRecord.EntityInfo.ID,\n entityName: EffectiveRecord.EntityInfo.Name,\n recordIds: [EffectiveRecord.PrimaryKey.Values()[0]],\n allowCreate: true\n }\"\n (complete)=\"OnListManagementComplete($event)\"\n (cancel)=\"OnListManagementClosed()\">\n </mj-list-management-dialog>\n}\n\n<!-- ============================================\n SECTION MANAGER DRAWER (shown when manage-sections button clicked)\n ============================================ -->\n<mj-section-manager\n [Sections]=\"SectionManagerItems\"\n [SectionOrder]=\"SectionManagerOrder\"\n [MoreSectionKeys]=\"SectionManagerMoreKeys\"\n [LockedMoreKeys]=\"SectionManagerLockedMoreKeys\"\n [Visible]=\"ShowSectionManager\"\n (SectionOrderChange)=\"OnSectionOrderChange($event)\"\n (MembershipChange)=\"OnChromeMembershipChange($event)\"\n (ResetRequested)=\"OnSectionManagerReset()\"\n (Closed)=\"OnSectionManagerClosed()\">\n</mj-section-manager>\n", styles: ["/* ============================================\n RECORD FORM CONTAINER \u2014 uses global --mj-* design tokens\n Top-level wrapper: toolbar + scrollable content\n ============================================ */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ViewEncapsulation.None fallback \u2014 ensure the element itself constrains overflow */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ============================================\n SCROLL AREA (full-width so mouse wheel works anywhere)\n ============================================ */\n.mj-forms-scroll-area {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: var(--mj-bg-page);\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n/* ============================================\n PANELS CONTAINER (centered content within scroll area)\n ============================================ */\n.mj-forms-panels-container {\n padding: 24px 32px 48px;\n max-width: 920px;\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n flex: 1;\n min-height: 0;\n}\n\n/* Widen max-width when ISA side panel is present */\n.mj-forms-panels--has-isa-panel {\n max-width: 1240px;\n}\n\n.mj-forms-panels--full-width {\n max-width: none;\n padding-left: 24px;\n padding-right: 24px;\n}\n\n/* Flex row layout: form panels + optional ISA side panel */\n.mj-forms-layout-row {\n display: flex;\n gap: 20px;\n align-items: flex-start;\n}\n\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav) {\n padding: 16px 20px 24px;\n display: flex;\n flex-direction: column;\n /* Definite height = the scroll-area's client box. min-height: 100% alone\n lets the column grow with content and never gives related grids a\n containing-block height, so Height:auto (100%) on the grid collapses. */\n height: 100%;\n max-height: 100%;\n min-height: 0;\n overflow: hidden;\n box-sizing: border-box;\n}\n\n/* Centered left-nav keeps the form column at the same 920px as accordion,\n plus the rail. Full-width still uses .mj-forms-panels--full-width. */\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav):not(.mj-forms-panels--full-width) {\n max-width: 1160px;\n}\n\n.mj-forms-layout-row.mj-forms-layout--left-nav {\n flex: 1;\n min-height: 0;\n /* Wins over .mj-forms-layout-row { align-items: flex-start } so the\n body column stretches to the rail / viewport instead of hugging content. */\n align-items: stretch;\n gap: 16px;\n}\n\n/* Left-nav: only the active rail item is in the body. Slot-mounted\n panels never inject the container coordinator, so host classes set\n from the container are the hide/show channel that always reaches them. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-hidden,\n.mj-forms-layout--accordion mj-collapsible-panel.mj-chrome-hidden {\n display: none;\n}\n\n/* Selected item: no accordion chrome \u2014 the rail is the header. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-header {\n display: none;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel {\n box-shadow: none;\n border: 0;\n background: transparent;\n border-radius: 0;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-body--collapsed {\n max-height: none;\n padding: 0;\n opacity: 1;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-content {\n max-height: none;\n padding: 0;\n overflow: visible;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show {\n /* Content-sized (see RelatedGridHeightPx). Do not flex-fill leftover\n column space \u2014 a form header above the grid can collapse that to 0. */\n flex: 0 0 auto;\n min-height: 0;\n}\n\n/* Accordion related panels use a 400px resizable box. Left-nav grids\n set their own pixel height from row count (RelatedGridHeightPx). */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show .mj-forms-panel-content {\n height: auto;\n max-height: none;\n overflow: hidden;\n resize: none;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels {\n gap: 0;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Details (field panels) can be taller than the viewport \u2014 scroll inside the\n column. Related grids scroll inside AG Grid instead. */\n.mj-forms-layout--left-nav .mj-forms-all-panels:has(mj-collapsible-panel.mj-chrome-show:not(.mj-panel--related-entity)) {\n overflow-y: auto;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels > *:not(mj-collapsible-panel.mj-panel--related-entity) {\n flex-shrink: 0;\n}\n\n.mj-forms-layout--left-nav .biz-hero {\n margin-bottom: 4px;\n}\n\n/* All panels in a single flex container \u2014 CSS order drives sequencing */\n.mj-forms-all-panels {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n min-width: 0;\n}\n\n/* Hide related entity panels in edit mode (variant host class on mj-collapsible-panel) */\n.mj-forms-panels--edit-mode .mj-panel--related-entity,\n.mj-forms-panels--edit-mode .mj-forms-more-overflow {\n display: none;\n}\n\n/* Detail / More panels sort after the overflow footer */\nmj-collapsible-panel.mj-form-role-detail,\nmj-collapsible-panel.mj-form-role-more {\n order: 8500;\n}\n\n.mj-forms-more-overflow {\n order: 8400;\n display: flex;\n flex-direction: column;\n margin-top: 4px;\n padding-top: 12px;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n\n.mj-forms-more-overflow-toggle {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 6px 2px;\n border: 0;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.mj-forms-more-overflow-toggle:hover {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-more-overflow-label {\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-more-overflow-preview {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-disabled);\n font-weight: var(--mj-font-normal);\n}\n\n.mj-forms-more-overflow-toggle .fa-chevron-right,\n.mj-forms-more-overflow-toggle .fa-chevron-down {\n margin-left: auto;\n}\n\n.mj-forms-chrome-rail {\n flex: 0 0 auto;\n width: 200px;\n max-width: 360px;\n min-width: 160px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n position: sticky;\n top: 0;\n align-self: stretch;\n min-height: 0;\n padding: 4px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: var(--mj-radius-md);\n}\n\n.mj-forms-chrome-rail.is-resizing {\n user-select: none;\n}\n\n.mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 36px;\n width: 36px;\n min-width: 36px;\n max-width: 36px;\n padding: 8px 0;\n overflow: hidden;\n}\n\n.mj-forms-chrome-rail-resizer {\n position: absolute;\n top: 0;\n right: -4px;\n width: 8px;\n height: 100%;\n cursor: col-resize;\n z-index: 3;\n touch-action: none;\n}\n\n.mj-forms-chrome-rail-resizer::after {\n content: '';\n position: absolute;\n top: 12px;\n bottom: 12px;\n left: 3px;\n width: 2px;\n border-radius: 1px;\n background: transparent;\n}\n\n.mj-forms-chrome-rail:hover .mj-forms-chrome-rail-resizer::after,\n.mj-forms-chrome-rail.is-resizing .mj-forms-chrome-rail-resizer::after {\n background: var(--mj-border-strong);\n}\n\n.mj-forms-layout--right-nav .mj-forms-chrome-rail-resizer {\n right: auto;\n left: -4px;\n}\n\n.mj-forms-chrome-rail-spine {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n width: 100%;\n height: 100%;\n min-height: 0;\n padding: 8px 0;\n border: 0;\n background: transparent;\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-spine:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-forms-chrome-rail-spine > i {\n flex-shrink: 0;\n}\n\n.mj-forms-chrome-rail-spine-label {\n writing-mode: vertical-rl;\n transform: rotate(180deg);\n letter-spacing: 0.04em;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-height: 100%;\n}\n\n.mj-forms-chrome-rail-toolbar {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 2px;\n padding: 2px 4px 6px;\n}\n\n.mj-forms-chrome-rail-pin,\n.mj-forms-chrome-rail-collapse {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-pin:hover,\n.mj-forms-chrome-rail-collapse:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-pin:not(.is-pinned) i {\n transform: rotate(45deg);\n}\n\n.mj-forms-chrome-rail-pin.is-pinned {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 10px 12px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n text-align: left;\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-item > i {\n width: 1.15em;\n flex-shrink: 0;\n text-align: center;\n color: inherit;\n}\n\n.mj-forms-chrome-rail-item:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-chrome-rail-item.is-active::before {\n content: '';\n position: absolute;\n left: 0;\n top: 6px;\n bottom: 6px;\n width: 3px;\n border-radius: 0 3px 3px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-label {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-drag-over {\n outline: 1px dashed var(--mj-border-focus);\n outline-offset: -1px;\n}\n\n.mj-forms-chrome-rail-handle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 18px;\n margin-left: -4px;\n color: var(--mj-text-muted);\n cursor: grab;\n opacity: 0;\n overflow: hidden;\n flex-shrink: 0;\n transition: opacity var(--mj-transition-base, 0.15s) ease;\n}\n\n.mj-forms-chrome-rail-item:hover .mj-forms-chrome-rail-handle,\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-handle {\n opacity: 1;\n}\n\n.mj-forms-chrome-rail-handle.is-spacer {\n opacity: 0;\n pointer-events: none;\n cursor: default;\n}\n\n.mj-forms-chrome-rail-handle:hover {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-handle:active {\n cursor: grabbing;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder {\n position: relative;\n margin-top: 14px;\n padding-top: 14px;\n color: var(--mj-text-muted);\n border-radius: 0;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder::before {\n content: '';\n position: absolute;\n top: 0;\n left: 8px;\n right: 8px;\n height: 1px;\n background: linear-gradient(\n 90deg,\n transparent 0%,\n var(--mj-border-strong) 18%,\n var(--mj-border-strong) 82%,\n transparent 100%\n );\n}\n\n.mj-forms-chrome-rail-item.is-more-folder:hover {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-item.is-more-folder.is-expanded {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-more-toggle {\n margin-left: auto;\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-chrome-rail-more-tree {\n margin-left: 22px;\n padding-left: 6px;\n border-left: 1px solid var(--mj-border-subtle);\n}\n\n.mj-forms-chrome-rail-item.is-more-child {\n padding-left: 8px;\n}\n\n.mj-forms-chrome-rail-count.is-zero {\n opacity: 0.55;\n}\n\n.mj-forms-chrome-rail-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mj-forms-chrome-rail-count {\n min-width: 1.25rem;\n padding: 0 6px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: var(--mj-text-xs);\n text-align: center;\n}\n\n@media (max-width: 720px) {\n .mj-forms-layout--left-nav {\n flex-direction: column;\n }\n\n .mj-forms-chrome-rail {\n flex: 1 1 auto;\n width: 100%;\n position: static;\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .mj-forms-chrome-rail-resizer {\n display: none;\n }\n\n .mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 auto;\n width: 100%;\n min-width: 0;\n max-width: none;\n height: 36px;\n padding: 0;\n }\n\n .mj-forms-chrome-rail-spine {\n flex-direction: row;\n padding: 0 12px;\n }\n\n .mj-forms-chrome-rail-spine-label {\n writing-mode: horizontal-tb;\n transform: none;\n max-height: none;\n }\n\n .mj-forms-chrome-rail-toolbar {\n width: 100%;\n }\n\n .mj-forms-chrome-rail-item {\n width: auto;\n }\n}\n\n/* ============================================\n EMPTY SEARCH STATE\n ============================================ */\n.mj-forms-empty-search-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px 24px;\n text-align: center;\n min-height: 400px;\n}\n\n.mj-forms-empty-search-icon {\n width: 80px;\n height: 80px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 24px;\n}\n\n.mj-forms-empty-search-icon i {\n font-size: 32px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-empty-search-title {\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n margin: 0 0 12px 0;\n}\n\n.mj-forms-empty-search-message {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n line-height: 1.6;\n max-width: 400px;\n margin: 0;\n}\n\n.mj-forms-empty-search-message strong {\n color: var(--mj-text-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-empty-search-link {\n color: var(--mj-brand-primary);\n text-decoration: none;\n font-weight: var(--mj-font-medium);\n}\n\n.mj-forms-empty-search-link:hover {\n text-decoration: underline;\n}\n\n/* ============================================\n RESPONSIVE\n ============================================ */\n@media (max-width: 768px) {\n .mj-forms-panels-container {\n padding: 16px 12px 32px;\n }\n}\n\n/* ====================================================================\n VARIANT PICKER \u2014 between toolbar and form body\n Compact \"Form: <name> \u25BE\" row that appears when more than one variant\n is applicable for the current entity record.\n ==================================================================== */\n\n.mj-form-variant-picker {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 18px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-icon {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n.mj-form-variant-picker-label {\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-control {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n outline: none;\n user-select: none;\n min-width: 160px;\n}\n.mj-form-variant-picker-control:hover,\n.mj-form-variant-picker-control:focus,\n.mj-form-variant-picker-control.open {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n.mj-form-variant-picker-current {\n font-weight: 600;\n flex: 1;\n}\n.mj-form-variant-picker-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 50;\n min-width: 280px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n box-shadow: var(--mj-shadow-md, 0 4px 12px rgba(15, 23, 42, 0.08));\n padding: 4px;\n max-height: 320px;\n overflow: auto;\n}\n.mj-form-variant-picker-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n.mj-form-variant-picker-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n.mj-form-variant-picker-row.current {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n.mj-form-variant-picker-row.inactive {\n opacity: 0.7;\n}\n.mj-form-variant-picker-row-main {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n.mj-form-variant-picker-row-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.mj-form-variant-picker-row-sub {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-form-variant-picker-check {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n/* Retrospective fix #8 \u2014 visually distinguish the Default row from variants. */\n.mj-form-variant-picker-row.mj-form-variant-picker-default {\n border-bottom: 1px dashed var(--mj-border-default);\n margin-bottom: 4px;\n padding-bottom: 10px;\n}\n.mj-form-variant-picker-default-tag {\n color: var(--mj-text-muted);\n font-weight: 400;\n font-size: 11px;\n margin-left: 4px;\n}\n"] }]
2290
+ args: [{ standalone: false, selector: 'mj-record-form-container', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [FormSlotCoordinator, FormChromeCoordinator, FormRecordRefreshCoordinator, FormSectionIndicatorCoordinator], template: "<!-- ============================================\n BEFORE-TOOLBAR SLOT\n ============================================ -->\n<ng-content select=\"[before-toolbar]\"></ng-content>\n\n<!-- ============================================\n TOOLBAR (bridges FormComponent state \u2192 toolbar inputs)\n Hidden entirely when Config.Toolbar === null (dialog/slide-in surfaces).\n ============================================ -->\n@if (EffectiveShowToolbar) {\n<mj-form-toolbar\n [Record]=\"EffectiveRecord\"\n [EditMode]=\"EffectiveEditMode\"\n [UserCanEdit]=\"EffectiveUserCanEdit\"\n [UserCanDelete]=\"EffectiveUserCanDelete\"\n [IsFavorite]=\"EffectiveIsFavorite\"\n [FavoriteInitDone]=\"EffectiveFavoriteInitDone\"\n [IsDirty]=\"EffectiveIsDirty\"\n [DirtyFieldNames]=\"EffectiveDirtyFieldNames\"\n [ListCount]=\"ListCount\"\n [TagCount]=\"TagCount\"\n [AttachmentCount]=\"AttachmentCount\"\n [AttachmentsAvailable]=\"AttachmentsAvailable\"\n [IsAttachmentsPanelOpen]=\"ShowAttachmentsPanel\"\n [VersionCount]=\"VersionCount\"\n [EntityInfo]=\"EffectiveEntityInfo\"\n [Config]=\"EffectiveToolbarConfig\"\n [IsSaving]=\"EffectiveIsSaving\"\n [IsRefreshing]=\"EffectiveIsRefreshing\"\n [VisibleSectionCount]=\"VisibleSectionCount\"\n [TotalSectionCount]=\"TotalSectionCount\"\n [ExpandedSectionCount]=\"ExpandedSectionCount\"\n [SearchFilter]=\"EffectiveSearchFilter\"\n [ShowEmptyFields]=\"EffectiveShowEmptyFields\"\n [WidthMode]=\"EffectiveWidthMode\"\n [HasCustomSectionOrder]=\"EffectiveHasCustomSectionOrder\"\n [ChromeLayout]=\"ChromeLayout\"\n [Variants]=\"EffectiveVariants\"\n [CurrentVariantID]=\"EffectiveCurrentVariantID\"\n [RegisteredItems]=\"EffectiveRegisteredToolbarItems\"\n [ItemOverrides]=\"EffectiveToolbarItemOverrides\"\n [FormComponent]=\"fc\"\n (Navigate)=\"OnNavigate($event)\"\n (EditModeChange)=\"OnEditModeChange($event)\"\n (BeforeSave)=\"BeforeSave.emit($event)\"\n (SaveRequested)=\"OnSaveRequested()\"\n (BeforeCancel)=\"BeforeCancel.emit($event)\"\n (CancelRequested)=\"OnCancelRequested()\"\n (BeforeDelete)=\"BeforeDelete.emit($event)\"\n (DeleteRequested)=\"OnDeleteRequested()\"\n (BeforeRefresh)=\"BeforeRefresh.emit($event)\"\n (RefreshRequested)=\"OnRefreshRequested()\"\n (FavoriteToggled)=\"OnFavoriteToggled()\"\n (BeforeHistoryView)=\"BeforeHistoryView.emit($event)\"\n (HistoryRequested)=\"OnHistoryRequested()\"\n (BeforeListManagement)=\"BeforeListManagement.emit($event)\"\n (ListManagementRequested)=\"OnListManagementRequested()\"\n (ShowChangesRequested)=\"OnShowChangesRequested()\"\n (CustomButtonClick)=\"CustomButtonClick.emit($event)\"\n (ToolbarItemClick)=\"ToolbarItemClick.emit($event)\"\n (FilterChange)=\"OnFilterChange($event)\"\n (ExpandAllRequested)=\"OnExpandAll()\"\n (CollapseAllRequested)=\"OnCollapseAll()\"\n (ShowEmptyFieldsChange)=\"OnShowEmptyFieldsChange($event)\"\n (WidthModeChange)=\"OnWidthModeChange($event)\"\n (ResetSectionOrderRequested)=\"OnResetSectionOrder()\"\n (ManageSectionsRequested)=\"OnManageSections()\"\n (TagsPanelToggled)=\"OnTagsPanelToggled()\"\n (AttachmentsPanelToggled)=\"OnAttachmentsPanelToggled()\"\n (VariantPicked)=\"OnVariantPicked($event)\">\n</mj-form-toolbar>\n}\n\n<!-- ============================================\n SCROLL AREA (full-width so mouse wheel works anywhere)\n Variant picker is now embedded in <mj-form-toolbar> as a right-side\n button \u2014 see the [Variants]/[CurrentVariantID] inputs + (VariantPicked)\n output on the toolbar above. Inline strip was removed.\n ============================================ -->\n<!-- Persistent polite live region for the section indicators (see FormIndicatorsAnnouncement) -->\n<span class=\"mj-forms-visually-hidden\" aria-live=\"polite\" aria-atomic=\"true\">{{ FormIndicatorsAnnouncement }}</span>\n\n<div class=\"mj-forms-scroll-area\">\n <div class=\"mj-forms-panels-container\"\n [class.mj-forms-panels--full-width]=\"EffectiveWidthMode === 'full-width'\"\n [class.mj-forms-panels--edit-mode]=\"EffectiveEditMode\"\n [class.mj-forms-panels--has-isa-panel]=\"HasIsaRelatedItems\">\n <!-- Flex row: optional left-nav + form panels + ISA side panel -->\n <div class=\"mj-forms-layout-row\"\n [class.mj-forms-layout--left-nav]=\"ChromeLayout === 'left-nav'\"\n [class.mj-forms-layout--accordion]=\"ChromeLayout === 'accordion'\"\n [class.mj-forms-layout--more]=\"IsChromeMoreActive\">\n @if (ShowChromeRail) {\n <nav class=\"mj-forms-chrome-rail\"\n [class.is-collapsed]=\"ChromeRailCollapsed\"\n [class.is-resizing]=\"RailResizing\"\n [style.width.px]=\"ChromeRailCollapsed ? null : ChromeRailWidthPx\"\n [attr.aria-expanded]=\"!ChromeRailCollapsed\"\n aria-label=\"Form sections\">\n @if (ChromeRailCollapsed) {\n <button type=\"button\"\n class=\"mj-forms-chrome-rail-spine\"\n (click)=\"OnChromeRailExpand()\"\n [attr.aria-label]=\"'Show form sections \u2014 ' + ChromeActiveTitle\"\n [title]=\"'Show sections \u2014 ' + ChromeActiveTitle\">\n <i [class]=\"ChromeActiveIcon\"></i>\n <span class=\"mj-forms-chrome-rail-spine-label\"\n (mouseenter)=\"OnRailLabelHover($event, ChromeActiveTitle)\">{{ ChromeActiveTitle }}</span>\n <!-- Whole-form section indicators: no rail item is visible while collapsed -->\n @let formIndicators = FormIndicators;\n @if (formIndicators.ErrorCount > 0) {\n <span class=\"mj-forms-chrome-rail-error is-spine\"\n role=\"img\"\n [title]=\"RailErrorTitle(formIndicators.ErrorCount, 'this record')\"\n [attr.aria-label]=\"RailErrorTitle(formIndicators.ErrorCount, 'this record')\">{{ formIndicators.ErrorCount }}</span>\n } @else if (formIndicators.WarningCount > 0) {\n <span class=\"mj-forms-chrome-rail-warning is-spine\"\n role=\"img\"\n [title]=\"RailWarningTitle(formIndicators.WarningCount, 'this record')\"\n [attr.aria-label]=\"RailWarningTitle(formIndicators.WarningCount, 'this record')\">{{ formIndicators.WarningCount }}</span>\n }\n @if (formIndicators.DirtyCount > 0) {\n <span class=\"mj-forms-chrome-rail-dirty is-spine\"\n role=\"img\"\n [title]=\"RailDirtyTitle(formIndicators.DirtyCount, 'this record')\"\n [attr.aria-label]=\"RailDirtyTitle(formIndicators.DirtyCount, 'this record')\"></span>\n }\n </button>\n } @else {\n <div class=\"mj-forms-chrome-rail-resizer\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n [attr.aria-valuenow]=\"ChromeRailWidthPx\"\n [attr.aria-valuemin]=\"RailWidthMin\"\n [attr.aria-valuemax]=\"RailWidthMax\"\n title=\"Drag to resize sections\"\n (pointerdown)=\"OnRailResizeStart($event)\"\n (pointermove)=\"OnRailResizeMove($event)\"\n (pointerup)=\"OnRailResizeEnd()\"\n (pointercancel)=\"OnRailResizeEnd()\"></div>\n <div class=\"mj-forms-chrome-rail-toolbar\">\n <button type=\"button\"\n class=\"mj-forms-chrome-rail-pin\"\n [class.is-pinned]=\"ChromeRailPinned\"\n [attr.aria-pressed]=\"ChromeRailPinned\"\n [title]=\"ChromeRailPinned ? 'Unpin sections \u2014 they hide after you switch' : 'Pin sections open'\"\n (click)=\"OnChromeRailPinToggle()\">\n <i class=\"fa-solid fa-thumbtack\"></i>\n </button>\n <button type=\"button\"\n class=\"mj-forms-chrome-rail-collapse\"\n title=\"Hide sections\"\n aria-label=\"Hide form sections\"\n (click)=\"OnChromeRailCollapse()\">\n <i class=\"fa-solid fa-angles-left\"></i>\n </button>\n </div>\n <!-- Rail items scroll on their own when they outgrow the viewport;\n the pin / collapse toolbar above stays put. -->\n <div class=\"mj-forms-chrome-rail-items\">\n @for (group of ChromeFirstClassGroups; track group.Key) {\n <div class=\"mj-forms-chrome-rail-item\"\n role=\"button\"\n tabindex=\"0\"\n [class.is-active]=\"ChromeActiveGroupKey === group.Key\"\n [attr.aria-current]=\"ChromeActiveGroupKey === group.Key ? 'page' : null\"\n [class.is-drag-over]=\"RailDragOverKey === group.Key\"\n [class.has-errors]=\"ChromeGroupIndicators(group).ErrorCount > 0\"\n [class.is-dirty]=\"ChromeGroupIndicators(group).DirtyCount > 0\"\n (click)=\"OnChromeGroupActivate(group.Key)\"\n (keydown.enter)=\"OnChromeGroupActivate(group.Key)\"\n (keydown.space)=\"$event.preventDefault(); OnChromeGroupActivate(group.Key)\"\n (dragover)=\"OnRailDragOver($event, group.Key)\"\n (dragleave)=\"OnRailDragLeave($event, group.Key)\"\n (drop)=\"OnRailDrop($event, group.Key)\">\n @if (ChromeReorderAllowed) {\n <span class=\"mj-forms-chrome-rail-handle\"\n title=\"Drag to reorder\"\n draggable=\"true\"\n (dragstart)=\"OnRailDragStart($event, group.Key)\"\n (dragend)=\"OnRailDragEnd()\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-grip-vertical\"></i>\n </span>\n }\n <i [class]=\"group.Icon\"></i>\n <span class=\"mj-forms-chrome-rail-label\"\n (mouseenter)=\"OnRailLabelHover($event, group.Title)\">{{ group.Title }}</span>\n @let groupIndicators = ChromeGroupIndicators(group);\n @if (groupIndicators.DirtyCount > 0) {\n <span class=\"mj-forms-chrome-rail-dirty\"\n role=\"img\"\n [title]=\"RailDirtyTitle(groupIndicators.DirtyCount, group.Title)\"\n [attr.aria-label]=\"RailDirtyTitle(groupIndicators.DirtyCount, group.Title)\"></span>\n }\n @if (groupIndicators.ErrorCount > 0) {\n <span class=\"mj-forms-chrome-rail-error\"\n role=\"img\"\n [title]=\"RailErrorTitle(groupIndicators.ErrorCount, group.Title)\"\n [attr.aria-label]=\"RailErrorTitle(groupIndicators.ErrorCount, group.Title)\">\n <i class=\"fa-solid fa-circle-exclamation\" aria-hidden=\"true\"></i>{{ groupIndicators.ErrorCount }}\n </span>\n } @else if (groupIndicators.WarningCount > 0) {\n <span class=\"mj-forms-chrome-rail-warning\"\n role=\"img\"\n [title]=\"RailWarningTitle(groupIndicators.WarningCount, group.Title)\"\n [attr.aria-label]=\"RailWarningTitle(groupIndicators.WarningCount, group.Title)\">\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>{{ groupIndicators.WarningCount }}\n </span>\n }\n @let rowCount = ChromeGroupRowCount(group);\n @if (rowCount != null && rowCount > 0) {\n <span class=\"mj-forms-chrome-rail-count\">{{ rowCount }}</span>\n }\n </div>\n }\n @if (ChromeMoreFolder; as more) {\n <div class=\"mj-forms-chrome-rail-item is-more-folder\"\n role=\"button\"\n tabindex=\"0\"\n [class.is-expanded]=\"MoreExpanded\"\n [class.has-errors]=\"ChromeGroupIndicators(more).ErrorCount > 0\"\n (click)=\"OnMoreFolderToggle()\"\n (keydown.enter)=\"OnMoreFolderToggle()\"\n (keydown.space)=\"$event.preventDefault(); OnMoreFolderToggle()\">\n <span class=\"mj-forms-chrome-rail-handle is-spacer\" aria-hidden=\"true\"></span>\n <i [class]=\"MoreExpanded ? 'fa-solid fa-folder-open' : 'fa-solid fa-folder'\"></i>\n <span class=\"mj-forms-chrome-rail-label\"\n (mouseenter)=\"OnRailLabelHover($event, more.Title)\">{{ more.Title }}</span>\n @let moreIndicators = ChromeGroupIndicators(more);\n @if (moreIndicators.DirtyCount > 0) {\n <span class=\"mj-forms-chrome-rail-dirty\"\n role=\"img\"\n [title]=\"RailDirtyTitle(moreIndicators.DirtyCount, more.Title)\"\n [attr.aria-label]=\"RailDirtyTitle(moreIndicators.DirtyCount, more.Title)\"></span>\n }\n @if (moreIndicators.ErrorCount > 0) {\n <span class=\"mj-forms-chrome-rail-error\"\n role=\"img\"\n [title]=\"RailErrorTitle(moreIndicators.ErrorCount, more.Title)\"\n [attr.aria-label]=\"RailErrorTitle(moreIndicators.ErrorCount, more.Title)\">\n <i class=\"fa-solid fa-circle-exclamation\" aria-hidden=\"true\"></i>{{ moreIndicators.ErrorCount }}\n </span>\n } @else if (moreIndicators.WarningCount > 0) {\n <span class=\"mj-forms-chrome-rail-warning\"\n role=\"img\"\n [title]=\"RailWarningTitle(moreIndicators.WarningCount, more.Title)\"\n [attr.aria-label]=\"RailWarningTitle(moreIndicators.WarningCount, more.Title)\">\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>{{ moreIndicators.WarningCount }}\n </span>\n }\n <i class=\"fa-solid mj-forms-chrome-rail-more-toggle\"\n [class.fa-minus]=\"MoreExpanded\"\n [class.fa-plus]=\"!MoreExpanded\"\n aria-hidden=\"true\"></i>\n </div>\n @if (MoreExpanded) {\n <div class=\"mj-forms-chrome-rail-more-tree\">\n @for (child of ChromeMoreItems; track child.Key) {\n <div class=\"mj-forms-chrome-rail-item is-more-child\"\n role=\"button\"\n tabindex=\"0\"\n [class.is-active]=\"ChromeActiveGroupKey === child.Key\"\n [attr.aria-current]=\"ChromeActiveGroupKey === child.Key ? 'page' : null\"\n [class.is-drag-over]=\"RailDragOverKey === child.Key\"\n [class.has-errors]=\"ChromeGroupIndicators(child).ErrorCount > 0\"\n [class.is-dirty]=\"ChromeGroupIndicators(child).DirtyCount > 0\"\n (click)=\"OnChromeGroupActivate(child.Key)\"\n (keydown.enter)=\"OnChromeGroupActivate(child.Key)\"\n (keydown.space)=\"$event.preventDefault(); OnChromeGroupActivate(child.Key)\"\n (dragover)=\"OnRailDragOver($event, child.Key)\"\n (dragleave)=\"OnRailDragLeave($event, child.Key)\"\n (drop)=\"OnRailDrop($event, child.Key)\">\n @if (ChromeReorderAllowed) {\n <span class=\"mj-forms-chrome-rail-handle\"\n title=\"Drag to reorder\"\n draggable=\"true\"\n (dragstart)=\"OnRailDragStart($event, child.Key)\"\n (dragend)=\"OnRailDragEnd()\"\n (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-grip-vertical\"></i>\n </span>\n }\n <i [class]=\"child.Icon\"></i>\n <span class=\"mj-forms-chrome-rail-label\"\n (mouseenter)=\"OnRailLabelHover($event, child.Title)\">{{ child.Title }}</span>\n @let childIndicators = ChromeGroupIndicators(child);\n @if (childIndicators.DirtyCount > 0) {\n <span class=\"mj-forms-chrome-rail-dirty\"\n role=\"img\"\n [title]=\"RailDirtyTitle(childIndicators.DirtyCount, child.Title)\"\n [attr.aria-label]=\"RailDirtyTitle(childIndicators.DirtyCount, child.Title)\"></span>\n }\n @if (childIndicators.ErrorCount > 0) {\n <span class=\"mj-forms-chrome-rail-error\"\n role=\"img\"\n [title]=\"RailErrorTitle(childIndicators.ErrorCount, child.Title)\"\n [attr.aria-label]=\"RailErrorTitle(childIndicators.ErrorCount, child.Title)\">\n <i class=\"fa-solid fa-circle-exclamation\" aria-hidden=\"true\"></i>{{ childIndicators.ErrorCount }}\n </span>\n } @else if (childIndicators.WarningCount > 0) {\n <span class=\"mj-forms-chrome-rail-warning\"\n role=\"img\"\n [title]=\"RailWarningTitle(childIndicators.WarningCount, child.Title)\"\n [attr.aria-label]=\"RailWarningTitle(childIndicators.WarningCount, child.Title)\">\n <i class=\"fa-solid fa-triangle-exclamation\" aria-hidden=\"true\"></i>{{ childIndicators.WarningCount }}\n </span>\n }\n @let childCount = ChromeGroupRowCount(child);\n @if (childCount != null && childCount > 0) {\n <span class=\"mj-forms-chrome-rail-count\">{{ childCount }}</span>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n </nav>\n }\n <!-- All panels in a single flex container \u2014 CSS order drives sequencing -->\n <div class=\"mj-forms-all-panels\">\n <ng-content></ng-content>\n\n <!--\n Fill-in related grids for DisplayInForm relationships the template\n did not bake and no registered panel claimed. Claimed / extra panels\n still mount via mj-form-panel-slot. See plans/form-contributions.md.\n -->\n @if (Record && FormComponent) {\n <mj-form-contributions\n [Record]=\"Record\"\n [FormComponent]=\"FormComponent\"\n [FormContext]=\"FormComponent.formContext\"\n [BakedSectionKeys]=\"BakedRelatedSectionKeys\"\n [ShowRelatedEntities]=\"EffectiveShowRelatedEntities\">\n </mj-form-contributions>\n }\n\n <!--\n Container-provided fallback slot. ALWAYS present \u2014 last in document\n order \u2014 so any panel whose registered slot isn't found in the current\n form falls through here via FormSlotCoordinator's chain. Downstream\n consumers that haven't rerun CodeGen against the slot-emitting\n template still see every panel; they just render at the bottom\n instead of at their preferred position.\n -->\n @if (ShowMoreToggle) {\n <div class=\"mj-forms-more-overflow\" [class.is-expanded]=\"MoreExpanded\">\n <button type=\"button\"\n class=\"mj-forms-more-overflow-toggle\"\n (click)=\"OnMoreToggle()\">\n <i [class]=\"MoreExpanded ? 'fa-solid fa-folder-open' : 'fa-solid fa-folder'\"></i>\n <span class=\"mj-forms-more-overflow-label\">{{ MoreExpanded ? 'Hide more' : 'More' }}</span>\n @if (!MoreExpanded && MorePreview) {\n <span class=\"mj-forms-more-overflow-preview\">{{ MorePreview }}</span>\n }\n <i class=\"fa-solid\"\n [class.fa-chevron-down]=\"MoreExpanded\"\n [class.fa-chevron-right]=\"!MoreExpanded\"></i>\n </button>\n </div>\n }\n\n @if (Record && FormComponent) {\n <mj-form-panel-slot\n [Entity]=\"Record.EntityInfo.Name\"\n Slot=\"after-everything\"\n [Record]=\"Record\"\n [FormComponent]=\"FormComponent\">\n </mj-form-panel-slot>\n }\n\n <!-- Empty state when no sections match search -->\n @if (EffectiveSearchFilter && SearchHasNoMatches) {\n <mj-empty-state class=\"mj-forms-empty-search-state\"\n Variant=\"no-results\"\n Title=\"No sections found\"\n [Message]=\"'No sections match &quot;' + EffectiveSearchFilter + '&quot;. Try a different search term.'\"\n ActionText=\"Clear search\"\n ActionIcon=\"fa-solid fa-rotate-left\"\n ActionVariant=\"flat\"\n (Action)=\"OnFilterChange('')\" />\n }\n </div>\n\n <!-- IS-A Related Records Side Panel -->\n <mj-isa-related-panel\n [Record]=\"EffectiveRecord\"\n [EditMode]=\"EffectiveEditMode\"\n [Collapsed]=\"EffectiveWidthMode === 'full-width'\"\n (Navigate)=\"OnNavigate($event)\">\n </mj-isa-related-panel>\n </div>\n </div>\n</div>\n\n<!-- ============================================\n RECORD CHANGES DRAWER (shown when history button clicked)\n ============================================ -->\n@if (ShowRecordChanges && EffectiveRecord) {\n <mj-record-changes\n [record]=\"EffectiveRecord\"\n [AllowRestore]=\"EffectiveUserCanEdit\"\n (RestoreRequested)=\"OnRestoreRequested($event)\"\n (dialogClosed)=\"OnRecordChangesClosed()\">\n </mj-record-changes>\n}\n\n<!-- ============================================\n TAGS PANEL (shown when tags button clicked)\n ============================================ -->\n@if (ShowTagsPanel && EffectiveRecord) {\n <mj-record-tags\n [Record]=\"EffectiveRecord\"\n [WidthPx]=\"TagsPanelWidth\"\n (PanelClosed)=\"OnTagsPanelClosed()\"\n (TagCountChanged)=\"OnTagCountChanged($event)\"\n (RecordNavigate)=\"OnTagsRecordNavigate($event)\"\n (WidthChanged)=\"OnTagsPanelWidthChanged($event)\">\n </mj-record-tags>\n}\n\n<!-- ============================================\n ATTACHMENTS PANEL (shown when attachments button clicked)\n ============================================ -->\n@if (ShowAttachmentsPanel && AttachmentsAvailable && EffectiveRecord) {\n <mj-record-attachments\n [Record]=\"EffectiveRecord\"\n [Visible]=\"true\"\n (PanelClosed)=\"OnAttachmentsPanelClosed()\"\n (AttachmentCountChanged)=\"OnAttachmentCountChanged($event)\">\n </mj-record-attachments>\n}\n\n<!-- ============================================\n LIST MANAGEMENT DIALOG (shown when lists button clicked)\n ============================================ -->\n@if (ShowListManagement && EffectiveRecord) {\n <mj-list-management-dialog\n [visible]=\"ShowListManagement\"\n [config]=\"{\n mode: 'manage',\n entityId: EffectiveRecord.EntityInfo.ID,\n entityName: EffectiveRecord.EntityInfo.Name,\n recordIds: [EffectiveRecord.PrimaryKey.Values()[0]],\n allowCreate: true\n }\"\n (complete)=\"OnListManagementComplete($event)\"\n (cancel)=\"OnListManagementClosed()\">\n </mj-list-management-dialog>\n}\n\n<!-- ============================================\n SECTION MANAGER DRAWER (shown when manage-sections button clicked)\n ============================================ -->\n<mj-section-manager\n [Sections]=\"SectionManagerItems\"\n [SectionOrder]=\"SectionManagerOrder\"\n [MoreSectionKeys]=\"SectionManagerMoreKeys\"\n [LockedMoreKeys]=\"SectionManagerLockedMoreKeys\"\n [Visible]=\"ShowSectionManager\"\n (SectionOrderChange)=\"OnSectionOrderChange($event)\"\n (MembershipChange)=\"OnChromeMembershipChange($event)\"\n (ResetRequested)=\"OnSectionManagerReset()\"\n (Closed)=\"OnSectionManagerClosed()\">\n</mj-section-manager>\n", styles: ["/* ============================================\n RECORD FORM CONTAINER \u2014 uses global --mj-* design tokens\n Top-level wrapper: toolbar + scrollable content\n ============================================ */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ViewEncapsulation.None fallback \u2014 ensure the element itself constrains overflow */\nmj-record-form-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n position: relative;\n overflow: hidden;\n}\n\n/* ============================================\n SCROLL AREA (full-width so mouse wheel works anywhere)\n ============================================ */\n.mj-forms-scroll-area {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: var(--mj-bg-page);\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n/* ============================================\n PANELS CONTAINER (centered content within scroll area)\n ============================================ */\n.mj-forms-panels-container {\n padding: 24px 32px 48px;\n max-width: 920px;\n margin: 0 auto;\n width: 100%;\n box-sizing: border-box;\n flex: 1;\n min-height: 0;\n}\n\n/* Widen max-width when ISA side panel is present */\n.mj-forms-panels--has-isa-panel {\n max-width: 1240px;\n}\n\n.mj-forms-panels--full-width {\n max-width: none;\n padding-left: 24px;\n padding-right: 24px;\n}\n\n/* Flex row layout: form panels + optional ISA side panel */\n.mj-forms-layout-row {\n display: flex;\n gap: 20px;\n align-items: flex-start;\n}\n\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav) {\n padding: 16px 20px 24px;\n display: flex;\n flex-direction: column;\n /* Definite height = the scroll-area's client box. min-height: 100% alone\n lets the column grow with content and never gives related grids a\n containing-block height, so Height:auto (100%) on the grid collapses. */\n height: 100%;\n max-height: 100%;\n min-height: 0;\n overflow: hidden;\n box-sizing: border-box;\n}\n\n/* Centered left-nav keeps the form column at the same 920px as accordion,\n plus the rail. Full-width still uses .mj-forms-panels--full-width. */\n.mj-forms-panels-container:has(.mj-forms-layout--left-nav):not(.mj-forms-panels--full-width) {\n max-width: 1160px;\n}\n\n.mj-forms-layout-row.mj-forms-layout--left-nav {\n flex: 1;\n min-height: 0;\n /* Wins over .mj-forms-layout-row { align-items: flex-start } so the\n body column stretches to the rail / viewport instead of hugging content. */\n align-items: stretch;\n gap: 16px;\n}\n\n/* Left-nav: only the active rail item is in the body. Slot-mounted\n panels never inject the container coordinator, so host classes set\n from the container are the hide/show channel that always reaches them. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-hidden,\n.mj-forms-layout--accordion mj-collapsible-panel.mj-chrome-hidden {\n display: none;\n}\n\n/* Selected item: no accordion chrome \u2014 the rail is the header. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-header {\n display: none;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel {\n box-shadow: none;\n border: 0;\n background: transparent;\n border-radius: 0;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-body--collapsed {\n max-height: none;\n padding: 0;\n opacity: 1;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-show .mj-forms-panel-content {\n max-height: none;\n padding: 0;\n overflow: visible;\n}\n\n/* Details: every field panel shows under ONE rail item, and the rail label\n cannot head several loose field lists \u2014 without a surface the rows float\n on the page background. So the Details panels render as ONE card: each\n panel is a segment (surface + side borders, no radius), and the container\n marks the visual first / last (CSS order, not DOM order) to close the top\n and bottom edges. No per-section headers \u2014 the sections are plain groups. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details .mj-forms-panel {\n background: var(--mj-bg-surface-card);\n border-left: 1px solid var(--mj-border-default);\n border-right: 1px solid var(--mj-border-default);\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first {\n margin-top: 8px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first .mj-forms-panel {\n border-top: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md) var(--mj-radius-md) 0 0;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-last .mj-forms-panel {\n border-bottom: 1px solid var(--mj-border-default);\n border-radius: 0 0 var(--mj-radius-md) var(--mj-radius-md);\n box-shadow: var(--mj-shadow-sm);\n}\n\n/* One panel = whole card: both edges on the same element. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first.mj-chrome-details-last .mj-forms-panel {\n border-radius: var(--mj-radius-md);\n}\n\n/* Segment padding: sides always; top / bottom only at the card's edges, and a\n half-step between segments so the groups still read as groups. */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details .mj-forms-panel-content {\n padding: 8px 20px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-first .mj-forms-panel-content {\n padding-top: 20px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-chrome-details-last .mj-forms-panel-content {\n padding-bottom: 20px;\n}\n\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show {\n /* Content-sized (see RelatedGridHeightPx). Do not flex-fill leftover\n column space \u2014 a form header above the grid can collapse that to 0. */\n flex: 0 0 auto;\n min-height: 0;\n}\n\n/* Accordion related panels use a 400px resizable box. Left-nav grids\n set their own pixel height from row count (RelatedGridHeightPx). */\n.mj-forms-layout--left-nav mj-collapsible-panel.mj-panel--related-entity.mj-chrome-show .mj-forms-panel-content {\n height: auto;\n max-height: none;\n overflow: hidden;\n resize: none;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels {\n gap: 0;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Details (field panels) can be taller than the viewport \u2014 scroll inside the\n column. Related grids scroll inside AG Grid instead. */\n.mj-forms-layout--left-nav .mj-forms-all-panels:has(mj-collapsible-panel.mj-chrome-show:not(.mj-panel--related-entity)) {\n overflow-y: auto;\n}\n\n.mj-forms-layout--left-nav .mj-forms-all-panels > *:not(mj-collapsible-panel.mj-panel--related-entity) {\n flex-shrink: 0;\n}\n\n.mj-forms-layout--left-nav .biz-hero {\n margin-bottom: 4px;\n}\n\n/* All panels in a single flex container \u2014 CSS order drives sequencing */\n.mj-forms-all-panels {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n min-width: 0;\n}\n\n/* Hide related entity panels in edit mode (variant host class on mj-collapsible-panel) */\n.mj-forms-panels--edit-mode .mj-panel--related-entity,\n.mj-forms-panels--edit-mode .mj-forms-more-overflow {\n display: none;\n}\n\n/* Detail / More panels sort after the overflow footer */\nmj-collapsible-panel.mj-form-role-detail,\nmj-collapsible-panel.mj-form-role-more {\n order: 8500;\n}\n\n.mj-forms-more-overflow {\n order: 8400;\n display: flex;\n flex-direction: column;\n margin-top: 4px;\n padding-top: 12px;\n border-top: 1px dashed var(--mj-border-subtle);\n}\n\n.mj-forms-more-overflow-toggle {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 6px 2px;\n border: 0;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n text-align: left;\n}\n\n.mj-forms-more-overflow-toggle:hover {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-more-overflow-label {\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-more-overflow-preview {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--mj-text-disabled);\n font-weight: var(--mj-font-normal);\n}\n\n.mj-forms-more-overflow-toggle .fa-chevron-right,\n.mj-forms-more-overflow-toggle .fa-chevron-down {\n margin-left: auto;\n}\n\n.mj-forms-chrome-rail {\n flex: 0 0 auto;\n width: 200px;\n max-width: 360px;\n min-width: 160px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n position: sticky;\n top: 0;\n align-self: stretch;\n min-height: 0;\n padding: 4px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: var(--mj-radius-md);\n}\n\n/* The rail is as tall as the body column; when it has more items than fit,\n the ITEMS scroll (the pin / collapse toolbar above stays fixed). Without\n this the overflow was clipped by the panels container. */\n.mj-forms-chrome-rail-items {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: thin;\n}\n\n.mj-forms-chrome-rail.is-resizing {\n user-select: none;\n}\n\n.mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 36px;\n width: 36px;\n min-width: 36px;\n max-width: 36px;\n padding: 8px 0;\n overflow: hidden;\n}\n\n.mj-forms-chrome-rail-resizer {\n position: absolute;\n top: 0;\n right: -4px;\n width: 8px;\n height: 100%;\n cursor: col-resize;\n z-index: 3;\n touch-action: none;\n}\n\n.mj-forms-chrome-rail-resizer::after {\n content: '';\n position: absolute;\n top: 12px;\n bottom: 12px;\n left: 3px;\n width: 2px;\n border-radius: 1px;\n background: transparent;\n}\n\n.mj-forms-chrome-rail:hover .mj-forms-chrome-rail-resizer::after,\n.mj-forms-chrome-rail.is-resizing .mj-forms-chrome-rail-resizer::after {\n background: var(--mj-border-strong);\n}\n\n.mj-forms-layout--right-nav .mj-forms-chrome-rail-resizer {\n right: auto;\n left: -4px;\n}\n\n.mj-forms-chrome-rail-spine {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n width: 100%;\n height: 100%;\n min-height: 0;\n padding: 8px 0;\n border: 0;\n background: transparent;\n color: var(--mj-brand-primary);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-spine:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-forms-chrome-rail-spine > i {\n flex-shrink: 0;\n}\n\n.mj-forms-chrome-rail-spine-label {\n writing-mode: vertical-rl;\n transform: rotate(180deg);\n letter-spacing: 0.04em;\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-height: 100%;\n}\n\n.mj-forms-chrome-rail-toolbar {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 2px;\n padding: 2px 4px 6px;\n}\n\n.mj-forms-chrome-rail-pin,\n.mj-forms-chrome-rail-collapse {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-pin:hover,\n.mj-forms-chrome-rail-collapse:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-pin:not(.is-pinned) i {\n transform: rotate(45deg);\n}\n\n.mj-forms-chrome-rail-pin.is-pinned {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 10px 12px;\n border: 0;\n border-radius: var(--mj-radius-sm);\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n text-align: left;\n cursor: pointer;\n}\n\n.mj-forms-chrome-rail-item > i {\n width: 1.15em;\n flex-shrink: 0;\n text-align: center;\n color: inherit;\n}\n\n.mj-forms-chrome-rail-item:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-chrome-rail-item.is-active::before {\n content: '';\n position: absolute;\n left: 0;\n top: 6px;\n bottom: 6px;\n width: 3px;\n border-radius: 0 3px 3px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-label {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-item.is-drag-over {\n outline: 1px dashed var(--mj-border-focus);\n outline-offset: -1px;\n}\n\n.mj-forms-chrome-rail-handle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 18px;\n margin-left: -4px;\n color: var(--mj-text-muted);\n cursor: grab;\n opacity: 0;\n overflow: hidden;\n flex-shrink: 0;\n transition: opacity var(--mj-transition-base, 0.15s) ease;\n}\n\n.mj-forms-chrome-rail-item:hover .mj-forms-chrome-rail-handle,\n.mj-forms-chrome-rail-item.is-active .mj-forms-chrome-rail-handle {\n opacity: 1;\n}\n\n.mj-forms-chrome-rail-handle.is-spacer {\n opacity: 0;\n pointer-events: none;\n cursor: default;\n}\n\n.mj-forms-chrome-rail-handle:hover {\n color: var(--mj-brand-primary);\n}\n\n.mj-forms-chrome-rail-handle:active {\n cursor: grabbing;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder {\n position: relative;\n margin-top: 14px;\n padding-top: 14px;\n color: var(--mj-text-muted);\n border-radius: 0;\n}\n\n.mj-forms-chrome-rail-item.is-more-folder::before {\n content: '';\n position: absolute;\n top: 0;\n left: 8px;\n right: 8px;\n height: 1px;\n background: linear-gradient(\n 90deg,\n transparent 0%,\n var(--mj-border-strong) 18%,\n var(--mj-border-strong) 82%,\n transparent 100%\n );\n}\n\n.mj-forms-chrome-rail-item.is-more-folder:hover {\n background: transparent;\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-item.is-more-folder.is-expanded {\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-chrome-rail-more-toggle {\n margin-left: auto;\n font-size: 10px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-chrome-rail-more-tree {\n margin-left: 22px;\n padding-left: 6px;\n border-left: 1px solid var(--mj-border-subtle);\n}\n\n.mj-forms-chrome-rail-item.is-more-child {\n padding-left: 8px;\n}\n\n.mj-forms-chrome-rail-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Related-grid row count. Not rendered at 0 \u2014 an empty grid is not a signal, and a\n grey \"0\" beside the red invalid count reads as one more thing to attend to. */\n.mj-forms-chrome-rail-count {\n min-width: 1.25rem;\n padding: 0 6px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: var(--mj-text-xs);\n text-align: center;\n}\n\n/* Screen-reader-only text (the indicators' live region). */\n.mj-forms-visually-hidden {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0 0 0 0);\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n/* ============================================\n RAIL SECTION INDICATORS\n A rail item says WHICH section holds unsaved edits or an invalid field, read\n live from the panels it fronts (FormSectionIndicatorCoordinator). Same idioms\n as the fields themselves: the 6px amber dot an edited field shows after its\n label, and the error colour a failing field paints its underline in.\n ============================================ */\n.mj-forms-chrome-rail-dirty {\n flex: 0 0 auto;\n width: var(--mj-space-1-5);\n height: var(--mj-space-1-5);\n border-radius: var(--mj-radius-full);\n background: var(--mj-status-warning);\n}\n\n.mj-forms-chrome-rail-error,\n.mj-forms-chrome-rail-warning {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-1);\n min-width: var(--mj-space-5);\n padding: var(--mj-space-px) var(--mj-space-1-5);\n border-radius: var(--mj-radius-full);\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n line-height: 1.2;\n text-align: center;\n}\n\n.mj-forms-chrome-rail-error {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n.mj-forms-chrome-rail-warning {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n border: 1px solid var(--mj-status-warning-border);\n}\n\n.mj-forms-chrome-rail-error i,\n.mj-forms-chrome-rail-warning i {\n font-size: var(--mj-space-2-5);\n}\n\n/* The section's icon takes the error colour too, so the item reads as failing\n even before the badge is noticed \u2014 but never the active item's brand tint. */\n.mj-forms-chrome-rail-item.has-errors:not(.is-active) > i {\n color: var(--mj-status-error);\n}\n\n/* Collapsed spine: a column of icon \u2192 badge / dot \u2192 rotated label. */\n.mj-forms-chrome-rail-error.is-spine,\n.mj-forms-chrome-rail-warning.is-spine {\n order: 1;\n padding: 0 var(--mj-space-1);\n min-width: var(--mj-space-5);\n}\n\n.mj-forms-chrome-rail-dirty.is-spine {\n order: 1;\n}\n\n.mj-forms-chrome-rail-spine > .mj-forms-chrome-rail-spine-label {\n order: 2;\n}\n\n@media (max-width: 720px) {\n .mj-forms-layout--left-nav {\n flex-direction: column;\n }\n\n .mj-forms-chrome-rail {\n flex: 1 1 auto;\n width: 100%;\n position: static;\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n .mj-forms-chrome-rail-resizer {\n display: none;\n }\n\n .mj-forms-chrome-rail.is-collapsed {\n flex: 0 0 auto;\n width: 100%;\n min-width: 0;\n max-width: none;\n height: 36px;\n padding: 0;\n }\n\n .mj-forms-chrome-rail-spine {\n flex-direction: row;\n padding: 0 12px;\n }\n\n .mj-forms-chrome-rail-spine-label {\n writing-mode: horizontal-tb;\n transform: none;\n max-height: none;\n }\n\n .mj-forms-chrome-rail-toolbar {\n width: 100%;\n }\n\n .mj-forms-chrome-rail-item {\n width: auto;\n }\n\n /* Phones: the rail is a wrapping row of chips, so the items wrapper must\n wrap too \u2014 a column here stacks one chip per row and grows past the\n rail (no scroll, body pushed out). */\n .mj-forms-chrome-rail-items {\n flex-direction: row;\n flex-wrap: wrap;\n overflow: visible;\n min-height: auto;\n }\n}\n\n/* ============================================\n EMPTY SEARCH STATE\n ============================================ */\n.mj-forms-empty-search-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px 24px;\n text-align: center;\n min-height: 400px;\n}\n\n.mj-forms-empty-search-icon {\n width: 80px;\n height: 80px;\n border-radius: var(--mj-radius-full);\n background: var(--mj-bg-surface-sunken);\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 24px;\n}\n\n.mj-forms-empty-search-icon i {\n font-size: 32px;\n color: var(--mj-text-muted);\n}\n\n.mj-forms-empty-search-title {\n font-size: var(--mj-text-xl);\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n margin: 0 0 12px 0;\n}\n\n.mj-forms-empty-search-message {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n line-height: 1.6;\n max-width: 400px;\n margin: 0;\n}\n\n.mj-forms-empty-search-message strong {\n color: var(--mj-text-primary);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-forms-empty-search-link {\n color: var(--mj-brand-primary);\n text-decoration: none;\n font-weight: var(--mj-font-medium);\n}\n\n.mj-forms-empty-search-link:hover {\n text-decoration: underline;\n}\n\n/* ============================================\n RESPONSIVE\n ============================================ */\n@media (max-width: 768px) {\n .mj-forms-panels-container {\n padding: 16px 12px 32px;\n }\n}\n\n/* ====================================================================\n VARIANT PICKER \u2014 between toolbar and form body\n Compact \"Form: <name> \u25BE\" row that appears when more than one variant\n is applicable for the current entity record.\n ==================================================================== */\n\n.mj-form-variant-picker {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 6px 18px;\n background: var(--mj-bg-surface-card);\n border-bottom: 1px solid var(--mj-border-default);\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-icon {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n.mj-form-variant-picker-label {\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.mj-form-variant-picker-control {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n outline: none;\n user-select: none;\n min-width: 160px;\n}\n.mj-form-variant-picker-control:hover,\n.mj-form-variant-picker-control:focus,\n.mj-form-variant-picker-control.open {\n border-color: var(--mj-border-focus);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n.mj-form-variant-picker-current {\n font-weight: 600;\n flex: 1;\n}\n.mj-form-variant-picker-menu {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 50;\n min-width: 280px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n box-shadow: var(--mj-shadow-md, 0 4px 12px rgba(15, 23, 42, 0.08));\n padding: 4px;\n max-height: 320px;\n overflow: auto;\n}\n.mj-form-variant-picker-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n cursor: pointer;\n}\n.mj-form-variant-picker-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n.mj-form-variant-picker-row.current {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}\n.mj-form-variant-picker-row.inactive {\n opacity: 0.7;\n}\n.mj-form-variant-picker-row-main {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n.mj-form-variant-picker-row-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.mj-form-variant-picker-row-sub {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-form-variant-picker-check {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n/* Retrospective fix #8 \u2014 visually distinguish the Default row from variants. */\n.mj-form-variant-picker-row.mj-form-variant-picker-default {\n border-bottom: 1px dashed var(--mj-border-default);\n margin-bottom: 4px;\n padding-bottom: 10px;\n}\n.mj-form-variant-picker-default-tag {\n color: var(--mj-text-muted);\n font-weight: 400;\n font-size: 11px;\n margin-left: 4px;\n}\n"] }]
1967
2291
  }], null, { recordChangesDrawer: [{
1968
2292
  type: ViewChild,
1969
2293
  args: [RecordChangesComponent]
@@ -2055,7 +2379,7 @@ export class MjRecordFormContainerComponent extends BaseAngularComponent {
2055
2379
  type: ContentChildren,
2056
2380
  args: [MjCollapsiblePanelComponent, { descendants: true }]
2057
2381
  }] }); })();
2058
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjRecordFormContainerComponent, { className: "MjRecordFormContainerComponent", filePath: "src/lib/container/record-form-container.component.ts", lineNumber: 116 }); })();
2382
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjRecordFormContainerComponent, { className: "MjRecordFormContainerComponent", filePath: "src/lib/container/record-form-container.component.ts", lineNumber: 127 }); })();
2059
2383
  function contributionRailKey(meta) {
2060
2384
  if (meta.contributionKey?.trim()) {
2061
2385
  return meta.contributionKey.trim();