@memberjunction/ng-base-forms 5.36.0 → 5.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/lib/base-form-component.d.ts +28 -0
  2. package/dist/lib/base-form-component.d.ts.map +1 -1
  3. package/dist/lib/base-form-component.js +45 -1
  4. package/dist/lib/base-form-component.js.map +1 -1
  5. package/dist/lib/container/record-form-container.component.d.ts +63 -1
  6. package/dist/lib/container/record-form-container.component.d.ts.map +1 -1
  7. package/dist/lib/container/record-form-container.component.js +134 -42
  8. package/dist/lib/container/record-form-container.component.js.map +1 -1
  9. package/dist/lib/interactive-form/interactive-form.component.d.ts +181 -0
  10. package/dist/lib/interactive-form/interactive-form.component.d.ts.map +1 -0
  11. package/dist/lib/interactive-form/interactive-form.component.js +560 -0
  12. package/dist/lib/interactive-form/interactive-form.component.js.map +1 -0
  13. package/dist/lib/panel-slot/base-form-panel.d.ts +97 -0
  14. package/dist/lib/panel-slot/base-form-panel.d.ts.map +1 -0
  15. package/dist/lib/panel-slot/base-form-panel.js +64 -0
  16. package/dist/lib/panel-slot/base-form-panel.js.map +1 -0
  17. package/dist/lib/panel-slot/form-panel-slot.component.d.ts +78 -0
  18. package/dist/lib/panel-slot/form-panel-slot.component.d.ts.map +1 -0
  19. package/dist/lib/panel-slot/form-panel-slot.component.js +227 -0
  20. package/dist/lib/panel-slot/form-panel-slot.component.js.map +1 -0
  21. package/dist/lib/panel-slot/form-slot-coordinator.service.d.ts +57 -0
  22. package/dist/lib/panel-slot/form-slot-coordinator.service.d.ts.map +1 -0
  23. package/dist/lib/panel-slot/form-slot-coordinator.service.js +104 -0
  24. package/dist/lib/panel-slot/form-slot-coordinator.service.js.map +1 -0
  25. package/dist/lib/toolbar/form-toolbar.component.d.ts +56 -1
  26. package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -1
  27. package/dist/lib/toolbar/form-toolbar.component.js +294 -136
  28. package/dist/lib/toolbar/form-toolbar.component.js.map +1 -1
  29. package/dist/lib/types/navigation-events.d.ts +19 -1
  30. package/dist/lib/types/navigation-events.d.ts.map +1 -1
  31. package/dist/lib/types/navigation-events.js.map +1 -1
  32. package/dist/lib/types/toolbar-config.d.ts +11 -0
  33. package/dist/lib/types/toolbar-config.d.ts.map +1 -1
  34. package/dist/lib/types/toolbar-config.js +3 -0
  35. package/dist/lib/types/toolbar-config.js.map +1 -1
  36. package/dist/module.d.ts +10 -7
  37. package/dist/module.d.ts.map +1 -1
  38. package/dist/module.js +21 -7
  39. package/dist/module.js.map +1 -1
  40. package/dist/public-api.d.ts +4 -0
  41. package/dist/public-api.d.ts.map +1 -1
  42. package/dist/public-api.js +7 -0
  43. package/dist/public-api.js.map +1 -1
  44. package/package.json +12 -10
  45. package/dist/__tests__/sanity.test.d.ts +0 -2
  46. package/dist/__tests__/sanity.test.d.ts.map +0 -1
  47. package/dist/__tests__/sanity.test.js +0 -12
  48. package/dist/__tests__/sanity.test.js.map +0 -1
  49. package/dist/__tests__/tag-count-badge.test.d.ts +0 -2
  50. package/dist/__tests__/tag-count-badge.test.d.ts.map +0 -1
  51. package/dist/__tests__/tag-count-badge.test.js +0 -70
  52. package/dist/__tests__/tag-count-badge.test.js.map +0 -1
  53. package/dist/lib/__tests__/base-forms.test.d.ts +0 -2
  54. package/dist/lib/__tests__/base-forms.test.d.ts.map +0 -1
  55. package/dist/lib/__tests__/base-forms.test.js +0 -256
  56. package/dist/lib/__tests__/base-forms.test.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';
2
+ import { UUIDsEqual } from '@memberjunction/global';
2
3
  import { DEFAULT_TOOLBAR_CONFIG } from '../types/toolbar-config';
3
4
  import { DiscoverISADescendants, BuildDescendantTree } from '../isa-related-panel/isa-hierarchy-utils';
4
5
  import { BeforeSaveEventArgs, BeforeDeleteEventArgs, BeforeCancelEventArgs, BeforeHistoryViewEventArgs, BeforeListManagementEventArgs } from '../types/form-events';
@@ -62,21 +63,21 @@ function MjFormToolbarComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
62
63
  } }
63
64
  function MjFormToolbarComponent_Conditional_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
64
65
  const _r3 = i0.ɵɵgetCurrentView();
65
- i0.ɵɵelementStart(0, "button", 26);
66
+ i0.ɵɵelementStart(0, "button", 27);
66
67
  i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnEdit()); });
67
68
  i0.ɵɵelement(1, "i", 13);
68
69
  i0.ɵɵelementEnd();
69
70
  } }
70
71
  function MjFormToolbarComponent_Conditional_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
71
72
  const _r4 = i0.ɵɵgetCurrentView();
72
- i0.ɵɵelementStart(0, "button", 27);
73
+ i0.ɵɵelementStart(0, "button", 28);
73
74
  i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnDeleteClick()); });
74
- i0.ɵɵelement(1, "i", 28);
75
+ i0.ɵɵelement(1, "i", 29);
75
76
  i0.ɵɵelementEnd();
76
77
  } }
77
78
  function MjFormToolbarComponent_Conditional_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
78
79
  const _r5 = i0.ɵɵgetCurrentView();
79
- i0.ɵɵelementStart(0, "button", 29);
80
+ i0.ɵɵelementStart(0, "button", 30);
80
81
  i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnFavoriteToggle()); });
81
82
  i0.ɵɵelement(1, "i");
82
83
  i0.ɵɵelementEnd();
@@ -87,7 +88,7 @@ function MjFormToolbarComponent_Conditional_1_Conditional_4_Template(rf, ctx) {
87
88
  i0.ɵɵclassMap(ctx_r1.IsFavorite ? "fa-solid fa-star mj-icon--favorite" : "fa-regular fa-star");
88
89
  } }
89
90
  function MjFormToolbarComponent_Conditional_1_Conditional_5_Conditional_2_Template(rf, ctx) { if (rf & 1) {
90
- i0.ɵɵelementStart(0, "span", 32);
91
+ i0.ɵɵelementStart(0, "span", 33);
91
92
  i0.ɵɵtext(1);
92
93
  i0.ɵɵelementEnd();
93
94
  } if (rf & 2) {
@@ -97,10 +98,10 @@ function MjFormToolbarComponent_Conditional_1_Conditional_5_Conditional_2_Templa
97
98
  } }
98
99
  function MjFormToolbarComponent_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
99
100
  const _r6 = i0.ɵɵgetCurrentView();
100
- i0.ɵɵelementStart(0, "button", 30);
101
+ i0.ɵɵelementStart(0, "button", 31);
101
102
  i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnHistory()); });
102
- i0.ɵɵelement(1, "i", 31);
103
- i0.ɵɵconditionalCreate(2, MjFormToolbarComponent_Conditional_1_Conditional_5_Conditional_2_Template, 2, 1, "span", 32);
103
+ i0.ɵɵelement(1, "i", 32);
104
+ i0.ɵɵconditionalCreate(2, MjFormToolbarComponent_Conditional_1_Conditional_5_Conditional_2_Template, 2, 1, "span", 33);
104
105
  i0.ɵɵelementEnd();
105
106
  } if (rf & 2) {
106
107
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -109,7 +110,7 @@ function MjFormToolbarComponent_Conditional_1_Conditional_5_Template(rf, ctx) {
109
110
  i0.ɵɵconditional(ctx_r1.VersionCount > 0 ? 2 : -1);
110
111
  } }
111
112
  function MjFormToolbarComponent_Conditional_1_Conditional_6_Conditional_2_Template(rf, ctx) { if (rf & 1) {
112
- i0.ɵɵelementStart(0, "span", 35);
113
+ i0.ɵɵelementStart(0, "span", 36);
113
114
  i0.ɵɵtext(1);
114
115
  i0.ɵɵelementEnd();
115
116
  } if (rf & 2) {
@@ -119,10 +120,10 @@ function MjFormToolbarComponent_Conditional_1_Conditional_6_Conditional_2_Templa
119
120
  } }
120
121
  function MjFormToolbarComponent_Conditional_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
121
122
  const _r7 = i0.ɵɵgetCurrentView();
122
- i0.ɵɵelementStart(0, "button", 33);
123
+ i0.ɵɵelementStart(0, "button", 34);
123
124
  i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnListManagement()); });
124
- i0.ɵɵelement(1, "i", 34);
125
- i0.ɵɵconditionalCreate(2, MjFormToolbarComponent_Conditional_1_Conditional_6_Conditional_2_Template, 2, 1, "span", 35);
125
+ i0.ɵɵelement(1, "i", 35);
126
+ i0.ɵɵconditionalCreate(2, MjFormToolbarComponent_Conditional_1_Conditional_6_Conditional_2_Template, 2, 1, "span", 36);
126
127
  i0.ɵɵelementEnd();
127
128
  } if (rf & 2) {
128
129
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -131,7 +132,7 @@ function MjFormToolbarComponent_Conditional_1_Conditional_6_Template(rf, ctx) {
131
132
  i0.ɵɵconditional(ctx_r1.ListCount > 0 ? 2 : -1);
132
133
  } }
133
134
  function MjFormToolbarComponent_Conditional_1_Conditional_7_Conditional_2_Template(rf, ctx) { if (rf & 1) {
134
- i0.ɵɵelementStart(0, "span", 35);
135
+ i0.ɵɵelementStart(0, "span", 36);
135
136
  i0.ɵɵtext(1);
136
137
  i0.ɵɵelementEnd();
137
138
  } if (rf & 2) {
@@ -141,10 +142,10 @@ function MjFormToolbarComponent_Conditional_1_Conditional_7_Conditional_2_Templa
141
142
  } }
142
143
  function MjFormToolbarComponent_Conditional_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
143
144
  const _r8 = i0.ɵɵgetCurrentView();
144
- i0.ɵɵelementStart(0, "button", 29);
145
+ i0.ɵɵelementStart(0, "button", 30);
145
146
  i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnTagsPanel()); });
146
- i0.ɵɵelement(1, "i", 36);
147
- i0.ɵɵconditionalCreate(2, MjFormToolbarComponent_Conditional_1_Conditional_7_Conditional_2_Template, 2, 1, "span", 35);
147
+ i0.ɵɵelement(1, "i", 37);
148
+ i0.ɵɵconditionalCreate(2, MjFormToolbarComponent_Conditional_1_Conditional_7_Conditional_2_Template, 2, 1, "span", 36);
148
149
  i0.ɵɵelementEnd();
149
150
  } if (rf & 2) {
150
151
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -154,7 +155,7 @@ function MjFormToolbarComponent_Conditional_1_Conditional_7_Template(rf, ctx) {
154
155
  } }
155
156
  function MjFormToolbarComponent_Conditional_1_For_9_Conditional_0_Template(rf, ctx) { if (rf & 1) {
156
157
  const _r9 = i0.ɵɵgetCurrentView();
157
- i0.ɵɵelementStart(0, "button", 38);
158
+ i0.ɵɵelementStart(0, "button", 39);
158
159
  i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_For_9_Conditional_0_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const button_r10 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnCustomButtonClick(button_r10)); });
159
160
  i0.ɵɵelement(1, "i");
160
161
  i0.ɵɵelementEnd();
@@ -166,7 +167,7 @@ function MjFormToolbarComponent_Conditional_1_For_9_Conditional_0_Template(rf, c
166
167
  i0.ɵɵclassMap(button_r10.Icon);
167
168
  } }
168
169
  function MjFormToolbarComponent_Conditional_1_For_9_Template(rf, ctx) { if (rf & 1) {
169
- i0.ɵɵconditionalCreate(0, MjFormToolbarComponent_Conditional_1_For_9_Conditional_0_Template, 2, 6, "button", 37);
170
+ i0.ɵɵconditionalCreate(0, MjFormToolbarComponent_Conditional_1_For_9_Conditional_0_Template, 2, 6, "button", 38);
170
171
  } if (rf & 2) {
171
172
  const button_r10 = ctx.$implicit;
172
173
  i0.ɵɵconditional(button_r10.Visible !== false ? 0 : -1);
@@ -176,13 +177,13 @@ function MjFormToolbarComponent_Conditional_1_Conditional_10_Template(rf, ctx) {
176
177
  } }
177
178
  function MjFormToolbarComponent_Conditional_1_Conditional_11_For_2_Template(rf, ctx) { if (rf & 1) {
178
179
  const _r11 = i0.ɵɵgetCurrentView();
179
- i0.ɵɵelementStart(0, "a", 41);
180
+ i0.ɵɵelementStart(0, "a", 42);
180
181
  i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_11_For_2_Template_a_click_0_listener($event) { const parent_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnParentBadgeClick(parent_r12, $event)); });
181
- i0.ɵɵelement(1, "i", 42);
182
+ i0.ɵɵelement(1, "i", 43);
182
183
  i0.ɵɵtext(2);
183
184
  i0.ɵɵelementEnd();
184
- i0.ɵɵelementStart(3, "span", 43);
185
- i0.ɵɵelement(4, "i", 44);
185
+ i0.ɵɵelementStart(3, "span", 44);
186
+ i0.ɵɵelement(4, "i", 45);
186
187
  i0.ɵɵelementEnd();
187
188
  } if (rf & 2) {
188
189
  const parent_r12 = ctx.$implicit;
@@ -191,7 +192,7 @@ function MjFormToolbarComponent_Conditional_1_Conditional_11_For_2_Template(rf,
191
192
  i0.ɵɵtextInterpolate1(" ", parent_r12.Name, " ");
192
193
  } }
193
194
  function MjFormToolbarComponent_Conditional_1_Conditional_11_Conditional_5_Template(rf, ctx) { if (rf & 1) {
194
- i0.ɵɵelementContainer(0, 40);
195
+ i0.ɵɵelementContainer(0, 41);
195
196
  } if (rf & 2) {
196
197
  const ctx_r1 = i0.ɵɵnextContext(3);
197
198
  const descendantTreeTpl_r13 = i0.ɵɵreference(5);
@@ -200,10 +201,10 @@ function MjFormToolbarComponent_Conditional_1_Conditional_11_Conditional_5_Templ
200
201
  function MjFormToolbarComponent_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
201
202
  i0.ɵɵelementStart(0, "div", 23);
202
203
  i0.ɵɵrepeaterCreate(1, MjFormToolbarComponent_Conditional_1_Conditional_11_For_2_Template, 5, 2, null, null, _forTrack1);
203
- i0.ɵɵelementStart(3, "span", 39);
204
+ i0.ɵɵelementStart(3, "span", 40);
204
205
  i0.ɵɵtext(4);
205
206
  i0.ɵɵelementEnd();
206
- i0.ɵɵconditionalCreate(5, MjFormToolbarComponent_Conditional_1_Conditional_11_Conditional_5_Template, 1, 4, "ng-container", 40);
207
+ i0.ɵɵconditionalCreate(5, MjFormToolbarComponent_Conditional_1_Conditional_11_Conditional_5_Template, 1, 4, "ng-container", 41);
207
208
  i0.ɵɵelementEnd();
208
209
  } if (rf & 2) {
209
210
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -214,19 +215,97 @@ function MjFormToolbarComponent_Conditional_1_Conditional_11_Template(rf, ctx) {
214
215
  i0.ɵɵadvance();
215
216
  i0.ɵɵconditional(ctx_r1.DescendantTree.length > 0 ? 5 : -1);
216
217
  } }
217
- function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
218
+ function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_6_Conditional_9_Template(rf, ctx) { if (rf & 1) {
219
+ i0.ɵɵelement(0, "i", 58);
220
+ } }
221
+ function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_6_For_11_Conditional_6_Template(rf, ctx) { if (rf & 1) {
222
+ i0.ɵɵelement(0, "i", 58);
223
+ } }
224
+ function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_6_For_11_Template(rf, ctx) { if (rf & 1) {
225
+ const _r16 = i0.ɵɵgetCurrentView();
226
+ i0.ɵɵelementStart(0, "div", 60);
227
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_6_For_11_Template_div_click_0_listener() { const v_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnVariantClick(v_r17.ID)); });
228
+ i0.ɵɵelementStart(1, "div", 54)(2, "span", 55);
229
+ i0.ɵɵtext(3);
230
+ i0.ɵɵelementEnd();
231
+ i0.ɵɵelementStart(4, "span", 57);
232
+ i0.ɵɵtext(5);
233
+ i0.ɵɵelementEnd()();
234
+ i0.ɵɵconditionalCreate(6, MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_6_For_11_Conditional_6_Template, 1, 0, "i", 58);
235
+ i0.ɵɵelementEnd();
236
+ } if (rf & 2) {
237
+ const v_r17 = ctx.$implicit;
238
+ const ctx_r1 = i0.ɵɵnextContext(4);
239
+ i0.ɵɵclassProp("current", v_r17.ID === ctx_r1.CurrentVariantID)("inactive", v_r17.Status !== "Active");
240
+ i0.ɵɵadvance(3);
241
+ i0.ɵɵtextInterpolate(v_r17.Label);
242
+ i0.ɵɵadvance(2);
243
+ i0.ɵɵtextInterpolate(ctx_r1.VariantSubtitle(v_r17));
244
+ i0.ɵɵadvance();
245
+ i0.ɵɵconditional(v_r17.ID === ctx_r1.CurrentVariantID ? 6 : -1);
246
+ } }
247
+ function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_6_Template(rf, ctx) { if (rf & 1) {
218
248
  const _r15 = i0.ɵɵgetCurrentView();
219
- i0.ɵɵelementStart(0, "button", 51);
220
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_1_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnClearFilter()); });
221
- i0.ɵɵelement(1, "i", 52);
249
+ i0.ɵɵelementStart(0, "div", 52);
250
+ i0.ɵɵlistener("mousedown", function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_6_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r15); return i0.ɵɵresetView($event.preventDefault()); })("click", function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_6_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r15); return i0.ɵɵresetView($event.stopPropagation()); });
251
+ i0.ɵɵelementStart(1, "div", 53);
252
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_6_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnVariantClick(null)); });
253
+ i0.ɵɵelementStart(2, "div", 54)(3, "span", 55);
254
+ i0.ɵɵtext(4, " Default form ");
255
+ i0.ɵɵelementStart(5, "span", 56);
256
+ i0.ɵɵtext(6, "(default)");
257
+ i0.ɵɵelementEnd()();
258
+ i0.ɵɵelementStart(7, "span", 57);
259
+ i0.ɵɵtext(8, "CodeGen-generated Angular fallback");
260
+ i0.ɵɵelementEnd()();
261
+ i0.ɵɵconditionalCreate(9, MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_6_Conditional_9_Template, 1, 0, "i", 58);
262
+ i0.ɵɵelementEnd();
263
+ i0.ɵɵrepeaterCreate(10, MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_6_For_11_Template, 7, 7, "div", 59, _forTrack1);
222
264
  i0.ɵɵelementEnd();
