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

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 (65) hide show
  1. package/dist/lib/base-form-component.d.ts +23 -0
  2. package/dist/lib/base-form-component.d.ts.map +1 -1
  3. package/dist/lib/base-form-component.js +56 -13
  4. package/dist/lib/base-form-component.js.map +1 -1
  5. package/dist/lib/chrome/form-chrome-rail-pref.d.ts +22 -0
  6. package/dist/lib/chrome/form-chrome-rail-pref.d.ts.map +1 -1
  7. package/dist/lib/chrome/form-chrome-rail-pref.js +29 -0
  8. package/dist/lib/chrome/form-chrome-rail-pref.js.map +1 -1
  9. package/dist/lib/chrome/form-chrome.d.ts +19 -0
  10. package/dist/lib/chrome/form-chrome.d.ts.map +1 -1
  11. package/dist/lib/chrome/form-chrome.js +26 -0
  12. package/dist/lib/chrome/form-chrome.js.map +1 -1
  13. package/dist/lib/container/record-form-container.component.d.ts +52 -2
  14. package/dist/lib/container/record-form-container.component.d.ts.map +1 -1
  15. package/dist/lib/container/record-form-container.component.js +485 -161
  16. package/dist/lib/container/record-form-container.component.js.map +1 -1
  17. package/dist/lib/explorer-entity-data-grid.component.d.ts +36 -0
  18. package/dist/lib/explorer-entity-data-grid.component.d.ts.map +1 -1
  19. package/dist/lib/explorer-entity-data-grid.component.js +112 -3
  20. package/dist/lib/explorer-entity-data-grid.component.js.map +1 -1
  21. package/dist/lib/field/form-field.component.d.ts +128 -0
  22. package/dist/lib/field/form-field.component.d.ts.map +1 -1
  23. package/dist/lib/field/form-field.component.js +871 -306
  24. package/dist/lib/field/form-field.component.js.map +1 -1
  25. package/dist/lib/isa-related-panel/isa-related-card.component.d.ts.map +1 -1
  26. package/dist/lib/isa-related-panel/isa-related-card.component.js +7 -1
  27. package/dist/lib/isa-related-panel/isa-related-card.component.js.map +1 -1
  28. package/dist/lib/overlays/base-form-overlay.d.ts.map +1 -1
  29. package/dist/lib/overlays/base-form-overlay.js +3 -1
  30. package/dist/lib/overlays/base-form-overlay.js.map +1 -1
  31. package/dist/lib/overlays/form-slide-in.component.js +10 -11
  32. package/dist/lib/overlays/form-slide-in.component.js.map +1 -1
  33. package/dist/lib/panel/collapsible-panel.component.d.ts +94 -3
  34. package/dist/lib/panel/collapsible-panel.component.d.ts.map +1 -1
  35. package/dist/lib/panel/collapsible-panel.component.js +278 -37
  36. package/dist/lib/panel/collapsible-panel.component.js.map +1 -1
  37. package/dist/lib/panel-slot/base-form-panel.d.ts +12 -0
  38. package/dist/lib/panel-slot/base-form-panel.d.ts.map +1 -1
  39. package/dist/lib/panel-slot/base-form-panel.js.map +1 -1
  40. package/dist/lib/related-grid-height.d.ts +48 -11
  41. package/dist/lib/related-grid-height.d.ts.map +1 -1
  42. package/dist/lib/related-grid-height.js +53 -12
  43. package/dist/lib/related-grid-height.js.map +1 -1
  44. package/dist/lib/section-indicators/form-section-indicator-coordinator.service.d.ts +80 -0
  45. package/dist/lib/section-indicators/form-section-indicator-coordinator.service.d.ts.map +1 -0
  46. package/dist/lib/section-indicators/form-section-indicator-coordinator.service.js +99 -0
  47. package/dist/lib/section-indicators/form-section-indicator-coordinator.service.js.map +1 -0
  48. package/dist/lib/section-indicators/form-section-indicators.d.ts +97 -0
  49. package/dist/lib/section-indicators/form-section-indicators.d.ts.map +1 -0
  50. package/dist/lib/section-indicators/form-section-indicators.js +132 -0
  51. package/dist/lib/section-indicators/form-section-indicators.js.map +1 -0
  52. package/dist/lib/section-manager/section-manager.component.js +2 -2
  53. package/dist/lib/section-manager/section-manager.component.js.map +1 -1
  54. package/dist/lib/toolbar/form-toolbar.component.d.ts +9 -1
  55. package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -1
  56. package/dist/lib/toolbar/form-toolbar.component.js +14 -6
  57. package/dist/lib/toolbar/form-toolbar.component.js.map +1 -1
  58. package/dist/lib/types/form-types.d.ts +8 -0
  59. package/dist/lib/types/form-types.d.ts.map +1 -1
  60. package/dist/lib/types/form-types.js.map +1 -1
  61. package/dist/public-api.d.ts +2 -0
  62. package/dist/public-api.d.ts.map +1 -1
  63. package/dist/public-api.js +3 -0
  64. package/dist/public-api.js.map +1 -1
  65. package/package.json +25 -27
@@ -1,8 +1,8 @@
1
1
  import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject, ElementRef, Renderer2 } from '@angular/core';
2
2
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
- import { EntityFieldTSType, CompositeKey, KeyValuePair, RunView } from '@memberjunction/core';
3
+ import { EntityFieldTSType, CompositeKey, KeyValuePair, RunView, CoerceImageSrc, IsInlineImageDataUri, CoerceRawImageBase64ToDataUri, MaxStoredImageChars, MaxInlineImageBytes, FormatByteSize, ParseCssHexColor, PrettyPrintJson } from '@memberjunction/core';
4
4
  import { BaseEngineRegistry } from '@memberjunction/core';
5
- import { HighlightSearchMatches, detectRichTextFormat, UUIDsEqual } from '@memberjunction/global';
5
+ import { ValidationErrorInfo, HighlightSearchMatches, detectRichTextFormat, UUIDsEqual } from '@memberjunction/global';
6
6
  import { FormatFKCell, FilterCachedFKRows } from './fk-search-utils';
7
7
  import { LinkedFieldOptionsStore } from './linked-field-options';
8
8
  import * as i0 from "@angular/core";
@@ -15,14 +15,14 @@ const _forTrack0 = ($index, $item) => $item.FieldName;
15
15
  const _forTrack1 = ($index, $item) => $item.PrimaryKeyValue;
16
16
  const _forTrack2 = ($index, $item) => $item.Message;
17
17
  function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
18
- i0.ɵɵelement(0, "label", 4);
18
+ i0.ɵɵelement(0, "label", 5);
19
19
  } if (rf & 2) {
20
20
  const ctx_r0 = i0.ɵɵnextContext(3);
21
21
  i0.ɵɵproperty("innerHTML", ctx_r0.HighlightedDisplayName, i0.ɵɵsanitizeHtml);
22
22
  } }
23
23
  function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
24
24
  const _r2 = i0.ɵɵgetCurrentView();
25
- i0.ɵɵelementStart(0, "a", 8);
25
+ i0.ɵɵelementStart(0, "a", 12);
26
26
  i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Conditional_1_Template_a_click_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnRecordLinkClick($event)); });
27
27
  i0.ɵɵtext(1);
28
28
  i0.ɵɵelementEnd();
@@ -38,101 +38,171 @@ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Conditio
38
38
  i0.ɵɵtextInterpolate1(" ", ctx_r0.FKDisplayName, " ");
39
39
  } }
40
40
  function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Template(rf, ctx) { if (rf & 1) {
41
- i0.ɵɵelementStart(0, "span", 6);
42
- i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Conditional_1_Template, 2, 1, "a", 7)(2, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Conditional_2_Template, 1, 1);
41
+ i0.ɵɵelementStart(0, "span", 7);
42
+ i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Conditional_1_Template, 2, 1, "a", 11)(2, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Conditional_2_Template, 1, 1);
43
43
  i0.ɵɵelementEnd();
44
44
  } if (rf & 2) {
45
45
  const ctx_r0 = i0.ɵɵnextContext(3);
46
46
  i0.ɵɵadvance();
47
47
  i0.ɵɵconditional(ctx_r0.RecordLinksEnabled ? 1 : 2);
48
48
  } }
49
- function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_0_Template(rf, ctx) { if (rf & 1) {
49
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
50
+ i0.ɵɵelement(0, "img", 13);
51
+ } if (rf & 2) {
52
+ const ctx_r0 = i0.ɵɵnextContext(4);
53
+ i0.ɵɵproperty("src", ctx_r0.ImagePreviewSrc, i0.ɵɵsanitizeUrl);
54
+ } }
55
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
56
+ i0.ɵɵelementStart(0, "span", 14);
57
+ i0.ɵɵtext(1);
58
+ i0.ɵɵelementEnd();
59
+ } if (rf & 2) {
60
+ const ctx_r0 = i0.ɵɵnextContext(4);
61
+ i0.ɵɵadvance();
62
+ i0.ɵɵtextInterpolate1("Inline image (", ctx_r0.ImageValueSizeLabel, ")");
63
+ } }
64
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_3_Template(rf, ctx) { if (rf & 1) {
50
65
  const _r3 = i0.ɵɵgetCurrentView();
51
- i0.ɵɵelementStart(0, "span", 6)(1, "a", 9);
52
- i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_0_Template_a_click_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnEmailLinkClick($event)); });
66
+ i0.ɵɵelementStart(0, "a", 16);
67
+ i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_3_Template_a_click_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnUrlLinkClick($event)); });
68
+ i0.ɵɵtext(1);
69
+ i0.ɵɵelement(2, "i", 17);
70
+ i0.ɵɵelementEnd();
71
+ } if (rf & 2) {
72
+ const ctx_r0 = i0.ɵɵnextContext(4);
73
+ i0.ɵɵadvance();
74
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.ImageUrlDisplay, " ");
75
+ } }
76
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_4_Template(rf, ctx) { if (rf & 1) {
77
+ i0.ɵɵelementStart(0, "span", 7);
78
+ i0.ɵɵtext(1);
79
+ i0.ɵɵelementEnd();
80
+ } if (rf & 2) {
81
+ const ctx_r0 = i0.ɵɵnextContext(4);
82
+ i0.ɵɵadvance();
83
+ i0.ɵɵtextInterpolate(ctx_r0.FormatValue());
84
+ } }
85
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Template(rf, ctx) { if (rf & 1) {
86
+ i0.ɵɵelementStart(0, "div", 8);
87
+ i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_1_Template, 1, 1, "img", 13);
88
+ i0.ɵɵconditionalCreate(2, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_2_Template, 2, 1, "span", 14)(3, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_3_Template, 3, 1, "a", 15)(4, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Conditional_4_Template, 2, 1, "span", 7);
89
+ i0.ɵɵelementEnd();
90
+ } if (rf & 2) {
91
+ const ctx_r0 = i0.ɵɵnextContext(3);
92
+ i0.ɵɵadvance();
93
+ i0.ɵɵconditional(ctx_r0.ImagePreviewSrc ? 1 : -1);
94
+ i0.ɵɵadvance();
95
+ i0.ɵɵconditional(ctx_r0.IsInlineImageValue ? 2 : ctx_r0.ImagePreviewSrc ? 3 : 4);
96
+ } }
97
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_5_Template(rf, ctx) { if (rf & 1) {
98
+ i0.ɵɵelementStart(0, "div", 9);
99
+ i0.ɵɵelement(1, "span", 18);
100
+ i0.ɵɵelementStart(2, "span", 7);
101
+ i0.ɵɵtext(3);
102
+ i0.ɵɵelementEnd()();
103
+ } if (rf & 2) {
104
+ const ctx_r0 = i0.ɵɵnextContext(3);
105
+ i0.ɵɵadvance();
106
+ i0.ɵɵstyleProp("background-color", ctx_r0.ColorSwatchValue);
107
+ i0.ɵɵadvance(2);
108
+ i0.ɵɵtextInterpolate(ctx_r0.FormatValue());
109
+ } }
110
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_6_Template(rf, ctx) { if (rf & 1) {
111
+ i0.ɵɵelementStart(0, "pre", 10);
112
+ i0.ɵɵtext(1);
113
+ i0.ɵɵelementEnd();
114
+ } if (rf & 2) {
115
+ const ctx_r0 = i0.ɵɵnextContext(3);
116
+ i0.ɵɵadvance();
117
+ i0.ɵɵtextInterpolate(ctx_r0.JsonDisplayValue);
118
+ } }
119
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_0_Template(rf, ctx) { if (rf & 1) {
120
+ const _r4 = i0.ɵɵgetCurrentView();
121
+ i0.ɵɵelementStart(0, "span", 7)(1, "a", 19);
122
+ i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_0_Template_a_click_1_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnEmailLinkClick($event)); });
53
123
  i0.ɵɵtext(2);
54
- i0.ɵɵelement(3, "i", 10);
124
+ i0.ɵɵelement(3, "i", 20);
55
125
  i0.ɵɵelementEnd()();
56
126
  } if (rf & 2) {
57
127
  const ctx_r0 = i0.ɵɵnextContext(4);
58
128
  i0.ɵɵadvance(2);
59
129
  i0.ɵɵtextInterpolate1(" ", ctx_r0.FormatValue(), " ");
60
130
  } }
61
- function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_1_Template(rf, ctx) { if (rf & 1) {
62
- const _r4 = i0.ɵɵgetCurrentView();
63
- i0.ɵɵelementStart(0, "span", 6)(1, "a", 11);
64
- i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_1_Template_a_click_1_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnUrlLinkClick($event)); });
131
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_1_Template(rf, ctx) { if (rf & 1) {
132
+ const _r5 = i0.ɵɵgetCurrentView();
133
+ i0.ɵɵelementStart(0, "span", 7)(1, "a", 21);
134
+ i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_1_Template_a_click_1_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnUrlLinkClick($event)); });
65
135
  i0.ɵɵtext(2);
66
- i0.ɵɵelement(3, "i", 12);
136
+ i0.ɵɵelement(3, "i", 17);
67
137
  i0.ɵɵelementEnd()();
68
138
  } if (rf & 2) {
69
139
  const ctx_r0 = i0.ɵɵnextContext(4);
70
140
  i0.ɵɵadvance(2);
71
141
  i0.ɵɵtextInterpolate1(" ", ctx_r0.FormatValue(), " ");
72
142
  } }
73
- function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
74
- const _r5 = i0.ɵɵgetCurrentView();
75
- i0.ɵɵelementStart(0, "a", 14);
76
- i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_2_Conditional_1_Template_a_click_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnRecordLinkClick($event)); });
143
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
144
+ const _r6 = i0.ɵɵgetCurrentView();
145
+ i0.ɵɵelementStart(0, "a", 23);
146
+ i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_2_Conditional_1_Template_a_click_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnRecordLinkClick($event)); });
77
147
  i0.ɵɵtext(1);
78
- i0.ɵɵelement(2, "i", 12);
148
+ i0.ɵɵelement(2, "i", 17);
79
149
  i0.ɵɵelementEnd();
80
150
  } if (rf & 2) {
81
151
  const ctx_r0 = i0.ɵɵnextContext(5);
82
152
  i0.ɵɵadvance();
83
153
  i0.ɵɵtextInterpolate1(" ", ctx_r0.FormatValue(), " ");
84
154
  } }
85
- function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
155
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
86
156
  i0.ɵɵtext(0);
87
157
  } if (rf & 2) {
88
158
  const ctx_r0 = i0.ɵɵnextContext(5);
89
159
  i0.ɵɵtextInterpolate1(" ", ctx_r0.FormatValue(), " ");
90
160
  } }
91
- function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_2_Template(rf, ctx) { if (rf & 1) {
92
- i0.ɵɵelementStart(0, "span", 6);
93
- i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_2_Conditional_1_Template, 3, 1, "a", 13)(2, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_2_Conditional_2_Template, 1, 1);
161
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_2_Template(rf, ctx) { if (rf & 1) {
162
+ i0.ɵɵelementStart(0, "span", 7);
163
+ i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_2_Conditional_1_Template, 3, 1, "a", 22)(2, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_2_Conditional_2_Template, 1, 1);
94
164
  i0.ɵɵelementEnd();
95
165
  } if (rf & 2) {
96
166
  const ctx_r0 = i0.ɵɵnextContext(4);
97
167
  i0.ɵɵadvance();
98
168
  i0.ɵɵconditional(ctx_r0.RecordLinksEnabled ? 1 : 2);
99
169
  } }
100
- function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
101
- i0.ɵɵelementStart(0, "span", 6)(1, "div", 19);
102
- i0.ɵɵelement(2, "input", 20);
170
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
171
+ i0.ɵɵelementStart(0, "span", 7)(1, "div", 28);
172
+ i0.ɵɵelement(2, "input", 29);
103
173
  i0.ɵɵelementEnd()();
104
174
  } if (rf & 2) {
105
175
  const ctx_r0 = i0.ɵɵnextContext(5);
106
176
  i0.ɵɵadvance(2);
107
177
  i0.ɵɵproperty("checked", !!ctx_r0.Value);
108
178
  } }
109
- function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
110
- i0.ɵɵelementStart(0, "div", 15);
111
- i0.ɵɵelement(1, "mj-markdown", 21);
179
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
180
+ i0.ɵɵelementStart(0, "div", 24);
181
+ i0.ɵɵelement(1, "mj-markdown", 30);
112
182
  i0.ɵɵelementEnd();
113
183
  } if (rf & 2) {
114
184
  const ctx_r0 = i0.ɵɵnextContext(5);
115
185
  i0.ɵɵadvance();
116
186
  i0.ɵɵproperty("data", ctx_r0.FormatValue());
117
187
  } }
118
- function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
119
- i0.ɵɵelement(0, "div", 16);
188
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
189
+ i0.ɵɵelement(0, "div", 25);
120
190
  i0.ɵɵpipe(1, "mjSafeRichHtml");
121
191
  } if (rf & 2) {
122
192
  const ctx_r0 = i0.ɵɵnextContext(5);
123
193
  i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind1(1, 1, ctx_r0.FormatValue()), i0.ɵɵsanitizeHtml);
124
194
  } }
125
- function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_Conditional_3_Template(rf, ctx) { if (rf & 1) {
126
- i0.ɵɵelementStart(0, "div", 17);
127
- i0.ɵɵelement(1, "mj-code-editor", 22);
195
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_3_Template(rf, ctx) { if (rf & 1) {
196
+ i0.ɵɵelementStart(0, "div", 26);
197
+ i0.ɵɵelement(1, "mj-code-editor", 31);
128
198
  i0.ɵɵelementEnd();
129
199
  } if (rf & 2) {
130
200
  const ctx_r0 = i0.ɵɵnextContext(5);
131
201
  i0.ɵɵadvance();
132
202
  i0.ɵɵproperty("value", ctx_r0.FormatValue())("language", ctx_r0.CodeEditorLanguage)("readonly", true);
133
203
  } }
134
- function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
135
- i0.ɵɵelementStart(0, "span", 18);
204
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
205
+ i0.ɵɵelementStart(0, "span", 27);
136
206
  i0.ɵɵtext(1);
137
207
  i0.ɵɵelementEnd();
138
208
  } if (rf & 2) {
@@ -140,8 +210,8 @@ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_C
140
210
  i0.ɵɵadvance();
141
211
  i0.ɵɵtextInterpolate(ctx_r0.FormatValue());
142
212
  } }
143
- function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_Conditional_5_Template(rf, ctx) { if (rf & 1) {
144
- i0.ɵɵelementStart(0, "span", 6);
213
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_5_Template(rf, ctx) { if (rf & 1) {
214
+ i0.ɵɵelementStart(0, "span", 7);
145
215
  i0.ɵɵtext(1);
146
216
  i0.ɵɵelementEnd();
147
217
  } if (rf & 2) {
@@ -149,24 +219,24 @@ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_C
149
219
  i0.ɵɵadvance();
150
220
  i0.ɵɵtextInterpolate(ctx_r0.FormatValue());
151
221
  } }
152
- function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_Template(rf, ctx) { if (rf & 1) {
153
- i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_Conditional_0_Template, 3, 1, "span", 6)(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_Conditional_1_Template, 2, 1, "div", 15)(2, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_Conditional_2_Template, 2, 3, "div", 16)(3, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_Conditional_3_Template, 2, 3, "div", 17)(4, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_Conditional_4_Template, 2, 1, "span", 18)(5, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_Conditional_5_Template, 2, 1, "span", 6);
222
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Template(rf, ctx) { if (rf & 1) {
223
+ i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_0_Template, 3, 1, "span", 7)(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_1_Template, 2, 1, "div", 24)(2, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_2_Template, 2, 3, "div", 25)(3, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_3_Template, 2, 3, "div", 26)(4, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_4_Template, 2, 1, "span", 27)(5, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Conditional_5_Template, 2, 1, "span", 7);
154
224
  } if (rf & 2) {
155
225
  const ctx_r0 = i0.ɵɵnextContext(4);
156
226
  i0.ɵɵconditional(ctx_r0.Type === "checkbox" ? 0 : ctx_r0.RichTextMode === "markdown" ? 1 : ctx_r0.RichTextMode === "html" ? 2 : ctx_r0.RichTextMode === "code" ? 3 : ctx_r0.IsLongText ? 4 : 5);
157
227
  } }
158
- function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Template(rf, ctx) { if (rf & 1) {
159
- i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_0_Template, 4, 1, "span", 6)(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_1_Template, 4, 1, "span", 6)(2, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_2_Template, 3, 1, "span", 6)(3, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Case_3_Template, 6, 1);
228
+ function MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Template(rf, ctx) { if (rf & 1) {
229
+ i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_0_Template, 4, 1, "span", 7)(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_1_Template, 4, 1, "span", 7)(2, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_2_Template, 3, 1, "span", 7)(3, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Case_3_Template, 6, 1);
160
230
  } if (rf & 2) {
161
231
  let tmp_3_0;
162
232
  const ctx_r0 = i0.ɵɵnextContext(3);
163
233
  i0.ɵɵconditional((tmp_3_0 = ctx_r0.LinkType) === "Email" ? 0 : tmp_3_0 === "URL" ? 1 : tmp_3_0 === "Record" ? 2 : 3);
164
234
  } }
165
235
  function MjFormFieldComponent_Conditional_0_Conditional_0_Template(rf, ctx) { if (rf & 1) {
166
- i0.ɵɵelementStart(0, "div", 3);
167
- i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_1_Template, 1, 1, "label", 4);
168
- i0.ɵɵelementStart(2, "div", 5);
169
- i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Template, 3, 1, "span", 6)(4, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Template, 4, 1);
236
+ i0.ɵɵelementStart(0, "div", 4);
237
+ i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_1_Template, 1, 1, "label", 5);
238
+ i0.ɵɵelementStart(2, "div", 6);
239
+ i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_3_Template, 3, 1, "span", 7)(4, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_4_Template, 5, 2, "div", 8)(5, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_5_Template, 4, 3, "div", 9)(6, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_6_Template, 2, 1, "pre", 10)(7, MjFormFieldComponent_Conditional_0_Conditional_0_Conditional_7_Template, 4, 1);
170
240
  i0.ɵɵelementEnd()();
171
241
  } if (rf & 2) {
172
242
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -174,26 +244,26 @@ function MjFormFieldComponent_Conditional_0_Conditional_0_Template(rf, ctx) { if
174
244
  i0.ɵɵadvance();
175
245
  i0.ɵɵconditional(ctx_r0.ShowLabel ? 1 : -1);
176
246
  i0.ɵɵadvance(2);
177
- i0.ɵɵconditional(ctx_r0.IsFKWithNameField ? 3 : 4);
247
+ i0.ɵɵconditional(ctx_r0.IsFKWithNameField ? 3 : ctx_r0.ExtendedDisplay === "image" ? 4 : ctx_r0.ExtendedDisplay === "color" ? 5 : ctx_r0.ExtendedDisplay === "json" ? 6 : 7);
178
248
  } }
179
249
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
180
- i0.ɵɵelement(0, "label", 4);
250
+ i0.ɵɵelement(0, "label", 5);
181
251
  } if (rf & 2) {
182
252
  const ctx_r0 = i0.ɵɵnextContext(3);
183
253
  i0.ɵɵproperty("innerHTML", ctx_r0.HighlightedDisplayName, i0.ɵɵsanitizeHtml);
184
254
  } }
185
255
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
186
- i0.ɵɵelement(0, "i", 29);
256
+ i0.ɵɵelement(0, "i", 41);
187
257
  } }
188
258
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_3_Template(rf, ctx) { if (rf & 1) {
189
- const _r7 = i0.ɵɵgetCurrentView();
190
- i0.ɵɵelementStart(0, "button", 35);
191
- i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_3_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnFKScopeToggle($event)); });
192
- i0.ɵɵelement(1, "i", 36);
193
- i0.ɵɵelementStart(2, "span", 37);
259
+ const _r8 = i0.ɵɵgetCurrentView();
260
+ i0.ɵɵelementStart(0, "button", 47);
261
+ i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_3_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnFKScopeToggle($event)); });
262
+ i0.ɵɵelement(1, "i", 48);
263
+ i0.ɵɵelementStart(2, "span", 49);
194
264
  i0.ɵɵtext(3);
195
265
  i0.ɵɵelementEnd();
196
- i0.ɵɵelement(4, "i", 38);
266
+ i0.ɵɵelement(4, "i", 50);
197
267
  i0.ɵɵelementEnd();
198
268
  } if (rf & 2) {
199
269
  const ctx_r0 = i0.ɵɵnextContext(4);
@@ -205,52 +275,52 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
205
275
  i0.ɵɵclassProp("fa-chevron-up", ctx_r0.FKShowScopeMenu)("fa-chevron-down", !ctx_r0.FKShowScopeMenu);
206
276
  } }
207
277
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_4_Template(rf, ctx) { if (rf & 1) {
208
- const _r8 = i0.ɵɵgetCurrentView();
209
- i0.ɵɵelementStart(0, "button", 39);
210
- i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_4_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnFKClearClick($event)); });
211
- i0.ɵɵelement(1, "i", 40);
278
+ const _r9 = i0.ɵɵgetCurrentView();
279
+ i0.ɵɵelementStart(0, "button", 51);
280
+ i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_4_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnFKClearClick($event)); });
281
+ i0.ɵɵelement(1, "i", 52);
212
282
  i0.ɵɵelementEnd();
213
283
  } }
214
284
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_5_Template(rf, ctx) { if (rf & 1) {
215
- i0.ɵɵelement(0, "i", 33);
285
+ i0.ɵɵelement(0, "i", 45);
216
286
  } }
217
287
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_For_4_Conditional_0_ng_container_0_Template(rf, ctx) { if (rf & 1) {
218
288
  i0.ɵɵelementContainer(0);
219
289
  } }
220
290
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_For_4_Conditional_0_Template(rf, ctx) { if (rf & 1) {
221
- i0.ɵɵtemplate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_For_4_Conditional_0_ng_container_0_Template, 1, 0, "ng-container", 50);
291
+ i0.ɵɵtemplate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_For_4_Conditional_0_ng_container_0_Template, 1, 0, "ng-container", 62);
222
292
  } if (rf & 2) {
223
- const f_r9 = i0.ɵɵnextContext().$implicit;
293
+ const f_r10 = i0.ɵɵnextContext().$implicit;
224
294
  i0.ɵɵnextContext(2);
225
- const scopeRow_r10 = i0.ɵɵreference(3);
226
- i0.ɵɵproperty("ngTemplateOutlet", scopeRow_r10)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, f_r9));
295
+ const scopeRow_r11 = i0.ɵɵreference(3);
296
+ i0.ɵɵproperty("ngTemplateOutlet", scopeRow_r11)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, f_r10));
227
297
  } }
228
298
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_For_4_Template(rf, ctx) { if (rf & 1) {
229
299
  i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_For_4_Conditional_0_Template, 1, 4, "ng-container");
230
300
  } if (rf & 2) {
231
- const f_r9 = ctx.$implicit;
232
- i0.ɵɵconditional(f_r9.Group === "shown" ? 0 : -1);
301
+ const f_r10 = ctx.$implicit;
302
+ i0.ɵɵconditional(f_r10.Group === "shown" ? 0 : -1);
233
303
  } }
234
304
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_For_4_Conditional_0_ng_container_0_Template(rf, ctx) { if (rf & 1) {
235
305
  i0.ɵɵelementContainer(0);
236
306
  } }
237
307
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_For_4_Conditional_0_Template(rf, ctx) { if (rf & 1) {
238
- i0.ɵɵtemplate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_For_4_Conditional_0_ng_container_0_Template, 1, 0, "ng-container", 50);
308
+ i0.ɵɵtemplate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_For_4_Conditional_0_ng_container_0_Template, 1, 0, "ng-container", 62);
239
309
  } if (rf & 2) {
240
- const f_r11 = i0.ɵɵnextContext().$implicit;
310
+ const f_r12 = i0.ɵɵnextContext().$implicit;
241
311
  i0.ɵɵnextContext(3);
242
- const scopeRow_r10 = i0.ɵɵreference(3);
243
- i0.ɵɵproperty("ngTemplateOutlet", scopeRow_r10)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, f_r11));
312
+ const scopeRow_r11 = i0.ɵɵreference(3);
313
+ i0.ɵɵproperty("ngTemplateOutlet", scopeRow_r11)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c0, f_r12));
244
314
  } }
245
315
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_For_4_Template(rf, ctx) { if (rf & 1) {
246
316
  i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_For_4_Conditional_0_Template, 1, 4, "ng-container");
247
317
  } if (rf & 2) {
248
- const f_r11 = ctx.$implicit;
249
- i0.ɵɵconditional(f_r11.Group === "other" ? 0 : -1);
318
+ const f_r12 = ctx.$implicit;
319
+ i0.ɵɵconditional(f_r12.Group === "other" ? 0 : -1);
250
320
  } }
251
321
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
252
- i0.ɵɵelement(0, "div", 51);
253
- i0.ɵɵelementStart(1, "div", 49);
322
+ i0.ɵɵelement(0, "div", 63);
323
+ i0.ɵɵelementStart(1, "div", 61);
254
324
  i0.ɵɵtext(2, "Other fields");
255
325
  i0.ɵɵelementEnd();
256
326
  i0.ɵɵrepeaterCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Conditional_5_For_4_Template, 1, 1, null, null, _forTrack0);
@@ -260,7 +330,7 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
260
330
  i0.ɵɵrepeater(ctx_r0.FKSearchableFields);
261
331
  } }
262
332
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Template(rf, ctx) { if (rf & 1) {
263
- i0.ɵɵelementStart(0, "div", 48)(1, "div", 49);
333
+ i0.ɵɵelementStart(0, "div", 60)(1, "div", 61);
264
334
  i0.ɵɵtext(2, "Columns shown");
265
335
  i0.ɵɵelementEnd();
266
336
  i0.ɵɵrepeaterCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_For_4_Template, 1, 1, null, null, _forTrack0);
@@ -275,71 +345,71 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
275
345
  i0.ɵɵconditional(ctx_r0.FKHasOtherSearchableFields ? 5 : -1);
276
346
  } }
277
347
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
278
- const _r14 = i0.ɵɵgetCurrentView();
279
- i0.ɵɵelementStart(0, "button", 57);
280
- i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_2_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r14); const f_r13 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.MoveFKColumn($event, f_r13.FieldName, -1)); });
281
- i0.ɵɵelement(1, "i", 58);
348
+ const _r15 = i0.ɵɵgetCurrentView();
349
+ i0.ɵɵelementStart(0, "button", 69);
350
+ i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_2_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r15); const f_r14 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.MoveFKColumn($event, f_r14.FieldName, -1)); });
351
+ i0.ɵɵelement(1, "i", 70);
282
352
  i0.ɵɵelementEnd();