265
+ } if (rf & 2) {
266
+ const ctx_r1 = i0.ɵɵnextContext(3);
267
+ i0.ɵɵadvance();
268
+ i0.ɵɵclassProp("current", !ctx_r1.CurrentVariantID);
269
+ i0.ɵɵadvance(8);
270
+ i0.ɵɵconditional(!ctx_r1.CurrentVariantID ? 9 : -1);
271
+ i0.ɵɵadvance();
272
+ i0.ɵɵrepeater(ctx_r1.Variants);
223
273
  } }
224
- function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_1_Template(rf, ctx) { if (rf & 1) {
274
+ function MjFormToolbarComponent_Conditional_1_Conditional_13_Template(rf, ctx) { if (rf & 1) {
225
275
  const _r14 = i0.ɵɵgetCurrentView();
226
- i0.ɵɵelementStart(0, "div", 45)(1, "input", 49);
227
- i0.ɵɵlistener("input", function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_1_Template_input_input_1_listener($event) { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnFilterInput($event)); });
276
+ i0.ɵɵelementStart(0, "div", 46)(1, "button", 47);
277
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_13_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleVariantMenu()); })("blur", function MjFormToolbarComponent_Conditional_1_Conditional_13_Template_button_blur_1_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.CloseVariantMenu()); });
278
+ i0.ɵɵelement(2, "i", 48);
279
+ i0.ɵɵelementStart(3, "span", 49);
280
+ i0.ɵɵtext(4);
281
+ i0.ɵɵelementEnd();
282
+ i0.ɵɵelement(5, "i", 50);
283
+ i0.ɵɵelementEnd();
284
+ i0.ɵɵconditionalCreate(6, MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_6_Template, 12, 3, "div", 51);
285
+ i0.ɵɵelementEnd();
286
+ } if (rf & 2) {
287
+ const ctx_r1 = i0.ɵɵnextContext(2);
288
+ i0.ɵɵclassProp("open", ctx_r1.VariantMenuOpen);
289
+ i0.ɵɵadvance();
290
+ i0.ɵɵproperty("title", "Form variant: " + ctx_r1.CurrentVariantLabel + " \u2014 click to change");
291
+ i0.ɵɵadvance(3);
292
+ i0.ɵɵtextInterpolate(ctx_r1.CurrentVariantLabel);
293
+ i0.ɵɵadvance(2);
294
+ i0.ɵɵconditional(ctx_r1.VariantMenuOpen ? 6 : -1);
295
+ } }
296
+ function MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
297
+ const _r19 = i0.ɵɵgetCurrentView();
298
+ i0.ɵɵelementStart(0, "button", 67);
299
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_1_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnClearFilter()); });
300
+ i0.ɵɵelement(1, "i", 68);
228
301
  i0.ɵɵelementEnd();
229
- i0.ɵɵconditionalCreate(2, MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_1_Conditional_2_Template, 2, 0, "button", 50);
302
+ } }
303
+ function MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
304
+ const _r18 = i0.ɵɵgetCurrentView();
305
+ i0.ɵɵelementStart(0, "div", 61)(1, "input", 65);
306
+ i0.ɵɵlistener("input", function MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_1_Template_input_input_1_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnFilterInput($event)); });
307
+ i0.ɵɵelementEnd();
308
+ i0.ɵɵconditionalCreate(2, MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_1_Conditional_2_Template, 2, 0, "button", 66);
230
309
  i0.ɵɵelementEnd();
231
310
  } if (rf & 2) {
232
311
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -236,15 +315,15 @@ function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_1_Templ
236
315
  i0.ɵɵadvance();
237
316
  i0.ɵɵconditional(ctx_r1.SearchFilter ? 2 : -1);
238
317
  } }
239
- function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_2_Template(rf, ctx) { if (rf & 1) {
240
- const _r16 = i0.ɵɵgetCurrentView();
241
- i0.ɵɵelementStart(0, "button", 53);
242
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnExpandAll()); });
243
- i0.ɵɵelement(1, "i", 54);
318
+ function MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_2_Template(rf, ctx) { if (rf & 1) {
319
+ const _r20 = i0.ɵɵgetCurrentView();
320
+ i0.ɵɵelementStart(0, "button", 69);
321
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnExpandAll()); });
322
+ i0.ɵɵelement(1, "i", 70);
244
323
  i0.ɵɵelementEnd();
245
- i0.ɵɵelementStart(2, "button", 55);
246
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_2_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnCollapseAll()); });
247
- i0.ɵɵelement(3, "i", 56);
324
+ i0.ɵɵelementStart(2, "button", 71);
325
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_2_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnCollapseAll()); });
326
+ i0.ɵɵelement(3, "i", 72);
248
327
  i0.ɵɵelementEnd();
249
328
  } if (rf & 2) {
250
329
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -252,24 +331,24 @@ function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_2_Templ
252
331
  i0.ɵɵadvance(2);
253
332
  i0.ɵɵproperty("disabled", ctx_r1.ExpandedSectionCount === 0);
254
333
  } }
255
- function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
256
- const _r17 = i0.ɵɵgetCurrentView();
257
- i0.ɵɵelementStart(0, "button", 57);
258
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnResetSectionOrder()); });
259
- i0.ɵɵelement(1, "i", 58);
334
+ function MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_3_Template(rf, ctx) { if (rf & 1) {
335
+ const _r21 = i0.ɵɵgetCurrentView();
336
+ i0.ɵɵelementStart(0, "button", 73);
337
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnResetSectionOrder()); });
338
+ i0.ɵɵelement(1, "i", 74);
260
339
  i0.ɵɵelementEnd();
261
340
  } }
262
- function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_4_Template(rf, ctx) { if (rf & 1) {
263
- const _r18 = i0.ɵɵgetCurrentView();
264
- i0.ɵɵelementStart(0, "button", 59);
265
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnManageSections()); });
266
- i0.ɵɵelement(1, "i", 60);
341
+ function MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_4_Template(rf, ctx) { if (rf & 1) {
342
+ const _r22 = i0.ɵɵgetCurrentView();
343
+ i0.ɵɵelementStart(0, "button", 75);
344
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r22); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnManageSections()); });
345
+ i0.ɵɵelement(1, "i", 76);
267
346
  i0.ɵɵelementEnd();
268
347
  } }
269
- function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_5_Template(rf, ctx) { if (rf & 1) {
270
- const _r19 = i0.ɵɵgetCurrentView();
271
- i0.ɵɵelementStart(0, "button", 61);
272
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnToggleWidthMode()); });
348
+ function MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_5_Template(rf, ctx) { if (rf & 1) {
349
+ const _r23 = i0.ɵɵgetCurrentView();
350
+ i0.ɵɵelementStart(0, "button", 77);
351
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnToggleWidthMode()); });
273
352
  i0.ɵɵelement(1, "i");
274
353
  i0.ɵɵelementEnd();
275
354
  } if (rf & 2) {
@@ -278,13 +357,13 @@ function MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_5_Templ
278
357
  i0.ɵɵadvance();
279
358
  i0.ɵɵclassMap(ctx_r1.WidthMode === "centered" ? "fa-solid fa-arrows-left-right-to-line" : "fa-solid fa-compress");
280
359
  } }
281
- function MjFormToolbarComponent_Conditional_1_Conditional_13_Template(rf, ctx) { if (rf & 1) {
282
- i0.ɵɵelementStart(0, "div", 24);
283
- i0.ɵɵconditionalCreate(1, MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_1_Template, 3, 4, "div", 45);
284
- i0.ɵɵconditionalCreate(2, MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_2_Template, 4, 2);
285
- i0.ɵɵconditionalCreate(3, MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_3_Template, 2, 0, "button", 46);
286
- i0.ɵɵconditionalCreate(4, MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_4_Template, 2, 0, "button", 47);
287
- i0.ɵɵconditionalCreate(5, MjFormToolbarComponent_Conditional_1_Conditional_13_Conditional_5_Template, 2, 3, "button", 48);
360
+ function MjFormToolbarComponent_Conditional_1_Conditional_14_Template(rf, ctx) { if (rf & 1) {
361
+ i0.ɵɵelementStart(0, "div", 25);
362
+ i0.ɵɵconditionalCreate(1, MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_1_Template, 3, 4, "div", 61);
363
+ i0.ɵɵconditionalCreate(2, MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_2_Template, 4, 2);
364
+ i0.ɵɵconditionalCreate(3, MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_3_Template, 2, 0, "button", 62);
365
+ i0.ɵɵconditionalCreate(4, MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_4_Template, 2, 0, "button", 63);
366
+ i0.ɵɵconditionalCreate(5, MjFormToolbarComponent_Conditional_1_Conditional_14_Conditional_5_Template, 2, 3, "button", 64);
288
367
  i0.ɵɵelementEnd();
289
368
  } if (rf & 2) {
290
369
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -299,8 +378,8 @@ function MjFormToolbarComponent_Conditional_1_Conditional_13_Template(rf, ctx) {
299
378
  i0.ɵɵadvance();
300
379
  i0.ɵɵconditional(ctx_r1.Config.ShowWidthToggle ? 5 : -1);
301
380
  } }
302
- function MjFormToolbarComponent_Conditional_1_Conditional_14_Template(rf, ctx) { if (rf & 1) {
303
- i0.ɵɵelementContainer(0, 25);
381
+ function MjFormToolbarComponent_Conditional_1_Conditional_15_Template(rf, ctx) { if (rf & 1) {
382
+ i0.ɵɵelementContainer(0, 26);
304
383
  } if (rf & 2) {
305
384
  const ctx_r1 = i0.ɵɵnextContext(2);
306
385
  i0.ɵɵproperty("ngTemplateOutlet", ctx_r1.AdditionalActionsTemplate);
@@ -318,9 +397,10 @@ function MjFormToolbarComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
318
397
  i0.ɵɵconditionalCreate(10, MjFormToolbarComponent_Conditional_1_Conditional_10_Template, 1, 0, "div", 22);
319
398
  i0.ɵɵconditionalCreate(11, MjFormToolbarComponent_Conditional_1_Conditional_11_Template, 6, 2, "div", 23);
320
399
  i0.ɵɵelement(12, "div", 4);
321
- i0.ɵɵconditionalCreate(13, MjFormToolbarComponent_Conditional_1_Conditional_13_Template, 6, 5, "div", 24);
322
- i0.ɵɵconditionalCreate(14, MjFormToolbarComponent_Conditional_1_Conditional_14_Template, 1, 1, "ng-container", 25);
323
- i0.ɵɵprojection(15);
400
+ i0.ɵɵconditionalCreate(13, MjFormToolbarComponent_Conditional_1_Conditional_13_Template, 7, 5, "div", 24);
401
+ i0.ɵɵconditionalCreate(14, MjFormToolbarComponent_Conditional_1_Conditional_14_Template, 6, 5, "div", 25);
402
+ i0.ɵɵconditionalCreate(15, MjFormToolbarComponent_Conditional_1_Conditional_15_Template, 1, 1, "ng-container", 26);
403
+ i0.ɵɵprojection(16);
324
404
  i0.ɵɵelementEnd();
325
405
  } if (rf & 2) {
326
406
  const ctx_r1 = i0.ɵɵnextContext();
@@ -344,37 +424,39 @@ function MjFormToolbarComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
344
424
  i0.ɵɵadvance();
345
425
  i0.ɵɵconditional(ctx_r1.Config.ShowEntityHierarchy && ctx_r1.IsInHierarchy ? 11 : -1);
346
426
  i0.ɵɵadvance(2);
347
- i0.ɵɵconditional(ctx_r1.Config.ShowSectionControls ? 13 : -1);
427
+ i0.ɵɵconditional(ctx_r1.ShowVariantPickerButton ? 13 : -1);
348
428
  i0.ɵɵadvance();
349
- i0.ɵɵconditional(ctx_r1.AdditionalActionsTemplate ? 14 : -1);
429
+ i0.ɵɵconditional(ctx_r1.Config.ShowSectionControls ? 14 : -1);
430
+ i0.ɵɵadvance();
431
+ i0.ɵɵconditional(ctx_r1.AdditionalActionsTemplate ? 15 : -1);
350
432
  } }
351
433
  function MjFormToolbarComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
352
- const _r20 = i0.ɵɵgetCurrentView();
353
- i0.ɵɵelementStart(0, "div", 62);
354
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_2_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDiscardCancel()); });
355
- i0.ɵɵelementStart(1, "div", 63);
356
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_2_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r20); return i0.ɵɵresetView($event.stopPropagation()); });
357
- i0.ɵɵelementStart(2, "div", 64)(3, "h3");
434
+ const _r24 = i0.ɵɵgetCurrentView();
435
+ i0.ɵɵelementStart(0, "div", 78);
436
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_2_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDiscardCancel()); });
437
+ i0.ɵɵelementStart(1, "div", 79);
438
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_2_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r24); return i0.ɵɵresetView($event.stopPropagation()); });
439
+ i0.ɵɵelementStart(2, "div", 80)(3, "h3");
358
440
  i0.ɵɵtext(4, "Discard Changes?");
359
441
  i0.ɵɵelementEnd();
360
- i0.ɵɵelementStart(5, "button", 65);
361
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_2_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDiscardCancel()); });
362
- i0.ɵɵelement(6, "i", 52);
442
+ i0.ɵɵelementStart(5, "button", 81);
443
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_2_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDiscardCancel()); });
444
+ i0.ɵɵelement(6, "i", 68);
363
445
  i0.ɵɵelementEnd()();
364
- i0.ɵɵelementStart(7, "div", 66)(8, "p");
446
+ i0.ɵɵelementStart(7, "div", 82)(8, "p");
365
447
  i0.ɵɵtext(9, "You have ");
366
448
  i0.ɵɵelementStart(10, "strong");
367
449
  i0.ɵɵtext(11);
368
450
  i0.ɵɵelementEnd();
369
451
  i0.ɵɵtext(12);
370
452
  i0.ɵɵelementEnd()();
371
- i0.ɵɵelementStart(13, "div", 67)(14, "button", 68);
372
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_2_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDiscardConfirm()); });
453
+ i0.ɵɵelementStart(13, "div", 83)(14, "button", 84);
454
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_2_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDiscardConfirm()); });
373
455
  i0.ɵɵelement(15, "i", 10);