283
- i0.ɵɵelementStart(2, "button", 59);
284
- i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_2_Template_button_mousedown_2_listener($event) { i0.ɵɵrestoreView(_r14); const f_r13 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.MoveFKColumn($event, f_r13.FieldName, 1)); });
285
- i0.ɵɵelement(3, "i", 60);
353
+ i0.ɵɵelementStart(2, "button", 71);
354
+ i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_2_Template_button_mousedown_2_listener($event) { i0.ɵɵrestoreView(_r15); const f_r14 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.MoveFKColumn($event, f_r14.FieldName, 1)); });
355
+ i0.ɵɵelement(3, "i", 72);
286
356
  i0.ɵɵelementEnd();
287
357
  } if (rf & 2) {
288
- const f_r13 = i0.ɵɵnextContext().$implicit;
358
+ const f_r14 = i0.ɵɵnextContext().$implicit;
289
359
  const ctx_r0 = i0.ɵɵnextContext(5);
290
- i0.ɵɵproperty("disabled", !ctx_r0.CanMoveFKColumnUp(f_r13.FieldName));
360
+ i0.ɵɵproperty("disabled", !ctx_r0.CanMoveFKColumnUp(f_r14.FieldName));
291
361
  i0.ɵɵadvance(2);
292
- i0.ɵɵproperty("disabled", !ctx_r0.CanMoveFKColumnDown(f_r13.FieldName));
362
+ i0.ɵɵproperty("disabled", !ctx_r0.CanMoveFKColumnDown(f_r14.FieldName));
293
363
  } }
294
364
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
295
- const _r15 = i0.ɵɵgetCurrentView();
296
- i0.ɵɵelementStart(0, "button", 61);
297
- i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_7_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r15); const f_r13 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnFKColumnToggle($event, f_r13)); });
298
- i0.ɵɵelement(1, "i", 62);
365
+ const _r16 = i0.ɵɵgetCurrentView();
366
+ i0.ɵɵelementStart(0, "button", 73);
367
+ i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_7_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r16); const f_r14 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnFKColumnToggle($event, f_r14)); });
368
+ i0.ɵɵelement(1, "i", 74);
299
369
  i0.ɵɵelementEnd();
300
370
  } if (rf & 2) {
301
- const f_r13 = i0.ɵɵnextContext().$implicit;
371
+ const f_r14 = i0.ɵɵnextContext().$implicit;
302
372
  const ctx_r0 = i0.ɵɵnextContext(5);
303
- i0.ɵɵclassProp("mj-fk-col-toggle--on", ctx_r0.IsFKColumnVisible(f_r13));
304
- i0.ɵɵproperty("title", ctx_r0.IsFKColumnVisible(f_r13) ? "Hide this column" : "Show as a column");
373
+ i0.ɵɵclassProp("mj-fk-col-toggle--on", ctx_r0.IsFKColumnVisible(f_r14));
374
+ i0.ɵɵproperty("title", ctx_r0.IsFKColumnVisible(f_r14) ? "Hide this column" : "Show as a column");
305
375
  i0.ɵɵadvance();
306
- i0.ɵɵclassProp("fa-eye", ctx_r0.IsFKColumnVisible(f_r13))("fa-eye-slash", !ctx_r0.IsFKColumnVisible(f_r13));
376
+ i0.ɵɵclassProp("fa-eye", ctx_r0.IsFKColumnVisible(f_r14))("fa-eye-slash", !ctx_r0.IsFKColumnVisible(f_r14));
307
377
  } }
308
378
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Template(rf, ctx) { if (rf & 1) {
309
- const _r12 = i0.ɵɵgetCurrentView();
310
- i0.ɵɵelementStart(0, "div", 52);
311
- i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Template_div_mousedown_0_listener($event) { const f_r13 = i0.ɵɵrestoreView(_r12).$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnFKScopeSelect($event, f_r13)); });
312
- i0.ɵɵelementStart(1, "span", 53);
379
+ const _r13 = i0.ɵɵgetCurrentView();
380
+ i0.ɵɵelementStart(0, "div", 64);
381
+ i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Template_div_mousedown_0_listener($event) { const f_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnFKScopeSelect($event, f_r14)); });
382
+ i0.ɵɵelementStart(1, "span", 65);
313
383
  i0.ɵɵconditionalCreate(2, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_2_Template, 4, 2);
314
384
  i0.ɵɵelementEnd();
315
385
  i0.ɵɵelement(3, "i");
316
- i0.ɵɵelementStart(4, "span", 54);
386
+ i0.ɵɵelementStart(4, "span", 66);
317
387
  i0.ɵɵtext(5);
318
388
  i0.ɵɵelementEnd();
319
- i0.ɵɵelementStart(6, "span", 55);
320
- i0.ɵɵconditionalCreate(7, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_7_Template, 2, 7, "button", 56);
389
+ i0.ɵɵelementStart(6, "span", 67);
390
+ i0.ɵɵconditionalCreate(7, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Conditional_7_Template, 2, 7, "button", 68);
321
391
  i0.ɵɵelementEnd()();
322
392
  } if (rf & 2) {
323
- const f_r13 = ctx.$implicit;
393
+ const f_r14 = ctx.$implicit;
324
394
  const ctx_r0 = i0.ɵɵnextContext(5);
325
- i0.ɵɵclassProp("mj-fk-scope-mi--on", ctx_r0.IsFKScopeActive(f_r13));
395
+ i0.ɵɵclassProp("mj-fk-scope-mi--on", ctx_r0.IsFKScopeActive(f_r14));
326
396
  i0.ɵɵadvance(2);
327
- i0.ɵɵconditional(f_r13.Group === "shown" ? 2 : -1);
397
+ i0.ɵɵconditional(f_r14.Group === "shown" ? 2 : -1);
328
398
  i0.ɵɵadvance();
329
- i0.ɵɵclassMap(f_r13.Icon + " mj-fk-scope-mi-icon");
399
+ i0.ɵɵclassMap(f_r14.Icon + " mj-fk-scope-mi-icon");
330
400
  i0.ɵɵadvance(2);
331
- i0.ɵɵtextInterpolate(f_r13.Label);
401
+ i0.ɵɵtextInterpolate(f_r14.Label);
332
402
  i0.ɵɵadvance(2);
333
- i0.ɵɵconditional(ctx_r0.CanToggleFKColumn(f_r13) ? 7 : -1);
403
+ i0.ɵɵconditional(ctx_r0.CanToggleFKColumn(f_r14) ? 7 : -1);
334
404
  } }
335
405
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Conditional_6_Template(rf, ctx) { if (rf & 1) {
336
- i0.ɵɵelement(0, "i", 70);
406
+ i0.ɵɵelement(0, "i", 82);
337
407
  } if (rf & 2) {
338
408
  const ctx_r0 = i0.ɵɵnextContext(6);
339
409
  i0.ɵɵclassMap(ctx_r0.FKSelectedSuggestion.Icon);
340
410
  } }
341
411
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Conditional_8_Template(rf, ctx) { if (rf & 1) {
342
- i0.ɵɵelementStart(0, "span", 68);
412
+ i0.ɵɵelementStart(0, "span", 80);
343
413
  i0.ɵɵtext(1);
344
414
  i0.ɵɵelementEnd();
345
415
  } if (rf & 2) {
@@ -348,20 +418,20 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
348
418
  i0.ɵɵtextInterpolate(ctx_r0.FKSelectedSuggestion.ExtraColumns[0].Value);
349
419
  } }
350
420
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Template(rf, ctx) { if (rf & 1) {
351
- const _r16 = i0.ɵɵgetCurrentView();
352
- i0.ɵɵelementStart(0, "div", 43)(1, "div", 63);
353
- i0.ɵɵelement(2, "i", 64);
421
+ const _r17 = i0.ɵɵgetCurrentView();
422
+ i0.ɵɵelementStart(0, "div", 55)(1, "div", 75);
423
+ i0.ɵɵelement(2, "i", 76);
354
424
  i0.ɵɵelementStart(3, "span");
355
425
  i0.ɵɵtext(4, "Currently selected");
356
426
  i0.ɵɵelementEnd()();
357
- i0.ɵɵelementStart(5, "div", 65);
358
- i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Template_div_mousedown_5_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnFKSelectItem(ctx_r0.FKSelectedSuggestion, $event)); });
359
- i0.ɵɵconditionalCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Conditional_6_Template, 1, 2, "i", 66);
360
- i0.ɵɵelement(7, "span", 67);
361
- i0.ɵɵconditionalCreate(8, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Conditional_8_Template, 2, 1, "span", 68);
362
- i0.ɵɵelementStart(9, "button", 69);
363
- i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Template_button_mousedown_9_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnFKClearClick($event)); });
364
- i0.ɵɵelement(10, "i", 40);
427
+ i0.ɵɵelementStart(5, "div", 77);
428
+ i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Template_div_mousedown_5_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnFKSelectItem(ctx_r0.FKSelectedSuggestion, $event)); });
429
+ i0.ɵɵconditionalCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Conditional_6_Template, 1, 2, "i", 78);
430
+ i0.ɵɵelement(7, "span", 79);
431
+ i0.ɵɵconditionalCreate(8, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Conditional_8_Template, 2, 1, "span", 80);
432
+ i0.ɵɵelementStart(9, "button", 81);
433
+ i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Template_button_mousedown_9_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnFKClearClick($event)); });
434
+ i0.ɵɵelement(10, "i", 52);
365
435
  i0.ɵɵelementEnd()()();
366
436
  } if (rf & 2) {
367
437
  const ctx_r0 = i0.ɵɵnextContext(5);
@@ -373,127 +443,127 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
373
443
  i0.ɵɵconditional(ctx_r0.FKSelectedSuggestion.ExtraColumns.length && ctx_r0.FKSelectedSuggestion.ExtraColumns[0].Value ? 8 : -1);
374
444
  } }
375
445
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_5_Template(rf, ctx) { if (rf & 1) {
376
- i0.ɵɵelementStart(0, "div", 44);
377
- i0.ɵɵelement(1, "i", 71);
446
+ i0.ɵɵelementStart(0, "div", 56);
447
+ i0.ɵɵelement(1, "i", 83);
378
448
  i0.ɵɵelementStart(2, "span");
379
449
  i0.ɵɵtext(3, "Searching\u2026");
380
450
  i0.ɵɵelementEnd()();
381
451
  } }
382
452
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_6_Template(rf, ctx) { if (rf & 1) {
383
- i0.ɵɵelementStart(0, "div", 45);
384
- i0.ɵɵelement(1, "i", 72);
453
+ i0.ɵɵelementStart(0, "div", 57);
454
+ i0.ɵɵelement(1, "i", 84);
385
455
  i0.ɵɵelementStart(2, "span");
386
456
  i0.ɵɵtext(3, "No matches");
387
457
  i0.ɵɵelementEnd()();
388
458
  } }
389
459
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_Conditional_3_Template(rf, ctx) { if (rf & 1) {
390
- i0.ɵɵelement(0, "div", 75);
460
+ i0.ɵɵelement(0, "div", 87);
391
461
  } }
392
462
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_5_Template(rf, ctx) { if (rf & 1) {
393
- const _r17 = i0.ɵɵgetCurrentView();
394
- i0.ɵɵelementStart(0, "div", 78);
395
- i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_5_Template_div_mousedown_0_listener($event) { const col_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.OnFKHeaderSort($event, col_r18)); });
396
- i0.ɵɵelementStart(1, "span", 79);
463
+ const _r18 = i0.ɵɵgetCurrentView();
464
+ i0.ɵɵelementStart(0, "div", 90);
465
+ i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_5_Template_div_mousedown_0_listener($event) { const col_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.OnFKHeaderSort($event, col_r19)); });
466
+ i0.ɵɵelementStart(1, "span", 91);
397
467
  i0.ɵɵtext(2);
398
468
  i0.ɵɵelementEnd();
399
469
  i0.ɵɵelement(3, "i");
400
- i0.ɵɵelementStart(4, "span", 80);
401
- i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_5_Template_span_mousedown_4_listener($event) { const col_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.OnFKColResizeStart($event, col_r18)); });
470
+ i0.ɵɵelementStart(4, "span", 92);
471
+ i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_5_Template_span_mousedown_4_listener($event) { const col_r19 = i0.ɵɵrestoreView(_r18).$implicit; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.OnFKColResizeStart($event, col_r19)); });
402
472
  i0.ɵɵelementEnd()();
403
473
  } if (rf & 2) {
404
- const col_r18 = ctx.$implicit;
405
- const ɵ$index_216_r19 = ctx.$index;
474
+ const col_r19 = ctx.$implicit;
475
+ const ɵ$index_248_r20 = ctx.$index;
406
476
  const ctx_r0 = i0.ɵɵnextContext(6);
407
- i0.ɵɵproperty("title", "Click to sort by " + ctx_r0.FKColumnHeaders[ɵ$index_216_r19]);
477
+ i0.ɵɵproperty("title", "Click to sort by " + ctx_r0.FKColumnHeaders[ɵ$index_248_r20]);
408
478
  i0.ɵɵadvance(2);
409
- i0.ɵɵtextInterpolate(ctx_r0.FKColumnHeaders[ɵ$index_216_r19]);
479
+ i0.ɵɵtextInterpolate(ctx_r0.FKColumnHeaders[ɵ$index_248_r20]);
410
480
  i0.ɵɵadvance();
411
- i0.ɵɵclassMap(ctx_r0.FKSortIcon(col_r18));
481
+ i0.ɵɵclassMap(ctx_r0.FKSortIcon(col_r19));
412
482
  } }
413
483
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Conditional_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
414
484
  i0.ɵɵelement(0, "i");
415
485
  } if (rf & 2) {
416
- const suggestion_r21 = i0.ɵɵnextContext(2).$implicit;
417
- i0.ɵɵclassMap(suggestion_r21.Icon);
486
+ const suggestion_r22 = i0.ɵɵnextContext(2).$implicit;
487
+ i0.ɵɵclassMap(suggestion_r22.Icon);
418
488
  } }
419
489
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
420
- i0.ɵɵelementStart(0, "div", 82);
421
- i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Conditional_1_Conditional_1_Template, 1, 2, "i", 83);
490
+ i0.ɵɵelementStart(0, "div", 94);
491
+ i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Conditional_1_Conditional_1_Template, 1, 2, "i", 95);
422
492
  i0.ɵɵelementEnd();
423
493
  } if (rf & 2) {
424
- const suggestion_r21 = i0.ɵɵnextContext().$implicit;
494
+ const suggestion_r22 = i0.ɵɵnextContext().$implicit;
425
495
  i0.ɵɵadvance();
426
- i0.ɵɵconditional(suggestion_r21.Icon ? 1 : -1);
496
+ i0.ɵɵconditional(suggestion_r22.Icon ? 1 : -1);
427
497
  } }
428
498
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
429
- i0.ɵɵelement(0, "i", 87);
499
+ i0.ɵɵelement(0, "i", 99);
430
500
  } }
431
501
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
432
- i0.ɵɵelementStart(0, "div", 86);
433
- i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_0_Conditional_1_Template, 1, 0, "i", 87);
434
- i0.ɵɵelement(2, "span", 88);
502
+ i0.ɵɵelementStart(0, "div", 98);
503
+ i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_0_Conditional_1_Template, 1, 0, "i", 99);
504
+ i0.ɵɵelement(2, "span", 100);
435
505
  i0.ɵɵelementEnd();
436
506
  } if (rf & 2) {
437
- const ctx_r22 = i0.ɵɵnextContext();
438
- const col_r24 = ctx_r22.$implicit;
439
- const ɵ$index_235_r25 = ctx_r22.$index;
440
- const ɵ$count_235_r26 = ctx_r22.$count;
441
- const suggestion_r21 = i0.ɵɵnextContext().$implicit;
507
+ const ctx_r23 = i0.ɵɵnextContext();
508
+ const col_r25 = ctx_r23.$implicit;
509
+ const ɵ$index_267_r26 = ctx_r23.$index;
510
+ const ɵ$count_267_r27 = ctx_r23.$count;
511
+ const suggestion_r22 = i0.ɵɵnextContext().$implicit;
442
512
  const ctx_r0 = i0.ɵɵnextContext(6);
443
- i0.ɵɵclassProp("mj-fk-cell--fill", ctx_r0.FKColumnFillsTrack(col_r24, ɵ$index_235_r25 === ɵ$count_235_r26 - 1));
513
+ i0.ɵɵclassProp("mj-fk-cell--fill", ctx_r0.FKColumnFillsTrack(col_r25, ɵ$index_267_r26 === ɵ$count_267_r27 - 1));
444
514
  i0.ɵɵadvance();
445
- i0.ɵɵconditional(ctx_r0.IsFKRowSelected(suggestion_r21) ? 1 : -1);
515
+ i0.ɵɵconditional(ctx_r0.IsFKRowSelected(suggestion_r22) ? 1 : -1);
446
516
  i0.ɵɵadvance();
447
- i0.ɵɵproperty("innerHTML", suggestion_r21.HighlightedName, i0.ɵɵsanitizeHtml);
517
+ i0.ɵɵproperty("innerHTML", suggestion_r22.HighlightedName, i0.ɵɵsanitizeHtml);
448
518
  } }
449
519
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
450
- i0.ɵɵelementStart(0, "div", 89);
451
- i0.ɵɵelement(1, "span", 88);
520
+ i0.ɵɵelementStart(0, "div", 101);
521
+ i0.ɵɵelement(1, "span", 100);
452
522
  i0.ɵɵelementEnd();
453
523
  } if (rf & 2) {
454
524
  let tmp_30_0;
455
525
  let tmp_31_0;
456
- const ctx_r22 = i0.ɵɵnextContext();
457
- const col_r24 = ctx_r22.$implicit;
458
- const ɵ$index_235_r25 = ctx_r22.$index;
459
- const ɵ$count_235_r26 = ctx_r22.$count;
460
- const suggestion_r21 = i0.ɵɵnextContext().$implicit;
526
+ const ctx_r23 = i0.ɵɵnextContext();
527
+ const col_r25 = ctx_r23.$implicit;
528
+ const ɵ$index_267_r26 = ctx_r23.$index;
529
+ const ɵ$count_267_r27 = ctx_r23.$count;
530
+ const suggestion_r22 = i0.ɵɵnextContext().$implicit;
461
531
  const ctx_r0 = i0.ɵɵnextContext(6);
462
- i0.ɵɵclassProp("mj-fk-cell--fill", ctx_r0.FKColumnFillsTrack(col_r24, ɵ$index_235_r25 === ɵ$count_235_r26 - 1));
463
- i0.ɵɵproperty("title", ((tmp_30_0 = ctx_r0.FKCellFor(suggestion_r21, col_r24)) == null ? null : tmp_30_0.Value) || "");
532
+ i0.ɵɵclassProp("mj-fk-cell--fill", ctx_r0.FKColumnFillsTrack(col_r25, ɵ$index_267_r26 === ɵ$count_267_r27 - 1));
533
+ i0.ɵɵproperty("title", ((tmp_30_0 = ctx_r0.FKCellFor(suggestion_r22, col_r25)) == null ? null : tmp_30_0.Value) || "");
464
534
  i0.ɵɵadvance();
465
- i0.ɵɵproperty("innerHTML", ((tmp_31_0 = ctx_r0.FKCellFor(suggestion_r21, col_r24)) == null ? null : tmp_31_0.HighlightedValue) || "", i0.ɵɵsanitizeHtml);
535
+ i0.ɵɵproperty("innerHTML", ((tmp_31_0 = ctx_r0.FKCellFor(suggestion_r22, col_r25)) == null ? null : tmp_31_0.HighlightedValue) || "", i0.ɵɵsanitizeHtml);
466
536
  } }
467
537
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Template(rf, ctx) { if (rf & 1) {
468
- i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_0_Template, 3, 4, "div", 84)(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_1_Template, 2, 4, "div", 85);
538
+ i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_0_Template, 3, 4, "div", 96)(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Conditional_1_Template, 2, 4, "div", 97);
469
539
  } if (rf & 2) {
470
- const col_r24 = ctx.$implicit;
540
+ const col_r25 = ctx.$implicit;
471
541
  const ctx_r0 = i0.ɵɵnextContext(7);
472
- i0.ɵɵconditional(col_r24 === ctx_r0.FKNameField ? 0 : 1);
542
+ i0.ɵɵconditional(col_r25 === ctx_r0.FKNameField ? 0 : 1);
473
543
  } }
474
544
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Template(rf, ctx) { if (rf & 1) {
475
- const _r20 = i0.ɵɵgetCurrentView();
476
- i0.ɵɵelementStart(0, "div", 81);
477
- i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Template_div_mousedown_0_listener($event) { const suggestion_r21 = i0.ɵɵrestoreView(_r20).$implicit; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.OnFKSelectItem(suggestion_r21, $event)); })("mouseenter", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Template_div_mouseenter_0_listener() { const ɵ$index_226_r22 = i0.ɵɵrestoreView(_r20).$index; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.FKActiveIndex = ɵ$index_226_r22); });
478
- i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Conditional_1_Template, 2, 1, "div", 82);
545
+ const _r21 = i0.ɵɵgetCurrentView();
546
+ i0.ɵɵelementStart(0, "div", 93);
547
+ i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Template_div_mousedown_0_listener($event) { const suggestion_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.OnFKSelectItem(suggestion_r22, $event)); })("mouseenter", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Template_div_mouseenter_0_listener() { const ɵ$index_258_r23 = i0.ɵɵrestoreView(_r21).$index; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.FKActiveIndex = ɵ$index_258_r23); });
548
+ i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Conditional_1_Template, 2, 1, "div", 94);
479
549
  i0.ɵɵrepeaterCreate(2, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_For_3_Template, 2, 1, null, null, i0.ɵɵrepeaterTrackByIdentity);
480
550
  i0.ɵɵelementEnd();
481
551
  } if (rf & 2) {
482
- const suggestion_r21 = ctx.$implicit;
483
- const ɵ$index_226_r22 = ctx.$index;
552
+ const suggestion_r22 = ctx.$implicit;
553
+ const ɵ$index_258_r23 = ctx.$index;
484
554
  const ctx_r0 = i0.ɵɵnextContext(6);
485
- i0.ɵɵclassProp("mj-fk-grid-row--active", ɵ$index_226_r22 === ctx_r0.FKActiveIndex)("mj-fk-grid-row--selected", ctx_r0.IsFKRowSelected(suggestion_r21));
555
+ i0.ɵɵclassProp("mj-fk-grid-row--active", ɵ$index_258_r23 === ctx_r0.FKActiveIndex)("mj-fk-grid-row--selected", ctx_r0.IsFKRowSelected(suggestion_r22));
486
556
  i0.ɵɵadvance();
487
557
  i0.ɵɵconditional(ctx_r0.FKHasIconColumn ? 1 : -1);
488
558
  i0.ɵɵadvance();
489
559
  i0.ɵɵrepeater(ctx_r0.FKColumnFields);
490
560
  } }
491
561
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_Template(rf, ctx) { if (rf & 1) {
492
- i0.ɵɵelementStart(0, "div", 46)(1, "div", 73)(2, "div", 74);
493
- i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_Conditional_3_Template, 1, 0, "div", 75);
494
- i0.ɵɵrepeaterCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_5_Template, 5, 4, "div", 76, i0.ɵɵrepeaterTrackByIdentity);
562
+ i0.ɵɵelementStart(0, "div", 58)(1, "div", 85)(2, "div", 86);
563
+ i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_Conditional_3_Template, 1, 0, "div", 87);
564
+ i0.ɵɵrepeaterCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_5_Template, 5, 4, "div", 88, i0.ɵɵrepeaterTrackByIdentity);
495
565
  i0.ɵɵelementEnd();
496
- i0.ɵɵrepeaterCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Template, 4, 5, "div", 77, _forTrack1);
566
+ i0.ɵɵrepeaterCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_For_7_Template, 4, 5, "div", 89, _forTrack1);
497
567
  i0.ɵɵelementEnd()();
498
568
  } if (rf & 2) {
499
569
  const ctx_r0 = i0.ɵɵnextContext(5);
@@ -507,11 +577,11 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
507
577
  i0.ɵɵrepeater(ctx_r0.FKSuggestions);
508
578
  } }
509
579
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
510
- const _r27 = i0.ɵɵgetCurrentView();
511
- i0.ɵɵelementStart(0, "button", 90);
512
- i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_8_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnFKCreateNew($event)); });
513
- i0.ɵɵelement(1, "i", 91);
514
- i0.ɵɵelementStart(2, "span", 92);
580
+ const _r28 = i0.ɵɵgetCurrentView();
581
+ i0.ɵɵelementStart(0, "button", 102);
582
+ i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_8_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r0 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r0.OnFKCreateNew($event)); });
583
+ i0.ɵɵelement(1, "i", 103);
584
+ i0.ɵɵelementStart(2, "span", 104);
515
585
  i0.ɵɵtext(3);
516
586
  i0.ɵɵelementEnd()();
517
587
  } if (rf & 2) {
@@ -521,14 +591,14 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
521
591
  i0.ɵɵtextInterpolate(ctx_r0.FKCreateLabel);
522
592
  } }
523
593
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Template(rf, ctx) { if (rf & 1) {
524
- i0.ɵɵelementStart(0, "div", 41);
525
- i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Template, 6, 3, "div", 42);
594
+ i0.ɵɵelementStart(0, "div", 53);
595
+ i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_1_Template, 6, 3, "div", 54);
526
596
  i0.ɵɵtemplate(2, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_ng_template_2_Template, 8, 7, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
527
- i0.ɵɵconditionalCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Template, 11, 3, "div", 43);
528
- i0.ɵɵconditionalCreate(5, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_5_Template, 4, 0, "div", 44);
529
- i0.ɵɵconditionalCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_6_Template, 4, 0, "div", 45);
530
- i0.ɵɵconditionalCreate(7, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_Template, 8, 3, "div", 46);
531
- i0.ɵɵconditionalCreate(8, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_8_Template, 4, 2, "button", 47);
597
+ i0.ɵɵconditionalCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_4_Template, 11, 3, "div", 55);
598
+ i0.ɵɵconditionalCreate(5, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_5_Template, 4, 0, "div", 56);
599
+ i0.ɵɵconditionalCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_6_Template, 4, 0, "div", 57);
600
+ i0.ɵɵconditionalCreate(7, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_7_Template, 8, 3, "div", 58);
601
+ i0.ɵɵconditionalCreate(8, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Conditional_8_Template, 4, 2, "button", 59);
532
602
  i0.ɵɵelementEnd();
533
603
  } if (rf & 2) {
534
604
  const ctx_r0 = i0.ɵɵnextContext(4);
@@ -548,15 +618,15 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditio
548
618
  i0.ɵɵconditional(ctx_r0.CanCreateFK ? 8 : -1);
549
619
  } }
550
620
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
551
- const _r6 = i0.ɵɵgetCurrentView();
552
- i0.ɵɵelementStart(0, "div", 28);
553
- i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_1_Template, 1, 0, "i", 29);
554
- i0.ɵɵelementStart(2, "input", 30);
555
- i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template_input_input_2_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnFKInput($event)); })("focus", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template_input_focus_2_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnFKFocus($event)); })("blur", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template_input_blur_2_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnFKBlur()); })("keydown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template_input_keydown_2_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnFKKeydown($event)); });
621
+ const _r7 = i0.ɵɵgetCurrentView();
622
+ i0.ɵɵelementStart(0, "div", 40);
623
+ i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_1_Template, 1, 0, "i", 41);
624
+ i0.ɵɵelementStart(2, "input", 42);
625
+ i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template_input_input_2_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnFKInput($event)); })("focus", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template_input_focus_2_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnFKFocus($event)); })("blur", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template_input_blur_2_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnFKBlur()); })("keydown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template_input_keydown_2_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnFKKeydown($event)); });
556
626
  i0.ɵɵelementEnd();
557
- i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_3_Template, 5, 8, "button", 31);
558
- i0.ɵɵconditionalCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_4_Template, 2, 0, "button", 32)(5, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_5_Template, 1, 0, "i", 33);
559
- i0.ɵɵconditionalCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Template, 9, 11, "div", 34);
627
+ i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_3_Template, 5, 8, "button", 43);
628
+ i0.ɵɵconditionalCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_4_Template, 2, 0, "button", 44)(5, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_5_Template, 1, 0, "i", 45);
629
+ i0.ɵɵconditionalCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Conditional_6_Template, 9, 11, "div", 46);
560
630
  i0.ɵɵelementEnd();
561
631
  } if (rf & 2) {
562
632
  const ctx_r0 = i0.ɵɵnextContext(3);
@@ -573,77 +643,166 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template
573
643
  i0.ɵɵadvance(2);
574
644
  i0.ɵɵconditional(ctx_r0.ShowFKDropdown ? 6 : -1);
575
645
  } }
646
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
647
+ i0.ɵɵelement(0, "img", 13);
648
+ } if (rf & 2) {
649
+ const ctx_r0 = i0.ɵɵnextContext(4);
650
+ i0.ɵɵproperty("src", ctx_r0.ImagePreviewSrc, i0.ɵɵsanitizeUrl);
651
+ } }
652
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
653
+ i0.ɵɵelementStart(0, "div", 105);
654
+ i0.ɵɵelement(1, "i", 113);
655
+ i0.ɵɵelementEnd();
656
+ } }
657
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_4_Template(rf, ctx) { if (rf & 1) {
658
+ i0.ɵɵelementStart(0, "span");
659
+ i0.ɵɵtext(1);
660
+ i0.ɵɵelementEnd();
661
+ } if (rf & 2) {
662
+ const ctx_r0 = i0.ɵɵnextContext(4);
663
+ i0.ɵɵadvance();
664
+ i0.ɵɵtextInterpolate1("Inline image (", ctx_r0.ImageValueSizeLabel, ")");
665
+ } }
666
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_13_Template(rf, ctx) { if (rf & 1) {
667
+ const _r31 = i0.ɵɵgetCurrentView();
668
+ i0.ɵɵelementStart(0, "button", 114);
669
+ i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_13_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r31); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnImageClear()); });
670
+ i0.ɵɵtext(1, "Clear");
671
+ i0.ɵɵelementEnd();
672
+ } }
576
673
  function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
577
- const _r28 = i0.ɵɵgetCurrentView();
578
- i0.ɵɵelementStart(0, "mj-code-editor", 93);
579
- i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Template_mj_code_editor_change_0_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnCodeEditorChange($event)); });
674
+ const _r29 = i0.ɵɵgetCurrentView();
675
+ i0.ɵɵelementStart(0, "div", 34);
676
+ i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_1_Template, 1, 1, "img", 13)(2, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_2_Template, 2, 0, "div", 105);
677
+ i0.ɵɵelementStart(3, "div", 14);
678
+ i0.ɵɵconditionalCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_4_Template, 2, 1, "span");
679
+ i0.ɵɵelementStart(5, "span", 106);
680
+ i0.ɵɵtext(6);
681
+ i0.ɵɵelementEnd()();
682
+ i0.ɵɵelementStart(7, "div", 107)(8, "input", 108, 1);
683
+ i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Template_input_change_8_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnImageFileSelected($event)); });
684
+ i0.ɵɵelementEnd();
685
+ i0.ɵɵelementStart(10, "button", 109);
686
+ i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r29); const imageFileInput_r30 = i0.ɵɵreference(9); return i0.ɵɵresetView(imageFileInput_r30.click()); });
687
+ i0.ɵɵelement(11, "i", 110);
688
+ i0.ɵɵtext(12);
689
+ i0.ɵɵelementEnd();
690
+ i0.ɵɵconditionalCreate(13, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Conditional_13_Template, 2, 0, "button", 111);
691
+ i0.ɵɵelementEnd();
692
+ i0.ɵɵelementStart(14, "input", 112);
693
+ i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Template_input_input_14_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnImageUrlInput($event)); });
694
+ i0.ɵɵelementEnd()();
695
+ } if (rf & 2) {
696
+ const ctx_r0 = i0.ɵɵnextContext(3);
697
+ i0.ɵɵadvance();
698
+ i0.ɵɵconditional(ctx_r0.ImagePreviewSrc ? 1 : 2);
699
+ i0.ɵɵadvance(3);
700
+ i0.ɵɵconditional(ctx_r0.IsInlineImageValue ? 4 : -1);
701
+ i0.ɵɵadvance(2);
702
+ i0.ɵɵtextInterpolate1("Max ", ctx_r0.ImageMaxSizeLabel);
703
+ i0.ɵɵadvance(6);
704
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.ImagePreviewSrc ? "Replace" : "Upload", " ");
705
+ i0.ɵɵadvance();
706
+ i0.ɵɵconditional(ctx_r0.ImagePreviewSrc ? 13 : -1);
707
+ i0.ɵɵadvance();
708
+ i0.ɵɵproperty("value", ctx_r0.ImageUrlInputValue);
709
+ } }
710
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
711
+ const _r32 = i0.ɵɵgetCurrentView();
712
+ i0.ɵɵelementStart(0, "div", 35)(1, "input", 115);
713
+ i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Template_input_input_1_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnColorPickerInput($event)); });
714
+ i0.ɵɵelementEnd();
715
+ i0.ɵɵelementStart(2, "input", 116);
716
+ i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Template_input_input_2_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnInputChange($event)); });
717
+ i0.ɵɵelementEnd()();
718
+ } if (rf & 2) {
719
+ const ctx_r0 = i0.ɵɵnextContext(3);
720
+ i0.ɵɵadvance();
721
+ i0.ɵɵproperty("value", ctx_r0.ColorPickerValue);
722
+ i0.ɵɵattribute("aria-label", ctx_r0.DisplayName + " color");
723
+ i0.ɵɵadvance();
724
+ i0.ɵɵproperty("value", ctx_r0.FormatValue());
725
+ } }
726
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
727
+ const _r33 = i0.ɵɵgetCurrentView();
728
+ i0.ɵɵelementStart(0, "textarea", 117);
729
+ i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_6_Template_textarea_input_0_listener($event) { i0.ɵɵrestoreView(_r33); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnInputChange($event)); })("blur", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_6_Template_textarea_blur_0_listener() { i0.ɵɵrestoreView(_r33); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnJsonBlur()); });
730
+ i0.ɵɵelementEnd();
731
+ } if (rf & 2) {
732
+ const ctx_r0 = i0.ɵɵnextContext(3);
733
+ i0.ɵɵproperty("value", ctx_r0.FormatValue());
734
+ } }
735
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
736
+ const _r34 = i0.ɵɵgetCurrentView();
737
+ i0.ɵɵelementStart(0, "mj-code-editor", 118);
738
+ i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_7_Template_mj_code_editor_change_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.OnCodeEditorChange($event)); });
580
739
  i0.ɵɵelementEnd();
581
740
  } if (rf & 2) {
582
741
  const ctx_r0 = i0.ɵɵnextContext(3);
583
742
  i0.ɵɵproperty("value", ctx_r0.FormatValue())("language", ctx_r0.CodeEditorLanguage);
584
743
  } }
585
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_0_Template(rf, ctx) { if (rf & 1) {
586
- const _r29 = i0.ɵɵgetCurrentView();
587
- i0.ɵɵelementStart(0, "input", 98);
588
- i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_0_Template_input_input_0_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnInputChange($event)); });
744
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_0_Template(rf, ctx) { if (rf & 1) {
745
+ const _r35 = i0.ɵɵgetCurrentView();
746
+ i0.ɵɵelementStart(0, "input", 123);
747
+ i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_0_Template_input_input_0_listener($event) { i0.ɵɵrestoreView(_r35); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnInputChange($event)); });
589
748
  i0.ɵɵelementEnd();
590
749
  } if (rf & 2) {
591
750
  const ctx_r0 = i0.ɵɵnextContext(4);
592
751
  i0.ɵɵproperty("value", ctx_r0.FormatValue());
593
752
  } }
594
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_1_Template(rf, ctx) { if (rf & 1) {
595
- const _r30 = i0.ɵɵgetCurrentView();
596
- i0.ɵɵelementStart(0, "textarea", 99);
597
- i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_1_Template_textarea_input_0_listener($event) { i0.ɵɵrestoreView(_r30); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnInputChange($event)); });
753
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_1_Template(rf, ctx) { if (rf & 1) {
754
+ const _r36 = i0.ɵɵgetCurrentView();
755
+ i0.ɵɵelementStart(0, "textarea", 124);
756
+ i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_1_Template_textarea_input_0_listener($event) { i0.ɵɵrestoreView(_r36); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnInputChange($event)); });
598
757
  i0.ɵɵelementEnd();
599
758
  } if (rf & 2) {
600
759
  const ctx_r0 = i0.ɵɵnextContext(4);
601
760
  i0.ɵɵproperty("value", ctx_r0.FormatValue());
602
761
  } }
603
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_2_Template(rf, ctx) { if (rf & 1) {
604
- const _r31 = i0.ɵɵgetCurrentView();
605
- i0.ɵɵelementStart(0, "input", 100);
606
- i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_2_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r31); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnNumberChange($event)); });
762
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_2_Template(rf, ctx) { if (rf & 1) {
763
+ const _r37 = i0.ɵɵgetCurrentView();
764
+ i0.ɵɵelementStart(0, "input", 125);
765
+ i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_2_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r37); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnNumberChange($event)); });
607
766
  i0.ɵɵelementEnd();
608
767
  } if (rf & 2) {
609
768
  const ctx_r0 = i0.ɵɵnextContext(4);
610
769
  i0.ɵɵproperty("value", ctx_r0.Value);
611
770
  } }
612
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_3_Template(rf, ctx) { if (rf & 1) {
613
- const _r32 = i0.ɵɵgetCurrentView();
614
- i0.ɵɵelementStart(0, "input", 101);
615
- i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_3_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r32); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnDateChange($event)); });
771
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_3_Template(rf, ctx) { if (rf & 1) {
772
+ const _r38 = i0.ɵɵgetCurrentView();
773
+ i0.ɵɵelementStart(0, "input", 126);
774
+ i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_3_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r38); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnDateChange($event)); });
616
775
  i0.ɵɵelementEnd();
617
776
  } if (rf & 2) {
618
777
  const ctx_r0 = i0.ɵɵnextContext(4);
619
778
  i0.ɵɵproperty("value", ctx_r0.DateInputValue);
620
779
  } }
621
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_4_Template(rf, ctx) { if (rf & 1) {
622
- const _r33 = i0.ɵɵgetCurrentView();
623
- i0.ɵɵelementStart(0, "div", 19)(1, "input", 102);
624
- i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_4_Template_input_change_1_listener($event) { i0.ɵɵrestoreView(_r33); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnCheckboxChange($event)); });
780
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_4_Template(rf, ctx) { if (rf & 1) {
781
+ const _r39 = i0.ɵɵgetCurrentView();
782
+ i0.ɵɵelementStart(0, "div", 28)(1, "input", 127);
783
+ i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_4_Template_input_change_1_listener($event) { i0.ɵɵrestoreView(_r39); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnCheckboxChange($event)); });
625
784
  i0.ɵɵelementEnd()();
626
785
  } if (rf & 2) {
627
786
  const ctx_r0 = i0.ɵɵnextContext(4);
628
787
  i0.ɵɵadvance();
629
788
  i0.ɵɵproperty("checked", !!ctx_r0.Value);
630
789
  } }
631
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_5_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
632
- const _r35 = i0.ɵɵgetCurrentView();
633
- i0.ɵɵelementStart(0, "div", 109);
634
- i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_5_Conditional_4_For_2_Template_div_mousedown_0_listener($event) { const option_r36 = i0.ɵɵrestoreView(_r35).$implicit; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.OnSelectOptionClick(option_r36, $event)); });
790
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
791
+ const _r41 = i0.ɵɵgetCurrentView();
792
+ i0.ɵɵelementStart(0, "div", 134);
793
+ i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Conditional_4_For_2_Template_div_mousedown_0_listener($event) { const option_r42 = i0.ɵɵrestoreView(_r41).$implicit; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.OnSelectOptionClick(option_r42, $event)); });
635
794
  i0.ɵɵtext(1);
636
795
  i0.ɵɵelementEnd();
637
796
  } if (rf & 2) {
638
- const option_r36 = ctx.$implicit;
797
+ const option_r42 = ctx.$implicit;
639
798
  const ctx_r0 = i0.ɵɵnextContext(6);
640
- i0.ɵɵclassProp("mj-fk-option--selected", ctx_r0.FormatValue() === option_r36);
799
+ i0.ɵɵclassProp("mj-fk-option--selected", ctx_r0.FormatValue() === option_r42);
641
800
  i0.ɵɵadvance();
642
- i0.ɵɵtextInterpolate1(" ", option_r36, " ");
801
+ i0.ɵɵtextInterpolate1(" ", option_r42, " ");
643
802
  } }
644
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_5_Conditional_4_Template(rf, ctx) { if (rf & 1) {
645
- i0.ɵɵelementStart(0, "div", 107);
646
- i0.ɵɵrepeaterCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_5_Conditional_4_For_2_Template, 2, 3, "div", 108, i0.ɵɵrepeaterTrackByIdentity);
803
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Conditional_4_Template(rf, ctx) { if (rf & 1) {
804
+ i0.ɵɵelementStart(0, "div", 132);
805
+ i0.ɵɵrepeaterCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Conditional_4_For_2_Template, 2, 3, "div", 133, i0.ɵɵrepeaterTrackByIdentity);
647
806
  i0.ɵɵelementEnd();
648
807
  } if (rf & 2) {
649
808
  const ctx_r0 = i0.ɵɵnextContext(5);
@@ -652,16 +811,16 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_5_C
652
811
  i0.ɵɵadvance();
653
812
  i0.ɵɵrepeater(ctx_r0.PossibleValues);
654
813
  } }
655
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_5_Template(rf, ctx) { if (rf & 1) {
656
- const _r34 = i0.ɵɵgetCurrentView();
657
- i0.ɵɵelementStart(0, "div", 103);
658
- i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_5_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r34); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnSelectTriggerClick($event)); })("blur", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_5_Template_div_blur_0_listener() { i0.ɵɵrestoreView(_r34); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnSelectTriggerBlur()); });
659
- i0.ɵɵelementStart(1, "span", 104);
814
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Template(rf, ctx) { if (rf & 1) {
815
+ const _r40 = i0.ɵɵgetCurrentView();
816
+ i0.ɵɵelementStart(0, "div", 128);
817
+ i0.ɵɵlistener("click", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r40); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnSelectTriggerClick($event)); })("blur", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Template_div_blur_0_listener() { i0.ɵɵrestoreView(_r40); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnSelectTriggerBlur()); });
818
+ i0.ɵɵelementStart(1, "span", 129);
660
819
  i0.ɵɵtext(2);
661
820
  i0.ɵɵelementEnd();
662
- i0.ɵɵelement(3, "i", 105);
821
+ i0.ɵɵelement(3, "i", 130);
663
822
  i0.ɵɵelementEnd();
664
- i0.ɵɵconditionalCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_5_Conditional_4_Template, 3, 3, "div", 106);
823
+ i0.ɵɵconditionalCreate(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Conditional_4_Template, 3, 3, "div", 131);
665
824
  } if (rf & 2) {
666
825
  const ctx_r0 = i0.ɵɵnextContext(4);
667
826
  i0.ɵɵadvance();
@@ -673,20 +832,20 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_5_T
673
832
  i0.ɵɵadvance();
674
833
  i0.ɵɵconditional(ctx_r0.ShowSelectDropdown && ctx_r0.PossibleValues.length > 0 ? 4 : -1);
675
834
  } }
676
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_6_Conditional_3_For_2_Template(rf, ctx) { if (rf & 1) {
677
- const _r38 = i0.ɵɵgetCurrentView();
678
- i0.ɵɵelementStart(0, "div", 109);
679
- i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_6_Conditional_3_For_2_Template_div_mousedown_0_listener($event) { const option_r39 = i0.ɵɵrestoreView(_r38).$implicit; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.OnValueListSelect(option_r39, $event)); });
835
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Conditional_3_For_2_Template(rf, ctx) { if (rf & 1) {
836
+ const _r44 = i0.ɵɵgetCurrentView();
837
+ i0.ɵɵelementStart(0, "div", 134);
838
+ i0.ɵɵlistener("mousedown", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Conditional_3_For_2_Template_div_mousedown_0_listener($event) { const option_r45 = i0.ɵɵrestoreView(_r44).$implicit; const ctx_r0 = i0.ɵɵnextContext(6); return i0.ɵɵresetView(ctx_r0.OnValueListSelect(option_r45, $event)); });
680
839
  i0.ɵɵtext(1);
681
840
  i0.ɵɵelementEnd();
682
841
  } if (rf & 2) {
683
- const option_r39 = ctx.$implicit;
842
+ const option_r45 = ctx.$implicit;
684
843
  i0.ɵɵadvance();
685
- i0.ɵɵtextInterpolate1(" ", option_r39, " ");
844
+ i0.ɵɵtextInterpolate1(" ", option_r45, " ");
686
845
  } }
687
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_6_Conditional_3_Template(rf, ctx) { if (rf & 1) {
688
- i0.ɵɵelementStart(0, "div", 107);
689
- i0.ɵɵrepeaterCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_6_Conditional_3_For_2_Template, 2, 1, "div", 111, i0.ɵɵrepeaterTrackByIdentity);
846
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Conditional_3_Template(rf, ctx) { if (rf & 1) {
847
+ i0.ɵɵelementStart(0, "div", 132);
848
+ i0.ɵɵrepeaterCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Conditional_3_For_2_Template, 2, 1, "div", 136, i0.ɵɵrepeaterTrackByIdentity);
690
849
  i0.ɵɵelementEnd();
691
850
  } if (rf & 2) {
692
851
  const ctx_r0 = i0.ɵɵnextContext(5);
@@ -695,13 +854,13 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_6_C
695
854
  i0.ɵɵadvance();
696
855
  i0.ɵɵrepeater(ctx_r0.FilteredPossibleValues);
697
856
  } }
698
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_6_Template(rf, ctx) { if (rf & 1) {
699
- const _r37 = i0.ɵɵgetCurrentView();
700
- i0.ɵɵelementStart(0, "div", 28)(1, "input", 110);
701
- i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_6_Template_input_input_1_listener($event) { i0.ɵɵrestoreView(_r37); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnValueListInput($event)); })("focus", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_6_Template_input_focus_1_listener($event) { i0.ɵɵrestoreView(_r37); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnValueListFocus($event)); })("blur", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_6_Template_input_blur_1_listener() { i0.ɵɵrestoreView(_r37); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnValueListBlur()); });
857
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Template(rf, ctx) { if (rf & 1) {
858
+ const _r43 = i0.ɵɵgetCurrentView();
859
+ i0.ɵɵelementStart(0, "div", 40)(1, "input", 135);
860
+ i0.ɵɵlistener("input", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Template_input_input_1_listener($event) { i0.ɵɵrestoreView(_r43); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnValueListInput($event)); })("focus", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Template_input_focus_1_listener($event) { i0.ɵɵrestoreView(_r43); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnValueListFocus($event)); })("blur", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Template_input_blur_1_listener() { i0.ɵɵrestoreView(_r43); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnValueListBlur()); });
702
861
  i0.ɵɵelementEnd();
703
- i0.ɵɵelement(2, "i", 33);
704
- i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_6_Conditional_3_Template, 3, 3, "div", 106);
862
+ i0.ɵɵelement(2, "i", 45);
863
+ i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Conditional_3_Template, 3, 3, "div", 131);
705
864
  i0.ɵɵelementEnd();
706
865
  } if (rf & 2) {
707
866
  const ctx_r0 = i0.ɵɵnextContext(4);
@@ -710,86 +869,96 @@ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_6_T
710
869
  i0.ɵɵadvance(2);
711
870
  i0.ɵɵconditional(ctx_r0.ShowValueListDropdown && ctx_r0.FilteredPossibleValues.length > 0 ? 3 : -1);
712
871
  } }
713
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_7_Template(rf, ctx) { if (rf & 1) {
714
- const _r40 = i0.ɵɵgetCurrentView();
715
- i0.ɵɵelementStart(0, "input", 112);
716
- i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_7_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r40); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnInputChange($event)); });
872
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_7_Template(rf, ctx) { if (rf & 1) {
873
+ const _r46 = i0.ɵɵgetCurrentView();
874
+ i0.ɵɵelementStart(0, "input", 137);
875
+ i0.ɵɵlistener("change", function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_7_Template_input_change_0_listener($event) { i0.ɵɵrestoreView(_r46); const ctx_r0 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r0.OnInputChange($event)); });
717
876
  i0.ɵɵelementEnd();
718
877
  } if (rf & 2) {
719
878
  const ctx_r0 = i0.ɵɵnextContext(4);
720
879
  i0.ɵɵproperty("value", ctx_r0.FormatValue());
721
880
  } }
722
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
723
- i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_0_Template, 1, 1, "input", 94)(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_1_Template, 1, 1, "textarea", 95)(2, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_2_Template, 1, 1, "input", 96)(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_3_Template, 1, 1, "input", 97)(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_4_Template, 2, 1, "div", 19)(5, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_5_Template, 5, 6)(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_6_Template, 4, 2, "div", 28)(7, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Case_7_Template, 1, 1, "input", 94);
881
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
882
+ i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_0_Template, 1, 1, "input", 119)(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_1_Template, 1, 1, "textarea", 120)(2, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_2_Template, 1, 1, "input", 121)(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_3_Template, 1, 1, "input", 122)(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_4_Template, 2, 1, "div", 28)(5, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_5_Template, 5, 6)(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_6_Template, 4, 2, "div", 40)(7, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Case_7_Template, 1, 1, "input", 119);
724
883
  } if (rf & 2) {
725
884
  let tmp_3_0;
726
885
  const ctx_r0 = i0.ɵɵnextContext(3);
727
886
  i0.ɵɵconditional((tmp_3_0 = ctx_r0.Type) === "textbox" ? 0 : tmp_3_0 === "textarea" ? 1 : tmp_3_0 === "number" ? 2 : tmp_3_0 === "datepicker" ? 3 : tmp_3_0 === "checkbox" ? 4 : tmp_3_0 === "select" ? 5 : tmp_3_0 === "autocomplete" ? 6 : 7);
728
887
  } }
729
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
730
- i0.ɵɵelementStart(0, "div", 113);
731
- i0.ɵɵelement(1, "i", 114);
888
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_9_For_2_Template(rf, ctx) { if (rf & 1) {
889
+ i0.ɵɵelementStart(0, "div", 138);
890
+ i0.ɵɵelement(1, "i", 139);
732
891
  i0.ɵɵelementStart(2, "span");
733
892
  i0.ɵɵtext(3);
734
893
  i0.ɵɵelementEnd()();
735
894
  } if (rf & 2) {
736
- const error_r41 = ctx.$implicit;
895
+ const error_r47 = ctx.$implicit;
737
896
  i0.ɵɵadvance(3);
738
- i0.ɵɵtextInterpolate(error_r41.Message);
897
+ i0.ɵɵtextInterpolate(error_r47.Message);
739
898
  } }
740
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
741
- i0.ɵɵelementStart(0, "div", 26);
742
- i0.ɵɵrepeaterCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_6_For_2_Template, 4, 1, "div", 113, _forTrack2);
899
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
900
+ i0.ɵɵelementStart(0, "div", 38);
901
+ i0.ɵɵrepeaterCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_9_For_2_Template, 4, 1, "div", 138, _forTrack2);
743
902
  i0.ɵɵelementEnd();
744
903
  } if (rf & 2) {
745
904
  const ctx_r0 = i0.ɵɵnextContext(3);
746
905
  i0.ɵɵadvance();
747
906
  i0.ɵɵrepeater(ctx_r0.DisplayErrors);
748
907
  } }
749
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_7_For_2_Template(rf, ctx) { if (rf & 1) {
750
- i0.ɵɵelementStart(0, "div", 113);
751
- i0.ɵɵelement(1, "i", 115);
908
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_10_For_2_Template(rf, ctx) { if (rf & 1) {
909
+ i0.ɵɵelementStart(0, "div", 138);
910
+ i0.ɵɵelement(1, "i", 140);
752
911
  i0.ɵɵelementStart(2, "span");
753
912
  i0.ɵɵtext(3);
754
913
  i0.ɵɵelementEnd()();
755
914
  } if (rf & 2) {
756
- const warning_r42 = ctx.$implicit;
915
+ const warning_r48 = ctx.$implicit;
757
916
  i0.ɵɵadvance(3);
758
- i0.ɵɵtextInterpolate(warning_r42.Message);
917
+ i0.ɵɵtextInterpolate(warning_r48.Message);
759
918
  } }
760
- function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
761
- i0.ɵɵelementStart(0, "div", 27);
762
- i0.ɵɵrepeaterCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_7_For_2_Template, 4, 1, "div", 113, _forTrack2);
919
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
920
+ i0.ɵɵelementStart(0, "div", 39);
921
+ i0.ɵɵrepeaterCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_10_For_2_Template, 4, 1, "div", 138, _forTrack2);
763
922
  i0.ɵɵelementEnd();
764
923
  } if (rf & 2) {
765
924
  const ctx_r0 = i0.ɵɵnextContext(3);
766
925
  i0.ɵɵadvance();
767
926
  i0.ɵɵrepeater(ctx_r0.DisplayWarnings);
768
927
  } }
928
+ function MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
929
+ i0.ɵɵelementStart(0, "div", 39)(1, "div", 138);
930
+ i0.ɵɵelement(2, "i", 140);
931
+ i0.ɵɵelementStart(3, "span");
932
+ i0.ɵɵtext(4, "This field holds a value that is not a readable date, so the box above is empty. Saving now will replace it.");
933
+ i0.ɵɵelementEnd()()();
934
+ } }
769
935
  function MjFormFieldComponent_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
770
- i0.ɵɵelementStart(0, "div", 23);
771
- i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_1_Template, 1, 1, "label", 4);
772
- i0.ɵɵelementStart(2, "div", 5);
773
- i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template, 7, 11, "div", 24)(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Template, 1, 2, "mj-code-editor", 25)(5, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Template, 8, 1);
936
+ i0.ɵɵelementStart(0, "div", 32);
937
+ i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_1_Template, 1, 1, "label", 5);
938
+ i0.ɵɵelementStart(2, "div", 6);
939
+ i0.ɵɵconditionalCreate(3, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_3_Template, 7, 11, "div", 33)(4, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_4_Template, 15, 6, "div", 34)(5, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_5_Template, 3, 3, "div", 35)(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_6_Template, 1, 1, "textarea", 36)(7, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_7_Template, 1, 2, "mj-code-editor", 37)(8, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_8_Template, 8, 1);
774
940
  i0.ɵɵelementEnd();
775
- i0.ɵɵconditionalCreate(6, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_6_Template, 3, 0, "div", 26);
776
- i0.ɵɵconditionalCreate(7, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_7_Template, 3, 0, "div", 27);
941
+ i0.ɵɵconditionalCreate(9, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_9_Template, 3, 0, "div", 38);
942
+ i0.ɵɵconditionalCreate(10, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_10_Template, 3, 0, "div", 39);
943
+ i0.ɵɵconditionalCreate(11, MjFormFieldComponent_Conditional_0_Conditional_1_Conditional_11_Template, 5, 0, "div", 39);
777
944
  i0.ɵɵelementEnd();
778
945
  } if (rf & 2) {
779
946
  const ctx_r0 = i0.ɵɵnextContext(2);
780
- i0.ɵɵclassProp("mj-forms-field--dirty", ctx_r0.IsDirty)("mj-forms-field--required-empty", ctx_r0.IsRequiredEmpty)("mj-forms-field--has-error", ctx_r0.ShowErrors)("mj-forms-field--has-warning", ctx_r0.ShowWarnings);
947
+ i0.ɵɵclassProp("mj-forms-field--dirty", ctx_r0.IsDirty)("mj-forms-field--required-empty", ctx_r0.IsRequiredEmpty)("mj-forms-field--has-error", ctx_r0.ShowErrors)("mj-forms-field--has-warning", ctx_r0.ShowWarnings || ctx_r0.StoredDateIsUnreadable);
781
948
  i0.ɵɵadvance();
782
949
  i0.ɵɵconditional(ctx_r0.ShowLabel ? 1 : -1);
783
950
  i0.ɵɵadvance(2);
784
- i0.ɵɵconditional(ctx_r0.HasRelatedEntity ? 3 : ctx_r0.EditRichTextMode !== "plain" ? 4 : 5);
785
- i0.ɵɵadvance(3);
786
- i0.ɵɵconditional(ctx_r0.DisplayErrors.length > 0 ? 6 : -1);
951
+ i0.ɵɵconditional(ctx_r0.HasRelatedEntity ? 3 : ctx_r0.ExtendedDisplay === "image" ? 4 : ctx_r0.ExtendedDisplay === "color" ? 5 : ctx_r0.ExtendedDisplay === "json" ? 6 : ctx_r0.EditRichTextMode !== "plain" ? 7 : 8);
952
+ i0.ɵɵadvance(6);
953
+ i0.ɵɵconditional(ctx_r0.DisplayErrors.length > 0 ? 9 : -1);
954
+ i0.ɵɵadvance();
955
+ i0.ɵɵconditional(ctx_r0.DisplayWarnings.length > 0 ? 10 : -1);
787
956
  i0.ɵɵadvance();
788
- i0.ɵɵconditional(ctx_r0.DisplayWarnings.length > 0 ? 7 : -1);
957
+ i0.ɵɵconditional(ctx_r0.StoredDateIsUnreadable ? 11 : -1);
789
958
  } }
790
959
  function MjFormFieldComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