374
456
  i0.ɵɵtext(16, " Discard Changes ");
375
457
  i0.ɵɵelementEnd();
376
- i0.ɵɵelementStart(17, "button", 69);
377
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_2_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDiscardCancel()); });
458
+ i0.ɵɵelementStart(17, "button", 85);
459
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_2_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r24); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDiscardCancel()); });
378
460
  i0.ɵɵtext(18, " Keep Editing ");
379
461
  i0.ɵɵelementEnd()()()();
380
462
  } if (rf & 2) {
@@ -385,99 +467,99 @@ function MjFormToolbarComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
385
467
  i0.ɵɵtextInterpolate2(" unsaved change", ctx_r1.DirtyFieldDisplayNames.length === 1 ? "" : "s", ". Are you sure you want to discard ", ctx_r1.DirtyFieldDisplayNames.length === 1 ? "it" : "them", "?");
386
468
  } }
387
469
  function MjFormToolbarComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
388
- const _r21 = i0.ɵɵgetCurrentView();
389
- i0.ɵɵelementStart(0, "div", 62);
390
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_3_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDeleteCancel()); });
391
- i0.ɵɵelementStart(1, "div", 63);
392
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_3_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r21); return i0.ɵɵresetView($event.stopPropagation()); });
393
- i0.ɵɵelementStart(2, "div", 64)(3, "h3");
470
+ const _r25 = i0.ɵɵgetCurrentView();
471
+ i0.ɵɵelementStart(0, "div", 78);
472
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_3_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDeleteCancel()); });
473
+ i0.ɵɵelementStart(1, "div", 79);
474
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_3_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r25); return i0.ɵɵresetView($event.stopPropagation()); });
475
+ i0.ɵɵelementStart(2, "div", 80)(3, "h3");
394
476
  i0.ɵɵtext(4, "Confirm Deletion");
395
477
  i0.ɵɵelementEnd();
396
- i0.ɵɵelementStart(5, "button", 65);
397
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_3_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDeleteCancel()); });
398
- i0.ɵɵelement(6, "i", 52);
478
+ i0.ɵɵelementStart(5, "button", 81);
479
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_3_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDeleteCancel()); });
480
+ i0.ɵɵelement(6, "i", 68);
399
481
  i0.ɵɵelementEnd()();
400
- i0.ɵɵelementStart(7, "div", 66)(8, "p");
482
+ i0.ɵɵelementStart(7, "div", 82)(8, "p");
401
483
  i0.ɵɵtext(9, "Are you sure you want to delete this record? This action cannot be undone.");
402
484
  i0.ɵɵelementEnd()();
403
- i0.ɵɵelementStart(10, "div", 67)(11, "button", 68);
404
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_3_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDeleteConfirm()); });
405
- i0.ɵɵelement(12, "i", 70);
485
+ i0.ɵɵelementStart(10, "div", 83)(11, "button", 84);
486
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_3_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDeleteConfirm()); });
487
+ i0.ɵɵelement(12, "i", 86);
406
488
  i0.ɵɵtext(13, " Delete ");
407
489
  i0.ɵɵelementEnd();
408
- i0.ɵɵelementStart(14, "button", 69);
409
- i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_3_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDeleteCancel()); });
490
+ i0.ɵɵelementStart(14, "button", 85);
491
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_Conditional_3_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r25); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDeleteCancel()); });
410
492
  i0.ɵɵtext(15, " Cancel ");
411
493
  i0.ɵɵelementEnd()()()();
412
494
  } }
413
495
  function MjFormToolbarComponent_ng_template_4_Conditional_0_Conditional_5_Template(rf, ctx) { if (rf & 1) {
414
- i0.ɵɵelementContainer(0, 40);
496
+ i0.ɵɵelementContainer(0, 41);
415
497
  } if (rf & 2) {
416
- const items_r23 = i0.ɵɵnextContext(2).items;
498
+ const items_r27 = i0.ɵɵnextContext(2).items;
417
499
  i0.ɵɵnextContext();
418
500
  const descendantTreeTpl_r13 = i0.ɵɵreference(5);
419
- i0.ɵɵproperty("ngTemplateOutlet", descendantTreeTpl_r13)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c2, items_r23[0].Children));
501
+ i0.ɵɵproperty("ngTemplateOutlet", descendantTreeTpl_r13)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c2, items_r27[0].Children));
420
502
  } }
421
503
  function MjFormToolbarComponent_ng_template_4_Conditional_0_Template(rf, ctx) { if (rf & 1) {
422
- const _r22 = i0.ɵɵgetCurrentView();
423
- i0.ɵɵelementStart(0, "span", 43);
424
- i0.ɵɵelement(1, "i", 44);
504
+ const _r26 = i0.ɵɵgetCurrentView();
505
+ i0.ɵɵelementStart(0, "span", 44);
506
+ i0.ɵɵelement(1, "i", 45);
425
507
  i0.ɵɵelementEnd();
426
- i0.ɵɵelementStart(2, "a", 72);
427
- i0.ɵɵlistener("click", function MjFormToolbarComponent_ng_template_4_Conditional_0_Template_a_click_2_listener($event) { i0.ɵɵrestoreView(_r22); const items_r23 = i0.ɵɵnextContext().items; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDescendantBadgeClick(items_r23[0].EntityName, $event)); });
428
- i0.ɵɵelement(3, "i", 73);
508
+ i0.ɵɵelementStart(2, "a", 88);
509
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_ng_template_4_Conditional_0_Template_a_click_2_listener($event) { i0.ɵɵrestoreView(_r26); const items_r27 = i0.ɵɵnextContext().items; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDescendantBadgeClick(items_r27[0].EntityName, $event)); });
510
+ i0.ɵɵelement(3, "i", 89);
429
511
  i0.ɵɵtext(4);
430
512
  i0.ɵɵelementEnd();
431
- i0.ɵɵconditionalCreate(5, MjFormToolbarComponent_ng_template_4_Conditional_0_Conditional_5_Template, 1, 4, "ng-container", 40);
513
+ i0.ɵɵconditionalCreate(5, MjFormToolbarComponent_ng_template_4_Conditional_0_Conditional_5_Template, 1, 4, "ng-container", 41);
432
514
  } if (rf & 2) {
433
- const items_r23 = i0.ɵɵnextContext().items;
515
+ const items_r27 = i0.ɵɵnextContext().items;
434
516
  i0.ɵɵadvance(2);
435
- i0.ɵɵproperty("title", "Navigate to: " + items_r23[0].EntityName);
517
+ i0.ɵɵproperty("title", "Navigate to: " + items_r27[0].EntityName);
436
518
  i0.ɵɵadvance(2);
437
- i0.ɵɵtextInterpolate1(" ", items_r23[0].EntityName, " ");
519
+ i0.ɵɵtextInterpolate1(" ", items_r27[0].EntityName, " ");
438
520
  i0.ɵɵadvance();
439
- i0.ɵɵconditional(items_r23[0].Children.length > 0 ? 5 : -1);
521
+ i0.ɵɵconditional(items_r27[0].Children.length > 0 ? 5 : -1);
440
522
  } }
441
523
  function MjFormToolbarComponent_ng_template_4_Conditional_1_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
442
- i0.ɵɵelementContainer(0, 40);
524
+ i0.ɵɵelementContainer(0, 41);
443
525
  } if (rf & 2) {
444
- const item_r25 = i0.ɵɵnextContext().$implicit;
526
+ const item_r29 = i0.ɵɵnextContext().$implicit;
445
527
  i0.ɵɵnextContext(3);
446
528
  const descendantTreeTpl_r13 = i0.ɵɵreference(5);
447
- i0.ɵɵproperty("ngTemplateOutlet", descendantTreeTpl_r13)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c2, item_r25.Children));
529
+ i0.ɵɵproperty("ngTemplateOutlet", descendantTreeTpl_r13)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c2, item_r29.Children));
448
530
  } }
449
531
  function MjFormToolbarComponent_ng_template_4_Conditional_1_For_2_Template(rf, ctx) { if (rf & 1) {
450
- const _r24 = i0.ɵɵgetCurrentView();
451
- i0.ɵɵelementStart(0, "div", 74)(1, "a", 72);
452
- i0.ɵɵlistener("click", function MjFormToolbarComponent_ng_template_4_Conditional_1_For_2_Template_a_click_1_listener($event) { const item_r25 = i0.ɵɵrestoreView(_r24).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnDescendantBadgeClick(item_r25.EntityName, $event)); });
453
- i0.ɵɵelement(2, "i", 73);
532
+ const _r28 = i0.ɵɵgetCurrentView();
533
+ i0.ɵɵelementStart(0, "div", 90)(1, "a", 88);
534
+ i0.ɵɵlistener("click", function MjFormToolbarComponent_ng_template_4_Conditional_1_For_2_Template_a_click_1_listener($event) { const item_r29 = i0.ɵɵrestoreView(_r28).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnDescendantBadgeClick(item_r29.EntityName, $event)); });
535
+ i0.ɵɵelement(2, "i", 89);
454
536
  i0.ɵɵtext(3);
455
537
  i0.ɵɵelementEnd();
456
- i0.ɵɵconditionalCreate(4, MjFormToolbarComponent_ng_template_4_Conditional_1_For_2_Conditional_4_Template, 1, 4, "ng-container", 40);
538
+ i0.ɵɵconditionalCreate(4, MjFormToolbarComponent_ng_template_4_Conditional_1_For_2_Conditional_4_Template, 1, 4, "ng-container", 41);
457
539
  i0.ɵɵelementEnd();
458
540
  } if (rf & 2) {
459
- const item_r25 = ctx.$implicit;
541
+ const item_r29 = ctx.$implicit;
460
542
  i0.ɵɵadvance();
461
- i0.ɵɵproperty("title", "Navigate to: " + item_r25.EntityName);
543
+ i0.ɵɵproperty("title", "Navigate to: " + item_r29.EntityName);
462
544
  i0.ɵɵadvance(2);
463
- i0.ɵɵtextInterpolate1(" ", item_r25.EntityName, " ");
545
+ i0.ɵɵtextInterpolate1(" ", item_r29.EntityName, " ");
464
546
  i0.ɵɵadvance();
465
- i0.ɵɵconditional(item_r25.Children.length > 0 ? 4 : -1);
547
+ i0.ɵɵconditional(item_r29.Children.length > 0 ? 4 : -1);
466
548
  } }
467
549
  function MjFormToolbarComponent_ng_template_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
468
- i0.ɵɵelementStart(0, "div", 71);
469
- i0.ɵɵrepeaterCreate(1, MjFormToolbarComponent_ng_template_4_Conditional_1_For_2_Template, 5, 3, "div", 74, _forTrack2);
550
+ i0.ɵɵelementStart(0, "div", 87);
551
+ i0.ɵɵrepeaterCreate(1, MjFormToolbarComponent_ng_template_4_Conditional_1_For_2_Template, 5, 3, "div", 90, _forTrack2);
470
552
  i0.ɵɵelementEnd();
471
553
  } if (rf & 2) {
472
- const items_r23 = i0.ɵɵnextContext().items;
554
+ const items_r27 = i0.ɵɵnextContext().items;
473
555
  i0.ɵɵadvance();
474
- i0.ɵɵrepeater(items_r23);
556
+ i0.ɵɵrepeater(items_r27);
475
557
  } }
476
558
  function MjFormToolbarComponent_ng_template_4_Template(rf, ctx) { if (rf & 1) {
477
- i0.ɵɵconditionalCreate(0, MjFormToolbarComponent_ng_template_4_Conditional_0_Template, 6, 3)(1, MjFormToolbarComponent_ng_template_4_Conditional_1_Template, 3, 0, "div", 71);
559
+ i0.ɵɵconditionalCreate(0, MjFormToolbarComponent_ng_template_4_Conditional_0_Template, 6, 3)(1, MjFormToolbarComponent_ng_template_4_Conditional_1_Template, 3, 0, "div", 87);
478
560
  } if (rf & 2) {
479
- const items_r23 = ctx.items;
480
- i0.ɵɵconditional(items_r23.length === 1 ? 0 : items_r23.length > 1 ? 1 : -1);
561
+ const items_r27 = ctx.items;
562
+ i0.ɵɵconditional(items_r27.length === 1 ? 0 : items_r27.length > 1 ? 1 : -1);
481
563
  } }
482
564
  /**
483
565
  * Configurable form toolbar component.
@@ -555,6 +637,20 @@ export class MjFormToolbarComponent {
555
637
  HasCustomSectionOrder = false;
556
638
  /** Optional template for additional toolbar actions */
557
639
  AdditionalActionsTemplate = null;
640
+ /**
641
+ * Available form variants for this entity. When the array has >1 entry
642
+ * and `Config.ShowFormVariantPicker` is true, the toolbar renders a
643
+ * right-side "form picker" button (icon) that opens a dropdown with
644
+ * the Default form + each variant. Picking emits {@link VariantPicked}
645
+ * with the override ID, or null for the CodeGen Angular default.
646
+ *
647
+ * Shape is intentionally minimal — Generic doesn't depend on the
648
+ * resolver row type. Hosts shape their data into this. See
649
+ * {@link VariantPickerItem} on the container for the canonical shape.
650
+ */
651
+ Variants = [];
652
+ /** The currently-applied variant ID, or null when the Default form is active. */
653
+ CurrentVariantID = null;
558
654
  // ---- Outputs ----
559
655
  /** Emitted for all navigation actions (record links, hierarchy clicks, etc.) */
560
656
  Navigate = new EventEmitter();