791
- i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_0_Template, 5, 6, "div", 1);
792
- i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Template, 8, 12, "div", 2);
960
+ i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Conditional_0_Template, 8, 6, "div", 2);
961
+ i0.ɵɵconditionalCreate(1, MjFormFieldComponent_Conditional_0_Conditional_1_Template, 12, 13, "div", 3);
793
962
  } if (rf & 2) {
794
963
  const ctx_r0 = i0.ɵɵnextContext();
795
964
  i0.ɵɵconditional((!ctx_r0.EditMode || ctx_r0.IsFieldReadOnly) && !ctx_r0.ShouldHideField ? 0 : -1);
@@ -899,6 +1068,45 @@ export class MjFormFieldComponent extends BaseAngularComponent {
899
1068
  get FieldInfo() {
900
1069
  return this.Record?.EntityInfo?.Fields?.find(f => f.Name === this.FieldName);
901
1070
  }
1071
+ /** Memoized answer for {@link IsFieldReadableByUser}; invalidated in ngOnChanges. */
1072
+ _isReadableByUser;
1073
+ /** Memoized answer for {@link IsFieldWritableByUser}; invalidated in ngOnChanges. */
1074
+ _isWritableByUser;
1075
+ /** The `Record.IsSaved` state {@link _isWritableByUser} was computed against. */
1076
+ _isWritableForSavedState;
1077
+ /**
1078
+ * Whether field-level security permits the current user to READ this field.
1079
+ *
1080
+ * The template gates the whole field on this BEFORE anything reads a value, because
1081
+ * `BaseEntity.Get()` throws for a denied field — so rendering one at all would take out the
1082
+ * entire form rather than hiding a column. Everything downstream (`Value`, `ShouldHideField`,
1083
+ * FK resolution) is safe only because this check runs first.
1084
+ *
1085
+ * Memoized: template getters are evaluated on every change-detection cycle, and
1086
+ * `GetDeniedReadFields` walks every field on the entity and aggregates permissions across the
1087
+ * user's roles. `ngOnChanges` clears the memo when `Record` or `FieldName` changes.
1088
+ *
1089
+ * Fails OPEN — on a missing entity, missing user, or an entity with field security switched
1090
+ * off — matching `BaseEntity`'s own gate. A form that hid fields because no user had resolved
1091
+ * yet would be worse than one that shows them, since the server is the real boundary.
1092
+ */
1093
+ get IsFieldReadableByUser() {
1094
+ if (this._isReadableByUser === undefined) {
1095
+ this._isReadableByUser = this.computeIsFieldReadableByUser();
1096
+ }
1097
+ return this._isReadableByUser;
1098
+ }
1099
+ computeIsFieldReadableByUser() {
1100
+ const entityInfo = this.Record?.EntityInfo;
1101
+ if (!entityInfo?.EnableFieldLevelSecurity) {
1102
+ return true; // one boolean for the overwhelming majority of entities
1103
+ }
1104
+ const user = this.ProviderToUse?.CurrentUser;
1105
+ if (!user || !this.FieldName) {
1106
+ return true;
1107
+ }
1108
+ return !entityInfo.GetDeniedReadFields(user).has(this.FieldName.trim().toLowerCase());
1109
+ }
902
1110
  /** Display name from metadata or override */
903
1111
  get DisplayName() {
904
1112
  if (this.DisplayNameOverride)
@@ -933,7 +1141,7 @@ export class MjFormFieldComponent extends BaseAngularComponent {
933
1141
  return;
934
1142
  const oldValue = this.Record.Get(this.FieldName);
935
1143
  this.Record.Set(this.FieldName, newValue);
936
- this._touched = true;
1144
+ this.markTouched();
937
1145
  this.runFieldValidation();
938
1146
  this.ValueChange.emit({ FieldName: this.FieldName, OldValue: oldValue, NewValue: newValue });
939
1147
  }
@@ -941,7 +1149,54 @@ export class MjFormFieldComponent extends BaseAngularComponent {
941
1149
  get IsFieldReadOnly() {
942
1150
  if (!this.FieldInfo)
943
1151
  return false;
944
- return this.FieldInfo.ReadOnly;
1152
+ return this.FieldInfo.ReadOnly || !this.IsFieldWritableByUser;
1153
+ }
1154
+ /**
1155
+ * Whether field-level security permits the current user to WRITE this field, against the verb
1156
+ * that actually applies to the record in hand: Create on a new record, Update on a saved one.
1157
+ *
1158
+ * Read access is handled separately and earlier ({@link IsFieldReadableByUser}) — a field the
1159
+ * user cannot see is not rendered at all. This is the narrower case of a field they CAN see
1160
+ * but may not change, which should render as a read-only value rather than an editable control.
1161
+ *
1162
+ * Both verbs matter and they fail differently, which is why this picks by record state rather
1163
+ * than checking update alone:
1164
+ *
1165
+ * - **Update denied** — the server rejects the save. Without this, the user types, saves, and
1166
+ * gets an error naming a field they had every reason to think was editable.
1167
+ * - **Create denied** — the server does NOT reject. It silently drops the value and takes the
1168
+ * column default, matching the read path where a denied field is simply absent. So an
1169
+ * editable control on a new record quietly discards what was typed, with no error anywhere.
1170
+ * That is the worse of the two, and the only signal the user gets is this.
1171
+ *
1172
+ * Memoized alongside the read check and invalidated by the same `ngOnChanges`, for the same
1173
+ * reason: template getters run every change-detection cycle and the underlying walk covers
1174
+ * every field on the entity.
1175
+ */
1176
+ get IsFieldWritableByUser() {
1177
+ // Keyed on IsSaved as well as memoized: the answer switches from the Create rules to the
1178
+ // Update rules the moment a new record is saved, and that happens WITHOUT ngOnChanges firing
1179
+ // — the Record input is the same object, only its state changed. A plain memo would keep
1180
+ // answering with the create-time verb for the rest of the form's life.
1181
+ const isSaved = this.Record?.IsSaved === true;
1182
+ if (this._isWritableByUser === undefined || this._isWritableForSavedState !== isSaved) {
1183
+ this._isWritableByUser = this.computeIsFieldWritableByUser();
1184
+ this._isWritableForSavedState = isSaved;
1185
+ }
1186
+ return this._isWritableByUser;
1187
+ }
1188
+ computeIsFieldWritableByUser() {
1189
+ const entityInfo = this.Record?.EntityInfo;
1190
+ if (!entityInfo?.EnableFieldLevelSecurity) {
1191
+ return true; // one boolean for the overwhelming majority of entities
1192
+ }
1193
+ const user = this.ProviderToUse?.CurrentUser;
1194
+ if (!user || !this.FieldName) {
1195
+ return true; // fail open, matching the read gate
1196
+ }
1197
+ return this.Record?.IsSaved
1198
+ ? entityInfo.IsFieldUpdatableByUser(this.FieldName, user)
1199
+ : entityInfo.IsFieldCreatableByUser(this.FieldName, user);
945
1200
  }
946
1201
  /** Whether this field has been modified (dirty). Only shown for saved records (not new). */
947
1202
  get IsDirty() {
@@ -967,15 +1222,45 @@ export class MjFormFieldComponent extends BaseAngularComponent {
967
1222
  // ---- INLINE VALIDATION ----
968
1223
  /** Whether the user has interacted with (changed) this field */
969
1224
  _touched = false;
1225
+ /**
1226
+ * `FormContext.validationRevision` as it stood when the user last edited this field. Compared with
1227
+ * the current revision in {@link FieldErrors}: equal means the edit came AFTER the last failed
1228
+ * save, so the user is addressing it and live local validation is the truth; lower means the
1229
+ * failure is newer than the edit, so the form-level errors must win.
1230
+ */
1231
+ _touchedAtRevision = 0;
1232
+ /** Set when an image upload is rejected (type/size) — shown with field validation. */
1233
+ imageUploadError = null;
970
1234
  /** Locally computed validation errors for this field */
971
1235
  _fieldErrors = [];
1236
+ /**
1237
+ * The ONE way a user interaction marks this field touched: every site must also stamp the
1238
+ * revision, or a field touched after a failed save would keep showing the stale form-level error.
1239
+ */
1240
+ markTouched() {
1241
+ this._touched = true;
1242
+ this._touchedAtRevision = this.FormContext?.validationRevision ?? 0;
1243
+ }
1244
+ /**
1245
+ * True when the user has edited this field since the form last published validation errors.
1246
+ *
1247
+ * Plain `_touched` was the wrong test: it stayed true from the moment the user typed, so after a
1248
+ * failed save the field returned its own — necessarily local, synchronous — validation, and an
1249
+ * error the SERVER had just reported for that very field (a `ValidateAsync()` refusal, which the
1250
+ * client cannot compute) never showed on the one field the user had just been in.
1251
+ */
1252
+ get editedSinceLastValidationFailure() {
1253
+ return this._touched && this._touchedAtRevision === (this.FormContext?.validationRevision ?? 0);
1254
+ }
972
1255
  /** Validation errors for this field from the best available source */
973
1256
  get FieldErrors() {
974
- // If touched, use fresh local validation (covers real-time feedback)
975
- if (this._touched) {
1257
+ // Edited after the last failure: fresh local validation (real-time feedback, and how a
1258
+ // server-reported error clears — a later valid edit yields no local errors).
1259
+ if (this.editedSinceLastValidationFailure) {
976
1260
  return this._fieldErrors;
977
1261
  }
978
- // Otherwise use form-level errors from save failure (covers untouched fields)
1262
+ // Otherwise the form-level errors from the failed save whether this field was never touched,
1263
+ // or was touched before the save that failed.
979
1264
  const contextErrors = this.FormContext?.validationErrors;
980
1265
  if (contextErrors && contextErrors.length > 0) {
981
1266
  return contextErrors.filter(e => e.Source === this.FieldName);
@@ -990,6 +1275,8 @@ export class MjFormFieldComponent extends BaseAngularComponent {
990
1275
  }
991
1276
  /** Whether this field has active error-level validation failures to display */
992
1277
  get ShowErrors() {
1278
+ if (this.imageUploadError)
1279
+ return true;
993
1280
  return this.ShowValidation && this.FieldErrors.some(e => e.Type === 'Failure');
994
1281
  }
995
1282
  /** Whether this field has active warning-level validation issues to display */
@@ -998,9 +1285,16 @@ export class MjFormFieldComponent extends BaseAngularComponent {
998
1285
  }
999
1286
  /** Error messages to render in the template */
1000
1287
  get DisplayErrors() {
1001
- if (!this.ShowValidation)
1002
- return [];
1003
- return this.FieldErrors.filter(e => e.Type === 'Failure');
1288
+ const errors = this.ShowValidation
1289
+ ? this.FieldErrors.filter(e => e.Type === 'Failure')
1290
+ : [];
1291
+ if (this.imageUploadError) {
1292
+ return [
1293
+ ...errors,
1294
+ new ValidationErrorInfo(this.FieldName, this.imageUploadError, this.Value),
1295
+ ];
1296
+ }
1297
+ return errors;
1004
1298
  }
1005
1299
  /** Warning messages to render in the template */
1006
1300
  get DisplayWarnings() {
@@ -1029,6 +1323,14 @@ export class MjFormFieldComponent extends BaseAngularComponent {
1029
1323
  }
1030
1324
  /** Whether this field should be hidden (empty in read-only mode) */
1031
1325
  get ShouldHideField() {
1326
+ // A read-denied field is always hidden. This must run before Value is touched: the
1327
+ // template's own @if guards rendering behind IsFieldReadableByUser, but programmatic
1328
+ // callers (MjCollapsiblePanelComponent.hasRenderableContent sweeps ShouldHideField to
1329
+ // decide section visibility) reach this getter directly, and BaseEntity.Get() THROWS for
1330
+ // a denied field. Returning true here is also what lets a section whose fields are all
1331
+ // denied collapse away instead of rendering an empty card.
1332
+ if (!this.IsFieldReadableByUser)
1333
+ return true;
1032
1334
  if (this.EditMode)
1033
1335
  return false;
1034
1336
  if (!this.HideWhenEmptyInReadOnlyMode)
@@ -1068,9 +1370,15 @@ export class MjFormFieldComponent extends BaseAngularComponent {
1068
1370
  const fkValue = this.Value;
1069
1371
  if (fkValue == null || fkValue === '')
1070
1372
  return null;
1071
- // Fast path: name field is joined into our record's view
1373
+ // Fast path: name field is joined into our record's view.
1374
+ //
1375
+ // The joined display column is a SEPARATE EntityField from the FK it accompanies, and can be
1376
+ // denied independently — CompanyID readable while Company is not. `IsFieldReadableByUser`
1377
+ // gates this component on its OWN field name, so it does not cover this read; without the
1378
+ // check here, Get() throws and takes out the form. Falling through to the async lookup is
1379
+ // right: that path reads the related record, which has its own permissions.
1072
1380
  const nameFieldMap = this.FieldInfo?.RelatedEntityNameFieldMap;
1073
- if (nameFieldMap) {
1381
+ if (nameFieldMap && this.Record.EntityInfo?.IsFieldReadableByUser(nameFieldMap, this.ProviderToUse?.CurrentUser)) {
1074
1382
  const val = this.Record.Get(nameFieldMap);
1075
1383
  if (val != null && val !== '')
1076
1384
  return String(val);
@@ -1433,17 +1741,26 @@ export class MjFormFieldComponent extends BaseAngularComponent {
1433
1741
  const relatedEntity = this.getRelatedEntityInfo();
1434
1742
  if (!relatedEntity)
1435
1743
  return null;
1436
- const nameField = relatedEntity.NameField;
1437
1744
  const pkFields = relatedEntity.PrimaryKeys;
1745
+ // Field-level security applies to the RELATED entity here, not this record's. A name field
1746
+ // the user cannot read would throw from every downstream Get() — so drop to the primary key,
1747
+ // which is unrestrictable by construction. This plan is the single chokepoint for every
1748
+ // related-record read the FK control makes (dropdown rows, search, create-and-select), so
1749
+ // filtering here is what keeps those safe rather than four separate guards.
1750
+ const user = this.ProviderToUse?.CurrentUser;
1751
+ const nameField = relatedEntity.NameField && relatedEntity.IsFieldReadableByUser(relatedEntity.NameField.Name, user)
1752
+ ? relatedEntity.NameField
1753
+ : null;
1438
1754
  if (!nameField && (!pkFields || pkFields.length !== 1))
1439
1755
  return null;
1440
1756
  const nameFieldName = nameField ? nameField.Name : pkFields[0].Name;
1441
1757
  const pkFieldName = this.FieldInfo?.RelatedEntityFieldName || (pkFields?.[0]?.Name ?? 'ID');
1442
1758
  // A field flagged ExtendedType='Icon' holds a per-row icon class — render it
1443
1759
  // as the row's leading glyph, not as a text column.
1444
- const iconField = relatedEntity.Fields.find(f => f.ExtendedType === 'Icon');
1760
+ const iconField = relatedEntity.Fields.find(f => f.ExtendedType === 'Icon' && relatedEntity.IsFieldReadableByUser(f.Name, user));
1445
1761
  const iconFieldName = iconField?.Name ?? null;
1446
- const columnFields = this.computeOrderedColumns(relatedEntity, nameFieldName, pkFieldName, iconFieldName);
1762
+ const columnFields = this.computeOrderedColumns(relatedEntity, nameFieldName, pkFieldName, iconFieldName)
1763
+ .filter(c => relatedEntity.IsFieldReadableByUser(c, user));
1447
1764
  const extraFieldNames = columnFields.filter(c => c !== nameFieldName);
1448
1765
  this._fkColumnPlan = {
1449
1766
  NameFieldName: nameFieldName,
@@ -2003,7 +2320,12 @@ export class MjFormFieldComponent extends BaseAngularComponent {
2003
2320
  }
2004
2321
  this._fkQuery = query;
2005
2322
  const accessor = (r) => ({ get: (field) => r.Get(field) });
2006
- const searchField = this.FKSearchField || plan.NameFieldName;
2323
+ // plan.NameFieldName is already vetted for readability by buildColumnPlan; FKSearchField is
2324
+ // caller-supplied and is not, so it falls back rather than throwing on the first row.
2325
+ const relatedInfo = records[0]?.EntityInfo;
2326
+ const searchField = this.FKSearchField && relatedInfo?.IsFieldReadableByUser(this.FKSearchField, this.ProviderToUse?.CurrentUser) !== false
2327
+ ? this.FKSearchField
2328
+ : plan.NameFieldName;
2007
2329
  const matches = FilterCachedFKRows(records, query, MjFormFieldComponent.FK_FOCUS_SHOW_LIMIT, r => r.Get(searchField));
2008
2330
  this.FKLoading = false;
2009
2331
  this.applySuggestions(this.buildSuggestions(matches.map(accessor), plan, query), plan);
@@ -2416,21 +2738,113 @@ export class MjFormFieldComponent extends BaseAngularComponent {
2416
2738
  default: return ''; // 'Other' / null → plain code editing
2417
2739
  }
2418
2740
  }
2741
+ /**
2742
+ * Runtime display kind from EntityField.ExtendedType. Honored ahead of the
2743
+ * generated `LinkType` input so PhotoURL forms still tagged LinkType=URL
2744
+ * render as images once metadata says Image.
2745
+ */
2746
+ get ExtendedDisplay() {
2747
+ switch (this.FieldInfo?.ExtendedType) {
2748
+ case 'Image': return 'image';
2749
+ case 'Color': return 'color';
2750
+ case 'JSON': return 'json';
2751
+ default: return null;
2752
+ }
2753
+ }
2754
+ get ImagePreviewSrc() {
2755
+ const raw = this.FormatValue();
2756
+ return CoerceImageSrc(raw);
2757
+ }
2758
+ get IsInlineImageValue() {
2759
+ const raw = this.FormatValue().trim();
2760
+ if (!raw)
2761
+ return false;
2762
+ return IsInlineImageDataUri(raw) || CoerceRawImageBase64ToDataUri(raw) != null;
2763
+ }
2764
+ get ImageValueSizeLabel() {
2765
+ const raw = this.FormatValue();
2766
+ if (!raw)
2767
+ return '';
2768
+ return FormatByteSize(raw.length);
2769
+ }
2770
+ get ImageMaxSizeLabel() {
2771
+ return FormatByteSize(MaxInlineImageBytes(this.FieldInfo?.MaxLength ?? 0));
2772
+ }
2773
+ /** URL box: empty for inline images so we never dump a data URI into a text input. */
2774
+ get ImageUrlInputValue() {
2775
+ if (this.IsInlineImageValue)
2776
+ return '';
2777
+ return this.FormatValue();
2778
+ }
2779
+ get ImageUrlDisplay() {
2780
+ const raw = this.FormatValue().trim();
2781
+ return raw.replace(/^https?:\/\//i, '').replace(/\/$/, '');
2782
+ }
2783
+ get ColorPickerValue() {
2784
+ return ParseCssHexColor(this.FormatValue()) ?? '#000000';
2785
+ }
2786
+ get ColorSwatchValue() {
2787
+ return ParseCssHexColor(this.FormatValue()) ?? 'transparent';
2788
+ }
2789
+ get JsonDisplayValue() {
2790
+ // Pretty-print only in read mode. Edit mode shows the live value; OnJsonBlur pretty-prints.
2791
+ if (this.EditMode)
2792
+ return this.FormatValue();
2793
+ return PrettyPrintJson(this.FormatValue());
2794
+ }
2419
2795
  /** Handle value changes coming from the embedded code editor (emits a plain string). */
2420
2796
  OnCodeEditorChange(value) {
2421
2797
  this.Value = value;
2422
2798
  }
2423
2799
  /** Format a value for display */
2800
+ /**
2801
+ * Whether this field holds a DATE with no time, as opposed to a timestamp.
2802
+ *
2803
+ * The distinction decides which timezone the value may be rendered in, and getting it wrong
2804
+ * moves the day. A `date` column has no time and no zone: it is a calendar day, and the only
2805
+ * correct way to show it is in the zone it was written in. A `datetime`/`datetimeoffset` names
2806
+ * an instant, and the correct way to show THAT is the reader's local zone.
2807
+ */
2808
+ get IsDateOnlyField() {
2809
+ return (this.FieldInfo?.Type ?? '').trim().toLowerCase() === 'date';
2810
+ }
2424
2811
  FormatValue() {
2425
2812
  const val = this.Value;
2426
2813
  if (val === null || val === undefined)
2427
2814
  return '';
2428
2815
  if (val instanceof Date) {
2816
+ /**
2817
+ * A DATE-ONLY VALUE IS NOT AN INSTANT, AND toLocaleString() TREATS IT AS ONE.
2818
+ *
2819
+ * A `date` column arrives as UTC midnight. Passing that through a LOCAL-time formatter
2820
+ * subtracts the reader's offset and lands on the previous day for everyone west of
2821
+ * Greenwich: a stored 2026-11-20 rendered as `11/19/2026, 7:00:00 PM` in America/New_York,
2822
+ * and 2026-01-01 rendered as `12/31/2025` — the wrong YEAR.
2823
+ *
2824
+ * The edit path does not have this bug: `DateInputValue` uses `toISOString()`, which is UTC.
2825
+ * So the two modes DISAGREED — a rep opened a record and saw 19 November, clicked Edit and
2826
+ * saw the 20th, on the same field, with no invalid data anywhere. Read mode was simply wrong.
2827
+ *
2828
+ * Pinning the timezone rather than switching to `toISOString()` keeps the reader's locale
2829
+ * format (a US reader still sees 11/20/2026, a UK reader 20/11/2026) and changes only the
2830
+ * zone the day is computed in. A TIMESTAMP is left exactly as it was: it names an instant,
2831
+ * and local time is the right way to show one.
2832
+ */
2833
+ if (this.IsDateOnlyField) {
2834
+ return val.toLocaleDateString(undefined, { timeZone: 'UTC' });
2835
+ }
2429
2836
  return val.toLocaleString();
2430
2837
  }
2431
2838
  return String(val);
2432
2839
  }
2433
2840
  ngOnChanges(changes) {
2841
+ // Field security depends on both the record's entity and which field this is, so the
2842
+ // memoized answer has to be dropped whenever either changes.
2843
+ if (changes['Record'] || changes['FieldName']) {
2844
+ this._isReadableByUser = undefined;
2845
+ this._isWritableByUser = undefined;
2846
+ this._isWritableForSavedState = undefined;
2847
+ }
2434
2848
  if (changes['FormContext'] || changes['EditMode'] || changes['Record']) {
2435
2849
  // Reset FK state when record changes
2436
2850
  if (changes['Record']) {
@@ -2551,8 +2965,130 @@ export class MjFormFieldComponent extends BaseAngularComponent {
2551
2965
  */
2552
2966
  OnInputChange(event) {
2553
2967
  const input = event.target;
2968
+ this.imageUploadError = null;
2969
+ this.Value = input.value;
2970
+ }
2971
+ OnImageUrlInput(event) {
2972
+ this.OnInputChange(event);
2973
+ }
2974
+ OnImageClear() {
2975
+ this.imageUploadError = null;
2976
+ this.Value = null;
2977
+ this.cdr.markForCheck();
2978
+ }
2979
+ async OnImageFileSelected(event) {
2980
+ const input = event.target;
2981
+ const file = input.files?.[0];
2982
+ input.value = '';
2983
+ this.imageUploadError = null;
2984
+ if (!file)
2985
+ return;
2986
+ const allowed = new Set(['image/png', 'image/jpeg', 'image/jpg', 'image/gif', 'image/webp', 'image/svg+xml']);
2987
+ if (file.type && !allowed.has(file.type)) {
2988
+ this.imageUploadError = 'That file is not a supported image type (PNG, JPEG, GIF, WebP, or SVG).';
2989
+ this.markTouched();
2990
+ this.cdr.markForCheck();
2991
+ return;
2992
+ }
2993
+ const absoluteReadCap = 8 * 1024 * 1024;
2994
+ if (file.size > absoluteReadCap) {
2995
+ this.imageUploadError = `File is too large to read (max ${FormatByteSize(absoluteReadCap)}).`;
2996
+ this.markTouched();
2997
+ this.cdr.markForCheck();
2998
+ return;
2999
+ }
3000
+ try {
3001
+ const maxChars = MaxStoredImageChars(this.FieldInfo?.MaxLength ?? 0);
3002
+ const dataUri = await this.readFileAsDataUri(file);
3003
+ if (!IsInlineImageDataUri(dataUri)) {
3004
+ this.imageUploadError = 'That file is not a supported image type (PNG, JPEG, GIF, WebP, or SVG).';
3005
+ this.markTouched();
3006
+ this.cdr.markForCheck();
3007
+ return;
3008
+ }
3009
+ if (dataUri.length <= maxChars) {
3010
+ this.Value = dataUri;
3011
+ this.cdr.markForCheck();
3012
+ return;
3013
+ }
3014
+ const compressed = await this.compressImageDataUriToFit(dataUri, maxChars);
3015
+ if (compressed) {
3016
+ this.Value = compressed;
3017
+ this.cdr.markForCheck();
3018
+ return;
3019
+ }
3020
+ this.imageUploadError = `Image is too large for this field (max ${this.ImageMaxSizeLabel}). Try a smaller file or paste an image URL.`;
3021
+ this.markTouched();
3022
+ }
3023
+ catch {
3024
+ this.imageUploadError = 'Could not read that image.';
3025
+ this.markTouched();
3026
+ }
3027
+ this.cdr.markForCheck();
3028
+ }
3029
+ OnColorPickerInput(event) {
3030
+ const input = event.target;
3031
+ this.imageUploadError = null;
2554
3032
  this.Value = input.value;
2555
3033
  }
3034
+ OnJsonBlur() {
3035
+ const raw = this.FormatValue();
3036
+ const pretty = PrettyPrintJson(raw);
3037
+ if (pretty !== raw) {
3038
+ this.Value = pretty;
3039
+ }
3040
+ }
3041
+ readFileAsDataUri(file) {
3042
+ return new Promise((resolve, reject) => {
3043
+ const reader = new FileReader();
3044
+ reader.onload = () => resolve(String(reader.result ?? ''));
3045
+ reader.onerror = () => reject(reader.error ?? new Error('read failed'));
3046
+ reader.readAsDataURL(file);
3047
+ });
3048
+ }
3049
+ loadHtmlImage(src) {
3050
+ return new Promise((resolve, reject) => {
3051
+ const img = new Image();
3052
+ img.onload = () => resolve(img);
3053
+ img.onerror = () => reject(new Error('image decode failed'));
3054
+ img.src = src;
3055
+ });
3056
+ }
3057
+ /**
3058
+ * Re-encode a raster data URI as JPEG, shrinking dimensions/quality until it fits
3059
+ * `maxChars`. GIF/SVG are left alone (would lose animation / vectors).
3060
+ */
3061
+ async compressImageDataUriToFit(dataUri, maxChars) {
3062
+ if (typeof document === 'undefined')
3063
+ return null;
3064
+ if (/^data:image\/(gif|svg\+xml)/i.test(dataUri))
3065
+ return null;
3066
+ const img = await this.loadHtmlImage(dataUri);
3067
+ const naturalW = img.naturalWidth || img.width;
3068
+ const naturalH = img.naturalHeight || img.height;
3069
+ if (!naturalW || !naturalH)
3070
+ return null;
3071
+ let maxDim = Math.min(Math.max(naturalW, naturalH), 1024);
3072
+ let quality = 0.85;
3073
+ for (let i = 0; i < 8; i++) {
3074
+ const scale = maxDim / Math.max(naturalW, naturalH);
3075
+ const w = Math.max(1, Math.round(naturalW * scale));
3076
+ const h = Math.max(1, Math.round(naturalH * scale));
3077
+ const canvas = document.createElement('canvas');
3078
+ canvas.width = w;
3079
+ canvas.height = h;
3080
+ const ctx = canvas.getContext('2d');
3081
+ if (!ctx)
3082
+ return null;
3083
+ ctx.drawImage(img, 0, 0, w, h);
3084
+ const next = canvas.toDataURL('image/jpeg', quality);
3085
+ if (next.length <= maxChars)
3086
+ return next;
3087
+ maxDim = Math.max(32, Math.round(maxDim * 0.65));
3088
+ quality = Math.max(0.4, quality - 0.1);
3089
+ }
3090
+ return null;
3091
+ }
2556
3092
  /**
2557
3093
  * Handle value change from a number input.
2558
3094
  */
@@ -2587,16 +3123,45 @@ export class MjFormFieldComponent extends BaseAngularComponent {
2587
3123
  return '';
2588
3124
  return date.toISOString().split('T')[0];
2589
3125
  }
3126
+ /**
3127
+ * The field holds SOMETHING, and the date editor cannot show it.
3128
+ *
3129
+ * WHY A SEPARATE SIGNAL IS THE ONLY OPTION. `DateInputValue` returns '' for a value it cannot
3130
+ * render, and an `<input type="date">` renders '' as an empty box — the same empty box it shows
3131
+ * for a field that was never set. There is no string that makes the element display
3132
+ * `not-a-date`, so the control physically cannot surface the problem itself. The most the getter
3133
+ * can do is refuse to emit garbage; saying WHY has to happen beside it.
3134
+ *
3135
+ * The consequence of not saying it is not cosmetic. The field reads as "no date", and the next
3136
+ * save writes that emptiness over whatever was actually stored — so an unreadable value becomes a
3137
+ * destroyed one, silently, by a user who was never told anything was wrong.
3138
+ *
3139
+ * READ MODE ALREADY DOES THIS and needs nothing: `FormatValue()` shows `Invalid Date` for a bad
3140
+ * Date and the raw text for a bad string. It is only the EDITOR that hides the problem, which is
3141
+ * why this is scoped to EditMode rather than to the field.
3142
+ *
3143
+ * An ABSENT value is not unreadable. Empty means empty, and must never be decorated as a fault.
3144
+ */
3145
+ get StoredDateIsUnreadable() {
3146
+ if (!this.EditMode)
3147
+ return false;
3148
+ if (this.Type !== 'datepicker' && this.FieldInfo?.TSType !== EntityFieldTSType.Date)
3149
+ return false;
3150
+ const val = this.Value;
3151
+ if (val === null || val === undefined || val === '')
3152
+ return false;
3153
+ return this.DateInputValue === '';
3154
+ }
2590
3155
  static ɵfac = /*@__PURE__*/ (() => { let ɵMjFormFieldComponent_BaseFactory; return function MjFormFieldComponent_Factory(__ngFactoryType__) { return (ɵMjFormFieldComponent_BaseFactory || (ɵMjFormFieldComponent_BaseFactory = i0.ɵɵgetInheritedFactory(MjFormFieldComponent)))(__ngFactoryType__ || MjFormFieldComponent); }; })();
2591
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjFormFieldComponent, selectors: [["mj-form-field"]], inputs: { Record: "Record", EditMode: "EditMode", FieldName: "FieldName", Type: "Type", LinkType: "LinkType", ShowLabel: "ShowLabel", FormContext: "FormContext", _deprecatedRecord: [0, "record", "_deprecatedRecord"], _deprecatedFormContext: [0, "formContext", "_deprecatedFormContext"], HideWhenEmptyInReadOnlyMode: "HideWhenEmptyInReadOnlyMode", DisplayNameOverride: "DisplayNameOverride", PossibleValuesOverride: "PossibleValuesOverride", FKDropdownMaxWidth: "FKDropdownMaxWidth", FKHighlightMatches: "FKHighlightMatches", AllowFKCreate: "AllowFKCreate", FKCreatePresentation: "FKCreatePresentation" }, outputs: { ValueChange: "ValueChange", Navigate: "Navigate" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["scopeRow", ""], [1, "mj-forms-field", 3, "mj-forms-field--readonly", "mj-forms-field--dirty"], [1, "mj-forms-field", "mj-forms-field--editing", 3, "mj-forms-field--dirty", "mj-forms-field--required-empty", "mj-forms-field--has-error", "mj-forms-field--has-warning"], [1, "mj-forms-field"], [1, "mj-forms-field-label", 3, "innerHTML"], [1, "mj-forms-field-control"], [1, "mj-forms-field-value"], ["title", "View related record", 1, "mj-forms-field-link", "mj-forms-field-link--fk"], ["title", "View related record", 1, "mj-forms-field-link", "mj-forms-field-link--fk", 3, "click"], ["title", "Send email", 1, "mj-forms-field-link", 3, "click"], [1, "fa-solid", "fa-envelope", "mj-forms-field-link-icon"], ["title", "Open link", 1, "mj-forms-field-link", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square", "mj-forms-field-link-icon"], ["title", "View related record", 1, "mj-forms-field-link"], ["title", "View related record", 1, "mj-forms-field-link", 3, "click"], [1, "mj-forms-field-value", "mj-forms-field-value--rich"], [1, "mj-forms-field-value", "mj-forms-field-value--rich", 3, "innerHTML"], [1, "mj-forms-field-value", "mj-forms-field-value--code"], [1, "mj-forms-field-value", "mj-forms-field-value--long"], [1, "mj-forms-field-checkbox"], ["type", "checkbox", "disabled", "", 3, "checked"], [3, "data"], [3, "value", "language", "readonly"], [1, "mj-forms-field", "mj-forms-field--editing"], [1, "mj-fk-search", 3, "mj-fk-search--matched", "mj-fk-search--scoped"], [1, "mj-forms-field-input--code", 3, "value", "language"], [1, "mj-forms-field-validation", "mj-forms-field-validation--error"], [1, "mj-forms-field-validation", "mj-forms-field-validation--warning"], [1, "mj-fk-search"], ["title", "Linked record", 1, "fa-solid", "fa-link", "mj-fk-link-icon"], ["type", "text", "placeholder", "Search...", 1, "mj-forms-field-input", 3, "input", "focus", "blur", "keydown", "value"], [1, "mj-fk-scope-pill", 3, "mj-fk-scope-pill--open", "title"], ["title", "Clear", 1, "mj-fk-clear"], [1, "fa-solid", "fa-magnifying-glass", "mj-fk-search-icon"], [1, "mj-fk-dropdown", "mj-fk-dropdown--multi", 3, "ngStyle", "mj-fk-dropdown--above", "mj-fk-dropdown--scope-open"], [1, "mj-fk-scope-pill", 3, "mousedown", "title"], [1, "fa-solid", "fa-magnifying-glass", "mj-fk-scope-pill-icon"], [1, "mj-fk-scope-pill-label"], [1, "fa-solid", "mj-fk-scope-pill-caret"], ["title", "Clear", 1, "mj-fk-clear", 3, "mousedown"], [1, "fa-solid", "fa-xmark"], [1, "mj-fk-dropdown", "mj-fk-dropdown--multi", 3, "ngStyle"], [1, "mj-fk-scope-menu", 3, "mj-fk-scope-menu--bottom"], [1, "mj-fk-current"], [1, "mj-fk-status"], [1, "mj-fk-status", "mj-fk-status--empty"], [1, "mj-fk-options"], ["type", "button", 1, "mj-fk-create-footer", 3, "title"], [1, "mj-fk-scope-menu"], [1, "mj-fk-scope-grp"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "mj-fk-scope-divider"], [1, "mj-fk-scope-mi", 3, "mousedown"], [1, "mj-fk-col-reorder"], [1, "mj-fk-scope-mi-label"], [1, "mj-fk-col-eye-slot"], ["type", "button", 1, "mj-fk-col-toggle", 3, "mj-fk-col-toggle--on", "title"], ["type", "button", "title", "Move column up", 1, "mj-fk-col-move", "mj-fk-col-move--up", 3, "mousedown", "disabled"], [1, "fa-solid", "fa-chevron-up"], ["type", "button", "title", "Move column down", 1, "mj-fk-col-move", "mj-fk-col-move--down", 3, "mousedown", "disabled"], [1, "fa-solid", "fa-chevron-down"], ["type", "button", 1, "mj-fk-col-toggle", 3, "mousedown", "title"], [1, "fa-solid"], [1, "mj-fk-current-head"], [1, "fa-solid", "fa-circle-check"], ["title", "Keep this selection", 1, "mj-fk-current-row", 3, "mousedown"], [1, "mj-fk-current-icon", 3, "class"], [1, "mj-fk-current-name", 3, "innerHTML"], [1, "mj-fk-current-detail"], ["type", "button", "title", "Clear selection", 1, "mj-fk-current-clear", 3, "mousedown"], [1, "mj-fk-current-icon"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [1, "fa-solid", "fa-magnifying-glass"], [1, "mj-fk-grid"], [1, "mj-fk-grid-row", "mj-fk-grid-row--header"], [1, "mj-fk-hcell", "mj-fk-hcell--icon"], [1, "mj-fk-hcell", 3, "title"], [1, "mj-fk-grid-row", 3, "mj-fk-grid-row--active", "mj-fk-grid-row--selected"], [1, "mj-fk-hcell", 3, "mousedown", "title"], [1, "mj-fk-hcell-label"], ["title", "Drag to resize", 1, "mj-fk-resizer", 3, "mousedown"], [1, "mj-fk-grid-row", 3, "mousedown", "mouseenter"], [1, "mj-fk-cell", "mj-fk-cell--icon"], [3, "class"], [1, "mj-fk-cell", "mj-fk-cell--name", 3, "mj-fk-cell--fill"], [1, "mj-fk-cell", 3, "mj-fk-cell--fill", "title"], [1, "mj-fk-cell", "mj-fk-cell--name"], ["title", "Currently selected", 1, "fa-solid", "fa-check", "mj-fk-selected-check"], [3, "innerHTML"], [1, "mj-fk-cell", 3, "title"], ["type", "button", 1, "mj-fk-create-footer", 3, "mousedown", "title"], [1, "fa-solid", "fa-plus", "mj-fk-create-icon"], [1, "mj-fk-create-label"], [1, "mj-forms-field-input--code", 3, "change", "value", "language"], ["type", "text", 1, "mj-forms-field-input", 3, "value"], [1, "mj-forms-field-input", "mj-forms-field-input--textarea", 3, "value"], ["type", "number", 1, "mj-forms-field-input", "mj-forms-field-input--number", 3, "value"], ["type", "date", 1, "mj-forms-field-input", "mj-forms-field-input--date", 3, "value"], ["type", "text", 1, "mj-forms-field-input", 3, "input", "value"], [1, "mj-forms-field-input", "mj-forms-field-input--textarea", 3, "input", "value"], ["type", "number", 1, "mj-forms-field-input", "mj-forms-field-input--number", 3, "change", "value"], ["type", "date", 1, "mj-forms-field-input", "mj-forms-field-input--date", 3, "change", "value"], ["type", "checkbox", 3, "change", "checked"], ["tabindex", "0", 1, "mj-custom-select-trigger", 3, "click", "blur"], [1, "mj-custom-select-value"], [1, "fa-solid", "fa-chevron-down", "mj-custom-select-chevron"], [1, "mj-fk-dropdown", 3, "ngStyle", "mj-fk-dropdown--above"], [1, "mj-fk-dropdown", 3, "ngStyle"], [1, "mj-fk-option", 3, "mj-fk-option--selected"], [1, "mj-fk-option", 3, "mousedown"], ["type", "text", "placeholder", "Type to search...", 1, "mj-forms-field-input", 3, "input", "focus", "blur", "value"], [1, "mj-fk-option"], ["type", "text", 1, "mj-forms-field-input", 3, "change", "value"], [1, "mj-forms-field-validation-item"], [1, "fa-solid", "fa-circle-exclamation"], [1, "fa-solid", "fa-triangle-exclamation"]], template: function MjFormFieldComponent_Template(rf, ctx) { if (rf & 1) {
3156
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjFormFieldComponent, selectors: [["mj-form-field"]], inputs: { Record: "Record", EditMode: "EditMode", FieldName: "FieldName", Type: "Type", LinkType: "LinkType", ShowLabel: "ShowLabel", FormContext: "FormContext", _deprecatedRecord: [0, "record", "_deprecatedRecord"], _deprecatedFormContext: [0, "formContext", "_deprecatedFormContext"], HideWhenEmptyInReadOnlyMode: "HideWhenEmptyInReadOnlyMode", DisplayNameOverride: "DisplayNameOverride", PossibleValuesOverride: "PossibleValuesOverride", FKDropdownMaxWidth: "FKDropdownMaxWidth", FKHighlightMatches: "FKHighlightMatches", AllowFKCreate: "AllowFKCreate", FKCreatePresentation: "FKCreatePresentation" }, outputs: { ValueChange: "ValueChange", Navigate: "Navigate" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["scopeRow", ""], ["imageFileInput", ""], [1, "mj-forms-field", 3, "mj-forms-field--readonly", "mj-forms-field--dirty"], [1, "mj-forms-field", "mj-forms-field--editing", 3, "mj-forms-field--dirty", "mj-forms-field--required-empty", "mj-forms-field--has-error", "mj-forms-field--has-warning"], [1, "mj-forms-field"], [1, "mj-forms-field-label", 3, "innerHTML"], [1, "mj-forms-field-control"], [1, "mj-forms-field-value"], [1, "mj-forms-image"], [1, "mj-forms-color"], [1, "mj-forms-json"], ["title", "View related record", 1, "mj-forms-field-link", "mj-forms-field-link--fk"], ["title", "View related record", 1, "mj-forms-field-link", "mj-forms-field-link--fk", 3, "click"], ["alt", "", 1, "mj-forms-image-preview", 3, "src"], [1, "mj-forms-image-meta"], ["title", "Open image", 1, "mj-forms-field-link"], ["title", "Open image", 1, "mj-forms-field-link", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square", "mj-forms-field-link-icon"], [1, "mj-forms-color-swatch"], ["title", "Send email", 1, "mj-forms-field-link", 3, "click"], [1, "fa-solid", "fa-envelope", "mj-forms-field-link-icon"], ["title", "Open link", 1, "mj-forms-field-link", 3, "click"], ["title", "View related record", 1, "mj-forms-field-link"], ["title", "View related record", 1, "mj-forms-field-link", 3, "click"], [1, "mj-forms-field-value", "mj-forms-field-value--rich"], [1, "mj-forms-field-value", "mj-forms-field-value--rich", 3, "innerHTML"], [1, "mj-forms-field-value", "mj-forms-field-value--code"], [1, "mj-forms-field-value", "mj-forms-field-value--long"], [1, "mj-forms-field-checkbox"], ["type", "checkbox", "disabled", "", 3, "checked"], [3, "data"], [3, "value", "language", "readonly"], [1, "mj-forms-field", "mj-forms-field--editing"], [1, "mj-fk-search", 3, "mj-fk-search--matched", "mj-fk-search--scoped"], [1, "mj-forms-image", "mj-forms-image--edit"], [1, "mj-forms-color", "mj-forms-color--edit"], [1, "mj-forms-field-input", "mj-forms-field-input--textarea", "mj-forms-json", 3, "value"], [1, "mj-forms-field-input--code", 3, "value", "language"], [1, "mj-forms-field-validation", "mj-forms-field-validation--error"], [1, "mj-forms-field-validation", "mj-forms-field-validation--warning"], [1, "mj-fk-search"], ["title", "Linked record", 1, "fa-solid", "fa-link", "mj-fk-link-icon"], ["type", "text", "placeholder", "Search...", 1, "mj-forms-field-input", 3, "input", "focus", "blur", "keydown", "value"], [1, "mj-fk-scope-pill", 3, "mj-fk-scope-pill--open", "title"], ["title", "Clear", 1, "mj-fk-clear"], [1, "fa-solid", "fa-magnifying-glass", "mj-fk-search-icon"], [1, "mj-fk-dropdown", "mj-fk-dropdown--multi", 3, "ngStyle", "mj-fk-dropdown--above", "mj-fk-dropdown--scope-open"], [1, "mj-fk-scope-pill", 3, "mousedown", "title"], [1, "fa-solid", "fa-magnifying-glass", "mj-fk-scope-pill-icon"], [1, "mj-fk-scope-pill-label"], [1, "fa-solid", "mj-fk-scope-pill-caret"], ["title", "Clear", 1, "mj-fk-clear", 3, "mousedown"], [1, "fa-solid", "fa-xmark"], [1, "mj-fk-dropdown", "mj-fk-dropdown--multi", 3, "ngStyle"], [1, "mj-fk-scope-menu", 3, "mj-fk-scope-menu--bottom"], [1, "mj-fk-current"], [1, "mj-fk-status"], [1, "mj-fk-status", "mj-fk-status--empty"], [1, "mj-fk-options"], ["type", "button", 1, "mj-fk-create-footer", 3, "title"], [1, "mj-fk-scope-menu"], [1, "mj-fk-scope-grp"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "mj-fk-scope-divider"], [1, "mj-fk-scope-mi", 3, "mousedown"], [1, "mj-fk-col-reorder"], [1, "mj-fk-scope-mi-label"], [1, "mj-fk-col-eye-slot"], ["type", "button", 1, "mj-fk-col-toggle", 3, "mj-fk-col-toggle--on", "title"], ["type", "button", "title", "Move column up", 1, "mj-fk-col-move", "mj-fk-col-move--up", 3, "mousedown", "disabled"], [1, "fa-solid", "fa-chevron-up"], ["type", "button", "title", "Move column down", 1, "mj-fk-col-move", "mj-fk-col-move--down", 3, "mousedown", "disabled"], [1, "fa-solid", "fa-chevron-down"], ["type", "button", 1, "mj-fk-col-toggle", 3, "mousedown", "title"], [1, "fa-solid"], [1, "mj-fk-current-head"], [1, "fa-solid", "fa-circle-check"], ["title", "Keep this selection", 1, "mj-fk-current-row", 3, "mousedown"], [1, "mj-fk-current-icon", 3, "class"], [1, "mj-fk-current-name", 3, "innerHTML"], [1, "mj-fk-current-detail"], ["type", "button", "title", "Clear selection", 1, "mj-fk-current-clear", 3, "mousedown"], [1, "mj-fk-current-icon"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [1, "fa-solid", "fa-magnifying-glass"], [1, "mj-fk-grid"], [1, "mj-fk-grid-row", "mj-fk-grid-row--header"], [1, "mj-fk-hcell", "mj-fk-hcell--icon"], [1, "mj-fk-hcell", 3, "title"], [1, "mj-fk-grid-row", 3, "mj-fk-grid-row--active", "mj-fk-grid-row--selected"], [1, "mj-fk-hcell", 3, "mousedown", "title"], [1, "mj-fk-hcell-label"], ["title", "Drag to resize", 1, "mj-fk-resizer", 3, "mousedown"], [1, "mj-fk-grid-row", 3, "mousedown", "mouseenter"], [1, "mj-fk-cell", "mj-fk-cell--icon"], [3, "class"], [1, "mj-fk-cell", "mj-fk-cell--name", 3, "mj-fk-cell--fill"], [1, "mj-fk-cell", 3, "mj-fk-cell--fill", "title"], [1, "mj-fk-cell", "mj-fk-cell--name"], ["title", "Currently selected", 1, "fa-solid", "fa-check", "mj-fk-selected-check"], [3, "innerHTML"], [1, "mj-fk-cell", 3, "title"], ["type", "button", 1, "mj-fk-create-footer", 3, "mousedown", "title"], [1, "fa-solid", "fa-plus", "mj-fk-create-icon"], [1, "mj-fk-create-label"], ["aria-hidden", "true", 1, "mj-forms-image-preview", "mj-forms-image-preview--empty"], [1, "mj-forms-image-hint"], [1, "mj-forms-image-actions"], ["type", "file", "accept", "image/png,image/jpeg,image/gif,image/webp,image/svg+xml", 1, "mj-forms-image-file", 3, "change"], ["type", "button", 1, "mj-forms-image-btn", 3, "click"], [1, "fa-solid", "fa-upload"], ["type", "button", 1, "mj-forms-image-btn", "mj-forms-image-btn--ghost"], ["type", "text", "placeholder", "https://\u2026 or paste a data URI", 1, "mj-forms-field-input", 3, "input", "value"], [1, "fa-regular", "fa-image"], ["type", "button", 1, "mj-forms-image-btn", "mj-forms-image-btn--ghost", 3, "click"], ["type", "color", 1, "mj-forms-color-picker", 3, "input", "value"], ["type", "text", "placeholder", "#RRGGBB", 1, "mj-forms-field-input", "mj-forms-color-hex", 3, "input", "value"], [1, "mj-forms-field-input", "mj-forms-field-input--textarea", "mj-forms-json", 3, "input", "blur", "value"], [1, "mj-forms-field-input--code", 3, "change", "value", "language"], ["type", "text", 1, "mj-forms-field-input", 3, "value"], [1, "mj-forms-field-input", "mj-forms-field-input--textarea", 3, "value"], ["type", "number", 1, "mj-forms-field-input", "mj-forms-field-input--number", 3, "value"], ["type", "date", 1, "mj-forms-field-input", "mj-forms-field-input--date", 3, "value"], ["type", "text", 1, "mj-forms-field-input", 3, "input", "value"], [1, "mj-forms-field-input", "mj-forms-field-input--textarea", 3, "input", "value"], ["type", "number", 1, "mj-forms-field-input", "mj-forms-field-input--number", 3, "change", "value"], ["type", "date", 1, "mj-forms-field-input", "mj-forms-field-input--date", 3, "change", "value"], ["type", "checkbox", 3, "change", "checked"], ["tabindex", "0", 1, "mj-custom-select-trigger", 3, "click", "blur"], [1, "mj-custom-select-value"], [1, "fa-solid", "fa-chevron-down", "mj-custom-select-chevron"], [1, "mj-fk-dropdown", 3, "ngStyle", "mj-fk-dropdown--above"], [1, "mj-fk-dropdown", 3, "ngStyle"], [1, "mj-fk-option", 3, "mj-fk-option--selected"], [1, "mj-fk-option", 3, "mousedown"], ["type", "text", "placeholder", "Type to search...", 1, "mj-forms-field-input", 3, "input", "focus", "blur", "value"], [1, "mj-fk-option"], ["type", "text", 1, "mj-forms-field-input", 3, "change", "value"], [1, "mj-forms-field-validation-item"], [1, "fa-solid", "fa-circle-exclamation"], [1, "fa-solid", "fa-triangle-exclamation"]], template: function MjFormFieldComponent_Template(rf, ctx) { if (rf & 1) {
2592
3157
  i0.ɵɵconditionalCreate(0, MjFormFieldComponent_Conditional_0_Template, 2, 2);
2593
3158
  } if (rf & 2) {
2594
- i0.ɵɵconditional(ctx.Record && (ctx.Record.IsSaved || !ctx.IsFieldReadOnly) ? 0 : -1);
2595
- } }, dependencies: [i1.NgTemplateOutlet, i1.NgStyle, i2.MarkdownComponent, i3.CodeEditorComponent, i4.MJSafeRichHtmlPipe], styles: ["\n\n\n\n[_nghost-%COMP%] {\n --mj-forms-field-label-width: 200px;\n --mj-forms-field-gap: 12px;\n\n display: contents;\n}\n\n.mj-forms-field[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: var(--mj-forms-field-label-width) 1fr;\n gap: var(--mj-forms-field-gap);\n align-items: baseline;\n padding: 8px 0;\n transition: all var(--mj-transition-base) ease;\n}\n\n\n\n.mj-forms-field--editing[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 6px;\n margin: 0 -8px;\n padding: 8px 8px;\n}\n\n\n\n\n\n.mj-forms-field-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n padding-top: 2px;\n word-break: break-word;\n}\n\n\n\n\n\n.mj-forms-field-control[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.mj-forms-field-control[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n\n\n\n\n.mj-forms-field--dirty[_ngcontent-%COMP%] .mj-forms-field-label[_ngcontent-%COMP%]::after {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--mj-status-warning);\n margin-left: 6px;\n vertical-align: middle;\n}\n\n\n\n\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%]:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-custom-select-trigger[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n}\n\n\n\n\n\n.mj-forms-field-value[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-primary);\n min-height: 24px;\n display: flex;\n align-items: center;\n overflow-wrap: break-word;\n word-break: break-word;\n}\n\n.mj-forms-field-value--long[_ngcontent-%COMP%] {\n white-space: pre-line;\n max-height: 300px;\n overflow: auto;\n}\n\n\n\n.mj-forms-field-value--rich[_ngcontent-%COMP%] {\n display: block;\n align-items: initial;\n max-height: 480px;\n overflow: auto;\n width: 100%;\n}\n\n\n\n.mj-forms-field-value--code[_ngcontent-%COMP%] {\n display: block;\n align-items: initial;\n width: 100%;\n}\n\n.mj-forms-field-value--code[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%], \n.mj-forms-field-input--code[_ngcontent-%COMP%] {\n display: block;\n width: 100%;\n min-height: 160px;\n max-height: 480px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius, 4px);\n overflow: auto;\n}\n\n\n\n.mj-forms-field--readonly[_ngcontent-%COMP%] {\n opacity: 0.7;\n}\n\n.mj-forms-field--readonly[_ngcontent-%COMP%] .mj-forms-field-value[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n\n\n\n\n.mj-forms-field-link[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-weight: 400;\n font-size: 14px;\n transition: color var(--mj-transition-base);\n text-decoration: none;\n}\n\n.mj-forms-field-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n}\n\n.mj-forms-field-link-icon[_ngcontent-%COMP%] {\n font-size: 11px;\n opacity: 0;\n transition: opacity var(--mj-transition-base);\n}\n\n.mj-forms-field-link[_ngcontent-%COMP%]:hover .mj-forms-field-link-icon[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n\n\n.mj-forms-field-link--fk[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 400;\n}\n\n\n\n\n\n.mj-forms-field-input[_ngcontent-%COMP%] {\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-forms-field-input[_ngcontent-%COMP%]:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-forms-field-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n\n\n.mj-forms-field-input--textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 60px;\n border: 1.5px solid var(--mj-border-default);\n border-radius: 6px;\n padding: 8px 10px;\n background: var(--mj-bg-surface);\n font-family: inherit;\n}\n\n.mj-forms-field-input--textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n background: var(--mj-bg-surface);\n padding: 8px 10px;\n border-radius: 6px;\n}\n\n\n\n.mj-forms-field-input--number[_ngcontent-%COMP%] {\n max-width: 200px;\n}\n\n\n\n.mj-forms-field-input--date[_ngcontent-%COMP%] {\n max-width: 220px;\n}\n\n\n\n\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n position: relative;\n transition: all var(--mj-transition-base) ease;\n flex-shrink: 0;\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%]:checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%]:checked::after {\n content: '';\n position: absolute;\n left: 5px;\n top: 1px;\n width: 5px;\n height: 9px;\n border: solid var(--mj-text-inverse);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n\n\n\n\n.mj-custom-select-trigger[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n cursor: pointer;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-custom-select-trigger[_ngcontent-%COMP%]:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-custom-select-value[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mj-custom-select-value--placeholder[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.mj-custom-select-chevron[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n transition: transform var(--mj-transition-base) ease;\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n.mj-custom-select-chevron--open[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n\n\n\n\n.mj-fk-search[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n}\n\n.mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n padding-right: 28px;\n}\n\n.mj-fk-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n right: 4px;\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n\n.mj-fk-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 2px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n padding: 4px 6px;\n line-height: 1;\n border-radius: 3px;\n transition: all var(--mj-transition-base);\n}\n\n.mj-fk-clear[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n\n\n\n.mj-fk-search--matched[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom: 2px solid var(--mj-brand-primary);\n}\n\n\n\n\n.mj-fk-link-icon[_ngcontent-%COMP%] {\n position: absolute;\n right: 26px;\n color: var(--mj-brand-primary);\n font-size: 10px;\n pointer-events: none;\n z-index: 1;\n}\n\n\n\n.mj-forms-field-input--linked[_ngcontent-%COMP%] {\n padding-right: 46px;\n}\n\n\n\n\n\n\n\n.mj-fk-search--scoped[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n padding-right: 150px;\n}\n\n.mj-fk-scope-pill[_ngcontent-%COMP%] {\n position: absolute;\n right: 30px;\n \n\n top: 50%;\n transform: translateY(-50%);\n display: inline-flex;\n align-items: center;\n gap: 5px;\n max-width: 120px;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n color: var(--mj-text-secondary);\n font-size: 10.5px;\n font-weight: 600;\n font-family: inherit;\n \n\n padding: 1px 7px;\n border-radius: 999px;\n cursor: pointer;\n white-space: nowrap;\n line-height: 1.35;\n transition: background var(--mj-transition-base), border-color var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-pill[_ngcontent-%COMP%]:hover, \n.mj-fk-scope-pill--open[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-primary);\n}\n\n.mj-fk-scope-pill-icon[_ngcontent-%COMP%] {\n font-size: 9px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-pill-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-scope-pill-caret[_ngcontent-%COMP%] {\n font-size: 8px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n\n\n\n\n.mj-fk-scope-menu[_ngcontent-%COMP%] {\n position: absolute;\n top: 4px;\n right: 8px;\n z-index: 5;\n min-width: 180px;\n max-width: calc(100vw - 24px);\n max-height: 260px;\n overflow-y: auto;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n box-shadow: var(--mj-shadow-lg);\n padding: 5px;\n animation: _ngcontent-%COMP%_mj-dropdown-in 120ms ease;\n}\n\n\n\n\n.mj-fk-scope-menu--bottom[_ngcontent-%COMP%] {\n top: auto;\n bottom: 4px;\n}\n\n.mj-fk-scope-grp[_ngcontent-%COMP%] {\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n padding: 7px 10px 4px;\n font-weight: 700;\n}\n\n.mj-fk-scope-mi[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 7px 10px;\n font-size: 13px;\n border-radius: 5px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.mj-fk-scope-mi[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-scope-mi--on[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n\n\n\n.mj-fk-col-reorder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 22px;\n flex-shrink: 0;\n}\n\n.mj-fk-col-move[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 10px;\n padding: 0;\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 8px;\n opacity: 0; \n\n transition: opacity var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-mi[_ngcontent-%COMP%]:hover .mj-fk-col-move[_ngcontent-%COMP%]:not(:disabled) {\n opacity: 0.8;\n}\n\n.mj-fk-col-move[_ngcontent-%COMP%]:hover:not(:disabled) {\n opacity: 1;\n color: var(--mj-brand-primary);\n}\n\n\n\n.mj-fk-col-move[_ngcontent-%COMP%]:disabled {\n opacity: 0 !important;\n cursor: default;\n}\n\n.mj-fk-scope-mi-icon[_ngcontent-%COMP%] {\n width: 14px;\n font-size: 11px;\n opacity: 0.75;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-mi-label[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n\n.mj-fk-col-eye-slot[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n\n\n.mj-fk-col-toggle[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-col-toggle[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.mj-fk-col-toggle--on[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-scope-divider[_ngcontent-%COMP%] {\n height: 1px;\n background: var(--mj-border-subtle);\n margin: 4px 6px;\n}\n\n\n\n\n@media (max-width: 560px) {\n .mj-fk-search--scoped[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n padding-right: 116px;\n }\n .mj-fk-scope-pill[_ngcontent-%COMP%] {\n max-width: 88px;\n }\n .mj-fk-scope-menu[_ngcontent-%COMP%] {\n min-width: 160px;\n }\n .mj-fk-scope-mi[_ngcontent-%COMP%] {\n padding: 10px 10px;\n }\n}\n\n\n\n\n\n.mj-fk-dropdown[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-lg);\n max-height: 240px;\n overflow-y: auto;\n padding: 4px;\n animation: _ngcontent-%COMP%_mj-dropdown-in 150ms ease;\n}\n\n.mj-fk-dropdown--above[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_mj-dropdown-in-above 150ms ease;\n}\n\n.mj-fk-option[_ngcontent-%COMP%] {\n padding: 10px 14px;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background var(--mj-transition-base);\n border-radius: 6px;\n}\n\n.mj-fk-option[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.mj-fk-option--selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-option--selected[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n\n\n\n.mj-fk-dropdown--multi[_ngcontent-%COMP%] {\n padding: 4px;\n \n\n\n overflow: hidden;\n max-height: none;\n}\n\n\n\n\n\n.mj-fk-dropdown--multi[_ngcontent-%COMP%] .mj-fk-options[_ngcontent-%COMP%] {\n overflow: auto;\n max-height: 260px;\n}\n\n\n\n\n.mj-fk-dropdown--scope-open[_ngcontent-%COMP%] {\n overflow: visible;\n}\n\n\n\n\n\n\n\n.mj-fk-grid[_ngcontent-%COMP%] {\n display: grid;\n width: 100%;\n min-width: max-content;\n align-items: stretch;\n}\n\n\n\n\n\n.mj-fk-grid-row[_ngcontent-%COMP%] {\n display: contents;\n}\n\n\n\n.mj-fk-hcell[_ngcontent-%COMP%] {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-elevated);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n}\n\n.mj-fk-hcell[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-hcell--icon[_ngcontent-%COMP%] {\n cursor: default;\n padding: 7px 8px;\n}\n\n.mj-fk-hcell--icon[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-elevated);\n}\n\n.mj-fk-hcell-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-sort-icon[_ngcontent-%COMP%] {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n\n\n.mj-fk-sort-icon--idle[_ngcontent-%COMP%] {\n opacity: 0.35;\n}\n\n\n\n.mj-fk-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 320px;\n cursor: pointer;\n}\n\n\n\n\n.mj-fk-cell--fill[_ngcontent-%COMP%] {\n max-width: none;\n}\n\n\n\n\n.mj-fk-cell[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n\n.mj-fk-cell--icon[_ngcontent-%COMP%] {\n justify-content: center;\n padding: 8px;\n max-width: none;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.mj-fk-cell--name[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 14px;\n color: var(--mj-text-primary);\n gap: 6px;\n}\n\n.mj-fk-selected-check[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 11px;\n flex-shrink: 0;\n}\n\n\n\n\n.mj-fk-grid-row--active[_ngcontent-%COMP%] > .mj-fk-cell[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n\n\n\n.mj-fk-grid-row--selected[_ngcontent-%COMP%] > .mj-fk-cell[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n}\n\n.mj-fk-grid-row--selected[_ngcontent-%COMP%] > .mj-fk-cell--name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n\n\n.mj-fk-cell--name[_ngcontent-%COMP%] .mj-forms-search-highlight, \n.mj-fk-cell[_ngcontent-%COMP%] .mj-forms-search-highlight {\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n\n\n.mj-fk-resizer[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 7px;\n height: 100%;\n cursor: col-resize;\n user-select: none;\n}\n\n.mj-fk-resizer[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n top: 20%;\n right: 2px;\n width: 2px;\n height: 60%;\n background: transparent;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-hcell[_ngcontent-%COMP%]:hover .mj-fk-resizer[_ngcontent-%COMP%]::after, \n.mj-fk-resizer[_ngcontent-%COMP%]:hover::after {\n background: var(--mj-border-strong);\n}\n\n\n\n.mj-fk-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-status[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.mj-fk-status--empty[_ngcontent-%COMP%] {\n font-style: italic;\n}\n\n\n\n\n.mj-fk-create-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 9px;\n width: 100%;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-top: 1px solid var(--mj-border-default);\n color: var(--mj-brand-primary);\n font-size: 13px;\n font-weight: 600;\n font-family: inherit;\n text-align: left;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-create-footer[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-create-icon[_ngcontent-%COMP%] {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n.mj-fk-create-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n\n\n\n.mj-fk-current[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-default);\n background: color-mix(in srgb, var(--mj-brand-primary) 7%, var(--mj-bg-surface-card));\n animation: _ngcontent-%COMP%_mj-fk-current-in 220ms cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n@keyframes _ngcontent-%COMP%_mj-fk-current-in {\n from { opacity: 0; transform: translateY(-6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.mj-fk-current-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px 3px;\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-current-head[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.mj-fk-current-row[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 6px 12px 10px;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n\n\n.mj-fk-current-row[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 0;\n top: 4px;\n bottom: 8px;\n width: 3px;\n border-radius: 0 2px 2px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-fk-current-row[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-fk-current-icon[_ngcontent-%COMP%] {\n flex-shrink: 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-current-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-detail[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-clear[_ngcontent-%COMP%] {\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-current-clear[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-status-error);\n}\n\n@keyframes _ngcontent-%COMP%_mj-dropdown-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes _ngcontent-%COMP%_mj-dropdown-in-above {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n\n\n\n\n.mj-forms-field-label[_ngcontent-%COMP%] .mj-forms-search-highlight {\n \n\n\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n\n\n\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%]:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-status-error);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-custom-select-trigger[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n\n\n\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%]:focus {\n background: color-mix(in srgb, var(--mj-status-warning) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%] {\n border-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-custom-select-trigger[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n\n\n\n\n.mj-forms-field-validation[_ngcontent-%COMP%] {\n grid-column: 2;\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: -2px;\n overflow: hidden;\n animation: _ngcontent-%COMP%_mj-validation-slide-in 200ms ease-out;\n}\n\n.mj-forms-field-validation-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n font-size: 12px;\n line-height: 1.4;\n padding: 3px 0 1px;\n}\n\n.mj-forms-field-validation-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n\n\n.mj-forms-field-validation--error[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.mj-forms-field-validation--error[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n.mj-forms-field-validation--warning[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] {\n color: var(--mj-status-warning-text);\n}\n\n.mj-forms-field-validation--warning[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n@keyframes _ngcontent-%COMP%_mj-validation-slide-in {\n from {\n opacity: 0;\n max-height: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n max-height: 100px;\n transform: translateY(0);\n }\n}\n\n\n\n\n\n@media (max-width: 640px) {\n .mj-forms-field[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 4px;\n }\n\n .mj-forms-field-label[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .mj-forms-field-validation[_ngcontent-%COMP%] {\n grid-column: 1;\n }\n}"], changeDetection: 0 });
3159
+ i0.ɵɵconditional(ctx.IsFieldReadableByUser && ctx.Record && (ctx.Record.IsSaved || !ctx.IsFieldReadOnly) ? 0 : -1);
3160
+ } }, dependencies: [i1.NgTemplateOutlet, i1.NgStyle, i2.MarkdownComponent, i3.CodeEditorComponent, i4.MJSafeRichHtmlPipe], styles: ["\n\n\n[_nghost-%COMP%] {\n --mj-forms-field-label-width: 200px;\n --mj-forms-field-gap: 12px;\n\n display: contents;\n}\n\n.mj-forms-field[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: var(--mj-forms-field-label-width) 1fr;\n gap: var(--mj-forms-field-gap);\n align-items: baseline;\n padding: 8px 0;\n transition: all var(--mj-transition-base) ease;\n}\n\n\n.mj-forms-field--editing[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 6px;\n margin: 0 -8px;\n padding: 8px 8px;\n}\n\n\n\n\n.mj-forms-field-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n padding-top: 2px;\n word-break: break-word;\n}\n\n\n\n\n.mj-forms-field-control[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.mj-forms-field-control[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n\n\n\n.mj-forms-field--dirty[_ngcontent-%COMP%] .mj-forms-field-label[_ngcontent-%COMP%]::after {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--mj-status-warning);\n margin-left: 6px;\n vertical-align: middle;\n}\n\n\n\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%]:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-custom-select-trigger[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty[_ngcontent-%COMP%] .mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n}\n\n\n\n\n.mj-forms-field-value[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-primary);\n min-height: 24px;\n display: flex;\n align-items: center;\n overflow-wrap: break-word;\n word-break: break-word;\n}\n\n.mj-forms-field-value--long[_ngcontent-%COMP%] {\n white-space: pre-line;\n max-height: 300px;\n overflow: auto;\n}\n\n\n.mj-forms-field-value--rich[_ngcontent-%COMP%] {\n display: block;\n align-items: initial;\n max-height: 480px;\n overflow: auto;\n width: 100%;\n}\n\n\n.mj-forms-field-value--code[_ngcontent-%COMP%] {\n display: block;\n align-items: initial;\n width: 100%;\n}\n\n.mj-forms-field-value--code[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%], \n.mj-forms-field-input--code[_ngcontent-%COMP%] {\n display: block;\n width: 100%;\n min-height: 160px;\n max-height: 480px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius, 4px);\n overflow: auto;\n}\n\n\n.mj-forms-field--readonly[_ngcontent-%COMP%] {\n opacity: 0.7;\n}\n\n.mj-forms-field--readonly[_ngcontent-%COMP%] .mj-forms-field-value[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n\n\n\n.mj-forms-field-link[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-weight: 400;\n font-size: 14px;\n transition: color var(--mj-transition-base);\n text-decoration: none;\n}\n\n.mj-forms-field-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n}\n\n.mj-forms-field-link-icon[_ngcontent-%COMP%] {\n font-size: 11px;\n opacity: 0;\n transition: opacity var(--mj-transition-base);\n}\n\n.mj-forms-field-link[_ngcontent-%COMP%]:hover .mj-forms-field-link-icon[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n\n.mj-forms-field-link--fk[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 400;\n}\n\n\n\n\n.mj-forms-field-input[_ngcontent-%COMP%] {\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-forms-field-input[_ngcontent-%COMP%]:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-forms-field-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n\n.mj-forms-field-input--textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 60px;\n border: 1.5px solid var(--mj-border-default);\n border-radius: 6px;\n padding: 8px 10px;\n background: var(--mj-bg-surface);\n font-family: inherit;\n}\n\n.mj-forms-field-input--textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n background: var(--mj-bg-surface);\n padding: 8px 10px;\n border-radius: 6px;\n}\n\n\n.mj-forms-field-input--number[_ngcontent-%COMP%] {\n max-width: 200px;\n}\n\n\n.mj-forms-field-input--date[_ngcontent-%COMP%] {\n max-width: 220px;\n}\n\n\n\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n position: relative;\n transition: all var(--mj-transition-base) ease;\n flex-shrink: 0;\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%]:checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%]:checked::after {\n content: '';\n position: absolute;\n left: 5px;\n top: 1px;\n width: 5px;\n height: 9px;\n border: solid var(--mj-text-inverse);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n}\n\n.mj-forms-field-checkbox[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n\n\n\n.mj-custom-select-trigger[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n cursor: pointer;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-custom-select-trigger[_ngcontent-%COMP%]:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-custom-select-value[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mj-custom-select-value--placeholder[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.mj-custom-select-chevron[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n transition: transform var(--mj-transition-base) ease;\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n.mj-custom-select-chevron--open[_ngcontent-%COMP%] {\n transform: rotate(180deg);\n}\n\n\n\n\n.mj-fk-search[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n}\n\n.mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n padding-right: 28px;\n}\n\n.mj-fk-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n right: 4px;\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n\n.mj-fk-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 2px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n padding: 4px 6px;\n line-height: 1;\n border-radius: 3px;\n transition: all var(--mj-transition-base);\n}\n\n.mj-fk-clear[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n\n\n.mj-fk-search--matched[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom: 2px solid var(--mj-brand-primary);\n}\n\n\n\n.mj-fk-link-icon[_ngcontent-%COMP%] {\n position: absolute;\n right: 26px;\n color: var(--mj-brand-primary);\n font-size: 10px;\n pointer-events: none;\n z-index: 1;\n}\n\n\n.mj-forms-field-input--linked[_ngcontent-%COMP%] {\n padding-right: 46px;\n}\n\n\n\n\n\n.mj-fk-search--scoped[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n padding-right: 150px;\n}\n\n.mj-fk-scope-pill[_ngcontent-%COMP%] {\n position: absolute;\n right: 30px;\n \n top: 50%;\n transform: translateY(-50%);\n display: inline-flex;\n align-items: center;\n gap: 5px;\n max-width: 120px;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n color: var(--mj-text-secondary);\n font-size: 10.5px;\n font-weight: 600;\n font-family: inherit;\n \n padding: 1px 7px;\n border-radius: 999px;\n cursor: pointer;\n white-space: nowrap;\n line-height: 1.35;\n transition: background var(--mj-transition-base), border-color var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-pill[_ngcontent-%COMP%]:hover, \n.mj-fk-scope-pill--open[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-primary);\n}\n\n.mj-fk-scope-pill-icon[_ngcontent-%COMP%] {\n font-size: 9px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-pill-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-scope-pill-caret[_ngcontent-%COMP%] {\n font-size: 8px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n\n\n\n.mj-fk-scope-menu[_ngcontent-%COMP%] {\n position: absolute;\n top: 4px;\n right: 8px;\n z-index: 5;\n min-width: 180px;\n max-width: calc(100vw - 24px);\n max-height: 260px;\n overflow-y: auto;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n box-shadow: var(--mj-shadow-lg);\n padding: 5px;\n animation: _ngcontent-%COMP%_mj-dropdown-in 120ms ease;\n}\n\n\n\n.mj-fk-scope-menu--bottom[_ngcontent-%COMP%] {\n top: auto;\n bottom: 4px;\n}\n\n.mj-fk-scope-grp[_ngcontent-%COMP%] {\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n padding: 7px 10px 4px;\n font-weight: 700;\n}\n\n.mj-fk-scope-mi[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 7px 10px;\n font-size: 13px;\n border-radius: 5px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.mj-fk-scope-mi[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-scope-mi--on[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n\n\n.mj-fk-col-reorder[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 22px;\n flex-shrink: 0;\n}\n\n.mj-fk-col-move[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 10px;\n padding: 0;\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 8px;\n opacity: 0; \n transition: opacity var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-mi[_ngcontent-%COMP%]:hover .mj-fk-col-move[_ngcontent-%COMP%]:not(:disabled) {\n opacity: 0.8;\n}\n\n.mj-fk-col-move[_ngcontent-%COMP%]:hover:not(:disabled) {\n opacity: 1;\n color: var(--mj-brand-primary);\n}\n\n\n.mj-fk-col-move[_ngcontent-%COMP%]:disabled {\n opacity: 0 !important;\n cursor: default;\n}\n\n.mj-fk-scope-mi-icon[_ngcontent-%COMP%] {\n width: 14px;\n font-size: 11px;\n opacity: 0.75;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-mi-label[_ngcontent-%COMP%] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n.mj-fk-col-eye-slot[_ngcontent-%COMP%] {\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n\n.mj-fk-col-toggle[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-col-toggle[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.mj-fk-col-toggle--on[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-scope-divider[_ngcontent-%COMP%] {\n height: 1px;\n background: var(--mj-border-subtle);\n margin: 4px 6px;\n}\n\n\n\n@media (max-width: 560px) {\n .mj-fk-search--scoped[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n padding-right: 116px;\n }\n .mj-fk-scope-pill[_ngcontent-%COMP%] {\n max-width: 88px;\n }\n .mj-fk-scope-menu[_ngcontent-%COMP%] {\n min-width: 160px;\n }\n .mj-fk-scope-mi[_ngcontent-%COMP%] {\n padding: 10px 10px;\n }\n}\n\n\n\n\n.mj-fk-dropdown[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-lg);\n max-height: 240px;\n overflow-y: auto;\n padding: 4px;\n animation: _ngcontent-%COMP%_mj-dropdown-in 150ms ease;\n}\n\n.mj-fk-dropdown--above[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_mj-dropdown-in-above 150ms ease;\n}\n\n.mj-fk-option[_ngcontent-%COMP%] {\n padding: 10px 14px;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background var(--mj-transition-base);\n border-radius: 6px;\n}\n\n.mj-fk-option[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.mj-fk-option--selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-option--selected[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n\n\n\n\n.mj-fk-dropdown--multi[_ngcontent-%COMP%] {\n padding: 4px;\n \n\n overflow: hidden;\n max-height: none;\n}\n\n\n\n\n.mj-fk-dropdown--multi[_ngcontent-%COMP%] .mj-fk-options[_ngcontent-%COMP%] {\n overflow: auto;\n max-height: 260px;\n}\n\n\n\n.mj-fk-dropdown--scope-open[_ngcontent-%COMP%] {\n overflow: visible;\n}\n\n\n\n\n\n\n.mj-fk-grid[_ngcontent-%COMP%] {\n display: grid;\n width: 100%;\n min-width: max-content;\n align-items: stretch;\n}\n\n\n\n\n.mj-fk-grid-row[_ngcontent-%COMP%] {\n display: contents;\n}\n\n\n.mj-fk-hcell[_ngcontent-%COMP%] {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-elevated);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n}\n\n.mj-fk-hcell[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-hcell--icon[_ngcontent-%COMP%] {\n cursor: default;\n padding: 7px 8px;\n}\n\n.mj-fk-hcell--icon[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-elevated);\n}\n\n.mj-fk-hcell-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-sort-icon[_ngcontent-%COMP%] {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n\n.mj-fk-sort-icon--idle[_ngcontent-%COMP%] {\n opacity: 0.35;\n}\n\n\n.mj-fk-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 320px;\n cursor: pointer;\n}\n\n\n\n.mj-fk-cell--fill[_ngcontent-%COMP%] {\n max-width: none;\n}\n\n\n\n.mj-fk-cell[_ngcontent-%COMP%] > span[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n\n.mj-fk-cell--icon[_ngcontent-%COMP%] {\n justify-content: center;\n padding: 8px;\n max-width: none;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.mj-fk-cell--name[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 14px;\n color: var(--mj-text-primary);\n gap: 6px;\n}\n\n.mj-fk-selected-check[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 11px;\n flex-shrink: 0;\n}\n\n\n\n.mj-fk-grid-row--active[_ngcontent-%COMP%] > .mj-fk-cell[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n\n\n.mj-fk-grid-row--selected[_ngcontent-%COMP%] > .mj-fk-cell[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n}\n\n.mj-fk-grid-row--selected[_ngcontent-%COMP%] > .mj-fk-cell--name[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n.mj-fk-cell--name[_ngcontent-%COMP%] .mj-forms-search-highlight, \n.mj-fk-cell[_ngcontent-%COMP%] .mj-forms-search-highlight {\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n\n.mj-fk-resizer[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 7px;\n height: 100%;\n cursor: col-resize;\n user-select: none;\n}\n\n.mj-fk-resizer[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n top: 20%;\n right: 2px;\n width: 2px;\n height: 60%;\n background: transparent;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-hcell[_ngcontent-%COMP%]:hover .mj-fk-resizer[_ngcontent-%COMP%]::after, \n.mj-fk-resizer[_ngcontent-%COMP%]:hover::after {\n background: var(--mj-border-strong);\n}\n\n\n.mj-fk-status[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-status[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.mj-fk-status--empty[_ngcontent-%COMP%] {\n font-style: italic;\n}\n\n\n\n.mj-fk-create-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 9px;\n width: 100%;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-top: 1px solid var(--mj-border-default);\n color: var(--mj-brand-primary);\n font-size: 13px;\n font-weight: 600;\n font-family: inherit;\n text-align: left;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-create-footer[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-create-icon[_ngcontent-%COMP%] {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n.mj-fk-create-label[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n\n\n\n.mj-fk-current[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-default);\n background: color-mix(in srgb, var(--mj-brand-primary) 7%, var(--mj-bg-surface-card));\n animation: _ngcontent-%COMP%_mj-fk-current-in 220ms cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n@keyframes _ngcontent-%COMP%_mj-fk-current-in {\n from { opacity: 0; transform: translateY(-6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.mj-fk-current-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px 3px;\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-current-head[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.mj-fk-current-row[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 6px 12px 10px;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n\n.mj-fk-current-row[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 0;\n top: 4px;\n bottom: 8px;\n width: 3px;\n border-radius: 0 2px 2px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-fk-current-row[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-fk-current-icon[_ngcontent-%COMP%] {\n flex-shrink: 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-current-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-detail[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-clear[_ngcontent-%COMP%] {\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-current-clear[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-status-error);\n}\n\n@keyframes _ngcontent-%COMP%_mj-dropdown-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes _ngcontent-%COMP%_mj-dropdown-in-above {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n\n\n\n.mj-forms-field-label[_ngcontent-%COMP%] .mj-forms-search-highlight {\n \n\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n\n\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%]:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-status-error);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-custom-select-trigger[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error[_ngcontent-%COMP%] .mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n\n\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%]:focus {\n background: color-mix(in srgb, var(--mj-status-warning) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%] {\n border-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-forms-field-input--textarea[_ngcontent-%COMP%]:focus {\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-custom-select-trigger[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning[_ngcontent-%COMP%] .mj-fk-search[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n\n\n\n.mj-forms-field-validation[_ngcontent-%COMP%] {\n grid-column: 2;\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: -2px;\n overflow: hidden;\n animation: _ngcontent-%COMP%_mj-validation-slide-in 200ms ease-out;\n}\n\n.mj-forms-field-validation-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n font-size: 12px;\n line-height: 1.4;\n padding: 3px 0 1px;\n}\n\n.mj-forms-field-validation-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n\n.mj-forms-field-validation--error[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.mj-forms-field-validation--error[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n.mj-forms-field-validation--warning[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] {\n color: var(--mj-status-warning-text);\n}\n\n.mj-forms-field-validation--warning[_ngcontent-%COMP%] .mj-forms-field-validation-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n\n\n\n.mj-forms-image[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n min-width: 0;\n}\n\n.mj-forms-image-preview[_ngcontent-%COMP%] {\n width: 72px;\n height: 72px;\n object-fit: cover;\n object-position: center;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n display: block;\n}\n\n.mj-forms-image-preview--empty[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 22px;\n}\n\n.mj-forms-image-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-image-hint[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.mj-forms-image-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-forms-image-file[_ngcontent-%COMP%] {\n display: none;\n}\n\n.mj-forms-image-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-family: inherit;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n border-radius: 6px;\n padding: 4px 10px;\n cursor: pointer;\n}\n\n.mj-forms-image-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n\n.mj-forms-image-btn--ghost[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n background: transparent;\n border-color: var(--mj-border-default);\n font-weight: 500;\n}\n\n.mj-forms-image--edit[_ngcontent-%COMP%] .mj-forms-field-input[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.mj-forms-color[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n}\n\n.mj-forms-color-swatch[_ngcontent-%COMP%] {\n width: 20px;\n height: 20px;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.mj-forms-color-picker[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n padding: 0;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n cursor: pointer;\n flex: 0 0 auto;\n}\n\n.mj-forms-color-hex[_ngcontent-%COMP%] {\n max-width: 160px;\n}\n\n.mj-forms-json[_ngcontent-%COMP%] {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 12.5px;\n line-height: 1.45;\n white-space: pre-wrap;\n word-break: break-word;\n margin: 0;\n max-height: 360px;\n overflow: auto;\n width: 100%;\n}\n\n@keyframes _ngcontent-%COMP%_mj-validation-slide-in {\n from {\n opacity: 0;\n max-height: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n max-height: 100px;\n transform: translateY(0);\n }\n}\n\n\n\n\n@media (max-width: 640px) {\n .mj-forms-field[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 4px;\n }\n\n .mj-forms-field-label[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .mj-forms-field-validation[_ngcontent-%COMP%] {\n grid-column: 1;\n }\n}"], changeDetection: 0 });
2596
3161
  }
2597
3162
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MjFormFieldComponent, [{
2598
3163
  type: Component,
2599
- args: [{ standalone: false, selector: 'mj-form-field', changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (Record && (Record.IsSaved || !IsFieldReadOnly)) {\n <!-- READ-ONLY MODE -->\n @if ((!EditMode || IsFieldReadOnly) && !ShouldHideField) {\n <div class=\"mj-forms-field\" [class.mj-forms-field--readonly]=\"EditMode && IsFieldReadOnly\" [class.mj-forms-field--dirty]=\"IsDirty\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- FK fields with a mapped name field: show the name as a hyperlink -->\n @if (IsFKWithNameField) {\n <span class=\"mj-forms-field-value\">\n @if (RecordLinksEnabled) {\n <a class=\"mj-forms-field-link mj-forms-field-link--fk\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FKDisplayName }}\n </a>\n } @else {\n {{ FKDisplayName }}\n }\n </span>\n }\n @else {\n @switch (LinkType) {\n @case ('Email') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnEmailLinkClick($event)\" title=\"Send email\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-envelope mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('URL') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnUrlLinkClick($event)\" title=\"Open link\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('Record') {\n <span class=\"mj-forms-field-value\">\n @if (RecordLinksEnabled) {\n <a class=\"mj-forms-field-link\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n } @else {\n {{ FormatValue() }}\n }\n </span>\n }\n @default {\n @if (Type === 'checkbox') {\n <span class=\"mj-forms-field-value\">\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\" [checked]=\"!!Value\" disabled>\n </div>\n </span>\n }\n @else if (RichTextMode === 'markdown') {\n <div class=\"mj-forms-field-value mj-forms-field-value--rich\">\n <mj-markdown [data]=\"FormatValue()\"></mj-markdown>\n </div>\n }\n @else if (RichTextMode === 'html') {\n <!-- XSS: the mjSafeRichHtml pipe sanitizes with DOMPurify (HTML + SVG profiles)\n and then bypasses Angular's redundant re-sanitize. DOMPurify strips <script>,\n on* handlers, javascript:/data: URLs and <foreignObject> while KEEPING safe\n inline SVG + styles \u2014 richer than Angular's built-in sanitizer, still safe for\n untrusted content. -->\n <div class=\"mj-forms-field-value mj-forms-field-value--rich\" [innerHTML]=\"FormatValue() | mjSafeRichHtml\"></div>\n }\n @else if (RichTextMode === 'code') {\n <div class=\"mj-forms-field-value mj-forms-field-value--code\">\n <mj-code-editor [value]=\"FormatValue()\" [language]=\"CodeEditorLanguage\" [readonly]=\"true\"></mj-code-editor>\n </div>\n }\n @else if (IsLongText) {\n <span class=\"mj-forms-field-value mj-forms-field-value--long\">{{ FormatValue() }}</span>\n }\n @else {\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n }\n }\n }\n }\n </div>\n </div>\n }\n\n <!-- EDIT MODE -->\n @if (EditMode && !IsFieldReadOnly) {\n <div class=\"mj-forms-field mj-forms-field--editing\" [class.mj-forms-field--dirty]=\"IsDirty\" [class.mj-forms-field--required-empty]=\"IsRequiredEmpty\" [class.mj-forms-field--has-error]=\"ShowErrors\" [class.mj-forms-field--has-warning]=\"ShowWarnings\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- Foreign Key fields get custom search autocomplete -->\n @if (HasRelatedEntity) {\n <div class=\"mj-fk-search\"\n [class.mj-fk-search--matched]=\"FKHasLinkedValue\"\n [class.mj-fk-search--scoped]=\"FKFocused && FKSearchableFields.length > 1\">\n @if (FKHasLinkedValue && !(FKFocused && FKSearchableFields.length > 1)) {\n <i class=\"fa-solid fa-link mj-fk-link-icon\" title=\"Linked record\"></i>\n }\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [class.mj-forms-field-input--linked]=\"FKHasLinkedValue\"\n [value]=\"FKSearchText\"\n (input)=\"OnFKInput($event)\"\n (focus)=\"OnFKFocus($event)\"\n (blur)=\"OnFKBlur()\"\n (keydown)=\"OnFKKeydown($event)\"\n placeholder=\"Search...\">\n\n <!-- Scope pill: only while focused, only when there's more than one searchable field.\n The menu itself lives INSIDE the results dropdown (below) so it overlays the\n list and rides the same above/below flip. -->\n @if (FKFocused && FKSearchableFields.length > 1) {\n <button class=\"mj-fk-scope-pill\"\n [class.mj-fk-scope-pill--open]=\"FKShowScopeMenu\"\n (mousedown)=\"OnFKScopeToggle($event)\"\n [title]=\"'Searching ' + FKSearchFieldLabel + ' \u2014 click to change'\">\n <i class=\"fa-solid fa-magnifying-glass mj-fk-scope-pill-icon\"></i>\n <span class=\"mj-fk-scope-pill-label\">{{ FKSearchFieldLabel }}</span>\n <i class=\"fa-solid mj-fk-scope-pill-caret\" [class.fa-chevron-up]=\"FKShowScopeMenu\" [class.fa-chevron-down]=\"!FKShowScopeMenu\"></i>\n </button>\n }\n\n @if (FKSearchText) {\n <button class=\"mj-fk-clear\" (mousedown)=\"OnFKClearClick($event)\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n } @else {\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n }\n @if (ShowFKDropdown) {\n <div class=\"mj-fk-dropdown mj-fk-dropdown--multi\"\n [ngStyle]=\"DropdownPositionStyle\"\n [class.mj-fk-dropdown--above]=\"OpenAbove\"\n [class.mj-fk-dropdown--scope-open]=\"FKShowScopeMenu\">\n\n <!-- Scope (search-field) picker + column toggles \u2014 overlays the list, anchored to the pill edge.\n Click a row to SEARCH that field; click the eye to SHOW/HIDE it as a column. -->\n @if (FKShowScopeMenu) {\n <div class=\"mj-fk-scope-menu\" [class.mj-fk-scope-menu--bottom]=\"OpenAbove\">\n <div class=\"mj-fk-scope-grp\">Columns shown</div>\n @for (f of FKSearchableFields; track f.FieldName) {\n @if (f.Group === 'shown') {\n <ng-container *ngTemplateOutlet=\"scopeRow; context: { $implicit: f }\"></ng-container>\n }\n }\n @if (FKHasOtherSearchableFields) {\n <div class=\"mj-fk-scope-divider\"></div>\n <div class=\"mj-fk-scope-grp\">Other fields</div>\n @for (f of FKSearchableFields; track f.FieldName) {\n @if (f.Group === 'other') {\n <ng-container *ngTemplateOutlet=\"scopeRow; context: { $implicit: f }\"></ng-container>\n }\n }\n }\n </div>\n }\n\n <!-- Shared scope-menu row, fixed-slot layout for clean alignment:\n [reorder \u25B2\u25BC \u2014 hover-reveal] [icon] [label] [eye].\n Click the row = search this field; the active search row is shown bold+accent. -->\n <ng-template #scopeRow let-f>\n <div class=\"mj-fk-scope-mi\"\n [class.mj-fk-scope-mi--on]=\"IsFKScopeActive(f)\"\n (mousedown)=\"OnFKScopeSelect($event, f)\">\n <span class=\"mj-fk-col-reorder\">\n @if (f.Group === 'shown') {\n <button type=\"button\" class=\"mj-fk-col-move mj-fk-col-move--up\" [disabled]=\"!CanMoveFKColumnUp(f.FieldName)\"\n (mousedown)=\"MoveFKColumn($event, f.FieldName, -1)\" title=\"Move column up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button type=\"button\" class=\"mj-fk-col-move mj-fk-col-move--down\" [disabled]=\"!CanMoveFKColumnDown(f.FieldName)\"\n (mousedown)=\"MoveFKColumn($event, f.FieldName, 1)\" title=\"Move column down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n }\n </span>\n <i [class]=\"f.Icon + ' mj-fk-scope-mi-icon'\"></i>\n <span class=\"mj-fk-scope-mi-label\">{{ f.Label }}</span>\n <span class=\"mj-fk-col-eye-slot\">\n @if (CanToggleFKColumn(f)) {\n <button type=\"button\" class=\"mj-fk-col-toggle\"\n [class.mj-fk-col-toggle--on]=\"IsFKColumnVisible(f)\"\n (mousedown)=\"OnFKColumnToggle($event, f)\"\n [title]=\"IsFKColumnVisible(f) ? 'Hide this column' : 'Show as a column'\">\n <i class=\"fa-solid\" [class.fa-eye]=\"IsFKColumnVisible(f)\" [class.fa-eye-slash]=\"!IsFKColumnVisible(f)\"></i>\n </button>\n }\n </span>\n </div>\n </ng-template>\n\n <!-- Pinned \"currently selected\" \u2014 sticky at the top while browsing, so you can\n keep it or pick another without clearing first. -->\n @if (FKSelectedSuggestion && !FKLoading) {\n <div class=\"mj-fk-current\">\n <div class=\"mj-fk-current-head\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>Currently selected</span>\n </div>\n <div class=\"mj-fk-current-row\" (mousedown)=\"OnFKSelectItem(FKSelectedSuggestion, $event)\" title=\"Keep this selection\">\n @if (FKSelectedSuggestion.Icon) { <i class=\"mj-fk-current-icon\" [class]=\"FKSelectedSuggestion.Icon\"></i> }\n <span class=\"mj-fk-current-name\" [innerHTML]=\"FKSelectedSuggestion.HighlightedName\"></span>\n @if (FKSelectedSuggestion.ExtraColumns.length && FKSelectedSuggestion.ExtraColumns[0].Value) {\n <span class=\"mj-fk-current-detail\">{{ FKSelectedSuggestion.ExtraColumns[0].Value }}</span>\n }\n <button type=\"button\" class=\"mj-fk-current-clear\" (mousedown)=\"OnFKClearClick($event)\" title=\"Clear selection\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n }\n\n @if (FKLoading) {\n <div class=\"mj-fk-status\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span>Searching\u2026</span>\n </div>\n }\n @if (!FKLoading && FKNoMatches) {\n <div class=\"mj-fk-status mj-fk-status--empty\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No matches</span>\n </div>\n }\n @if (!FKLoading && FKSuggestions.length > 0) {\n <div class=\"mj-fk-options\">\n <div class=\"mj-fk-grid\" [style.grid-template-columns]=\"FKGridTemplateColumns\">\n <!-- Header row: click to sort, drag the right edge to resize.\n (Column reorder lives in the field-selector menu, not here.) -->\n <div class=\"mj-fk-grid-row mj-fk-grid-row--header\">\n @if (FKHasIconColumn) {\n <div class=\"mj-fk-hcell mj-fk-hcell--icon\"></div>\n }\n @for (col of FKColumnFields; track col; let i = $index) {\n <div class=\"mj-fk-hcell\"\n (mousedown)=\"OnFKHeaderSort($event, col)\"\n [title]=\"'Click to sort by ' + FKColumnHeaders[i]\">\n <span class=\"mj-fk-hcell-label\">{{ FKColumnHeaders[i] }}</span>\n <i [class]=\"FKSortIcon(col)\"></i>\n <span class=\"mj-fk-resizer\" (mousedown)=\"OnFKColResizeStart($event, col)\" title=\"Drag to resize\"></span>\n </div>\n }\n </div>\n <!-- Data rows -->\n @for (suggestion of FKSuggestions; track suggestion.PrimaryKeyValue; let i = $index) {\n <div class=\"mj-fk-grid-row\"\n [class.mj-fk-grid-row--active]=\"i === FKActiveIndex\"\n [class.mj-fk-grid-row--selected]=\"IsFKRowSelected(suggestion)\"\n (mousedown)=\"OnFKSelectItem(suggestion, $event)\"\n (mouseenter)=\"FKActiveIndex = i\">\n @if (FKHasIconColumn) {\n <div class=\"mj-fk-cell mj-fk-cell--icon\">\n @if (suggestion.Icon) { <i [class]=\"suggestion.Icon\"></i> }\n </div>\n }\n @for (col of FKColumnFields; track col; let last = $last) {\n @if (col === FKNameField) {\n <div class=\"mj-fk-cell mj-fk-cell--name\" [class.mj-fk-cell--fill]=\"FKColumnFillsTrack(col, last)\">\n @if (IsFKRowSelected(suggestion)) {\n <i class=\"fa-solid fa-check mj-fk-selected-check\" title=\"Currently selected\"></i>\n }\n <span [innerHTML]=\"suggestion.HighlightedName\"></span>\n </div>\n } @else {\n <div class=\"mj-fk-cell\" [class.mj-fk-cell--fill]=\"FKColumnFillsTrack(col, last)\" [title]=\"FKCellFor(suggestion, col)?.Value || ''\">\n <span [innerHTML]=\"FKCellFor(suggestion, col)?.HighlightedValue || ''\"></span>\n </div>\n }\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Sticky \"create new\" footer \u2014 always visible at the bottom (no scrolling),\n prefilled with the typed text. Gated on create permission. -->\n @if (CanCreateFK) {\n <button type=\"button\" class=\"mj-fk-create-footer\" (mousedown)=\"OnFKCreateNew($event)\" [title]=\"FKCreateLabel\">\n <i class=\"fa-solid fa-plus mj-fk-create-icon\"></i>\n <span class=\"mj-fk-create-label\">{{ FKCreateLabel }}</span>\n </button>\n }\n </div>\n }\n </div>\n }\n @else if (EditRichTextMode !== 'plain') {\n <!-- Markdown / HTML / Code long-text: edit raw with a syntax-highlighted code editor -->\n <mj-code-editor\n class=\"mj-forms-field-input--code\"\n [value]=\"FormatValue()\"\n [language]=\"CodeEditorLanguage\"\n (change)=\"OnCodeEditorChange($event)\"></mj-code-editor>\n }\n @else {\n @switch (Type) {\n @case ('textbox') {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\">\n }\n @case ('textarea') {\n <textarea\n class=\"mj-forms-field-input mj-forms-field-input--textarea\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"></textarea>\n }\n @case ('number') {\n <input type=\"number\"\n class=\"mj-forms-field-input mj-forms-field-input--number\"\n [value]=\"Value\"\n (change)=\"OnNumberChange($event)\">\n }\n @case ('datepicker') {\n <input type=\"date\"\n class=\"mj-forms-field-input mj-forms-field-input--date\"\n [value]=\"DateInputValue\"\n (change)=\"OnDateChange($event)\">\n }\n @case ('checkbox') {\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"!!Value\"\n (change)=\"OnCheckboxChange($event)\">\n </div>\n }\n @case ('select') {\n <div class=\"mj-custom-select-trigger\"\n tabindex=\"0\"\n (click)=\"OnSelectTriggerClick($event)\"\n (blur)=\"OnSelectTriggerBlur()\">\n <span class=\"mj-custom-select-value\" [class.mj-custom-select-value--placeholder]=\"!FormatValue()\">\n {{ FormatValue() || '-- Select --' }}\n </span>\n <i class=\"fa-solid fa-chevron-down mj-custom-select-chevron\" [class.mj-custom-select-chevron--open]=\"ShowSelectDropdown\"></i>\n </div>\n @if (ShowSelectDropdown && PossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of PossibleValues; track option) {\n <div class=\"mj-fk-option\" [class.mj-fk-option--selected]=\"FormatValue() === option\" (mousedown)=\"OnSelectOptionClick(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n }\n @case ('autocomplete') {\n <div class=\"mj-fk-search\">\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnValueListInput($event)\"\n (focus)=\"OnValueListFocus($event)\"\n (blur)=\"OnValueListBlur()\"\n placeholder=\"Type to search...\">\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n @if (ShowValueListDropdown && FilteredPossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of FilteredPossibleValues; track option) {\n <div class=\"mj-fk-option\" (mousedown)=\"OnValueListSelect(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n </div>\n }\n @default {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (change)=\"OnInputChange($event)\">\n }\n }\n }\n </div>\n <!-- Inline validation messages -->\n @if (DisplayErrors.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--error\">\n @for (error of DisplayErrors; track error.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ error.Message }}</span>\n </div>\n }\n </div>\n }\n @if (DisplayWarnings.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--warning\">\n @for (warning of DisplayWarnings; track warning.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ warning.Message }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n}\n", styles: ["/* ============================================\n FORM FIELD - Shared styles for read and edit\n ============================================ */\n:host {\n --mj-forms-field-label-width: 200px;\n --mj-forms-field-gap: 12px;\n\n display: contents;\n}\n\n.mj-forms-field {\n display: grid;\n grid-template-columns: var(--mj-forms-field-label-width) 1fr;\n gap: var(--mj-forms-field-gap);\n align-items: baseline;\n padding: 8px 0;\n transition: all var(--mj-transition-base) ease;\n}\n\n/* Subtle row hover in edit mode */\n.mj-forms-field--editing:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 6px;\n margin: 0 -8px;\n padding: 8px 8px;\n}\n\n/* ============================================\n LABEL\n ============================================ */\n.mj-forms-field-label {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n padding-top: 2px;\n word-break: break-word;\n}\n\n/* ============================================\n FIELD CONTROL WRAPPER (value + dirty dot)\n ============================================ */\n.mj-forms-field-control {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.mj-forms-field-control > * {\n flex: 1;\n min-width: 0;\n}\n\n/* ============================================\n DIRTY INDICATOR (solid amber dot after label)\n ============================================ */\n.mj-forms-field--dirty .mj-forms-field-label::after {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--mj-status-warning);\n margin-left: 6px;\n vertical-align: middle;\n}\n\n/* ============================================\n REQUIRED FIELD - red underline when empty\n ============================================ */\n.mj-forms-field--required-empty .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty .mj-forms-field-input:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty .mj-custom-select-trigger {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty .mj-fk-search .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n}\n\n/* ============================================\n READ-ONLY VALUE\n ============================================ */\n.mj-forms-field-value {\n font-size: 14px;\n color: var(--mj-text-primary);\n min-height: 24px;\n display: flex;\n align-items: center;\n overflow-wrap: break-word;\n word-break: break-word;\n}\n\n.mj-forms-field-value--long {\n white-space: pre-line;\n max-height: 300px;\n overflow: auto;\n}\n\n/* Rich (markdown / html) read-only rendering \u2014 let content flow as a block, not a flex row */\n.mj-forms-field-value--rich {\n display: block;\n align-items: initial;\n max-height: 480px;\n overflow: auto;\n width: 100%;\n}\n\n/* Code read-only / edit rendering \u2014 the embedded code editor needs an explicit height */\n.mj-forms-field-value--code {\n display: block;\n align-items: initial;\n width: 100%;\n}\n\n.mj-forms-field-value--code mj-code-editor,\n.mj-forms-field-input--code {\n display: block;\n width: 100%;\n min-height: 160px;\n max-height: 480px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius, 4px);\n overflow: auto;\n}\n\n/* Read-only fields in edit mode */\n.mj-forms-field--readonly {\n opacity: 0.7;\n}\n\n.mj-forms-field--readonly .mj-forms-field-value {\n color: var(--mj-text-secondary);\n}\n\n/* ============================================\n LINKS (FK, email, URL)\n ============================================ */\n.mj-forms-field-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-weight: 400;\n font-size: 14px;\n transition: color var(--mj-transition-base);\n text-decoration: none;\n}\n\n.mj-forms-field-link:hover {\n color: var(--mj-brand-primary-hover);\n}\n\n.mj-forms-field-link-icon {\n font-size: 11px;\n opacity: 0;\n transition: opacity var(--mj-transition-base);\n}\n\n.mj-forms-field-link:hover .mj-forms-field-link-icon {\n opacity: 1;\n}\n\n/* FK fields showing entity name instead of raw ID */\n.mj-forms-field-link--fk {\n font-size: 14px;\n font-weight: 400;\n}\n\n/* ============================================\n EDIT MODE INPUTS - Clean underline style\n ============================================ */\n.mj-forms-field-input {\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-forms-field-input:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-forms-field-input::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n/* Textarea variant */\n.mj-forms-field-input--textarea {\n resize: vertical;\n min-height: 60px;\n border: 1.5px solid var(--mj-border-default);\n border-radius: 6px;\n padding: 8px 10px;\n background: var(--mj-bg-surface);\n font-family: inherit;\n}\n\n.mj-forms-field-input--textarea:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n background: var(--mj-bg-surface);\n padding: 8px 10px;\n border-radius: 6px;\n}\n\n/* Number input - narrower */\n.mj-forms-field-input--number {\n max-width: 200px;\n}\n\n/* Date input - narrower */\n.mj-forms-field-input--date {\n max-width: 220px;\n}\n\n/* ============================================\n CHECKBOX (custom styled)\n ============================================ */\n.mj-forms-field-checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"] {\n appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n position: relative;\n transition: all var(--mj-transition-base) ease;\n flex-shrink: 0;\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"]:checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"]:checked::after {\n content: '';\n position: absolute;\n left: 5px;\n top: 1px;\n width: 5px;\n height: 9px;\n border: solid var(--mj-text-inverse);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"]:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n/* ============================================\n CUSTOM SELECT DROPDOWN (replaces native <select>)\n ============================================ */\n.mj-custom-select-trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n cursor: pointer;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-custom-select-trigger:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-custom-select-value {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mj-custom-select-value--placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.mj-custom-select-chevron {\n font-size: 11px;\n color: var(--mj-text-muted);\n transition: transform var(--mj-transition-base) ease;\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n.mj-custom-select-chevron--open {\n transform: rotate(180deg);\n}\n\n/* ============================================\n FK SEARCH (custom autocomplete)\n ============================================ */\n.mj-fk-search {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n}\n\n.mj-fk-search .mj-forms-field-input {\n padding-right: 28px;\n}\n\n.mj-fk-search-icon {\n position: absolute;\n right: 4px;\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n\n.mj-fk-clear {\n position: absolute;\n right: 2px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n padding: 4px 6px;\n line-height: 1;\n border-radius: 3px;\n transition: all var(--mj-transition-base);\n}\n\n.mj-fk-clear:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n/* Linked state: solid accent underline + a leading chain icon, so it's obvious the\n field holds a resolved record reference rather than free-typed text. */\n.mj-fk-search--matched .mj-forms-field-input {\n border-bottom: 2px solid var(--mj-brand-primary);\n}\n\n/* Linked indicator sits on the RIGHT (just left of the clear button) so it never\n interrupts left-to-right reading of the value or overlaps the text. */\n.mj-fk-link-icon {\n position: absolute;\n right: 26px;\n color: var(--mj-brand-primary);\n font-size: 10px;\n pointer-events: none;\n z-index: 1;\n}\n\n/* Make room on the right for the link icon + the clear button. */\n.mj-forms-field-input--linked {\n padding-right: 46px;\n}\n\n/* ============================================\n SCOPE PILL + FIELD-PICKER MENU (search-field scope)\n ============================================ */\n/* When the pill is showing, reserve room on the right of the input for it. */\n.mj-fk-search--scoped .mj-forms-field-input {\n padding-right: 150px;\n}\n\n.mj-fk-scope-pill {\n position: absolute;\n right: 30px;\n /* Vertically centered in the input so it clears the focus underline below. */\n top: 50%;\n transform: translateY(-50%);\n display: inline-flex;\n align-items: center;\n gap: 5px;\n max-width: 120px;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n color: var(--mj-text-secondary);\n font-size: 10.5px;\n font-weight: 600;\n font-family: inherit;\n /* Kept short so it clears the input's focus underline without making the row taller. */\n padding: 1px 7px;\n border-radius: 999px;\n cursor: pointer;\n white-space: nowrap;\n line-height: 1.35;\n transition: background var(--mj-transition-base), border-color var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-pill:hover,\n.mj-fk-scope-pill--open {\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-primary);\n}\n\n.mj-fk-scope-pill-icon {\n font-size: 9px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-pill-label {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-scope-pill-caret {\n font-size: 8px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n/* The menu is rendered INSIDE the results dropdown panel so it overlays the list\n (correct z-order, no extra real estate) and rides the dropdown's above/below\n flip. Anchored to the dropdown's top-right \u2014 right under the pill. */\n.mj-fk-scope-menu {\n position: absolute;\n top: 4px;\n right: 8px;\n z-index: 5;\n min-width: 180px;\n max-width: calc(100vw - 24px);\n max-height: 260px;\n overflow-y: auto;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n box-shadow: var(--mj-shadow-lg);\n padding: 5px;\n animation: mj-dropdown-in 120ms ease;\n}\n\n/* When the dropdown opens ABOVE the input, anchor the menu to its bottom edge so it\n stays next to the pill (which is at the input/dropdown boundary). */\n.mj-fk-scope-menu--bottom {\n top: auto;\n bottom: 4px;\n}\n\n.mj-fk-scope-grp {\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n padding: 7px 10px 4px;\n font-weight: 700;\n}\n\n.mj-fk-scope-mi {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 7px 10px;\n font-size: 13px;\n border-radius: 5px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.mj-fk-scope-mi:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-scope-mi--on {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n/* Fixed-width LEFT slot: a compact stacked up/down reorder control that reveals on row\n hover. Reserved (same width) on every row so the field icons + labels stay aligned. */\n.mj-fk-col-reorder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 22px;\n flex-shrink: 0;\n}\n\n.mj-fk-col-move {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 10px;\n padding: 0;\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 8px;\n opacity: 0; /* hover-reveal for a clean resting state */\n transition: opacity var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-mi:hover .mj-fk-col-move:not(:disabled) {\n opacity: 0.8;\n}\n\n.mj-fk-col-move:hover:not(:disabled) {\n opacity: 1;\n color: var(--mj-brand-primary);\n}\n\n/* End-of-range arrows stay hidden (slot still reserved) rather than greyed. */\n.mj-fk-col-move:disabled {\n opacity: 0 !important;\n cursor: default;\n}\n\n.mj-fk-scope-mi-icon {\n width: 14px;\n font-size: 11px;\n opacity: 0.75;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-mi-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Fixed-width RIGHT slot so the eye (or its empty space, for the name row) aligns. */\n.mj-fk-col-eye-slot {\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Eye toggle: show/hide a field as a grid column (independent of search scope). */\n.mj-fk-col-toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-col-toggle:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.mj-fk-col-toggle--on {\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-scope-divider {\n height: 1px;\n background: var(--mj-border-subtle);\n margin: 4px 6px;\n}\n\n/* Narrow / mobile screens: shrink the pill + its reserved space, give menu rows a\n larger touch target, and keep the menu within the viewport. */\n@media (max-width: 560px) {\n .mj-fk-search--scoped .mj-forms-field-input {\n padding-right: 116px;\n }\n .mj-fk-scope-pill {\n max-width: 88px;\n }\n .mj-fk-scope-menu {\n min-width: 160px;\n }\n .mj-fk-scope-mi {\n padding: 10px 10px;\n }\n}\n\n/* ============================================\n FLOATING DROPDOWN PANEL (position: fixed via ngStyle)\n ============================================ */\n.mj-fk-dropdown {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-lg);\n max-height: 240px;\n overflow-y: auto;\n padding: 4px;\n animation: mj-dropdown-in 150ms ease;\n}\n\n.mj-fk-dropdown--above {\n animation: mj-dropdown-in-above 150ms ease;\n}\n\n.mj-fk-option {\n padding: 10px 14px;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background var(--mj-transition-base);\n border-radius: 6px;\n}\n\n.mj-fk-option:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.mj-fk-option--selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-option--selected:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ============================================\n MULTI-COLUMN FK DROPDOWN \u2014 aligned mini-grid (icon + name + extra cols)\n with sortable headers and horizontal scroll.\n ============================================ */\n.mj-fk-dropdown--multi {\n padding: 4px;\n /* The inner .mj-fk-options is the single scroll container (both axes) so the\n sticky header anchors correctly; the dropdown just clips to its rounded border. */\n overflow: hidden;\n max-height: none;\n}\n\n/* Single scroll region (both axes) for the grid: vertical for long lists, horizontal\n when many DefaultInView columns make rows wider than the dropdown. Being the sole\n scroller lets the sticky column headers anchor to its top edge. */\n.mj-fk-dropdown--multi .mj-fk-options {\n overflow: auto;\n max-height: 260px;\n}\n\n/* While the scope menu is open it must escape the panel's clip (the inner\n .mj-fk-options keeps its own scroll, so the grid still behaves). */\n.mj-fk-dropdown--scope-open {\n overflow: visible;\n}\n\n/* One CSS grid spans the header + all data rows so every column lines up.\n grid-template-columns is supplied inline from FKGridTemplateColumns.\n `width: 100%` (with `min-width: max-content`) lets the last column's `1fr` track\n absorb leftover width, while still overflowing \u2192 horizontal scroll when the columns\n are collectively wider than the dropdown. */\n.mj-fk-grid {\n display: grid;\n width: 100%;\n min-width: max-content;\n align-items: stretch;\n}\n\n/* Rows are layout-transparent so their cells become direct grid items (this is\n what makes columns align across rows). The row element still exists for click\n handling and for the active-state selector below. */\n.mj-fk-grid-row {\n display: contents;\n}\n\n/* Header cells: sticky to the top of the vertical scroll, clickable to sort. */\n.mj-fk-hcell {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-elevated);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n}\n\n.mj-fk-hcell:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-hcell--icon {\n cursor: default;\n padding: 7px 8px;\n}\n\n.mj-fk-hcell--icon:hover {\n background: var(--mj-bg-surface-elevated);\n}\n\n.mj-fk-hcell-label {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-sort-icon {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n/* Idle (unsorted) columns show a faded sort glyph to signal sortability. */\n.mj-fk-sort-icon--idle {\n opacity: 0.35;\n}\n\n/* Data cells */\n.mj-fk-cell {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 320px;\n cursor: pointer;\n}\n\n/* The fill column (last, or a user-resized one) drops the default content cap so its\n cells stretch to the full track width that the header already occupies. */\n.mj-fk-cell--fill {\n max-width: none;\n}\n\n/* Wrapping span keeps the highlighted text+<mark> as one inline run (so flex\n doesn't strip the space next to the mark) while still truncating with ellipsis. */\n.mj-fk-cell > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n\n.mj-fk-cell--icon {\n justify-content: center;\n padding: 8px;\n max-width: none;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.mj-fk-cell--name {\n font-weight: 500;\n font-size: 14px;\n color: var(--mj-text-primary);\n gap: 6px;\n}\n\n.mj-fk-selected-check {\n color: var(--mj-brand-primary);\n font-size: 11px;\n flex-shrink: 0;\n}\n\n/* Active (keyboard / hover) row \u2014 painted on the cells, since the row box is\n removed by display:contents. The child combinator still matches. */\n.mj-fk-grid-row--active > .mj-fk-cell {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n/* Currently-linked row \u2014 a subtle persistent tint so the user sees which record\n is selected when they reopen the list (stacks under the brighter active tint). */\n.mj-fk-grid-row--selected > .mj-fk-cell {\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n}\n\n.mj-fk-grid-row--selected > .mj-fk-cell--name {\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n/* Matched-substring highlight inside the name column */\n/* ::ng-deep (not :global, which Angular's emulated encapsulation ignores) so the\n style reaches the <mark> injected via [innerHTML]. Color comes from the shared\n theme token so light/dark/white-label all control it centrally. */\n.mj-fk-cell--name ::ng-deep .mj-forms-search-highlight,\n.mj-fk-cell ::ng-deep .mj-forms-search-highlight {\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n/* Column resize handle \u2014 thin grab strip on the right edge of each header cell. */\n.mj-fk-resizer {\n position: absolute;\n top: 0;\n right: 0;\n width: 7px;\n height: 100%;\n cursor: col-resize;\n user-select: none;\n}\n\n.mj-fk-resizer::after {\n content: '';\n position: absolute;\n top: 20%;\n right: 2px;\n width: 2px;\n height: 60%;\n background: transparent;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-hcell:hover .mj-fk-resizer::after,\n.mj-fk-resizer:hover::after {\n background: var(--mj-border-strong);\n}\n\n/* Loading / empty status rows */\n.mj-fk-status {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-status i {\n font-size: 12px;\n}\n\n.mj-fk-status--empty {\n font-style: italic;\n}\n\n/* Sticky \"create new\" footer \u2014 sits below the (scrolling) options as a direct child of\n the dropdown panel, so it's always visible regardless of list length. */\n.mj-fk-create-footer {\n display: flex;\n align-items: center;\n gap: 9px;\n width: 100%;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-top: 1px solid var(--mj-border-default);\n color: var(--mj-brand-primary);\n font-size: 13px;\n font-weight: 600;\n font-family: inherit;\n text-align: left;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-create-footer:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-create-icon {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n.mj-fk-create-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ============================================\n PINNED \"CURRENTLY SELECTED\" SECTION\n ============================================ */\n.mj-fk-current {\n border-bottom: 1px solid var(--mj-border-default);\n background: color-mix(in srgb, var(--mj-brand-primary) 7%, var(--mj-bg-surface-card));\n animation: mj-fk-current-in 220ms cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n@keyframes mj-fk-current-in {\n from { opacity: 0; transform: translateY(-6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.mj-fk-current-head {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px 3px;\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-current-head i {\n font-size: 10px;\n}\n\n.mj-fk-current-row {\n position: relative;\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 6px 12px 10px;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n/* Accent bar on the left for a bit of sizzle. */\n.mj-fk-current-row::before {\n content: '';\n position: absolute;\n left: 0;\n top: 4px;\n bottom: 8px;\n width: 3px;\n border-radius: 0 2px 2px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-fk-current-row:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-fk-current-icon {\n flex-shrink: 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-current-name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-detail {\n font-size: 13px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-clear {\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-current-clear:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-status-error);\n}\n\n@keyframes mj-dropdown-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes mj-dropdown-in-above {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* ============================================\n SEARCH HIGHLIGHTING\n ============================================ */\n.mj-forms-field-label ::ng-deep .mj-forms-search-highlight {\n /* Shared search-highlight theme token. ::ng-deep (not :global) so it reaches\n innerHTML content. */\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n/* ============================================\n VALIDATION ERROR STATE\n ============================================ */\n.mj-forms-field--has-error .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error .mj-forms-field-input:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error .mj-forms-field-input--textarea {\n border-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error .mj-forms-field-input--textarea:focus {\n border-color: var(--mj-status-error);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n.mj-forms-field--has-error .mj-custom-select-trigger {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error .mj-fk-search .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n/* ============================================\n VALIDATION WARNING STATE\n ============================================ */\n.mj-forms-field--has-warning .mj-forms-field-input {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning .mj-forms-field-input:focus {\n background: color-mix(in srgb, var(--mj-status-warning) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning .mj-forms-field-input--textarea {\n border-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning .mj-forms-field-input--textarea:focus {\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n}\n\n.mj-forms-field--has-warning .mj-custom-select-trigger {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning .mj-fk-search .mj-forms-field-input {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n/* ============================================\n VALIDATION MESSAGE AREA\n ============================================ */\n.mj-forms-field-validation {\n grid-column: 2;\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: -2px;\n overflow: hidden;\n animation: mj-validation-slide-in 200ms ease-out;\n}\n\n.mj-forms-field-validation-item {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n font-size: 12px;\n line-height: 1.4;\n padding: 3px 0 1px;\n}\n\n.mj-forms-field-validation-item i {\n font-size: 11px;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n/* Error message colors */\n.mj-forms-field-validation--error .mj-forms-field-validation-item {\n color: var(--mj-status-error);\n}\n\n.mj-forms-field-validation--error .mj-forms-field-validation-item i {\n color: var(--mj-status-error);\n}\n\n/* Warning message colors */\n.mj-forms-field-validation--warning .mj-forms-field-validation-item {\n color: var(--mj-status-warning-text);\n}\n\n.mj-forms-field-validation--warning .mj-forms-field-validation-item i {\n color: var(--mj-status-warning);\n}\n\n@keyframes mj-validation-slide-in {\n from {\n opacity: 0;\n max-height: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n max-height: 100px;\n transform: translateY(0);\n }\n}\n\n/* ============================================\n RESPONSIVE\n ============================================ */\n@media (max-width: 640px) {\n .mj-forms-field {\n grid-template-columns: 1fr;\n gap: 4px;\n }\n\n .mj-forms-field-label {\n font-size: 12px;\n }\n\n .mj-forms-field-validation {\n grid-column: 1;\n }\n}\n"] }]
3164
+ args: [{ standalone: false, selector: 'mj-form-field', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n IsFieldReadableByUser is FIRST deliberately. BaseEntity.Get() throws for a field the user\n cannot read, so every expression below \u2014 Value, ShouldHideField, the FK resolution \u2014 is only\n safe once this has short-circuited. A denied field renders nothing at all.\n-->\n@if (IsFieldReadableByUser && Record && (Record.IsSaved || !IsFieldReadOnly)) {\n <!-- READ-ONLY MODE -->\n @if ((!EditMode || IsFieldReadOnly) && !ShouldHideField) {\n <div class=\"mj-forms-field\" [class.mj-forms-field--readonly]=\"EditMode && IsFieldReadOnly\" [class.mj-forms-field--dirty]=\"IsDirty\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- FK fields with a mapped name field: show the name as a hyperlink -->\n @if (IsFKWithNameField) {\n <span class=\"mj-forms-field-value\">\n @if (RecordLinksEnabled) {\n <a class=\"mj-forms-field-link mj-forms-field-link--fk\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FKDisplayName }}\n </a>\n } @else {\n {{ FKDisplayName }}\n }\n </span>\n }\n @else if (ExtendedDisplay === 'image') {\n <div class=\"mj-forms-image\">\n @if (ImagePreviewSrc) {\n <img class=\"mj-forms-image-preview\" [src]=\"ImagePreviewSrc\" alt=\"\" />\n }\n @if (IsInlineImageValue) {\n <span class=\"mj-forms-image-meta\">Inline image ({{ ImageValueSizeLabel }})</span>\n } @else if (ImagePreviewSrc) {\n <a class=\"mj-forms-field-link\" (click)=\"OnUrlLinkClick($event)\" title=\"Open image\">\n {{ ImageUrlDisplay }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n } @else {\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n }\n </div>\n }\n @else if (ExtendedDisplay === 'color') {\n <div class=\"mj-forms-color\">\n <span class=\"mj-forms-color-swatch\" [style.background-color]=\"ColorSwatchValue\"></span>\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n </div>\n }\n @else if (ExtendedDisplay === 'json') {\n <pre class=\"mj-forms-json\">{{ JsonDisplayValue }}</pre>\n }\n @else {\n @switch (LinkType) {\n @case ('Email') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnEmailLinkClick($event)\" title=\"Send email\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-envelope mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('URL') {\n <span class=\"mj-forms-field-value\">\n <a class=\"mj-forms-field-link\" (click)=\"OnUrlLinkClick($event)\" title=\"Open link\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n </span>\n }\n @case ('Record') {\n <span class=\"mj-forms-field-value\">\n @if (RecordLinksEnabled) {\n <a class=\"mj-forms-field-link\" (click)=\"OnRecordLinkClick($event)\" title=\"View related record\">\n {{ FormatValue() }}\n <i class=\"fa-solid fa-arrow-up-right-from-square mj-forms-field-link-icon\"></i>\n </a>\n } @else {\n {{ FormatValue() }}\n }\n </span>\n }\n @default {\n @if (Type === 'checkbox') {\n <span class=\"mj-forms-field-value\">\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\" [checked]=\"!!Value\" disabled>\n </div>\n </span>\n }\n @else if (RichTextMode === 'markdown') {\n <div class=\"mj-forms-field-value mj-forms-field-value--rich\">\n <mj-markdown [data]=\"FormatValue()\"></mj-markdown>\n </div>\n }\n @else if (RichTextMode === 'html') {\n <!-- XSS: the mjSafeRichHtml pipe sanitizes with DOMPurify (HTML + SVG profiles)\n and then bypasses Angular's redundant re-sanitize. DOMPurify strips <script>,\n on* handlers, javascript:/data: URLs and <foreignObject> while KEEPING safe\n inline SVG + styles \u2014 richer than Angular's built-in sanitizer, still safe for\n untrusted content. -->\n <div class=\"mj-forms-field-value mj-forms-field-value--rich\" [innerHTML]=\"FormatValue() | mjSafeRichHtml\"></div>\n }\n @else if (RichTextMode === 'code') {\n <div class=\"mj-forms-field-value mj-forms-field-value--code\">\n <mj-code-editor [value]=\"FormatValue()\" [language]=\"CodeEditorLanguage\" [readonly]=\"true\"></mj-code-editor>\n </div>\n }\n @else if (IsLongText) {\n <span class=\"mj-forms-field-value mj-forms-field-value--long\">{{ FormatValue() }}</span>\n }\n @else {\n <span class=\"mj-forms-field-value\">{{ FormatValue() }}</span>\n }\n }\n }\n }\n </div>\n </div>\n }\n\n <!-- EDIT MODE -->\n @if (EditMode && !IsFieldReadOnly) {\n <div class=\"mj-forms-field mj-forms-field--editing\" [class.mj-forms-field--dirty]=\"IsDirty\" [class.mj-forms-field--required-empty]=\"IsRequiredEmpty\" [class.mj-forms-field--has-error]=\"ShowErrors\" [class.mj-forms-field--has-warning]=\"ShowWarnings || StoredDateIsUnreadable\">\n @if (ShowLabel) {\n <label class=\"mj-forms-field-label\" [innerHTML]=\"HighlightedDisplayName\"></label>\n }\n <div class=\"mj-forms-field-control\">\n <!-- Foreign Key fields get custom search autocomplete -->\n @if (HasRelatedEntity) {\n <div class=\"mj-fk-search\"\n [class.mj-fk-search--matched]=\"FKHasLinkedValue\"\n [class.mj-fk-search--scoped]=\"FKFocused && FKSearchableFields.length > 1\">\n @if (FKHasLinkedValue && !(FKFocused && FKSearchableFields.length > 1)) {\n <i class=\"fa-solid fa-link mj-fk-link-icon\" title=\"Linked record\"></i>\n }\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [class.mj-forms-field-input--linked]=\"FKHasLinkedValue\"\n [value]=\"FKSearchText\"\n (input)=\"OnFKInput($event)\"\n (focus)=\"OnFKFocus($event)\"\n (blur)=\"OnFKBlur()\"\n (keydown)=\"OnFKKeydown($event)\"\n placeholder=\"Search...\">\n\n <!-- Scope pill: only while focused, only when there's more than one searchable field.\n The menu itself lives INSIDE the results dropdown (below) so it overlays the\n list and rides the same above/below flip. -->\n @if (FKFocused && FKSearchableFields.length > 1) {\n <button class=\"mj-fk-scope-pill\"\n [class.mj-fk-scope-pill--open]=\"FKShowScopeMenu\"\n (mousedown)=\"OnFKScopeToggle($event)\"\n [title]=\"'Searching ' + FKSearchFieldLabel + ' \u2014 click to change'\">\n <i class=\"fa-solid fa-magnifying-glass mj-fk-scope-pill-icon\"></i>\n <span class=\"mj-fk-scope-pill-label\">{{ FKSearchFieldLabel }}</span>\n <i class=\"fa-solid mj-fk-scope-pill-caret\" [class.fa-chevron-up]=\"FKShowScopeMenu\" [class.fa-chevron-down]=\"!FKShowScopeMenu\"></i>\n </button>\n }\n\n @if (FKSearchText) {\n <button class=\"mj-fk-clear\" (mousedown)=\"OnFKClearClick($event)\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n } @else {\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n }\n @if (ShowFKDropdown) {\n <div class=\"mj-fk-dropdown mj-fk-dropdown--multi\"\n [ngStyle]=\"DropdownPositionStyle\"\n [class.mj-fk-dropdown--above]=\"OpenAbove\"\n [class.mj-fk-dropdown--scope-open]=\"FKShowScopeMenu\">\n\n <!-- Scope (search-field) picker + column toggles \u2014 overlays the list, anchored to the pill edge.\n Click a row to SEARCH that field; click the eye to SHOW/HIDE it as a column. -->\n @if (FKShowScopeMenu) {\n <div class=\"mj-fk-scope-menu\" [class.mj-fk-scope-menu--bottom]=\"OpenAbove\">\n <div class=\"mj-fk-scope-grp\">Columns shown</div>\n @for (f of FKSearchableFields; track f.FieldName) {\n @if (f.Group === 'shown') {\n <ng-container *ngTemplateOutlet=\"scopeRow; context: { $implicit: f }\"></ng-container>\n }\n }\n @if (FKHasOtherSearchableFields) {\n <div class=\"mj-fk-scope-divider\"></div>\n <div class=\"mj-fk-scope-grp\">Other fields</div>\n @for (f of FKSearchableFields; track f.FieldName) {\n @if (f.Group === 'other') {\n <ng-container *ngTemplateOutlet=\"scopeRow; context: { $implicit: f }\"></ng-container>\n }\n }\n }\n </div>\n }\n\n <!-- Shared scope-menu row, fixed-slot layout for clean alignment:\n [reorder \u25B2\u25BC \u2014 hover-reveal] [icon] [label] [eye].\n Click the row = search this field; the active search row is shown bold+accent. -->\n <ng-template #scopeRow let-f>\n <div class=\"mj-fk-scope-mi\"\n [class.mj-fk-scope-mi--on]=\"IsFKScopeActive(f)\"\n (mousedown)=\"OnFKScopeSelect($event, f)\">\n <span class=\"mj-fk-col-reorder\">\n @if (f.Group === 'shown') {\n <button type=\"button\" class=\"mj-fk-col-move mj-fk-col-move--up\" [disabled]=\"!CanMoveFKColumnUp(f.FieldName)\"\n (mousedown)=\"MoveFKColumn($event, f.FieldName, -1)\" title=\"Move column up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button type=\"button\" class=\"mj-fk-col-move mj-fk-col-move--down\" [disabled]=\"!CanMoveFKColumnDown(f.FieldName)\"\n (mousedown)=\"MoveFKColumn($event, f.FieldName, 1)\" title=\"Move column down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n }\n </span>\n <i [class]=\"f.Icon + ' mj-fk-scope-mi-icon'\"></i>\n <span class=\"mj-fk-scope-mi-label\">{{ f.Label }}</span>\n <span class=\"mj-fk-col-eye-slot\">\n @if (CanToggleFKColumn(f)) {\n <button type=\"button\" class=\"mj-fk-col-toggle\"\n [class.mj-fk-col-toggle--on]=\"IsFKColumnVisible(f)\"\n (mousedown)=\"OnFKColumnToggle($event, f)\"\n [title]=\"IsFKColumnVisible(f) ? 'Hide this column' : 'Show as a column'\">\n <i class=\"fa-solid\" [class.fa-eye]=\"IsFKColumnVisible(f)\" [class.fa-eye-slash]=\"!IsFKColumnVisible(f)\"></i>\n </button>\n }\n </span>\n </div>\n </ng-template>\n\n <!-- Pinned \"currently selected\" \u2014 sticky at the top while browsing, so you can\n keep it or pick another without clearing first. -->\n @if (FKSelectedSuggestion && !FKLoading) {\n <div class=\"mj-fk-current\">\n <div class=\"mj-fk-current-head\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>Currently selected</span>\n </div>\n <div class=\"mj-fk-current-row\" (mousedown)=\"OnFKSelectItem(FKSelectedSuggestion, $event)\" title=\"Keep this selection\">\n @if (FKSelectedSuggestion.Icon) { <i class=\"mj-fk-current-icon\" [class]=\"FKSelectedSuggestion.Icon\"></i> }\n <span class=\"mj-fk-current-name\" [innerHTML]=\"FKSelectedSuggestion.HighlightedName\"></span>\n @if (FKSelectedSuggestion.ExtraColumns.length && FKSelectedSuggestion.ExtraColumns[0].Value) {\n <span class=\"mj-fk-current-detail\">{{ FKSelectedSuggestion.ExtraColumns[0].Value }}</span>\n }\n <button type=\"button\" class=\"mj-fk-current-clear\" (mousedown)=\"OnFKClearClick($event)\" title=\"Clear selection\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n }\n\n @if (FKLoading) {\n <div class=\"mj-fk-status\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span>Searching\u2026</span>\n </div>\n }\n @if (!FKLoading && FKNoMatches) {\n <div class=\"mj-fk-status mj-fk-status--empty\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No matches</span>\n </div>\n }\n @if (!FKLoading && FKSuggestions.length > 0) {\n <div class=\"mj-fk-options\">\n <div class=\"mj-fk-grid\" [style.grid-template-columns]=\"FKGridTemplateColumns\">\n <!-- Header row: click to sort, drag the right edge to resize.\n (Column reorder lives in the field-selector menu, not here.) -->\n <div class=\"mj-fk-grid-row mj-fk-grid-row--header\">\n @if (FKHasIconColumn) {\n <div class=\"mj-fk-hcell mj-fk-hcell--icon\"></div>\n }\n @for (col of FKColumnFields; track col; let i = $index) {\n <div class=\"mj-fk-hcell\"\n (mousedown)=\"OnFKHeaderSort($event, col)\"\n [title]=\"'Click to sort by ' + FKColumnHeaders[i]\">\n <span class=\"mj-fk-hcell-label\">{{ FKColumnHeaders[i] }}</span>\n <i [class]=\"FKSortIcon(col)\"></i>\n <span class=\"mj-fk-resizer\" (mousedown)=\"OnFKColResizeStart($event, col)\" title=\"Drag to resize\"></span>\n </div>\n }\n </div>\n <!-- Data rows -->\n @for (suggestion of FKSuggestions; track suggestion.PrimaryKeyValue; let i = $index) {\n <div class=\"mj-fk-grid-row\"\n [class.mj-fk-grid-row--active]=\"i === FKActiveIndex\"\n [class.mj-fk-grid-row--selected]=\"IsFKRowSelected(suggestion)\"\n (mousedown)=\"OnFKSelectItem(suggestion, $event)\"\n (mouseenter)=\"FKActiveIndex = i\">\n @if (FKHasIconColumn) {\n <div class=\"mj-fk-cell mj-fk-cell--icon\">\n @if (suggestion.Icon) { <i [class]=\"suggestion.Icon\"></i> }\n </div>\n }\n @for (col of FKColumnFields; track col; let last = $last) {\n @if (col === FKNameField) {\n <div class=\"mj-fk-cell mj-fk-cell--name\" [class.mj-fk-cell--fill]=\"FKColumnFillsTrack(col, last)\">\n @if (IsFKRowSelected(suggestion)) {\n <i class=\"fa-solid fa-check mj-fk-selected-check\" title=\"Currently selected\"></i>\n }\n <span [innerHTML]=\"suggestion.HighlightedName\"></span>\n </div>\n } @else {\n <div class=\"mj-fk-cell\" [class.mj-fk-cell--fill]=\"FKColumnFillsTrack(col, last)\" [title]=\"FKCellFor(suggestion, col)?.Value || ''\">\n <span [innerHTML]=\"FKCellFor(suggestion, col)?.HighlightedValue || ''\"></span>\n </div>\n }\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Sticky \"create new\" footer \u2014 always visible at the bottom (no scrolling),\n prefilled with the typed text. Gated on create permission. -->\n @if (CanCreateFK) {\n <button type=\"button\" class=\"mj-fk-create-footer\" (mousedown)=\"OnFKCreateNew($event)\" [title]=\"FKCreateLabel\">\n <i class=\"fa-solid fa-plus mj-fk-create-icon\"></i>\n <span class=\"mj-fk-create-label\">{{ FKCreateLabel }}</span>\n </button>\n }\n </div>\n }\n </div>\n }\n @else if (ExtendedDisplay === 'image') {\n <div class=\"mj-forms-image mj-forms-image--edit\">\n @if (ImagePreviewSrc) {\n <img class=\"mj-forms-image-preview\" [src]=\"ImagePreviewSrc\" alt=\"\" />\n } @else {\n <div class=\"mj-forms-image-preview mj-forms-image-preview--empty\" aria-hidden=\"true\">\n <i class=\"fa-regular fa-image\"></i>\n </div>\n }\n <div class=\"mj-forms-image-meta\">\n @if (IsInlineImageValue) {\n <span>Inline image ({{ ImageValueSizeLabel }})</span>\n }\n <span class=\"mj-forms-image-hint\">Max {{ ImageMaxSizeLabel }}</span>\n </div>\n <div class=\"mj-forms-image-actions\">\n <input #imageFileInput type=\"file\" accept=\"image/png,image/jpeg,image/gif,image/webp,image/svg+xml\"\n class=\"mj-forms-image-file\" (change)=\"OnImageFileSelected($event)\">\n <button type=\"button\" class=\"mj-forms-image-btn\" (click)=\"imageFileInput.click()\">\n <i class=\"fa-solid fa-upload\"></i>\n {{ ImagePreviewSrc ? 'Replace' : 'Upload' }}\n </button>\n @if (ImagePreviewSrc) {\n <button type=\"button\" class=\"mj-forms-image-btn mj-forms-image-btn--ghost\" (click)=\"OnImageClear()\">Clear</button>\n }\n </div>\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"ImageUrlInputValue\"\n (input)=\"OnImageUrlInput($event)\"\n placeholder=\"https://\u2026 or paste a data URI\">\n </div>\n }\n @else if (ExtendedDisplay === 'color') {\n <div class=\"mj-forms-color mj-forms-color--edit\">\n <input type=\"color\"\n class=\"mj-forms-color-picker\"\n [value]=\"ColorPickerValue\"\n (input)=\"OnColorPickerInput($event)\"\n [attr.aria-label]=\"DisplayName + ' color'\">\n <input type=\"text\"\n class=\"mj-forms-field-input mj-forms-color-hex\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"\n placeholder=\"#RRGGBB\">\n </div>\n }\n @else if (ExtendedDisplay === 'json') {\n <textarea\n class=\"mj-forms-field-input mj-forms-field-input--textarea mj-forms-json\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"\n (blur)=\"OnJsonBlur()\"></textarea>\n }\n @else if (EditRichTextMode !== 'plain') {\n <!-- Markdown / HTML / Code long-text: edit raw with a syntax-highlighted code editor -->\n <mj-code-editor\n class=\"mj-forms-field-input--code\"\n [value]=\"FormatValue()\"\n [language]=\"CodeEditorLanguage\"\n (change)=\"OnCodeEditorChange($event)\"></mj-code-editor>\n }\n @else {\n @switch (Type) {\n @case ('textbox') {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\">\n }\n @case ('textarea') {\n <textarea\n class=\"mj-forms-field-input mj-forms-field-input--textarea\"\n [value]=\"FormatValue()\"\n (input)=\"OnInputChange($event)\"></textarea>\n }\n @case ('number') {\n <input type=\"number\"\n class=\"mj-forms-field-input mj-forms-field-input--number\"\n [value]=\"Value\"\n (change)=\"OnNumberChange($event)\">\n }\n @case ('datepicker') {\n <input type=\"date\"\n class=\"mj-forms-field-input mj-forms-field-input--date\"\n [value]=\"DateInputValue\"\n (change)=\"OnDateChange($event)\">\n }\n @case ('checkbox') {\n <div class=\"mj-forms-field-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"!!Value\"\n (change)=\"OnCheckboxChange($event)\">\n </div>\n }\n @case ('select') {\n <div class=\"mj-custom-select-trigger\"\n tabindex=\"0\"\n (click)=\"OnSelectTriggerClick($event)\"\n (blur)=\"OnSelectTriggerBlur()\">\n <span class=\"mj-custom-select-value\" [class.mj-custom-select-value--placeholder]=\"!FormatValue()\">\n {{ FormatValue() || '-- Select --' }}\n </span>\n <i class=\"fa-solid fa-chevron-down mj-custom-select-chevron\" [class.mj-custom-select-chevron--open]=\"ShowSelectDropdown\"></i>\n </div>\n @if (ShowSelectDropdown && PossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of PossibleValues; track option) {\n <div class=\"mj-fk-option\" [class.mj-fk-option--selected]=\"FormatValue() === option\" (mousedown)=\"OnSelectOptionClick(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n }\n @case ('autocomplete') {\n <div class=\"mj-fk-search\">\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (input)=\"OnValueListInput($event)\"\n (focus)=\"OnValueListFocus($event)\"\n (blur)=\"OnValueListBlur()\"\n placeholder=\"Type to search...\">\n <i class=\"fa-solid fa-magnifying-glass mj-fk-search-icon\"></i>\n @if (ShowValueListDropdown && FilteredPossibleValues.length > 0) {\n <div class=\"mj-fk-dropdown\" [ngStyle]=\"DropdownPositionStyle\" [class.mj-fk-dropdown--above]=\"OpenAbove\">\n @for (option of FilteredPossibleValues; track option) {\n <div class=\"mj-fk-option\" (mousedown)=\"OnValueListSelect(option, $event)\">\n {{ option }}\n </div>\n }\n </div>\n }\n </div>\n }\n @default {\n <input type=\"text\"\n class=\"mj-forms-field-input\"\n [value]=\"FormatValue()\"\n (change)=\"OnInputChange($event)\">\n }\n }\n }\n </div>\n <!-- Inline validation messages -->\n @if (DisplayErrors.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--error\">\n @for (error of DisplayErrors; track error.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-circle-exclamation\"></i>\n <span>{{ error.Message }}</span>\n </div>\n }\n </div>\n }\n @if (DisplayWarnings.length > 0) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--warning\">\n @for (warning of DisplayWarnings; track warning.Message) {\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ warning.Message }}</span>\n </div>\n }\n </div>\n }\n <!--\n An unreadable stored value renders as an EMPTY date box, identical to a field that\n was never set - and the next save writes that emptiness over whatever is stored. The\n element cannot display the bad value itself, so the warning sits with the other validation messages, beneath the control.\n -->\n @if (StoredDateIsUnreadable) {\n <div class=\"mj-forms-field-validation mj-forms-field-validation--warning\">\n <div class=\"mj-forms-field-validation-item\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>This field holds a value that is not a readable date, so the box above is\n empty. Saving now will replace it.</span>\n </div>\n </div>\n }\n </div>\n }\n}\n", styles: ["/* ============================================\n FORM FIELD - Shared styles for read and edit\n ============================================ */\n:host {\n --mj-forms-field-label-width: 200px;\n --mj-forms-field-gap: 12px;\n\n display: contents;\n}\n\n.mj-forms-field {\n display: grid;\n grid-template-columns: var(--mj-forms-field-label-width) 1fr;\n gap: var(--mj-forms-field-gap);\n align-items: baseline;\n padding: 8px 0;\n transition: all var(--mj-transition-base) ease;\n}\n\n/* Subtle row hover in edit mode */\n.mj-forms-field--editing:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 6px;\n margin: 0 -8px;\n padding: 8px 8px;\n}\n\n/* ============================================\n LABEL\n ============================================ */\n.mj-forms-field-label {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n padding-top: 2px;\n word-break: break-word;\n}\n\n/* ============================================\n FIELD CONTROL WRAPPER (value + dirty dot)\n ============================================ */\n.mj-forms-field-control {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n.mj-forms-field-control > * {\n flex: 1;\n min-width: 0;\n}\n\n/* ============================================\n DIRTY INDICATOR (solid amber dot after label)\n ============================================ */\n.mj-forms-field--dirty .mj-forms-field-label::after {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--mj-status-warning);\n margin-left: 6px;\n vertical-align: middle;\n}\n\n/* ============================================\n REQUIRED FIELD - red underline when empty\n ============================================ */\n.mj-forms-field--required-empty .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty .mj-forms-field-input:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty .mj-custom-select-trigger {\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--required-empty .mj-fk-search .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n}\n\n/* ============================================\n READ-ONLY VALUE\n ============================================ */\n.mj-forms-field-value {\n font-size: 14px;\n color: var(--mj-text-primary);\n min-height: 24px;\n display: flex;\n align-items: center;\n overflow-wrap: break-word;\n word-break: break-word;\n}\n\n.mj-forms-field-value--long {\n white-space: pre-line;\n max-height: 300px;\n overflow: auto;\n}\n\n/* Rich (markdown / html) read-only rendering \u2014 let content flow as a block, not a flex row */\n.mj-forms-field-value--rich {\n display: block;\n align-items: initial;\n max-height: 480px;\n overflow: auto;\n width: 100%;\n}\n\n/* Code read-only / edit rendering \u2014 the embedded code editor needs an explicit height */\n.mj-forms-field-value--code {\n display: block;\n align-items: initial;\n width: 100%;\n}\n\n.mj-forms-field-value--code mj-code-editor,\n.mj-forms-field-input--code {\n display: block;\n width: 100%;\n min-height: 160px;\n max-height: 480px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius, 4px);\n overflow: auto;\n}\n\n/* Read-only fields in edit mode */\n.mj-forms-field--readonly {\n opacity: 0.7;\n}\n\n.mj-forms-field--readonly .mj-forms-field-value {\n color: var(--mj-text-secondary);\n}\n\n/* ============================================\n LINKS (FK, email, URL)\n ============================================ */\n.mj-forms-field-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--mj-brand-primary);\n cursor: pointer;\n font-weight: 400;\n font-size: 14px;\n transition: color var(--mj-transition-base);\n text-decoration: none;\n}\n\n.mj-forms-field-link:hover {\n color: var(--mj-brand-primary-hover);\n}\n\n.mj-forms-field-link-icon {\n font-size: 11px;\n opacity: 0;\n transition: opacity var(--mj-transition-base);\n}\n\n.mj-forms-field-link:hover .mj-forms-field-link-icon {\n opacity: 1;\n}\n\n/* FK fields showing entity name instead of raw ID */\n.mj-forms-field-link--fk {\n font-size: 14px;\n font-weight: 400;\n}\n\n/* ============================================\n EDIT MODE INPUTS - Clean underline style\n ============================================ */\n.mj-forms-field-input {\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-forms-field-input:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-forms-field-input::placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n/* Textarea variant */\n.mj-forms-field-input--textarea {\n resize: vertical;\n min-height: 60px;\n border: 1.5px solid var(--mj-border-default);\n border-radius: 6px;\n padding: 8px 10px;\n background: var(--mj-bg-surface);\n font-family: inherit;\n}\n\n.mj-forms-field-input--textarea:focus {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n background: var(--mj-bg-surface);\n padding: 8px 10px;\n border-radius: 6px;\n}\n\n/* Number input - narrower */\n.mj-forms-field-input--number {\n max-width: 200px;\n}\n\n/* Date input - narrower */\n.mj-forms-field-input--date {\n max-width: 220px;\n}\n\n/* ============================================\n CHECKBOX (custom styled)\n ============================================ */\n.mj-forms-field-checkbox {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"] {\n appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n position: relative;\n transition: all var(--mj-transition-base) ease;\n flex-shrink: 0;\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"]:checked {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"]:checked::after {\n content: '';\n position: absolute;\n left: 5px;\n top: 1px;\n width: 5px;\n height: 9px;\n border: solid var(--mj-text-inverse);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n}\n\n.mj-forms-field-checkbox input[type=\"checkbox\"]:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n/* ============================================\n CUSTOM SELECT DROPDOWN (replaces native <select>)\n ============================================ */\n.mj-custom-select-trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 14px;\n font-family: inherit;\n color: var(--mj-text-primary);\n background: transparent;\n border: none;\n border-bottom: 1.5px solid var(--mj-border-default);\n padding: 4px 0;\n width: 100%;\n cursor: pointer;\n outline: none;\n transition: border-color var(--mj-transition-base) ease,\n background var(--mj-transition-base) ease;\n}\n\n.mj-custom-select-trigger:focus {\n border-bottom-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border-radius: 4px 4px 0 0;\n padding: 4px 6px;\n}\n\n.mj-custom-select-value {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.mj-custom-select-value--placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.mj-custom-select-chevron {\n font-size: 11px;\n color: var(--mj-text-muted);\n transition: transform var(--mj-transition-base) ease;\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n.mj-custom-select-chevron--open {\n transform: rotate(180deg);\n}\n\n/* ============================================\n FK SEARCH (custom autocomplete)\n ============================================ */\n.mj-fk-search {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n}\n\n.mj-fk-search .mj-forms-field-input {\n padding-right: 28px;\n}\n\n.mj-fk-search-icon {\n position: absolute;\n right: 4px;\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n\n.mj-fk-clear {\n position: absolute;\n right: 2px;\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 11px;\n padding: 4px 6px;\n line-height: 1;\n border-radius: 3px;\n transition: all var(--mj-transition-base);\n}\n\n.mj-fk-clear:hover {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n/* Linked state: solid accent underline + a leading chain icon, so it's obvious the\n field holds a resolved record reference rather than free-typed text. */\n.mj-fk-search--matched .mj-forms-field-input {\n border-bottom: 2px solid var(--mj-brand-primary);\n}\n\n/* Linked indicator sits on the RIGHT (just left of the clear button) so it never\n interrupts left-to-right reading of the value or overlaps the text. */\n.mj-fk-link-icon {\n position: absolute;\n right: 26px;\n color: var(--mj-brand-primary);\n font-size: 10px;\n pointer-events: none;\n z-index: 1;\n}\n\n/* Make room on the right for the link icon + the clear button. */\n.mj-forms-field-input--linked {\n padding-right: 46px;\n}\n\n/* ============================================\n SCOPE PILL + FIELD-PICKER MENU (search-field scope)\n ============================================ */\n/* When the pill is showing, reserve room on the right of the input for it. */\n.mj-fk-search--scoped .mj-forms-field-input {\n padding-right: 150px;\n}\n\n.mj-fk-scope-pill {\n position: absolute;\n right: 30px;\n /* Vertically centered in the input so it clears the focus underline below. */\n top: 50%;\n transform: translateY(-50%);\n display: inline-flex;\n align-items: center;\n gap: 5px;\n max-width: 120px;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n color: var(--mj-text-secondary);\n font-size: 10.5px;\n font-weight: 600;\n font-family: inherit;\n /* Kept short so it clears the input's focus underline without making the row taller. */\n padding: 1px 7px;\n border-radius: 999px;\n cursor: pointer;\n white-space: nowrap;\n line-height: 1.35;\n transition: background var(--mj-transition-base), border-color var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-pill:hover,\n.mj-fk-scope-pill--open {\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-primary);\n}\n\n.mj-fk-scope-pill-icon {\n font-size: 9px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-pill-label {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-scope-pill-caret {\n font-size: 8px;\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n/* The menu is rendered INSIDE the results dropdown panel so it overlays the list\n (correct z-order, no extra real estate) and rides the dropdown's above/below\n flip. Anchored to the dropdown's top-right \u2014 right under the pill. */\n.mj-fk-scope-menu {\n position: absolute;\n top: 4px;\n right: 8px;\n z-index: 5;\n min-width: 180px;\n max-width: calc(100vw - 24px);\n max-height: 260px;\n overflow-y: auto;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-sm);\n box-shadow: var(--mj-shadow-lg);\n padding: 5px;\n animation: mj-dropdown-in 120ms ease;\n}\n\n/* When the dropdown opens ABOVE the input, anchor the menu to its bottom edge so it\n stays next to the pill (which is at the input/dropdown boundary). */\n.mj-fk-scope-menu--bottom {\n top: auto;\n bottom: 4px;\n}\n\n.mj-fk-scope-grp {\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n padding: 7px 10px 4px;\n font-weight: 700;\n}\n\n.mj-fk-scope-mi {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 7px 10px;\n font-size: 13px;\n border-radius: 5px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n}\n\n.mj-fk-scope-mi:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-scope-mi--on {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n/* Fixed-width LEFT slot: a compact stacked up/down reorder control that reveals on row\n hover. Reserved (same width) on every row so the field icons + labels stay aligned. */\n.mj-fk-col-reorder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 22px;\n flex-shrink: 0;\n}\n\n.mj-fk-col-move {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 10px;\n padding: 0;\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 8px;\n opacity: 0; /* hover-reveal for a clean resting state */\n transition: opacity var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-scope-mi:hover .mj-fk-col-move:not(:disabled) {\n opacity: 0.8;\n}\n\n.mj-fk-col-move:hover:not(:disabled) {\n opacity: 1;\n color: var(--mj-brand-primary);\n}\n\n/* End-of-range arrows stay hidden (slot still reserved) rather than greyed. */\n.mj-fk-col-move:disabled {\n opacity: 0 !important;\n cursor: default;\n}\n\n.mj-fk-scope-mi-icon {\n width: 14px;\n font-size: 11px;\n opacity: 0.75;\n flex-shrink: 0;\n}\n\n.mj-fk-scope-mi-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Fixed-width RIGHT slot so the eye (or its empty space, for the name row) aligns. */\n.mj-fk-col-eye-slot {\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Eye toggle: show/hide a field as a grid column (independent of search scope). */\n.mj-fk-col-toggle {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-col-toggle:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.mj-fk-col-toggle--on {\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-scope-divider {\n height: 1px;\n background: var(--mj-border-subtle);\n margin: 4px 6px;\n}\n\n/* Narrow / mobile screens: shrink the pill + its reserved space, give menu rows a\n larger touch target, and keep the menu within the viewport. */\n@media (max-width: 560px) {\n .mj-fk-search--scoped .mj-forms-field-input {\n padding-right: 116px;\n }\n .mj-fk-scope-pill {\n max-width: 88px;\n }\n .mj-fk-scope-menu {\n min-width: 160px;\n }\n .mj-fk-scope-mi {\n padding: 10px 10px;\n }\n}\n\n/* ============================================\n FLOATING DROPDOWN PANEL (position: fixed via ngStyle)\n ============================================ */\n.mj-fk-dropdown {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-lg);\n max-height: 240px;\n overflow-y: auto;\n padding: 4px;\n animation: mj-dropdown-in 150ms ease;\n}\n\n.mj-fk-dropdown--above {\n animation: mj-dropdown-in-above 150ms ease;\n}\n\n.mj-fk-option {\n padding: 10px 14px;\n font-size: 14px;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: background var(--mj-transition-base);\n border-radius: 6px;\n}\n\n.mj-fk-option:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n\n.mj-fk-option--selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-option--selected:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n/* ============================================\n MULTI-COLUMN FK DROPDOWN \u2014 aligned mini-grid (icon + name + extra cols)\n with sortable headers and horizontal scroll.\n ============================================ */\n.mj-fk-dropdown--multi {\n padding: 4px;\n /* The inner .mj-fk-options is the single scroll container (both axes) so the\n sticky header anchors correctly; the dropdown just clips to its rounded border. */\n overflow: hidden;\n max-height: none;\n}\n\n/* Single scroll region (both axes) for the grid: vertical for long lists, horizontal\n when many DefaultInView columns make rows wider than the dropdown. Being the sole\n scroller lets the sticky column headers anchor to its top edge. */\n.mj-fk-dropdown--multi .mj-fk-options {\n overflow: auto;\n max-height: 260px;\n}\n\n/* While the scope menu is open it must escape the panel's clip (the inner\n .mj-fk-options keeps its own scroll, so the grid still behaves). */\n.mj-fk-dropdown--scope-open {\n overflow: visible;\n}\n\n/* One CSS grid spans the header + all data rows so every column lines up.\n grid-template-columns is supplied inline from FKGridTemplateColumns.\n `width: 100%` (with `min-width: max-content`) lets the last column's `1fr` track\n absorb leftover width, while still overflowing \u2192 horizontal scroll when the columns\n are collectively wider than the dropdown. */\n.mj-fk-grid {\n display: grid;\n width: 100%;\n min-width: max-content;\n align-items: stretch;\n}\n\n/* Rows are layout-transparent so their cells become direct grid items (this is\n what makes columns align across rows). The row element still exists for click\n handling and for the active-state selector below. */\n.mj-fk-grid-row {\n display: contents;\n}\n\n/* Header cells: sticky to the top of the vertical scroll, clickable to sort. */\n.mj-fk-hcell {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n font-size: 12px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-elevated);\n border-bottom: 1px solid var(--mj-border-default);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n}\n\n.mj-fk-hcell:hover {\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-hcell--icon {\n cursor: default;\n padding: 7px 8px;\n}\n\n.mj-fk-hcell--icon:hover {\n background: var(--mj-bg-surface-elevated);\n}\n\n.mj-fk-hcell-label {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-sort-icon {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n/* Idle (unsorted) columns show a faded sort glyph to signal sortability. */\n.mj-fk-sort-icon--idle {\n opacity: 0.35;\n}\n\n/* Data cells */\n.mj-fk-cell {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 320px;\n cursor: pointer;\n}\n\n/* The fill column (last, or a user-resized one) drops the default content cap so its\n cells stretch to the full track width that the header already occupies. */\n.mj-fk-cell--fill {\n max-width: none;\n}\n\n/* Wrapping span keeps the highlighted text+<mark> as one inline run (so flex\n doesn't strip the space next to the mark) while still truncating with ellipsis. */\n.mj-fk-cell > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n\n.mj-fk-cell--icon {\n justify-content: center;\n padding: 8px;\n max-width: none;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.mj-fk-cell--name {\n font-weight: 500;\n font-size: 14px;\n color: var(--mj-text-primary);\n gap: 6px;\n}\n\n.mj-fk-selected-check {\n color: var(--mj-brand-primary);\n font-size: 11px;\n flex-shrink: 0;\n}\n\n/* Active (keyboard / hover) row \u2014 painted on the cells, since the row box is\n removed by display:contents. The child combinator still matches. */\n.mj-fk-grid-row--active > .mj-fk-cell {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n/* Currently-linked row \u2014 a subtle persistent tint so the user sees which record\n is selected when they reopen the list (stacks under the brighter active tint). */\n.mj-fk-grid-row--selected > .mj-fk-cell {\n background: color-mix(in srgb, var(--mj-brand-primary) 6%, transparent);\n}\n\n.mj-fk-grid-row--selected > .mj-fk-cell--name {\n font-weight: 600;\n color: var(--mj-brand-primary);\n}\n\n/* Matched-substring highlight inside the name column */\n/* ::ng-deep (not :global, which Angular's emulated encapsulation ignores) so the\n style reaches the <mark> injected via [innerHTML]. Color comes from the shared\n theme token so light/dark/white-label all control it centrally. */\n.mj-fk-cell--name ::ng-deep .mj-forms-search-highlight,\n.mj-fk-cell ::ng-deep .mj-forms-search-highlight {\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n/* Column resize handle \u2014 thin grab strip on the right edge of each header cell. */\n.mj-fk-resizer {\n position: absolute;\n top: 0;\n right: 0;\n width: 7px;\n height: 100%;\n cursor: col-resize;\n user-select: none;\n}\n\n.mj-fk-resizer::after {\n content: '';\n position: absolute;\n top: 20%;\n right: 2px;\n width: 2px;\n height: 60%;\n background: transparent;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-hcell:hover .mj-fk-resizer::after,\n.mj-fk-resizer:hover::after {\n background: var(--mj-border-strong);\n}\n\n/* Loading / empty status rows */\n.mj-fk-status {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-status i {\n font-size: 12px;\n}\n\n.mj-fk-status--empty {\n font-style: italic;\n}\n\n/* Sticky \"create new\" footer \u2014 sits below the (scrolling) options as a direct child of\n the dropdown panel, so it's always visible regardless of list length. */\n.mj-fk-create-footer {\n display: flex;\n align-items: center;\n gap: 9px;\n width: 100%;\n padding: 10px 14px;\n background: var(--mj-bg-surface-card);\n border: none;\n border-top: 1px solid var(--mj-border-default);\n color: var(--mj-brand-primary);\n font-size: 13px;\n font-weight: 600;\n font-family: inherit;\n text-align: left;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n.mj-fk-create-footer:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.mj-fk-create-icon {\n font-size: 11px;\n flex-shrink: 0;\n}\n\n.mj-fk-create-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* ============================================\n PINNED \"CURRENTLY SELECTED\" SECTION\n ============================================ */\n.mj-fk-current {\n border-bottom: 1px solid var(--mj-border-default);\n background: color-mix(in srgb, var(--mj-brand-primary) 7%, var(--mj-bg-surface-card));\n animation: mj-fk-current-in 220ms cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n@keyframes mj-fk-current-in {\n from { opacity: 0; transform: translateY(-6px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.mj-fk-current-head {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px 3px;\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-brand-primary);\n}\n\n.mj-fk-current-head i {\n font-size: 10px;\n}\n\n.mj-fk-current-row {\n position: relative;\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 6px 12px 10px;\n cursor: pointer;\n transition: background var(--mj-transition-base);\n}\n\n/* Accent bar on the left for a bit of sizzle. */\n.mj-fk-current-row::before {\n content: '';\n position: absolute;\n left: 0;\n top: 4px;\n bottom: 8px;\n width: 3px;\n border-radius: 0 2px 2px 0;\n background: var(--mj-brand-primary);\n}\n\n.mj-fk-current-row:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.mj-fk-current-icon {\n flex-shrink: 0;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n\n.mj-fk-current-name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-detail {\n font-size: 13px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.mj-fk-current-clear {\n margin-left: auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n flex-shrink: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--mj-text-muted);\n cursor: pointer;\n font-size: 12px;\n transition: background var(--mj-transition-base), color var(--mj-transition-base);\n}\n\n.mj-fk-current-clear:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-status-error);\n}\n\n@keyframes mj-dropdown-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes mj-dropdown-in-above {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* ============================================\n SEARCH HIGHLIGHTING\n ============================================ */\n.mj-forms-field-label ::ng-deep .mj-forms-search-highlight {\n /* Shared search-highlight theme token. ::ng-deep (not :global) so it reaches\n innerHTML content. */\n background-color: var(--mj-search-highlight-bg);\n color: var(--mj-search-highlight-text);\n border-radius: 2px;\n padding: 0 1px;\n font-weight: 600;\n}\n\n/* ============================================\n VALIDATION ERROR STATE\n ============================================ */\n.mj-forms-field--has-error .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error .mj-forms-field-input:focus {\n background: color-mix(in srgb, var(--mj-status-error) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error .mj-forms-field-input--textarea {\n border-color: var(--mj-status-error);\n}\n\n.mj-forms-field--has-error .mj-forms-field-input--textarea:focus {\n border-color: var(--mj-status-error);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-error) 8%, transparent);\n}\n\n.mj-forms-field--has-error .mj-custom-select-trigger {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-error .mj-fk-search .mj-forms-field-input {\n border-bottom-color: var(--mj-status-error);\n border-bottom-width: 2px;\n}\n\n/* ============================================\n VALIDATION WARNING STATE\n ============================================ */\n.mj-forms-field--has-warning .mj-forms-field-input {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning .mj-forms-field-input:focus {\n background: color-mix(in srgb, var(--mj-status-warning) 5%, var(--mj-bg-surface));\n border-bottom-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning .mj-forms-field-input--textarea {\n border-color: var(--mj-status-warning);\n}\n\n.mj-forms-field--has-warning .mj-forms-field-input--textarea:focus {\n border-color: var(--mj-status-warning);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n}\n\n.mj-forms-field--has-warning .mj-custom-select-trigger {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n.mj-forms-field--has-warning .mj-fk-search .mj-forms-field-input {\n border-bottom-color: var(--mj-status-warning);\n border-bottom-width: 2px;\n}\n\n/* ============================================\n VALIDATION MESSAGE AREA\n ============================================ */\n.mj-forms-field-validation {\n grid-column: 2;\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-top: -2px;\n overflow: hidden;\n animation: mj-validation-slide-in 200ms ease-out;\n}\n\n.mj-forms-field-validation-item {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n font-size: 12px;\n line-height: 1.4;\n padding: 3px 0 1px;\n}\n\n.mj-forms-field-validation-item i {\n font-size: 11px;\n margin-top: 2px;\n flex-shrink: 0;\n}\n\n/* Error message colors */\n.mj-forms-field-validation--error .mj-forms-field-validation-item {\n color: var(--mj-status-error);\n}\n\n.mj-forms-field-validation--error .mj-forms-field-validation-item i {\n color: var(--mj-status-error);\n}\n\n/* Warning message colors */\n.mj-forms-field-validation--warning .mj-forms-field-validation-item {\n color: var(--mj-status-warning-text);\n}\n\n.mj-forms-field-validation--warning .mj-forms-field-validation-item i {\n color: var(--mj-status-warning);\n}\n\n/* ============================================\n IMAGE / COLOR / JSON EXTENDED TYPES\n ============================================ */\n.mj-forms-image {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n min-width: 0;\n}\n\n.mj-forms-image-preview {\n width: 72px;\n height: 72px;\n object-fit: cover;\n object-position: center;\n border-radius: 8px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n display: block;\n}\n\n.mj-forms-image-preview--empty {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 22px;\n}\n\n.mj-forms-image-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.mj-forms-image-hint {\n color: var(--mj-text-muted);\n}\n\n.mj-forms-image-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-forms-image-file {\n display: none;\n}\n\n.mj-forms-image-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-family: inherit;\n font-weight: 600;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n border-radius: 6px;\n padding: 4px 10px;\n cursor: pointer;\n}\n\n.mj-forms-image-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n}\n\n.mj-forms-image-btn--ghost {\n color: var(--mj-text-secondary);\n background: transparent;\n border-color: var(--mj-border-default);\n font-weight: 500;\n}\n\n.mj-forms-image--edit .mj-forms-field-input {\n width: 100%;\n}\n\n.mj-forms-color {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n}\n\n.mj-forms-color-swatch {\n width: 20px;\n height: 20px;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.mj-forms-color-picker {\n width: 32px;\n height: 32px;\n padding: 0;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n cursor: pointer;\n flex: 0 0 auto;\n}\n\n.mj-forms-color-hex {\n max-width: 160px;\n}\n\n.mj-forms-json {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 12.5px;\n line-height: 1.45;\n white-space: pre-wrap;\n word-break: break-word;\n margin: 0;\n max-height: 360px;\n overflow: auto;\n width: 100%;\n}\n\n@keyframes mj-validation-slide-in {\n from {\n opacity: 0;\n max-height: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n max-height: 100px;\n transform: translateY(0);\n }\n}\n\n/* ============================================\n RESPONSIVE\n ============================================ */\n@media (max-width: 640px) {\n .mj-forms-field {\n grid-template-columns: 1fr;\n gap: 4px;\n }\n\n .mj-forms-field-label {\n font-size: 12px;\n }\n\n .mj-forms-field-validation {\n grid-column: 1;\n }\n}\n"] }]
2600
3165
  }], null, { Record: [{
2601
3166
  type: Input
2602
3167
  }], EditMode: [{