@@ -586,6 +682,12 @@ export class MjFormToolbarComponent {
586
682
  TagsPanelToggled = new EventEmitter();
587
683
  /** Request to show dirty field changes */
588
684
  ShowChangesRequested = new EventEmitter();
685
+ /**
686
+ * Emitted when the user picks an item from the form-variant dropdown.
687
+ * Payload is the override ID for a specific variant, or `null` when the
688
+ * user picks the "Default form" row (CodeGen / Angular fallback).
689
+ */
690
+ VariantPicked = new EventEmitter();
589
691
  /** Emitted when a custom toolbar button is clicked */
590
692
  CustomButtonClick = new EventEmitter();
591
693
  // Section control outputs
@@ -916,6 +1018,56 @@ export class MjFormToolbarComponent {
916
1018
  return;
917
1019
  this.ShowChangesRequested.emit();
918
1020
  }
1021
+ // ── Form-variant picker ─────────────────────────────────────────
1022
+ /** Whether the variant-picker dropdown is currently open. */
1023
+ VariantMenuOpen = false;
1024
+ /**
1025
+ * True iff the toolbar should render the variant-picker button.
1026
+ *
1027
+ * Note the threshold is `>= 1`, NOT `> 1`. The picker menu always
1028
+ * includes the "Default form" row (CodeGen / Angular fallback) — that
1029
+ * row isn't in {@link Variants}; it's rendered unconditionally as the
1030
+ * first row inside the menu. So any single variant still yields a real
1031
+ * choice (Default vs that variant) and the picker should appear. The
1032
+ * inline-strip implementation that this replaces used `> 1` and
1033
+ * therefore hid the picker for entities with exactly one override,
1034
+ * which made that override unreachable from the UI.
1035
+ */
1036
+ get ShowVariantPickerButton() {
1037
+ return !!this.Config.ShowFormVariantPicker && (this.Variants?.length ?? 0) >= 1;
1038
+ }
1039
+ /** Label for the currently-active variant, or "Default form" when none. */
1040
+ get CurrentVariantLabel() {
1041
+ const v = this.Variants?.find(x => UUIDsEqual(x.ID, this.CurrentVariantID));
1042
+ return v?.Label ?? 'Default form';
1043
+ }
1044
+ /** Compact subtitle for a variant menu row: "Scope · Status". */
1045
+ VariantSubtitle(v) {
1046
+ return `${v.Scope} · ${v.Status}`;
1047
+ }
1048
+ ToggleVariantMenu() {
1049
+ this.VariantMenuOpen = !this.VariantMenuOpen;
1050
+ this.cdr.markForCheck();
1051
+ }
1052
+ CloseVariantMenu() {
1053
+ if (this.VariantMenuOpen) {
1054
+ this.VariantMenuOpen = false;
1055
+ this.cdr.markForCheck();
1056
+ }
1057
+ }
1058
+ /**
1059
+ * User picked a row in the variant menu. Closes the menu and emits
1060
+ * `VariantPicked` (null → "Default form" / CodeGen Angular; UUID →
1061
+ * specific override). No-op when the picked value matches the current.
1062
+ */
1063
+ OnVariantClick(variantID) {
1064
+ this.VariantMenuOpen = false;
1065
+ if (variantID === this.CurrentVariantID) {
1066
+ this.cdr.markForCheck();
1067
+ return;
1068
+ }
1069
+ this.VariantPicked.emit(variantID);
1070
+ }
919
1071
  /**
920
1072
  * Try to call a method on the legacy form reference.
921
1073
  * Returns true if the method was found and called, false otherwise.
@@ -1014,10 +1166,10 @@ export class MjFormToolbarComponent {
1014
1166
  this.ManageSectionsRequested.emit();
1015
1167
  }
1016
1168
  static ɵfac = function MjFormToolbarComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MjFormToolbarComponent)(); };
1017
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjFormToolbarComponent, selectors: [["mj-form-toolbar"]], inputs: { Form: "Form", _deprecatedForm: [0, "form", "_deprecatedForm"], Record: "Record", EditMode: "EditMode", UserCanEdit: "UserCanEdit", UserCanDelete: "UserCanDelete", IsFavorite: "IsFavorite", FavoriteInitDone: "FavoriteInitDone", IsDirty: "IsDirty", DirtyFieldNames: "DirtyFieldNames", ListCount: "ListCount", TagCount: "TagCount", IsTagsPanelOpen: "IsTagsPanelOpen", VersionCount: "VersionCount", EntityInfo: "EntityInfo", Config: "Config", IsSaving: "IsSaving", VisibleSectionCount: "VisibleSectionCount", TotalSectionCount: "TotalSectionCount", ExpandedSectionCount: "ExpandedSectionCount", SearchFilter: "SearchFilter", ShowEmptyFields: "ShowEmptyFields", WidthMode: "WidthMode", HasCustomSectionOrder: "HasCustomSectionOrder", AdditionalActionsTemplate: "AdditionalActionsTemplate" }, outputs: { Navigate: "Navigate", EditModeChange: "EditModeChange", BeforeSave: "BeforeSave", SaveRequested: "SaveRequested", BeforeCancel: "BeforeCancel", CancelRequested: "CancelRequested", BeforeDelete: "BeforeDelete", DeleteRequested: "DeleteRequested", FavoriteToggled: "FavoriteToggled", BeforeHistoryView: "BeforeHistoryView", HistoryRequested: "HistoryRequested", BeforeListManagement: "BeforeListManagement", ListManagementRequested: "ListManagementRequested", TagsPanelToggled: "TagsPanelToggled", ShowChangesRequested: "ShowChangesRequested", CustomButtonClick: "CustomButtonClick", FilterChange: "FilterChange", ExpandAllRequested: "ExpandAllRequested", CollapseAllRequested: "CollapseAllRequested", ShowEmptyFieldsChange: "ShowEmptyFieldsChange", WidthModeChange: "WidthModeChange", ResetSectionOrderRequested: "ResetSectionOrderRequested", ManageSectionsRequested: "ManageSectionsRequested" }, standalone: false, ngContentSelectors: _c1, decls: 6, vars: 4, consts: [["descendantTreeTpl", ""], [1, "mj-forms-edit-banner"], [1, "mj-forms-toolbar", 3, "mj-forms-toolbar--sticky"], [1, "mj-dialog-overlay"], [1, "mj-forms-toolbar-spacer"], [1, "mj-forms-edit-banner-actions"], ["title", "Save Changes", 1, "mj-forms-btn", "mj-forms-btn--primary", 3, "click", "disabled"], [1, "fa-solid", "fa-floppy-disk"], [1, "mj-forms-btn-text"], ["title", "Discard Changes", 1, "mj-forms-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-rotate-left"], [1, "fa-solid", "fa-circle-exclamation", "mj-forms-edit-banner-icon--dirty"], [1, "mj-forms-edit-banner-dirty"], [1, "fa-solid", "fa-pen-to-square"], [1, "mj-forms-edit-banner-text"], [1, "mj-forms-toolbar"], [1, "mj-forms-toolbar-group"], ["title", "Edit this Record", 1, "mj-forms-btn"], ["title", "Delete this Record", 1, "mj-forms-btn"], [1, "mj-forms-btn", 3, "title"], [1, "mj-forms-btn", "mj-forms-btn--history", 3, "title"], [1, "mj-forms-btn", "mj-forms-btn--list", 3, "title"], [1, "mj-forms-toolbar-separator"], [1, "mj-entity-hierarchy"], [1, "mj-forms-toolbar-group", "mj-section-controls"], [3, "ngTemplateOutlet"], ["title", "Edit this Record", 1, "mj-forms-btn", 3, "click"], ["title", "Delete this Record", 1, "mj-forms-btn", 3, "click"], [1, "fa-regular", "fa-trash-can"], [1, "mj-forms-btn", 3, "click", "title"], [1, "mj-forms-btn", "mj-forms-btn--history", 3, "click", "title"], [1, "fa-regular", "fa-clock"], [1, "mj-version-count-badge"], [1, "mj-forms-btn", "mj-forms-btn--list", 3, "click", "title"], [1, "fa-regular", "fa-bookmark"], [1, "mj-list-count-badge"], [1, "fa-solid", "fa-tags"], [1, "mj-forms-btn", 3, "class", "disabled", "title"], [1, "mj-forms-btn", 3, "click", "disabled", "title"], [1, "mj-entity-badge", "mj-entity-badge--current"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "mj-entity-badge", "mj-entity-badge--parent", 3, "click", "title"], [1, "fa-solid", "fa-arrow-up"], [1, "mj-hierarchy-arrow"], [1, "fa-solid", "fa-chevron-right"], [1, "mj-forms-search-wrapper"], ["title", "Reset section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only"], ["title", "Manage section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only"], [1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "title"], ["type", "text", "placeholder", "Search sections...", 1, "mj-section-search", 3, "input", "value"], ["title", "Clear search", 1, "mj-clear-search"], ["title", "Clear search", 1, "mj-clear-search", 3, "click"], [1, "fa-solid", "fa-xmark"], ["title", "Expand all sections", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click", "disabled"], [1, "fa-solid", "fa-angles-down"], ["title", "Collapse all sections", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click", "disabled"], [1, "fa-solid", "fa-angles-up"], ["title", "Reset section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click"], [1, "fa-solid", "fa-arrow-rotate-left"], ["title", "Manage section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click"], [1, "fa-solid", "fa-bars-staggered"], [1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click", "title"], [1, "mj-dialog-overlay", 3, "click"], [1, "mj-dialog", 3, "click"], [1, "mj-dialog-header"], [1, "mj-dialog-close", 3, "click"], [1, "mj-dialog-body"], [1, "mj-dialog-footer"], [1, "mj-forms-btn", "mj-forms-btn--danger", 3, "click"], [1, "mj-forms-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "mj-descendant-chains"], [1, "mj-entity-badge", "mj-entity-badge--child", 3, "click", "title"], [1, "fa-solid", "fa-arrow-down"], [1, "mj-descendant-chain"]], template: function MjFormToolbarComponent_Template(rf, ctx) { if (rf & 1) {
1169
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjFormToolbarComponent, selectors: [["mj-form-toolbar"]], inputs: { Form: "Form", _deprecatedForm: [0, "form", "_deprecatedForm"], Record: "Record", EditMode: "EditMode", UserCanEdit: "UserCanEdit", UserCanDelete: "UserCanDelete", IsFavorite: "IsFavorite", FavoriteInitDone: "FavoriteInitDone", IsDirty: "IsDirty", DirtyFieldNames: "DirtyFieldNames", ListCount: "ListCount", TagCount: "TagCount", IsTagsPanelOpen: "IsTagsPanelOpen", VersionCount: "VersionCount", EntityInfo: "EntityInfo", Config: "Config", IsSaving: "IsSaving", VisibleSectionCount: "VisibleSectionCount", TotalSectionCount: "TotalSectionCount", ExpandedSectionCount: "ExpandedSectionCount", SearchFilter: "SearchFilter", ShowEmptyFields: "ShowEmptyFields", WidthMode: "WidthMode", HasCustomSectionOrder: "HasCustomSectionOrder", AdditionalActionsTemplate: "AdditionalActionsTemplate", Variants: "Variants", CurrentVariantID: "CurrentVariantID" }, outputs: { Navigate: "Navigate", EditModeChange: "EditModeChange", BeforeSave: "BeforeSave", SaveRequested: "SaveRequested", BeforeCancel: "BeforeCancel", CancelRequested: "CancelRequested", BeforeDelete: "BeforeDelete", DeleteRequested: "DeleteRequested", FavoriteToggled: "FavoriteToggled", BeforeHistoryView: "BeforeHistoryView", HistoryRequested: "HistoryRequested", BeforeListManagement: "BeforeListManagement", ListManagementRequested: "ListManagementRequested", TagsPanelToggled: "TagsPanelToggled", ShowChangesRequested: "ShowChangesRequested", VariantPicked: "VariantPicked", CustomButtonClick: "CustomButtonClick", FilterChange: "FilterChange", ExpandAllRequested: "ExpandAllRequested", CollapseAllRequested: "CollapseAllRequested", ShowEmptyFieldsChange: "ShowEmptyFieldsChange", WidthModeChange: "WidthModeChange", ResetSectionOrderRequested: "ResetSectionOrderRequested", ManageSectionsRequested: "ManageSectionsRequested" }, standalone: false, ngContentSelectors: _c1, decls: 6, vars: 4, consts: [["descendantTreeTpl", ""], [1, "mj-forms-edit-banner"], [1, "mj-forms-toolbar", 3, "mj-forms-toolbar--sticky"], [1, "mj-dialog-overlay"], [1, "mj-forms-toolbar-spacer"], [1, "mj-forms-edit-banner-actions"], ["title", "Save Changes", 1, "mj-forms-btn", "mj-forms-btn--primary", 3, "click", "disabled"], [1, "fa-solid", "fa-floppy-disk"], [1, "mj-forms-btn-text"], ["title", "Discard Changes", 1, "mj-forms-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-rotate-left"], [1, "fa-solid", "fa-circle-exclamation", "mj-forms-edit-banner-icon--dirty"], [1, "mj-forms-edit-banner-dirty"], [1, "fa-solid", "fa-pen-to-square"], [1, "mj-forms-edit-banner-text"], [1, "mj-forms-toolbar"], [1, "mj-forms-toolbar-group"], ["title", "Edit this Record", 1, "mj-forms-btn"], ["title", "Delete this Record", 1, "mj-forms-btn"], [1, "mj-forms-btn", 3, "title"], [1, "mj-forms-btn", "mj-forms-btn--history", 3, "title"], [1, "mj-forms-btn", "mj-forms-btn--list", 3, "title"], [1, "mj-forms-toolbar-separator"], [1, "mj-entity-hierarchy"], [1, "mj-form-variant-picker-host", 3, "open"], [1, "mj-forms-toolbar-group", "mj-section-controls"], [3, "ngTemplateOutlet"], ["title", "Edit this Record", 1, "mj-forms-btn", 3, "click"], ["title", "Delete this Record", 1, "mj-forms-btn", 3, "click"], [1, "fa-regular", "fa-trash-can"], [1, "mj-forms-btn", 3, "click", "title"], [1, "mj-forms-btn", "mj-forms-btn--history", 3, "click", "title"], [1, "fa-regular", "fa-clock"], [1, "mj-version-count-badge"], [1, "mj-forms-btn", "mj-forms-btn--list", 3, "click", "title"], [1, "fa-regular", "fa-bookmark"], [1, "mj-list-count-badge"], [1, "fa-solid", "fa-tags"], [1, "mj-forms-btn", 3, "class", "disabled", "title"], [1, "mj-forms-btn", 3, "click", "disabled", "title"], [1, "mj-entity-badge", "mj-entity-badge--current"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "mj-entity-badge", "mj-entity-badge--parent", 3, "click", "title"], [1, "fa-solid", "fa-arrow-up"], [1, "mj-hierarchy-arrow"], [1, "fa-solid", "fa-chevron-right"], [1, "mj-form-variant-picker-host"], ["type", "button", 1, "mj-forms-btn", "mj-form-variant-picker-trigger", 3, "click", "blur", "title"], [1, "fa-solid", "fa-pen-ruler"], [1, "mj-form-variant-picker-current-label"], [1, "fa-solid", "fa-chevron-down", "chev"], [1, "mj-form-variant-picker-menu"], [1, "mj-form-variant-picker-menu", 3, "mousedown", "click"], [1, "mj-form-variant-picker-row", "mj-form-variant-picker-default", 3, "click"], [1, "mj-form-variant-picker-row-main"], [1, "mj-form-variant-picker-row-title"], [1, "mj-form-variant-picker-default-tag"], [1, "mj-form-variant-picker-row-sub"], [1, "fa-solid", "fa-check", "mj-form-variant-picker-check"], [1, "mj-form-variant-picker-row", 3, "current", "inactive"], [1, "mj-form-variant-picker-row", 3, "click"], [1, "mj-forms-search-wrapper"], ["title", "Reset section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only"], ["title", "Manage section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only"], [1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "title"], ["type", "text", "placeholder", "Search sections...", 1, "mj-section-search", 3, "input", "value"], ["title", "Clear search", 1, "mj-clear-search"], ["title", "Clear search", 1, "mj-clear-search", 3, "click"], [1, "fa-solid", "fa-xmark"], ["title", "Expand all sections", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click", "disabled"], [1, "fa-solid", "fa-angles-down"], ["title", "Collapse all sections", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click", "disabled"], [1, "fa-solid", "fa-angles-up"], ["title", "Reset section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click"], [1, "fa-solid", "fa-arrow-rotate-left"], ["title", "Manage section order", 1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click"], [1, "fa-solid", "fa-bars-staggered"], [1, "mj-forms-btn", "mj-forms-btn--ghost", "mj-forms-btn--icon-only", 3, "click", "title"], [1, "mj-dialog-overlay", 3, "click"], [1, "mj-dialog", 3, "click"], [1, "mj-dialog-header"], [1, "mj-dialog-close", 3, "click"], [1, "mj-dialog-body"], [1, "mj-dialog-footer"], [1, "mj-forms-btn", "mj-forms-btn--danger", 3, "click"], [1, "mj-forms-btn", 3, "click"], [1, "fa-solid", "fa-trash-can"], [1, "mj-descendant-chains"], [1, "mj-entity-badge", "mj-entity-badge--child", 3, "click", "title"], [1, "fa-solid", "fa-arrow-down"], [1, "mj-descendant-chain"]], template: function MjFormToolbarComponent_Template(rf, ctx) { if (rf & 1) {
1018
1170
  i0.ɵɵprojectionDef(_c0);
1019
1171
  i0.ɵɵconditionalCreate(0, MjFormToolbarComponent_Conditional_0_Template, 13, 3, "div", 1);
1020
- i0.ɵɵconditionalCreate(1, MjFormToolbarComponent_Conditional_1_Template, 16, 12, "div", 2);
1172
+ i0.ɵɵconditionalCreate(1, MjFormToolbarComponent_Conditional_1_Template, 17, 13, "div", 2);
1021
1173
  i0.ɵɵconditionalCreate(2, MjFormToolbarComponent_Conditional_2_Template, 19, 3, "div", 3);
1022
1174
  i0.ɵɵconditionalCreate(3, MjFormToolbarComponent_Conditional_3_Template, 16, 0, "div", 3);
1023
1175
  i0.ɵɵtemplate(4, MjFormToolbarComponent_ng_template_4_Template, 2, 1, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
@@ -1029,11 +1181,11 @@ export class MjFormToolbarComponent {
1029
1181
  i0.ɵɵconditional(ctx.ShowDiscardDialog ? 2 : -1);
1030
1182
  i0.ɵɵadvance();
1031
1183
  i0.ɵɵconditional(ctx.ShowDeleteDialog ? 3 : -1);
1032
- } }, dependencies: [i1.NgTemplateOutlet], styles: ["\n\n\n\n[_nghost-%COMP%] {\n display: block;\n}\n\n\n\n\n\n.mj-forms-edit-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 16px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 2px solid var(--mj-brand-primary);\n font-size: 13px;\n color: var(--mj-brand-primary);\n font-weight: var(--mj-font-medium);\n}\n\n.mj-forms-edit-banner[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n}\n\n.mj-forms-edit-banner-icon--dirty[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n font-size: var(--mj-text-base);\n}\n\n.mj-forms-edit-banner-text[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n}\n\n.mj-forms-edit-banner-dirty[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-edit-banner-dirty[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n font-weight: var(--mj-font-bold);\n}\n\n.mj-forms-edit-banner-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n\n\n.mj-forms-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 22px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 2px solid var(--mj-border-default);\n flex-wrap: wrap;\n z-index: 40;\n}\n\n.mj-forms-toolbar--sticky[_ngcontent-%COMP%] {\n position: sticky;\n top: 0;\n}\n\n.mj-forms-toolbar--disabled[_ngcontent-%COMP%] {\n pointer-events: none;\n opacity: 0.7;\n}\n\n.mj-forms-toolbar-group[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.mj-forms-toolbar-separator[_ngcontent-%COMP%] {\n width: 1px;\n height: 24px;\n background: var(--mj-border-default);\n margin: 0 4px;\n}\n\n.mj-forms-toolbar-spacer[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n\n\n\n\n.mj-forms-btn[_ngcontent-%COMP%] {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n font-size: 13px;\n font-weight: var(--mj-font-medium);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all var(--mj-transition-base) ease;\n white-space: nowrap;\n font-family: inherit;\n line-height: 1;\n}\n\n.mj-forms-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.mj-forms-btn[_ngcontent-%COMP%]:active {\n transform: translateY(0);\n box-shadow: none;\n}\n\n.mj-forms-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.mj-forms-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 15px;\n line-height: 1;\n}\n\n.mj-forms-btn--primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-forms-btn--primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.mj-forms-btn--danger[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, transparent);\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n}\n\n.mj-forms-btn--danger[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n}\n\n.mj-forms-btn--ghost[_ngcontent-%COMP%] {\n border-color: transparent;\n background: transparent;\n}\n\n.mj-forms-btn--ghost[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-color: transparent;\n}\n\n.mj-forms-btn--icon-only[_ngcontent-%COMP%] {\n padding: 7px 9px;\n}\n\n.mj-forms-btn--sm[_ngcontent-%COMP%] {\n padding: 5px 12px;\n font-size: var(--mj-text-xs);\n}\n\n.mj-forms-btn--sm[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xs);\n}\n\n.mj-forms-btn-text[_ngcontent-%COMP%] {\n margin-left: 2px;\n}\n\n.mj-icon--favorite[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n\n\n.mj-forms-btn--list[_ngcontent-%COMP%] {\n position: relative;\n}\n\n\n\n.mj-forms-btn--history[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.mj-version-count-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -6px;\n right: -10px;\n padding: 0 5px;\n font-size: 10px;\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-inverse);\n background: linear-gradient(135deg, var(--mj-status-success) 0%, color-mix(in srgb, var(--mj-status-success) 85%, black) 100%);\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n height: 16px;\n border: 2px solid var(--mj-bg-surface-card);\n white-space: nowrap;\n line-height: 1;\n}\n\n.mj-list-count-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n font-size: 10px;\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-inverse);\n background: linear-gradient(135deg, var(--mj-status-info) 0%, color-mix(in srgb, var(--mj-status-info) 85%, black) 100%);\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-bg-surface-card);\n}\n\n\n\n\n\n.mj-entity-hierarchy[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.mj-entity-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all var(--mj-transition-base) ease;\n text-decoration: none;\n border: 1px solid transparent;\n}\n\n.mj-entity-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.mj-entity-badge--parent[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-color-indigo-500) 10%, var(--mj-bg-surface));\n color: var(--mj-color-indigo-500);\n border-color: color-mix(in srgb, var(--mj-color-indigo-500) 25%, transparent);\n}\n\n.mj-entity-badge--parent[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-color-indigo-500) 18%, var(--mj-bg-surface));\n border-color: var(--mj-color-indigo-500);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--mj-color-indigo-500) 15%, transparent);\n}\n\n.mj-entity-badge--current[_ngcontent-%COMP%] {\n font-weight: var(--mj-font-semibold);\n font-size: 13px;\n color: var(--mj-text-primary);\n padding: 4px 8px;\n background: var(--mj-bg-surface-hover);\n border-radius: var(--mj-radius-sm);\n cursor: default;\n}\n\n.mj-entity-badge--child[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n border-color: color-mix(in srgb, var(--mj-status-info) 25%, transparent);\n}\n\n.mj-entity-badge--child[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-info) 18%, var(--mj-bg-surface));\n border-color: var(--mj-status-info);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--mj-status-info) 15%, transparent);\n}\n\n.mj-entity-badge--overlapping[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: color-mix(in srgb, var(--mj-status-warning) 85%, black);\n border-color: color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n}\n\n.mj-entity-badge--overlapping[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 18%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-warning) 85%, black);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--mj-status-warning) 15%, transparent);\n}\n\n.mj-entity-badge-group[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n\n.mj-child-count[_ngcontent-%COMP%] {\n background: var(--mj-status-info);\n color: var(--mj-text-inverse);\n font-size: 10px;\n padding: 1px 5px;\n border-radius: var(--mj-radius-full);\n font-weight: var(--mj-font-bold);\n}\n\n.mj-entity-badge--leaf[_ngcontent-%COMP%] {\n border-style: dashed;\n}\n\n.mj-entity-badge--root[_ngcontent-%COMP%] {\n border-style: dashed;\n}\n\n.mj-hierarchy-arrow[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 10px;\n}\n\n\n\n.mj-descendant-chains[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n position: relative;\n padding-left: 20px;\n}\n\n\n\n.mj-descendant-chains[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: -4px;\n top: 50%;\n width: 4px;\n border-top: 1.5px solid var(--mj-text-muted);\n}\n\n.mj-descendant-chain[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n position: relative;\n padding: 2px 0;\n}\n\n\n\n.mj-descendant-chain[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: -20px;\n top: 50%;\n width: 18px;\n border-top: 1.5px solid var(--mj-text-muted);\n}\n\n\n\n.mj-descendant-chain[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n left: -20px;\n top: 0;\n bottom: 0;\n border-left: 1.5px solid var(--mj-text-muted);\n}\n\n\n\n.mj-descendant-chain[_ngcontent-%COMP%]:first-child::after {\n top: 50%;\n}\n\n\n\n.mj-descendant-chain[_ngcontent-%COMP%]:last-child::after {\n bottom: 50%;\n}\n\n\n\n\n\n\n\n\n.mj-section-controls[_ngcontent-%COMP%] {\n gap: 6px;\n}\n\n.mj-forms-search-wrapper[_ngcontent-%COMP%] {\n position: relative;\n display: inline-flex;\n align-items: center;\n}\n\n.mj-section-search[_ngcontent-%COMP%] {\n max-width: 180px;\n font-size: 13px;\n padding: 6px 28px 6px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n outline: none;\n font-family: inherit;\n transition: all var(--mj-transition-base);\n}\n\n.mj-section-search[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n\n\n.mj-section-search--active[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-status-warning) 40%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n color: color-mix(in srgb, var(--mj-status-warning) 80%, black);\n font-weight: var(--mj-font-semibold);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-status-warning) 25%, transparent);\n}\n\n.mj-section-search[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.mj-clear-search[_ngcontent-%COMP%] {\n position: absolute;\n right: 4px;\n padding: 4px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: var(--mj-text-xs);\n line-height: 1;\n}\n\n.mj-clear-search[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n\n\n\n\n\n.mj-dialog-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n animation: _ngcontent-%COMP%_mj-fade-in 150ms ease;\n}\n\n.mj-dialog[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-lg);\n box-shadow: var(--mj-shadow-lg);\n min-width: 400px;\n max-width: 550px;\n animation: _ngcontent-%COMP%_mj-slide-up 200ms ease;\n}\n\n.mj-dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.mj-dialog-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-dialog-close[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n font-size: var(--mj-text-base);\n transition: color var(--mj-transition-base);\n}\n\n.mj-dialog-close[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.mj-dialog-body[_ngcontent-%COMP%] {\n padding: 20px;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n line-height: 1.6;\n}\n\n.mj-dialog-body[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n}\n\n.mj-dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n@keyframes _ngcontent-%COMP%_mj-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes _ngcontent-%COMP%_mj-slide-up {\n from { transform: translateY(8px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}"], changeDetection: 0 });
1184
+ } }, dependencies: [i1.NgTemplateOutlet], styles: ["\n\n\n\n[_nghost-%COMP%] {\n display: block;\n}\n\n\n\n\n\n.mj-forms-edit-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 16px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 2px solid var(--mj-brand-primary);\n font-size: 13px;\n color: var(--mj-brand-primary);\n font-weight: var(--mj-font-medium);\n}\n\n.mj-forms-edit-banner[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n}\n\n.mj-forms-edit-banner-icon--dirty[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n font-size: var(--mj-text-base);\n}\n\n.mj-forms-edit-banner-text[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n}\n\n.mj-forms-edit-banner-dirty[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-edit-banner-dirty[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n font-weight: var(--mj-font-bold);\n}\n\n.mj-forms-edit-banner-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n\n\n\n\n.mj-forms-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 22px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 2px solid var(--mj-border-default);\n flex-wrap: wrap;\n z-index: 40;\n}\n\n.mj-forms-toolbar--sticky[_ngcontent-%COMP%] {\n position: sticky;\n top: 0;\n}\n\n.mj-forms-toolbar--disabled[_ngcontent-%COMP%] {\n pointer-events: none;\n opacity: 0.7;\n}\n\n.mj-forms-toolbar-group[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.mj-forms-toolbar-separator[_ngcontent-%COMP%] {\n width: 1px;\n height: 24px;\n background: var(--mj-border-default);\n margin: 0 4px;\n}\n\n.mj-forms-toolbar-spacer[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n\n\n\n\n.mj-forms-btn[_ngcontent-%COMP%] {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n font-size: 13px;\n font-weight: var(--mj-font-medium);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all var(--mj-transition-base) ease;\n white-space: nowrap;\n font-family: inherit;\n line-height: 1;\n}\n\n.mj-forms-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.mj-forms-btn[_ngcontent-%COMP%]:active {\n transform: translateY(0);\n box-shadow: none;\n}\n\n.mj-forms-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.mj-forms-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 15px;\n line-height: 1;\n}\n\n.mj-forms-btn--primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-forms-btn--primary[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.mj-forms-btn--danger[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, transparent);\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n}\n\n.mj-forms-btn--danger[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n}\n\n.mj-forms-btn--ghost[_ngcontent-%COMP%] {\n border-color: transparent;\n background: transparent;\n}\n\n.mj-forms-btn--ghost[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-color: transparent;\n}\n\n.mj-forms-btn--icon-only[_ngcontent-%COMP%] {\n padding: 7px 9px;\n}\n\n.mj-forms-btn--sm[_ngcontent-%COMP%] {\n padding: 5px 12px;\n font-size: var(--mj-text-xs);\n}\n\n.mj-forms-btn--sm[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xs);\n}\n\n.mj-forms-btn-text[_ngcontent-%COMP%] {\n margin-left: 2px;\n}\n\n.mj-icon--favorite[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n\n\n.mj-forms-btn--list[_ngcontent-%COMP%] {\n position: relative;\n}\n\n\n\n.mj-forms-btn--history[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.mj-version-count-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -6px;\n right: -10px;\n padding: 0 5px;\n font-size: 10px;\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-inverse);\n background: linear-gradient(135deg, var(--mj-status-success) 0%, color-mix(in srgb, var(--mj-status-success) 85%, black) 100%);\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n height: 16px;\n border: 2px solid var(--mj-bg-surface-card);\n white-space: nowrap;\n line-height: 1;\n}\n\n.mj-list-count-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n font-size: 10px;\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-inverse);\n background: linear-gradient(135deg, var(--mj-status-info) 0%, color-mix(in srgb, var(--mj-status-info) 85%, black) 100%);\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-bg-surface-card);\n}\n\n\n\n\n\n.mj-entity-hierarchy[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.mj-entity-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all var(--mj-transition-base) ease;\n text-decoration: none;\n border: 1px solid transparent;\n}\n\n.mj-entity-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.mj-entity-badge--parent[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-color-indigo-500) 10%, var(--mj-bg-surface));\n color: var(--mj-color-indigo-500);\n border-color: color-mix(in srgb, var(--mj-color-indigo-500) 25%, transparent);\n}\n\n.mj-entity-badge--parent[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-color-indigo-500) 18%, var(--mj-bg-surface));\n border-color: var(--mj-color-indigo-500);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--mj-color-indigo-500) 15%, transparent);\n}\n\n.mj-entity-badge--current[_ngcontent-%COMP%] {\n font-weight: var(--mj-font-semibold);\n font-size: 13px;\n color: var(--mj-text-primary);\n padding: 4px 8px;\n background: var(--mj-bg-surface-hover);\n border-radius: var(--mj-radius-sm);\n cursor: default;\n}\n\n.mj-entity-badge--child[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n border-color: color-mix(in srgb, var(--mj-status-info) 25%, transparent);\n}\n\n.mj-entity-badge--child[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-info) 18%, var(--mj-bg-surface));\n border-color: var(--mj-status-info);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--mj-status-info) 15%, transparent);\n}\n\n.mj-entity-badge--overlapping[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: color-mix(in srgb, var(--mj-status-warning) 85%, black);\n border-color: color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n}\n\n.mj-entity-badge--overlapping[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 18%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-warning) 85%, black);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--mj-status-warning) 15%, transparent);\n}\n\n.mj-entity-badge-group[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n\n.mj-child-count[_ngcontent-%COMP%] {\n background: var(--mj-status-info);\n color: var(--mj-text-inverse);\n font-size: 10px;\n padding: 1px 5px;\n border-radius: var(--mj-radius-full);\n font-weight: var(--mj-font-bold);\n}\n\n.mj-entity-badge--leaf[_ngcontent-%COMP%] {\n border-style: dashed;\n}\n\n.mj-entity-badge--root[_ngcontent-%COMP%] {\n border-style: dashed;\n}\n\n.mj-hierarchy-arrow[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 10px;\n}\n\n\n\n.mj-descendant-chains[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n position: relative;\n padding-left: 20px;\n}\n\n\n\n.mj-descendant-chains[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: -4px;\n top: 50%;\n width: 4px;\n border-top: 1.5px solid var(--mj-text-muted);\n}\n\n.mj-descendant-chain[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n position: relative;\n padding: 2px 0;\n}\n\n\n\n.mj-descendant-chain[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: -20px;\n top: 50%;\n width: 18px;\n border-top: 1.5px solid var(--mj-text-muted);\n}\n\n\n\n.mj-descendant-chain[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n left: -20px;\n top: 0;\n bottom: 0;\n border-left: 1.5px solid var(--mj-text-muted);\n}\n\n\n\n.mj-descendant-chain[_ngcontent-%COMP%]:first-child::after {\n top: 50%;\n}\n\n\n\n.mj-descendant-chain[_ngcontent-%COMP%]:last-child::after {\n bottom: 50%;\n}\n\n\n\n\n\n\n\n\n.mj-section-controls[_ngcontent-%COMP%] {\n gap: 6px;\n}\n\n.mj-forms-search-wrapper[_ngcontent-%COMP%] {\n position: relative;\n display: inline-flex;\n align-items: center;\n}\n\n.mj-section-search[_ngcontent-%COMP%] {\n max-width: 180px;\n font-size: 13px;\n padding: 6px 28px 6px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n outline: none;\n font-family: inherit;\n transition: all var(--mj-transition-base);\n}\n\n.mj-section-search[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n\n\n.mj-section-search--active[_ngcontent-%COMP%] {\n background-color: color-mix(in srgb, var(--mj-status-warning) 40%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n color: color-mix(in srgb, var(--mj-status-warning) 80%, black);\n font-weight: var(--mj-font-semibold);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-status-warning) 25%, transparent);\n}\n\n.mj-section-search[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.mj-clear-search[_ngcontent-%COMP%] {\n position: absolute;\n right: 4px;\n padding: 4px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: var(--mj-text-xs);\n line-height: 1;\n}\n\n.mj-clear-search[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n\n\n\n\n\n.mj-dialog-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n animation: _ngcontent-%COMP%_mj-fade-in 150ms ease;\n}\n\n.mj-dialog[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-lg);\n box-shadow: var(--mj-shadow-lg);\n min-width: 400px;\n max-width: 550px;\n animation: _ngcontent-%COMP%_mj-slide-up 200ms ease;\n}\n\n.mj-dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.mj-dialog-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-dialog-close[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n font-size: var(--mj-text-base);\n transition: color var(--mj-transition-base);\n}\n\n.mj-dialog-close[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n\n.mj-dialog-body[_ngcontent-%COMP%] {\n padding: 20px;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n line-height: 1.6;\n}\n\n.mj-dialog-body[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n}\n\n.mj-dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n@keyframes _ngcontent-%COMP%_mj-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes _ngcontent-%COMP%_mj-slide-up {\n from { transform: translateY(8px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n\n\n\n\n\n\n\n\n.mj-form-variant-picker-host[_ngcontent-%COMP%] {\n position: relative;\n display: inline-flex;\n}\n\n.mj-form-variant-picker-trigger[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n max-width: 240px;\n}\n\n.mj-form-variant-picker-trigger[_ngcontent-%COMP%] .chev[_ngcontent-%COMP%] {\n font-size: 10px;\n opacity: 0.7;\n}\n\n.mj-form-variant-picker-current-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 160px;\n font-size: 12px;\n font-weight: 500;\n}\n\n.mj-form-variant-picker-host.open[_ngcontent-%COMP%] .mj-form-variant-picker-trigger[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-focus);\n}\n\n.mj-form-variant-picker-menu[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 4px);\n right: 0;\n z-index: 50;\n min-width: 280px;\n max-height: 360px;\n overflow-y: auto;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n padding: 4px 0;\n}\n\n.mj-form-variant-picker-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n color: var(--mj-text-primary);\n font-size: 13px;\n transition: background 120ms;\n}\n\n.mj-form-variant-picker-row[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-form-variant-picker-row.current[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-form-variant-picker-row.inactive[_ngcontent-%COMP%] {\n opacity: 0.6;\n}\n\n.mj-form-variant-picker-row-main[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mj-form-variant-picker-row-title[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.mj-form-variant-picker-row-sub[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.mj-form-variant-picker-default-tag[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-muted);\n margin-left: 4px;\n}\n\n.mj-form-variant-picker-default[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.mj-form-variant-picker-check[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 12px;\n margin-top: 2px;\n}"], changeDetection: 0 });
1033
1185
  }
1034
1186
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MjFormToolbarComponent, [{
1035
1187
  type: Component,
1036
- args: [{ standalone: false, selector: 'mj-form-toolbar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- ============================================\n EDIT MODE BANNER (shows above toolbar when editing)\n ============================================ -->\n@if (EditMode && Config.ShowEditBanner) {\n <div class=\"mj-forms-edit-banner\">\n @if (DirtyFieldDisplayNames.length > 0) {\n <i class=\"fa-solid fa-circle-exclamation mj-forms-edit-banner-icon--dirty\"></i>\n <span class=\"mj-forms-edit-banner-dirty\">\n <strong>{{ DirtyFieldDisplayNames.length }}</strong>\n field{{ DirtyFieldDisplayNames.length === 1 ? '' : 's' }} modified\n &mdash; {{ DirtyFieldDisplayNames.join(', ') }}\n </span>\n } @else {\n <i class=\"fa-solid fa-pen-to-square\"></i>\n <span class=\"mj-forms-edit-banner-text\">Editing: {{ RecordDisplayName }}</span>\n }\n <div class=\"mj-forms-toolbar-spacer\"></div>\n <div class=\"mj-forms-edit-banner-actions\">\n <button class=\"mj-forms-btn mj-forms-btn--primary\" (click)=\"OnSave()\" [disabled]=\"IsSaving\" title=\"Save Changes\">\n <i class=\"fa-solid fa-floppy-disk\"></i>\n <span class=\"mj-forms-btn-text\">Save Changes</span>\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnCancel()\" [disabled]=\"IsSaving\" title=\"Discard Changes\">\n <i class=\"fa-solid fa-rotate-left\"></i>\n <span class=\"mj-forms-btn-text\">Discard</span>\n </button>\n </div>\n </div>\n}\n\n<!-- ============================================\n MAIN TOOLBAR (read mode only \u2014 hidden in edit mode)\n ============================================ -->\n@if (!EditMode) {\n <div class=\"mj-forms-toolbar\" [class.mj-forms-toolbar--sticky]=\"Config.StickyToolbar\">\n\n <!-- Action buttons -->\n <div class=\"mj-forms-toolbar-group\">\n @if (Config.ShowEditButton && UserCanEdit) {\n <button class=\"mj-forms-btn\" (click)=\"OnEdit()\" title=\"Edit this Record\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n @if (Config.ShowDeleteButton && UserCanDelete) {\n <button class=\"mj-forms-btn\" (click)=\"OnDeleteClick()\" title=\"Delete this Record\">\n <i class=\"fa-regular fa-trash-can\"></i>\n </button>\n }\n @if (Config.ShowFavoriteButton && FavoriteInitDone) {\n <button class=\"mj-forms-btn\" (click)=\"OnFavoriteToggle()\" [title]=\"IsFavorite ? 'Remove Favorite' : 'Make Favorite'\">\n <i [class]=\"IsFavorite ? 'fa-solid fa-star mj-icon--favorite' : 'fa-regular fa-star'\"></i>\n </button>\n }\n @if (Config.ShowHistoryButton && TracksChanges) {\n <button class=\"mj-forms-btn mj-forms-btn--history\" (click)=\"OnHistory()\"\n [title]=\"VersionCount > 0 ? VersionCount + ' version(s) tracked' : 'Record Changes'\">\n <i class=\"fa-regular fa-clock\"></i>\n @if (VersionCount > 0) {\n <span class=\"mj-version-count-badge\">v{{ VersionCount }}</span>\n }\n </button>\n }\n @if (Config.ShowListButton) {\n <button class=\"mj-forms-btn mj-forms-btn--list\" (click)=\"OnListManagement()\"\n [title]=\"ListCount > 0 ? 'Member of ' + ListCount + ' list(s)' : 'Add to a list'\">\n <i class=\"fa-regular fa-bookmark\"></i>\n @if (ListCount > 0) {\n <span class=\"mj-list-count-badge\">{{ ListCount }}</span>\n }\n </button>\n }\n @if (Config.ShowTagsButton) {\n <button class=\"mj-forms-btn\" (click)=\"OnTagsPanel()\"\n [title]=\"TagCount > 0 ? TagCount + ' tag(s)' : 'View tags'\">\n <i class=\"fa-solid fa-tags\"></i>\n @if (TagCount > 0) {\n <span class=\"mj-list-count-badge\">{{ TagCount }}</span>\n }\n </button>\n }\n\n <!-- Custom toolbar buttons -->\n @for (button of Config.CustomButtons; track button.Key) {\n @if (button.Visible !== false) {\n <button class=\"mj-forms-btn\"\n [class]=\"button.CssClass || ''\"\n [disabled]=\"button.Disabled || false\"\n [title]=\"button.Description\"\n (click)=\"OnCustomButtonClick(button)\">\n <i [class]=\"button.Icon\"></i>\n </button>\n }\n }\n </div>\n\n <!-- Separator before hierarchy -->\n @if (Config.ShowEntityHierarchy && IsInHierarchy) {\n <div class=\"mj-forms-toolbar-separator\"></div>\n }\n\n <!-- IS-A Entity Hierarchy Breadcrumb (bidirectional: Root \u2192 ... \u2192 Current \u2192 ... \u2192 Leaf) -->\n @if (Config.ShowEntityHierarchy && IsInHierarchy) {\n <div class=\"mj-entity-hierarchy\">\n <!-- Parent chain (root \u2192 ... \u2192 immediate parent) -->\n @for (parent of ParentChain; track parent.ID) {\n <a class=\"mj-entity-badge mj-entity-badge--parent\"\n [title]=\"'Navigate to parent: ' + parent.Name\"\n (click)=\"OnParentBadgeClick(parent, $event)\">\n <i class=\"fa-solid fa-arrow-up\"></i>\n {{ parent.Name }}\n </a>\n <span class=\"mj-hierarchy-arrow\"><i class=\"fa-solid fa-chevron-right\"></i></span>\n }\n\n <!-- Current entity (always shown) -->\n <span class=\"mj-entity-badge mj-entity-badge--current\">{{ EntityInfo?.Name }}</span>\n\n <!-- Descendant tree (recursive: inline for single paths, branching for multiple) -->\n @if (DescendantTree.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: DescendantTree }\"></ng-container>\n }\n </div>\n }\n\n <!-- Spacer pushes section controls to the right -->\n <div class=\"mj-forms-toolbar-spacer\"></div>\n\n <!-- Section Controls -->\n @if (Config.ShowSectionControls) {\n <div class=\"mj-forms-toolbar-group mj-section-controls\">\n @if (Config.ShowSectionFilter) {\n <div class=\"mj-forms-search-wrapper\">\n <input type=\"text\"\n class=\"mj-section-search\"\n [class.mj-section-search--active]=\"SearchFilter\"\n [value]=\"SearchFilter\"\n (input)=\"OnFilterInput($event)\"\n placeholder=\"Search sections...\">\n @if (SearchFilter) {\n <button class=\"mj-clear-search\" (click)=\"OnClearFilter()\" title=\"Clear search\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n }\n @if (Config.ShowExpandCollapseAllButtons) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n [disabled]=\"ExpandedSectionCount >= VisibleSectionCount\"\n (click)=\"OnExpandAll()\" title=\"Expand all sections\">\n <i class=\"fa-solid fa-angles-down\"></i>\n </button>\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n [disabled]=\"ExpandedSectionCount === 0\"\n (click)=\"OnCollapseAll()\" title=\"Collapse all sections\">\n <i class=\"fa-solid fa-angles-up\"></i>\n </button>\n }\n @if (HasCustomSectionOrder) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\" (click)=\"OnResetSectionOrder()\" title=\"Reset section order\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i>\n </button>\n }\n @if (Config.ShowSectionManager) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n (click)=\"OnManageSections()\" title=\"Manage section order\">\n <i class=\"fa-solid fa-bars-staggered\"></i>\n </button>\n }\n @if (Config.ShowWidthToggle) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n (click)=\"OnToggleWidthMode()\"\n [title]=\"WidthMode === 'centered' ? 'Expand to full width' : 'Center content'\">\n <i [class]=\"WidthMode === 'centered' ? 'fa-solid fa-arrows-left-right-to-line' : 'fa-solid fa-compress'\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Additional actions slot -->\n @if (AdditionalActionsTemplate) {\n <ng-container [ngTemplateOutlet]=\"AdditionalActionsTemplate\"></ng-container>\n }\n <ng-content select=\"[toolbar-additional-controls]\"></ng-content>\n </div>\n}\n\n<!-- ============================================\n DISCARD CHANGES CONFIRMATION DIALOG\n ============================================ -->\n@if (ShowDiscardDialog) {\n <div class=\"mj-dialog-overlay\" (click)=\"OnDiscardCancel()\">\n <div class=\"mj-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-dialog-header\">\n <h3>Discard Changes?</h3>\n <button class=\"mj-dialog-close\" (click)=\"OnDiscardCancel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-dialog-body\">\n <p>You have <strong>{{ DirtyFieldDisplayNames.length }}</strong> unsaved change{{ DirtyFieldDisplayNames.length === 1 ? '' : 's' }}. Are you sure you want to discard {{ DirtyFieldDisplayNames.length === 1 ? 'it' : 'them' }}?</p>\n </div>\n <div class=\"mj-dialog-footer\">\n <button class=\"mj-forms-btn mj-forms-btn--danger\" (click)=\"OnDiscardConfirm()\">\n <i class=\"fa-solid fa-rotate-left\"></i>\n Discard Changes\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnDiscardCancel()\">\n Keep Editing\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- ============================================\n DELETE CONFIRMATION DIALOG\n ============================================ -->\n@if (ShowDeleteDialog) {\n <div class=\"mj-dialog-overlay\" (click)=\"OnDeleteCancel()\">\n <div class=\"mj-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-dialog-header\">\n <h3>Confirm Deletion</h3>\n <button class=\"mj-dialog-close\" (click)=\"OnDeleteCancel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-dialog-body\">\n <p>Are you sure you want to delete this record? This action cannot be undone.</p>\n </div>\n <div class=\"mj-dialog-footer\">\n <button class=\"mj-forms-btn mj-forms-btn--danger\" (click)=\"OnDeleteConfirm()\">\n <i class=\"fa-solid fa-trash-can\"></i>\n Delete\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnDeleteCancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Recursive template for IS-A descendant tree rendering.\n Single child at a level \u2192 inline with chevron.\n Multiple children at a level \u2192 tree branch with CSS connector lines. -->\n<ng-template #descendantTreeTpl let-items=\"items\">\n @if (items.length === 1) {\n <span class=\"mj-hierarchy-arrow\"><i class=\"fa-solid fa-chevron-right\"></i></span>\n <a class=\"mj-entity-badge mj-entity-badge--child\"\n [title]=\"'Navigate to: ' + items[0].EntityName\"\n (click)=\"OnDescendantBadgeClick(items[0].EntityName, $event)\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n {{ items[0].EntityName }}\n </a>\n @if (items[0].Children.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: items[0].Children }\"></ng-container>\n }\n } @else if (items.length > 1) {\n <div class=\"mj-descendant-chains\">\n @for (item of items; track item.EntityName) {\n <div class=\"mj-descendant-chain\">\n <a class=\"mj-entity-badge mj-entity-badge--child\"\n [title]=\"'Navigate to: ' + item.EntityName\"\n (click)=\"OnDescendantBadgeClick(item.EntityName, $event)\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n {{ item.EntityName }}\n </a>\n @if (item.Children.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: item.Children }\"></ng-container>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n", styles: ["/* ============================================\n FORM TOOLBAR \u2014 uses global --mj-* design tokens\n ============================================ */\n:host {\n display: block;\n}\n\n/* ============================================\n EDIT BANNER\n ============================================ */\n.mj-forms-edit-banner {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 16px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 2px solid var(--mj-brand-primary);\n font-size: 13px;\n color: var(--mj-brand-primary);\n font-weight: var(--mj-font-medium);\n}\n\n.mj-forms-edit-banner > i {\n font-size: var(--mj-text-sm);\n}\n\n.mj-forms-edit-banner-icon--dirty {\n color: var(--mj-status-warning);\n font-size: var(--mj-text-base);\n}\n\n.mj-forms-edit-banner-text {\n font-size: var(--mj-text-sm);\n}\n\n.mj-forms-edit-banner-dirty {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-edit-banner-dirty strong {\n color: var(--mj-status-warning);\n font-weight: var(--mj-font-bold);\n}\n\n.mj-forms-edit-banner-actions {\n display: flex;\n gap: 8px;\n}\n\n/* ============================================\n MAIN TOOLBAR\n ============================================ */\n.mj-forms-toolbar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 22px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 2px solid var(--mj-border-default);\n flex-wrap: wrap;\n z-index: 40;\n}\n\n.mj-forms-toolbar--sticky {\n position: sticky;\n top: 0;\n}\n\n.mj-forms-toolbar--disabled {\n pointer-events: none;\n opacity: 0.7;\n}\n\n.mj-forms-toolbar-group {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.mj-forms-toolbar-separator {\n width: 1px;\n height: 24px;\n background: var(--mj-border-default);\n margin: 0 4px;\n}\n\n.mj-forms-toolbar-spacer {\n flex: 1;\n}\n\n/* ============================================\n BUTTONS\n ============================================ */\n.mj-forms-btn {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n font-size: 13px;\n font-weight: var(--mj-font-medium);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all var(--mj-transition-base) ease;\n white-space: nowrap;\n font-family: inherit;\n line-height: 1;\n}\n\n.mj-forms-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.mj-forms-btn:active {\n transform: translateY(0);\n box-shadow: none;\n}\n\n.mj-forms-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.mj-forms-btn i {\n font-size: 15px;\n line-height: 1;\n}\n\n.mj-forms-btn--primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-forms-btn--primary:hover {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.mj-forms-btn--danger {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, transparent);\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n}\n\n.mj-forms-btn--danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n}\n\n.mj-forms-btn--ghost {\n border-color: transparent;\n background: transparent;\n}\n\n.mj-forms-btn--ghost:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-color: transparent;\n}\n\n.mj-forms-btn--icon-only {\n padding: 7px 9px;\n}\n\n.mj-forms-btn--sm {\n padding: 5px 12px;\n font-size: var(--mj-text-xs);\n}\n\n.mj-forms-btn--sm i {\n font-size: var(--mj-text-xs);\n}\n\n.mj-forms-btn-text {\n margin-left: 2px;\n}\n\n.mj-icon--favorite {\n color: var(--mj-status-warning);\n}\n\n/* List button with count badge */\n.mj-forms-btn--list {\n position: relative;\n}\n\n/* History button with version badge */\n.mj-forms-btn--history {\n position: relative;\n}\n\n.mj-version-count-badge {\n position: absolute;\n top: -6px;\n right: -10px;\n padding: 0 5px;\n font-size: 10px;\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-inverse);\n background: linear-gradient(135deg, var(--mj-status-success) 0%, color-mix(in srgb, var(--mj-status-success) 85%, black) 100%);\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n height: 16px;\n border: 2px solid var(--mj-bg-surface-card);\n white-space: nowrap;\n line-height: 1;\n}\n\n.mj-list-count-badge {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n font-size: 10px;\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-inverse);\n background: linear-gradient(135deg, var(--mj-status-info) 0%, color-mix(in srgb, var(--mj-status-info) 85%, black) 100%);\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-bg-surface-card);\n}\n\n/* ============================================\n IS-A ENTITY HIERARCHY\n ============================================ */\n.mj-entity-hierarchy {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.mj-entity-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all var(--mj-transition-base) ease;\n text-decoration: none;\n border: 1px solid transparent;\n}\n\n.mj-entity-badge i {\n font-size: 11px;\n}\n\n.mj-entity-badge--parent {\n background: color-mix(in srgb, var(--mj-color-indigo-500) 10%, var(--mj-bg-surface));\n color: var(--mj-color-indigo-500);\n border-color: color-mix(in srgb, var(--mj-color-indigo-500) 25%, transparent);\n}\n\n.mj-entity-badge--parent:hover {\n background: color-mix(in srgb, var(--mj-color-indigo-500) 18%, var(--mj-bg-surface));\n border-color: var(--mj-color-indigo-500);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--mj-color-indigo-500) 15%, transparent);\n}\n\n.mj-entity-badge--current {\n font-weight: var(--mj-font-semibold);\n font-size: 13px;\n color: var(--mj-text-primary);\n padding: 4px 8px;\n background: var(--mj-bg-surface-hover);\n border-radius: var(--mj-radius-sm);\n cursor: default;\n}\n\n.mj-entity-badge--child {\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n border-color: color-mix(in srgb, var(--mj-status-info) 25%, transparent);\n}\n\n.mj-entity-badge--child:hover {\n background: color-mix(in srgb, var(--mj-status-info) 18%, var(--mj-bg-surface));\n border-color: var(--mj-status-info);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--mj-status-info) 15%, transparent);\n}\n\n.mj-entity-badge--overlapping {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: color-mix(in srgb, var(--mj-status-warning) 85%, black);\n border-color: color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n}\n\n.mj-entity-badge--overlapping:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 18%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-warning) 85%, black);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--mj-status-warning) 15%, transparent);\n}\n\n.mj-entity-badge-group {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n\n.mj-child-count {\n background: var(--mj-status-info);\n color: var(--mj-text-inverse);\n font-size: 10px;\n padding: 1px 5px;\n border-radius: var(--mj-radius-full);\n font-weight: var(--mj-font-bold);\n}\n\n.mj-entity-badge--leaf {\n border-style: dashed;\n}\n\n.mj-entity-badge--root {\n border-style: dashed;\n}\n\n.mj-hierarchy-arrow {\n color: var(--mj-text-muted);\n font-size: 10px;\n}\n\n/* Descendant chain tree (connecting lines when multiple chains branch) */\n.mj-descendant-chains {\n display: flex;\n flex-direction: column;\n gap: 6px;\n position: relative;\n padding-left: 20px;\n}\n\n/* Horizontal connector from parent entity badge to tree trunk */\n.mj-descendant-chains::before {\n content: '';\n position: absolute;\n left: -4px;\n top: 50%;\n width: 4px;\n border-top: 1.5px solid var(--mj-text-muted);\n}\n\n.mj-descendant-chain {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n position: relative;\n padding: 2px 0;\n}\n\n/* Horizontal branch line from trunk to chain content */\n.mj-descendant-chain::before {\n content: '';\n position: absolute;\n left: -20px;\n top: 50%;\n width: 18px;\n border-top: 1.5px solid var(--mj-text-muted);\n}\n\n/* Vertical trunk segment (each chain draws its portion) */\n.mj-descendant-chain::after {\n content: '';\n position: absolute;\n left: -20px;\n top: 0;\n bottom: 0;\n border-left: 1.5px solid var(--mj-text-muted);\n}\n\n/* First chain: trunk starts from center */\n.mj-descendant-chain:first-child::after {\n top: 50%;\n}\n\n/* Last chain: trunk ends at center */\n.mj-descendant-chain:last-child::after {\n bottom: 50%;\n}\n\n/* (dirty summary removed \u2014 now inline in edit banner) */\n\n/* ============================================\n SECTION CONTROLS\n ============================================ */\n.mj-section-controls {\n gap: 6px;\n}\n\n.mj-forms-search-wrapper {\n position: relative;\n display: inline-flex;\n align-items: center;\n}\n\n.mj-section-search {\n max-width: 180px;\n font-size: 13px;\n padding: 6px 28px 6px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n outline: none;\n font-family: inherit;\n transition: all var(--mj-transition-base);\n}\n\n.mj-section-search:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n/* Active filter highlight \u2014 matches the yellow used on matched panel/field names */\n.mj-section-search--active {\n background-color: color-mix(in srgb, var(--mj-status-warning) 40%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n color: color-mix(in srgb, var(--mj-status-warning) 80%, black);\n font-weight: var(--mj-font-semibold);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-status-warning) 25%, transparent);\n}\n\n.mj-section-search::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.mj-clear-search {\n position: absolute;\n right: 4px;\n padding: 4px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: var(--mj-text-xs);\n line-height: 1;\n}\n\n.mj-clear-search:hover {\n color: var(--mj-text-secondary);\n}\n\n/* ============================================\n DIALOG (lightweight inline)\n ============================================ */\n.mj-dialog-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n animation: mj-fade-in 150ms ease;\n}\n\n.mj-dialog {\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-lg);\n box-shadow: var(--mj-shadow-lg);\n min-width: 400px;\n max-width: 550px;\n animation: mj-slide-up 200ms ease;\n}\n\n.mj-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.mj-dialog-header h3 {\n margin: 0;\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-dialog-close {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n font-size: var(--mj-text-base);\n transition: color var(--mj-transition-base);\n}\n\n.mj-dialog-close:hover {\n color: var(--mj-text-primary);\n}\n\n.mj-dialog-body {\n padding: 20px;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n line-height: 1.6;\n}\n\n.mj-dialog-body p {\n margin: 0;\n}\n\n.mj-dialog-footer {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n@keyframes mj-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes mj-slide-up {\n from { transform: translateY(8px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n"] }]
1188
+ args: [{ standalone: false, selector: 'mj-form-toolbar', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- ============================================\n EDIT MODE BANNER (shows above toolbar when editing)\n ============================================ -->\n@if (EditMode && Config.ShowEditBanner) {\n <div class=\"mj-forms-edit-banner\">\n @if (DirtyFieldDisplayNames.length > 0) {\n <i class=\"fa-solid fa-circle-exclamation mj-forms-edit-banner-icon--dirty\"></i>\n <span class=\"mj-forms-edit-banner-dirty\">\n <strong>{{ DirtyFieldDisplayNames.length }}</strong>\n field{{ DirtyFieldDisplayNames.length === 1 ? '' : 's' }} modified\n &mdash; {{ DirtyFieldDisplayNames.join(', ') }}\n </span>\n } @else {\n <i class=\"fa-solid fa-pen-to-square\"></i>\n <span class=\"mj-forms-edit-banner-text\">Editing: {{ RecordDisplayName }}</span>\n }\n <div class=\"mj-forms-toolbar-spacer\"></div>\n <div class=\"mj-forms-edit-banner-actions\">\n <button class=\"mj-forms-btn mj-forms-btn--primary\" (click)=\"OnSave()\" [disabled]=\"IsSaving\" title=\"Save Changes\">\n <i class=\"fa-solid fa-floppy-disk\"></i>\n <span class=\"mj-forms-btn-text\">Save Changes</span>\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnCancel()\" [disabled]=\"IsSaving\" title=\"Discard Changes\">\n <i class=\"fa-solid fa-rotate-left\"></i>\n <span class=\"mj-forms-btn-text\">Discard</span>\n </button>\n </div>\n </div>\n}\n\n<!-- ============================================\n MAIN TOOLBAR (read mode only \u2014 hidden in edit mode)\n ============================================ -->\n@if (!EditMode) {\n <div class=\"mj-forms-toolbar\" [class.mj-forms-toolbar--sticky]=\"Config.StickyToolbar\">\n\n <!-- Action buttons -->\n <div class=\"mj-forms-toolbar-group\">\n @if (Config.ShowEditButton && UserCanEdit) {\n <button class=\"mj-forms-btn\" (click)=\"OnEdit()\" title=\"Edit this Record\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n }\n @if (Config.ShowDeleteButton && UserCanDelete) {\n <button class=\"mj-forms-btn\" (click)=\"OnDeleteClick()\" title=\"Delete this Record\">\n <i class=\"fa-regular fa-trash-can\"></i>\n </button>\n }\n @if (Config.ShowFavoriteButton && FavoriteInitDone) {\n <button class=\"mj-forms-btn\" (click)=\"OnFavoriteToggle()\" [title]=\"IsFavorite ? 'Remove Favorite' : 'Make Favorite'\">\n <i [class]=\"IsFavorite ? 'fa-solid fa-star mj-icon--favorite' : 'fa-regular fa-star'\"></i>\n </button>\n }\n @if (Config.ShowHistoryButton && TracksChanges) {\n <button class=\"mj-forms-btn mj-forms-btn--history\" (click)=\"OnHistory()\"\n [title]=\"VersionCount > 0 ? VersionCount + ' version(s) tracked' : 'Record Changes'\">\n <i class=\"fa-regular fa-clock\"></i>\n @if (VersionCount > 0) {\n <span class=\"mj-version-count-badge\">v{{ VersionCount }}</span>\n }\n </button>\n }\n @if (Config.ShowListButton) {\n <button class=\"mj-forms-btn mj-forms-btn--list\" (click)=\"OnListManagement()\"\n [title]=\"ListCount > 0 ? 'Member of ' + ListCount + ' list(s)' : 'Add to a list'\">\n <i class=\"fa-regular fa-bookmark\"></i>\n @if (ListCount > 0) {\n <span class=\"mj-list-count-badge\">{{ ListCount }}</span>\n }\n </button>\n }\n @if (Config.ShowTagsButton) {\n <button class=\"mj-forms-btn\" (click)=\"OnTagsPanel()\"\n [title]=\"TagCount > 0 ? TagCount + ' tag(s)' : 'View tags'\">\n <i class=\"fa-solid fa-tags\"></i>\n @if (TagCount > 0) {\n <span class=\"mj-list-count-badge\">{{ TagCount }}</span>\n }\n </button>\n }\n\n <!-- Custom toolbar buttons -->\n @for (button of Config.CustomButtons; track button.Key) {\n @if (button.Visible !== false) {\n <button class=\"mj-forms-btn\"\n [class]=\"button.CssClass || ''\"\n [disabled]=\"button.Disabled || false\"\n [title]=\"button.Description\"\n (click)=\"OnCustomButtonClick(button)\">\n <i [class]=\"button.Icon\"></i>\n </button>\n }\n }\n </div>\n\n <!-- Separator before hierarchy -->\n @if (Config.ShowEntityHierarchy && IsInHierarchy) {\n <div class=\"mj-forms-toolbar-separator\"></div>\n }\n\n <!-- IS-A Entity Hierarchy Breadcrumb (bidirectional: Root \u2192 ... \u2192 Current \u2192 ... \u2192 Leaf) -->\n @if (Config.ShowEntityHierarchy && IsInHierarchy) {\n <div class=\"mj-entity-hierarchy\">\n <!-- Parent chain (root \u2192 ... \u2192 immediate parent) -->\n @for (parent of ParentChain; track parent.ID) {\n <a class=\"mj-entity-badge mj-entity-badge--parent\"\n [title]=\"'Navigate to parent: ' + parent.Name\"\n (click)=\"OnParentBadgeClick(parent, $event)\">\n <i class=\"fa-solid fa-arrow-up\"></i>\n {{ parent.Name }}\n </a>\n <span class=\"mj-hierarchy-arrow\"><i class=\"fa-solid fa-chevron-right\"></i></span>\n }\n\n <!-- Current entity (always shown) -->\n <span class=\"mj-entity-badge mj-entity-badge--current\">{{ EntityInfo?.Name }}</span>\n\n <!-- Descendant tree (recursive: inline for single paths, branching for multiple) -->\n @if (DescendantTree.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: DescendantTree }\"></ng-container>\n }\n </div>\n }\n\n <!-- Spacer pushes section controls to the right -->\n <div class=\"mj-forms-toolbar-spacer\"></div>\n\n <!-- Form-variant picker: right-side toolbar button. Opens a dropdown\n with the Default (CodeGen Angular) form + every variant the host\n supplied. Persists the user's pick via the host's resolver (which\n goes through UserInfoEngine settings, not localStorage). Hidden\n entirely when the host disables ShowFormVariantPicker or supplied\n fewer than 2 variants. -->\n @if (ShowVariantPickerButton) {\n <div class=\"mj-form-variant-picker-host\"\n [class.open]=\"VariantMenuOpen\">\n <button class=\"mj-forms-btn mj-form-variant-picker-trigger\"\n type=\"button\"\n (click)=\"ToggleVariantMenu()\"\n (blur)=\"CloseVariantMenu()\"\n [title]=\"'Form variant: ' + CurrentVariantLabel + ' \u2014 click to change'\">\n <i class=\"fa-solid fa-pen-ruler\"></i>\n <span class=\"mj-form-variant-picker-current-label\">{{ CurrentVariantLabel }}</span>\n <i class=\"fa-solid fa-chevron-down chev\"></i>\n </button>\n @if (VariantMenuOpen) {\n <div class=\"mj-form-variant-picker-menu\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"$event.stopPropagation()\">\n <div class=\"mj-form-variant-picker-row mj-form-variant-picker-default\"\n [class.current]=\"!CurrentVariantID\"\n (click)=\"OnVariantClick(null)\">\n <div class=\"mj-form-variant-picker-row-main\">\n <span class=\"mj-form-variant-picker-row-title\">\n Default form <span class=\"mj-form-variant-picker-default-tag\">(default)</span>\n </span>\n <span class=\"mj-form-variant-picker-row-sub\">CodeGen-generated Angular fallback</span>\n </div>\n @if (!CurrentVariantID) {\n <i class=\"fa-solid fa-check mj-form-variant-picker-check\"></i>\n }\n </div>\n @for (v of Variants; track v.ID) {\n <div class=\"mj-form-variant-picker-row\"\n [class.current]=\"v.ID === CurrentVariantID\"\n [class.inactive]=\"v.Status !== 'Active'\"\n (click)=\"OnVariantClick(v.ID)\">\n <div class=\"mj-form-variant-picker-row-main\">\n <span class=\"mj-form-variant-picker-row-title\">{{ v.Label }}</span>\n <span class=\"mj-form-variant-picker-row-sub\">{{ VariantSubtitle(v) }}</span>\n </div>\n @if (v.ID === CurrentVariantID) {\n <i class=\"fa-solid fa-check mj-form-variant-picker-check\"></i>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Section Controls -->\n @if (Config.ShowSectionControls) {\n <div class=\"mj-forms-toolbar-group mj-section-controls\">\n @if (Config.ShowSectionFilter) {\n <div class=\"mj-forms-search-wrapper\">\n <input type=\"text\"\n class=\"mj-section-search\"\n [class.mj-section-search--active]=\"SearchFilter\"\n [value]=\"SearchFilter\"\n (input)=\"OnFilterInput($event)\"\n placeholder=\"Search sections...\">\n @if (SearchFilter) {\n <button class=\"mj-clear-search\" (click)=\"OnClearFilter()\" title=\"Clear search\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n }\n @if (Config.ShowExpandCollapseAllButtons) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n [disabled]=\"ExpandedSectionCount >= VisibleSectionCount\"\n (click)=\"OnExpandAll()\" title=\"Expand all sections\">\n <i class=\"fa-solid fa-angles-down\"></i>\n </button>\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n [disabled]=\"ExpandedSectionCount === 0\"\n (click)=\"OnCollapseAll()\" title=\"Collapse all sections\">\n <i class=\"fa-solid fa-angles-up\"></i>\n </button>\n }\n @if (HasCustomSectionOrder) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\" (click)=\"OnResetSectionOrder()\" title=\"Reset section order\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i>\n </button>\n }\n @if (Config.ShowSectionManager) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n (click)=\"OnManageSections()\" title=\"Manage section order\">\n <i class=\"fa-solid fa-bars-staggered\"></i>\n </button>\n }\n @if (Config.ShowWidthToggle) {\n <button class=\"mj-forms-btn mj-forms-btn--ghost mj-forms-btn--icon-only\"\n (click)=\"OnToggleWidthMode()\"\n [title]=\"WidthMode === 'centered' ? 'Expand to full width' : 'Center content'\">\n <i [class]=\"WidthMode === 'centered' ? 'fa-solid fa-arrows-left-right-to-line' : 'fa-solid fa-compress'\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Additional actions slot -->\n @if (AdditionalActionsTemplate) {\n <ng-container [ngTemplateOutlet]=\"AdditionalActionsTemplate\"></ng-container>\n }\n <ng-content select=\"[toolbar-additional-controls]\"></ng-content>\n </div>\n}\n\n<!-- ============================================\n DISCARD CHANGES CONFIRMATION DIALOG\n ============================================ -->\n@if (ShowDiscardDialog) {\n <div class=\"mj-dialog-overlay\" (click)=\"OnDiscardCancel()\">\n <div class=\"mj-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-dialog-header\">\n <h3>Discard Changes?</h3>\n <button class=\"mj-dialog-close\" (click)=\"OnDiscardCancel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-dialog-body\">\n <p>You have <strong>{{ DirtyFieldDisplayNames.length }}</strong> unsaved change{{ DirtyFieldDisplayNames.length === 1 ? '' : 's' }}. Are you sure you want to discard {{ DirtyFieldDisplayNames.length === 1 ? 'it' : 'them' }}?</p>\n </div>\n <div class=\"mj-dialog-footer\">\n <button class=\"mj-forms-btn mj-forms-btn--danger\" (click)=\"OnDiscardConfirm()\">\n <i class=\"fa-solid fa-rotate-left\"></i>\n Discard Changes\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnDiscardCancel()\">\n Keep Editing\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- ============================================\n DELETE CONFIRMATION DIALOG\n ============================================ -->\n@if (ShowDeleteDialog) {\n <div class=\"mj-dialog-overlay\" (click)=\"OnDeleteCancel()\">\n <div class=\"mj-dialog\" (click)=\"$event.stopPropagation()\">\n <div class=\"mj-dialog-header\">\n <h3>Confirm Deletion</h3>\n <button class=\"mj-dialog-close\" (click)=\"OnDeleteCancel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"mj-dialog-body\">\n <p>Are you sure you want to delete this record? This action cannot be undone.</p>\n </div>\n <div class=\"mj-dialog-footer\">\n <button class=\"mj-forms-btn mj-forms-btn--danger\" (click)=\"OnDeleteConfirm()\">\n <i class=\"fa-solid fa-trash-can\"></i>\n Delete\n </button>\n <button class=\"mj-forms-btn\" (click)=\"OnDeleteCancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n}\n\n<!-- Recursive template for IS-A descendant tree rendering.\n Single child at a level \u2192 inline with chevron.\n Multiple children at a level \u2192 tree branch with CSS connector lines. -->\n<ng-template #descendantTreeTpl let-items=\"items\">\n @if (items.length === 1) {\n <span class=\"mj-hierarchy-arrow\"><i class=\"fa-solid fa-chevron-right\"></i></span>\n <a class=\"mj-entity-badge mj-entity-badge--child\"\n [title]=\"'Navigate to: ' + items[0].EntityName\"\n (click)=\"OnDescendantBadgeClick(items[0].EntityName, $event)\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n {{ items[0].EntityName }}\n </a>\n @if (items[0].Children.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: items[0].Children }\"></ng-container>\n }\n } @else if (items.length > 1) {\n <div class=\"mj-descendant-chains\">\n @for (item of items; track item.EntityName) {\n <div class=\"mj-descendant-chain\">\n <a class=\"mj-entity-badge mj-entity-badge--child\"\n [title]=\"'Navigate to: ' + item.EntityName\"\n (click)=\"OnDescendantBadgeClick(item.EntityName, $event)\">\n <i class=\"fa-solid fa-arrow-down\"></i>\n {{ item.EntityName }}\n </a>\n @if (item.Children.length > 0) {\n <ng-container [ngTemplateOutlet]=\"descendantTreeTpl\"\n [ngTemplateOutletContext]=\"{ items: item.Children }\"></ng-container>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n", styles: ["/* ============================================\n FORM TOOLBAR \u2014 uses global --mj-* design tokens\n ============================================ */\n:host {\n display: block;\n}\n\n/* ============================================\n EDIT BANNER\n ============================================ */\n.mj-forms-edit-banner {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 16px 16px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-bottom: 2px solid var(--mj-brand-primary);\n font-size: 13px;\n color: var(--mj-brand-primary);\n font-weight: var(--mj-font-medium);\n}\n\n.mj-forms-edit-banner > i {\n font-size: var(--mj-text-sm);\n}\n\n.mj-forms-edit-banner-icon--dirty {\n color: var(--mj-status-warning);\n font-size: var(--mj-text-base);\n}\n\n.mj-forms-edit-banner-text {\n font-size: var(--mj-text-sm);\n}\n\n.mj-forms-edit-banner-dirty {\n font-size: var(--mj-text-sm);\n color: var(--mj-text-primary);\n}\n\n.mj-forms-edit-banner-dirty strong {\n color: var(--mj-status-warning);\n font-weight: var(--mj-font-bold);\n}\n\n.mj-forms-edit-banner-actions {\n display: flex;\n gap: 8px;\n}\n\n/* ============================================\n MAIN TOOLBAR\n ============================================ */\n.mj-forms-toolbar {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 22px 16px;\n background: var(--mj-bg-surface-card);\n border-bottom: 2px solid var(--mj-border-default);\n flex-wrap: wrap;\n z-index: 40;\n}\n\n.mj-forms-toolbar--sticky {\n position: sticky;\n top: 0;\n}\n\n.mj-forms-toolbar--disabled {\n pointer-events: none;\n opacity: 0.7;\n}\n\n.mj-forms-toolbar-group {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.mj-forms-toolbar-separator {\n width: 1px;\n height: 24px;\n background: var(--mj-border-default);\n margin: 0 4px;\n}\n\n.mj-forms-toolbar-spacer {\n flex: 1;\n}\n\n/* ============================================\n BUTTONS\n ============================================ */\n.mj-forms-btn {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n font-size: 13px;\n font-weight: var(--mj-font-medium);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all var(--mj-transition-base) ease;\n white-space: nowrap;\n font-family: inherit;\n line-height: 1;\n}\n\n.mj-forms-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.mj-forms-btn:active {\n transform: translateY(0);\n box-shadow: none;\n}\n\n.mj-forms-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.mj-forms-btn i {\n font-size: 15px;\n line-height: 1;\n}\n\n.mj-forms-btn--primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-forms-btn--primary:hover {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n}\n\n.mj-forms-btn--danger {\n color: var(--mj-status-error);\n border-color: color-mix(in srgb, var(--mj-status-error) 30%, transparent);\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n}\n\n.mj-forms-btn--danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n}\n\n.mj-forms-btn--ghost {\n border-color: transparent;\n background: transparent;\n}\n\n.mj-forms-btn--ghost:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-color: transparent;\n}\n\n.mj-forms-btn--icon-only {\n padding: 7px 9px;\n}\n\n.mj-forms-btn--sm {\n padding: 5px 12px;\n font-size: var(--mj-text-xs);\n}\n\n.mj-forms-btn--sm i {\n font-size: var(--mj-text-xs);\n}\n\n.mj-forms-btn-text {\n margin-left: 2px;\n}\n\n.mj-icon--favorite {\n color: var(--mj-status-warning);\n}\n\n/* List button with count badge */\n.mj-forms-btn--list {\n position: relative;\n}\n\n/* History button with version badge */\n.mj-forms-btn--history {\n position: relative;\n}\n\n.mj-version-count-badge {\n position: absolute;\n top: -6px;\n right: -10px;\n padding: 0 5px;\n font-size: 10px;\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-inverse);\n background: linear-gradient(135deg, var(--mj-status-success) 0%, color-mix(in srgb, var(--mj-status-success) 85%, black) 100%);\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n height: 16px;\n border: 2px solid var(--mj-bg-surface-card);\n white-space: nowrap;\n line-height: 1;\n}\n\n.mj-list-count-badge {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n font-size: 10px;\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-inverse);\n background: linear-gradient(135deg, var(--mj-status-info) 0%, color-mix(in srgb, var(--mj-status-info) 85%, black) 100%);\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--mj-bg-surface-card);\n}\n\n/* ============================================\n IS-A ENTITY HIERARCHY\n ============================================ */\n.mj-entity-hierarchy {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.mj-entity-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 10px;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-semibold);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all var(--mj-transition-base) ease;\n text-decoration: none;\n border: 1px solid transparent;\n}\n\n.mj-entity-badge i {\n font-size: 11px;\n}\n\n.mj-entity-badge--parent {\n background: color-mix(in srgb, var(--mj-color-indigo-500) 10%, var(--mj-bg-surface));\n color: var(--mj-color-indigo-500);\n border-color: color-mix(in srgb, var(--mj-color-indigo-500) 25%, transparent);\n}\n\n.mj-entity-badge--parent:hover {\n background: color-mix(in srgb, var(--mj-color-indigo-500) 18%, var(--mj-bg-surface));\n border-color: var(--mj-color-indigo-500);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--mj-color-indigo-500) 15%, transparent);\n}\n\n.mj-entity-badge--current {\n font-weight: var(--mj-font-semibold);\n font-size: 13px;\n color: var(--mj-text-primary);\n padding: 4px 8px;\n background: var(--mj-bg-surface-hover);\n border-radius: var(--mj-radius-sm);\n cursor: default;\n}\n\n.mj-entity-badge--child {\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n border-color: color-mix(in srgb, var(--mj-status-info) 25%, transparent);\n}\n\n.mj-entity-badge--child:hover {\n background: color-mix(in srgb, var(--mj-status-info) 18%, var(--mj-bg-surface));\n border-color: var(--mj-status-info);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--mj-status-info) 15%, transparent);\n}\n\n.mj-entity-badge--overlapping {\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n color: color-mix(in srgb, var(--mj-status-warning) 85%, black);\n border-color: color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n}\n\n.mj-entity-badge--overlapping:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 18%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-warning) 85%, black);\n box-shadow: 0 2px 6px color-mix(in srgb, var(--mj-status-warning) 15%, transparent);\n}\n\n.mj-entity-badge-group {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n flex-wrap: wrap;\n}\n\n.mj-child-count {\n background: var(--mj-status-info);\n color: var(--mj-text-inverse);\n font-size: 10px;\n padding: 1px 5px;\n border-radius: var(--mj-radius-full);\n font-weight: var(--mj-font-bold);\n}\n\n.mj-entity-badge--leaf {\n border-style: dashed;\n}\n\n.mj-entity-badge--root {\n border-style: dashed;\n}\n\n.mj-hierarchy-arrow {\n color: var(--mj-text-muted);\n font-size: 10px;\n}\n\n/* Descendant chain tree (connecting lines when multiple chains branch) */\n.mj-descendant-chains {\n display: flex;\n flex-direction: column;\n gap: 6px;\n position: relative;\n padding-left: 20px;\n}\n\n/* Horizontal connector from parent entity badge to tree trunk */\n.mj-descendant-chains::before {\n content: '';\n position: absolute;\n left: -4px;\n top: 50%;\n width: 4px;\n border-top: 1.5px solid var(--mj-text-muted);\n}\n\n.mj-descendant-chain {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n position: relative;\n padding: 2px 0;\n}\n\n/* Horizontal branch line from trunk to chain content */\n.mj-descendant-chain::before {\n content: '';\n position: absolute;\n left: -20px;\n top: 50%;\n width: 18px;\n border-top: 1.5px solid var(--mj-text-muted);\n}\n\n/* Vertical trunk segment (each chain draws its portion) */\n.mj-descendant-chain::after {\n content: '';\n position: absolute;\n left: -20px;\n top: 0;\n bottom: 0;\n border-left: 1.5px solid var(--mj-text-muted);\n}\n\n/* First chain: trunk starts from center */\n.mj-descendant-chain:first-child::after {\n top: 50%;\n}\n\n/* Last chain: trunk ends at center */\n.mj-descendant-chain:last-child::after {\n bottom: 50%;\n}\n\n/* (dirty summary removed \u2014 now inline in edit banner) */\n\n/* ============================================\n SECTION CONTROLS\n ============================================ */\n.mj-section-controls {\n gap: 6px;\n}\n\n.mj-forms-search-wrapper {\n position: relative;\n display: inline-flex;\n align-items: center;\n}\n\n.mj-section-search {\n max-width: 180px;\n font-size: 13px;\n padding: 6px 28px 6px 8px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n outline: none;\n font-family: inherit;\n transition: all var(--mj-transition-base);\n}\n\n.mj-section-search:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n/* Active filter highlight \u2014 matches the yellow used on matched panel/field names */\n.mj-section-search--active {\n background-color: color-mix(in srgb, var(--mj-status-warning) 40%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n color: color-mix(in srgb, var(--mj-status-warning) 80%, black);\n font-weight: var(--mj-font-semibold);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-status-warning) 25%, transparent);\n}\n\n.mj-section-search::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.mj-clear-search {\n position: absolute;\n right: 4px;\n padding: 4px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: var(--mj-text-xs);\n line-height: 1;\n}\n\n.mj-clear-search:hover {\n color: var(--mj-text-secondary);\n}\n\n/* ============================================\n DIALOG (lightweight inline)\n ============================================ */\n.mj-dialog-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n animation: mj-fade-in 150ms ease;\n}\n\n.mj-dialog {\n background: var(--mj-bg-surface-card);\n border-radius: var(--mj-radius-lg);\n box-shadow: var(--mj-shadow-lg);\n min-width: 400px;\n max-width: 550px;\n animation: mj-slide-up 200ms ease;\n}\n\n.mj-dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.mj-dialog-header h3 {\n margin: 0;\n font-size: var(--mj-text-base);\n font-weight: var(--mj-font-semibold);\n}\n\n.mj-dialog-close {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n font-size: var(--mj-text-base);\n transition: color var(--mj-transition-base);\n}\n\n.mj-dialog-close:hover {\n color: var(--mj-text-primary);\n}\n\n.mj-dialog-body {\n padding: 20px;\n font-size: var(--mj-text-sm);\n color: var(--mj-text-secondary);\n line-height: 1.6;\n}\n\n.mj-dialog-body p {\n margin: 0;\n}\n\n.mj-dialog-footer {\n display: flex;\n gap: 8px;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n@keyframes mj-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes mj-slide-up {\n from { transform: translateY(8px); opacity: 0; }\n to { transform: translateY(0); opacity: 1; }\n}\n\n/* ============================================================ */\n/* FORM-VARIANT PICKER (toolbar-embedded; right-side) */\n/* ============================================================ */\n\n.mj-form-variant-picker-host {\n position: relative;\n display: inline-flex;\n}\n\n.mj-form-variant-picker-trigger {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n max-width: 240px;\n}\n\n.mj-form-variant-picker-trigger .chev {\n font-size: 10px;\n opacity: 0.7;\n}\n\n.mj-form-variant-picker-current-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 160px;\n font-size: 12px;\n font-weight: 500;\n}\n\n.mj-form-variant-picker-host.open .mj-form-variant-picker-trigger {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-focus);\n}\n\n.mj-form-variant-picker-menu {\n position: absolute;\n top: calc(100% + 4px);\n right: 0;\n z-index: 50;\n min-width: 280px;\n max-height: 360px;\n overflow-y: auto;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n padding: 4px 0;\n}\n\n.mj-form-variant-picker-row {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px 12px;\n cursor: pointer;\n color: var(--mj-text-primary);\n font-size: 13px;\n transition: background 120ms;\n}\n\n.mj-form-variant-picker-row:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-form-variant-picker-row.current {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-form-variant-picker-row.inactive {\n opacity: 0.6;\n}\n\n.mj-form-variant-picker-row-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.mj-form-variant-picker-row-title {\n font-weight: 600;\n}\n\n.mj-form-variant-picker-row-sub {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.mj-form-variant-picker-default-tag {\n font-size: 10px;\n font-weight: 500;\n color: var(--mj-text-muted);\n margin-left: 4px;\n}\n\n.mj-form-variant-picker-default {\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.mj-form-variant-picker-check {\n color: var(--mj-brand-primary);\n font-size: 12px;\n margin-top: 2px;\n}\n"] }]
1037
1189
  }], null, { Form: [{
1038
1190
  type: Input
1039
1191
  }], _deprecatedForm: [{
@@ -1085,6 +1237,10 @@ export class MjFormToolbarComponent {
1085
1237
  type: Input
1086
1238
  }], AdditionalActionsTemplate: [{
1087
1239
  type: Input
1240
+ }], Variants: [{
1241
+ type: Input
1242
+ }], CurrentVariantID: [{
1243
+ type: Input
1088
1244
  }], Navigate: [{
1089
1245
  type: Output
1090
1246
  }], EditModeChange: [{
@@ -1115,6 +1271,8 @@ export class MjFormToolbarComponent {
1115
1271
  type: Output
1116
1272
  }], ShowChangesRequested: [{
1117
1273
  type: Output
1274
+ }], VariantPicked: [{
1275
+ type: Output
1118
1276
  }], CustomButtonClick: [{
1119
1277
  type: Output
1120
1278
  }], FilterChange: [{
@@ -1132,5 +1290,5 @@ export class MjFormToolbarComponent {
1132
1290
  }], ManageSectionsRequested: [{
1133
1291
  type: Output
1134
1292
  }] }); })();
1135
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjFormToolbarComponent, { className: "MjFormToolbarComponent", filePath: "src/lib/toolbar/form-toolbar.component.ts", lineNumber: 46 }); })();
1293
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjFormToolbarComponent, { className: "MjFormToolbarComponent", filePath: "src/lib/toolbar/form-toolbar.component.ts", lineNumber: 47 }); })();
1136
1294
  //# sourceMappingURL=form-toolbar.component.js.map