@memberjunction/ng-explorer-settings 5.43.0 → 5.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/__tests__/role-management-agent-context.test.d.ts +2 -0
  2. package/dist/__tests__/role-management-agent-context.test.d.ts.map +1 -0
  3. package/dist/__tests__/role-management-agent-context.test.js +107 -0
  4. package/dist/__tests__/role-management-agent-context.test.js.map +1 -0
  5. package/dist/__tests__/user-management-agent-context.test.d.ts +2 -0
  6. package/dist/__tests__/user-management-agent-context.test.d.ts.map +1 -0
  7. package/dist/__tests__/user-management-agent-context.test.js +134 -0
  8. package/dist/__tests__/user-management-agent-context.test.js.map +1 -0
  9. package/dist/lib/application-management/application-dialog/application-dialog.component.js +176 -200
  10. package/dist/lib/application-management/application-dialog/application-dialog.component.js.map +1 -1
  11. package/dist/lib/application-management/application-management.component.d.ts +7 -0
  12. package/dist/lib/application-management/application-management.component.d.ts.map +1 -1
  13. package/dist/lib/application-management/application-management.component.js +49 -39
  14. package/dist/lib/application-management/application-management.component.js.map +1 -1
  15. package/dist/lib/application-settings/application-settings.component.js +58 -70
  16. package/dist/lib/application-settings/application-settings.component.js.map +1 -1
  17. package/dist/lib/entity-permissions/entity-permissions.component.d.ts +10 -0
  18. package/dist/lib/entity-permissions/entity-permissions.component.d.ts.map +1 -1
  19. package/dist/lib/entity-permissions/entity-permissions.component.js +32 -16
  20. package/dist/lib/entity-permissions/entity-permissions.component.js.map +1 -1
  21. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js +32 -33
  22. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js.map +1 -1
  23. package/dist/lib/module.d.ts +1 -1
  24. package/dist/lib/module.d.ts.map +1 -1
  25. package/dist/lib/module.js +13 -4
  26. package/dist/lib/module.js.map +1 -1
  27. package/dist/lib/notification-preferences/notification-preferences.component.js +30 -35
  28. package/dist/lib/notification-preferences/notification-preferences.component.js.map +1 -1
  29. package/dist/lib/role-management/role-dialog/role-dialog.component.js +26 -46
  30. package/dist/lib/role-management/role-dialog/role-dialog.component.js.map +1 -1
  31. package/dist/lib/role-management/role-management-agent-context.d.ts +96 -0
  32. package/dist/lib/role-management/role-management-agent-context.d.ts.map +1 -0
  33. package/dist/lib/role-management/role-management-agent-context.js +85 -0
  34. package/dist/lib/role-management/role-management-agent-context.js.map +1 -0
  35. package/dist/lib/role-management/role-management.component.d.ts +32 -0
  36. package/dist/lib/role-management/role-management.component.d.ts.map +1 -1
  37. package/dist/lib/role-management/role-management.component.js +236 -41
  38. package/dist/lib/role-management/role-management.component.js.map +1 -1
  39. package/dist/lib/sql-logging/sql-logging.component.js +151 -184
  40. package/dist/lib/sql-logging/sql-logging.component.js.map +1 -1
  41. package/dist/lib/user-app-config/user-app-config.component.js +80 -93
  42. package/dist/lib/user-app-config/user-app-config.component.js.map +1 -1
  43. package/dist/lib/user-management/user-dialog/user-dialog.component.js +20 -21
  44. package/dist/lib/user-management/user-dialog/user-dialog.component.js.map +1 -1
  45. package/dist/lib/user-management/user-management-agent-context.d.ts +107 -0
  46. package/dist/lib/user-management/user-management-agent-context.d.ts.map +1 -0
  47. package/dist/lib/user-management/user-management-agent-context.js +132 -0
  48. package/dist/lib/user-management/user-management-agent-context.js.map +1 -0
  49. package/dist/lib/user-management/user-management.component.d.ts +35 -0
  50. package/dist/lib/user-management/user-management.component.d.ts.map +1 -1
  51. package/dist/lib/user-management/user-management.component.js +311 -71
  52. package/dist/lib/user-management/user-management.component.js.map +1 -1
  53. package/dist/lib/user-profile-settings/user-profile-settings.component.js +52 -70
  54. package/dist/lib/user-profile-settings/user-profile-settings.component.js.map +1 -1
  55. package/package.json +19 -19
@@ -13,92 +13,83 @@ const _c0 = () => ({ standalone: true });
13
13
  const _forTrack0 = ($index, $item) => $item.entity.ID;
14
14
  const _forTrack1 = ($index, $item) => $item.ID;
15
15
  function ApplicationDialogComponent_Conditional_0_Conditional_16_Template(rf, ctx) { if (rf & 1) {
16
- i0.ɵɵelementStart(0, "div", 14)(1, "div", 27);
17
- i0.ɵɵelement(2, "i", 28);
18
- i0.ɵɵelementStart(3, "div");
19
- i0.ɵɵtext(4);
20
- i0.ɵɵelementEnd()()();
16
+ i0.ɵɵelementStart(0, "div", 14);
17
+ i0.ɵɵelement(1, "mj-alert", 34);
18
+ i0.ɵɵelementEnd();
21
19
  } if (rf & 2) {
22
20
  const ctx_r1 = i0.ɵɵnextContext(2);
23
- i0.ɵɵadvance(4);
24
- i0.ɵɵtextInterpolate(ctx_r1.error);
21
+ i0.ɵɵadvance();
22
+ i0.ɵɵproperty("Message", ctx_r1.error);
25
23
  } }
26
- function ApplicationDialogComponent_Conditional_0_Conditional_26_Conditional_6_Conditional_2_Template(rf, ctx) { if (rf & 1) {
24
+ function ApplicationDialogComponent_Conditional_0_ng_template_18_Template(rf, ctx) { if (rf & 1) {
25
+ i0.ɵɵelementStart(0, "span", 35)(1, "span", 36);
26
+ i0.ɵɵelement(2, "i", 37);
27
+ i0.ɵɵtext(3, " Application Information ");
28
+ i0.ɵɵelementEnd();
29
+ i0.ɵɵelementStart(4, "span", 38);
30
+ i0.ɵɵtext(5, "Define the application's basic properties");
31
+ i0.ɵɵelementEnd()();
32
+ } }
33
+ function ApplicationDialogComponent_Conditional_0_Conditional_25_Conditional_2_Template(rf, ctx) { if (rf & 1) {
27
34
  i0.ɵɵtext(0, " Application name is required ");
28
35
  } }
29
- function ApplicationDialogComponent_Conditional_0_Conditional_26_Conditional_6_Conditional_3_Template(rf, ctx) { if (rf & 1) {
36
+ function ApplicationDialogComponent_Conditional_0_Conditional_25_Conditional_3_Template(rf, ctx) { if (rf & 1) {
30
37
  i0.ɵɵtext(0, " Application name cannot exceed 100 characters ");
31
38
  } }
32
- function ApplicationDialogComponent_Conditional_0_Conditional_26_Conditional_6_Template(rf, ctx) { if (rf & 1) {
33
- i0.ɵɵelementStart(0, "div", 33);
34
- i0.ɵɵelement(1, "i", 37);
35
- i0.ɵɵconditionalCreate(2, ApplicationDialogComponent_Conditional_0_Conditional_26_Conditional_6_Conditional_2_Template, 1, 0);
36
- i0.ɵɵconditionalCreate(3, ApplicationDialogComponent_Conditional_0_Conditional_26_Conditional_6_Conditional_3_Template, 1, 0);
39
+ function ApplicationDialogComponent_Conditional_0_Conditional_25_Template(rf, ctx) { if (rf & 1) {
40
+ i0.ɵɵelementStart(0, "div", 22);
41
+ i0.ɵɵelement(1, "i", 39);
42
+ i0.ɵɵconditionalCreate(2, ApplicationDialogComponent_Conditional_0_Conditional_25_Conditional_2_Template, 1, 0);
43
+ i0.ɵɵconditionalCreate(3, ApplicationDialogComponent_Conditional_0_Conditional_25_Conditional_3_Template, 1, 0);
37
44
  i0.ɵɵelementEnd();
38
45
  } if (rf & 2) {
46
+ let tmp_2_0;
39
47
  let tmp_3_0;
40
- let tmp_4_0;
41
- const ctx_r1 = i0.ɵɵnextContext(3);
48
+ const ctx_r1 = i0.ɵɵnextContext(2);
42
49
  i0.ɵɵadvance(2);
43
- i0.ɵɵconditional(((tmp_3_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_3_0.errors == null ? null : tmp_3_0.errors["required"]) ? 2 : -1);
50
+ i0.ɵɵconditional(((tmp_2_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_2_0.errors == null ? null : tmp_2_0.errors["required"]) ? 2 : -1);
44
51
  i0.ɵɵadvance();
45
- i0.ɵɵconditional(((tmp_4_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_4_0.errors == null ? null : tmp_4_0.errors["maxlength"]) ? 3 : -1);
52
+ i0.ɵɵconditional(((tmp_3_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_3_0.errors == null ? null : tmp_3_0.errors["maxlength"]) ? 3 : -1);
46
53
  } }
47
- function ApplicationDialogComponent_Conditional_0_Conditional_26_Template(rf, ctx) { if (rf & 1) {
48
- i0.ɵɵelementStart(0, "div", 22)(1, "div", 29)(2, "div", 30)(3, "label", 31);
49
- i0.ɵɵtext(4, "Application Name");
50
- i0.ɵɵelementEnd();
51
- i0.ɵɵelement(5, "input", 32);
52
- i0.ɵɵconditionalCreate(6, ApplicationDialogComponent_Conditional_0_Conditional_26_Conditional_6_Template, 4, 2, "div", 33);
53
- i0.ɵɵelementEnd();
54
- i0.ɵɵelementStart(7, "div", 30)(8, "label", 34);
55
- i0.ɵɵtext(9, "Description");
54
+ function ApplicationDialogComponent_Conditional_0_ng_template_33_Template(rf, ctx) { if (rf & 1) {
55
+ i0.ɵɵelementStart(0, "span", 35)(1, "span", 36);
56
+ i0.ɵɵelement(2, "i", 40);
57
+ i0.ɵɵtext(3, " Application Entities ");
56
58
  i0.ɵɵelementEnd();
57
- i0.ɵɵelement(10, "textarea", 35);
58
- i0.ɵɵelementStart(11, "div", 36);
59
- i0.ɵɵtext(12, " Provide a clear description of what this application does and its main features. ");
60
- i0.ɵɵelementEnd()()()();
61
- } if (rf & 2) {
62
- let tmp_2_0;
63
- let tmp_3_0;
64
- let tmp_4_0;
65
- const ctx_r1 = i0.ɵɵnextContext(2);
66
- i0.ɵɵadvance(5);
67
- i0.ɵɵclassProp("error", ((tmp_2_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_2_0.invalid) && ((tmp_2_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_2_0.touched));
68
- i0.ɵɵattribute("aria-invalid", ((tmp_3_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_3_0.invalid) && ((tmp_3_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_3_0.touched));
69
- i0.ɵɵadvance();
70
- i0.ɵɵconditional(((tmp_4_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_4_0.invalid) && ((tmp_4_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_4_0.touched) ? 6 : -1);
59
+ i0.ɵɵelementStart(4, "span", 38);
60
+ i0.ɵɵtext(5, "Manage which entities are included in this application");
61
+ i0.ɵɵelementEnd()();
71
62
  } }
72
- function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_For_5_Conditional_8_Template(rf, ctx) { if (rf & 1) {
73
- i0.ɵɵelement(0, "i", 52);
63
+ function ApplicationDialogComponent_Conditional_0_Conditional_36_For_5_Conditional_8_Template(rf, ctx) { if (rf & 1) {
64
+ i0.ɵɵelement(0, "i", 51);
74
65
  } if (rf & 2) {
75
66
  const config_r5 = i0.ɵɵnextContext().$implicit;
76
67
  i0.ɵɵproperty("title", config_r5.entity.Description);
77
68
  i0.ɵɵattribute("aria-label", "Entity description: " + config_r5.entity.Description);
78
69
  } }
79
- function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_For_5_Template(rf, ctx) { if (rf & 1) {
70
+ function ApplicationDialogComponent_Conditional_0_Conditional_36_For_5_Template(rf, ctx) { if (rf & 1) {
80
71
  const _r4 = i0.ɵɵgetCurrentView();
81
- i0.ɵɵelementStart(0, "div", 45);
82
- i0.ɵɵelement(1, "i", 46);
83
- i0.ɵɵelementStart(2, "div", 47)(3, "div", 48);
84
- i0.ɵɵelement(4, "i", 49);
72
+ i0.ɵɵelementStart(0, "div", 44);
73
+ i0.ɵɵelement(1, "i", 45);
74
+ i0.ɵɵelementStart(2, "div", 46)(3, "div", 47);
75
+ i0.ɵɵelement(4, "i", 48);
85
76
  i0.ɵɵelementEnd();
86
- i0.ɵɵelementStart(5, "div", 50)(6, "div", 51);
77
+ i0.ɵɵelementStart(5, "div", 49)(6, "div", 50);
87
78
  i0.ɵɵtext(7);
88
- i0.ɵɵconditionalCreate(8, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_For_5_Conditional_8_Template, 1, 2, "i", 52);
79
+ i0.ɵɵconditionalCreate(8, ApplicationDialogComponent_Conditional_0_Conditional_36_For_5_Conditional_8_Template, 1, 2, "i", 51);
89
80
  i0.ɵɵelementEnd()()();
90
- i0.ɵɵelementStart(9, "div", 53)(10, "div", 54)(11, "label", 55)(12, "input", 56);
91
- i0.ɵɵtwoWayListener("ngModelChange", function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_For_5_Template_input_ngModelChange_12_listener($event) { const config_r5 = i0.ɵɵrestoreView(_r4).$implicit; i0.ɵɵtwoWayBindingSet(config_r5.defaultForNewUser, $event) || (config_r5.defaultForNewUser = $event); return i0.ɵɵresetView($event); });
92
- i0.ɵɵlistener("change", function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_For_5_Template_input_change_12_listener() { const config_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onDefaultForNewUserChange(config_r5)); });
81
+ i0.ɵɵelementStart(9, "div", 52)(10, "div", 53)(11, "label", 54)(12, "input", 55);
82
+ i0.ɵɵtwoWayListener("ngModelChange", function ApplicationDialogComponent_Conditional_0_Conditional_36_For_5_Template_input_ngModelChange_12_listener($event) { const config_r5 = i0.ɵɵrestoreView(_r4).$implicit; i0.ɵɵtwoWayBindingSet(config_r5.defaultForNewUser, $event) || (config_r5.defaultForNewUser = $event); return i0.ɵɵresetView($event); });
83
+ i0.ɵɵlistener("change", function ApplicationDialogComponent_Conditional_0_Conditional_36_For_5_Template_input_change_12_listener() { const config_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onDefaultForNewUserChange(config_r5)); });
93
84
  i0.ɵɵelementEnd();
94
- i0.ɵɵelementStart(13, "span", 57);
85
+ i0.ɵɵelementStart(13, "span", 56);
95
86
  i0.ɵɵtext(14, "Default for new users");
96
87
  i0.ɵɵelementEnd()()();
97
- i0.ɵɵelementStart(15, "div", 58);
88
+ i0.ɵɵelementStart(15, "div", 57);
98
89
  i0.ɵɵtext(16);
99
90
  i0.ɵɵelementEnd()();
100
- i0.ɵɵelementStart(17, "div", 59)(18, "button", 60);
101
- i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_For_5_Template_button_click_18_listener() { const config_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.removeEntity(config_r5)); });
91
+ i0.ɵɵelementStart(17, "div", 58)(18, "button", 59);
92
+ i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Conditional_36_For_5_Template_button_click_18_listener() { const config_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.removeEntity(config_r5)); });
102
93
  i0.ɵɵelement(19, "i", 11);
103
94
  i0.ɵɵelementEnd()()();
104
95
  } if (rf & 2) {
@@ -118,46 +109,46 @@ function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_F
118
109
  i0.ɵɵadvance(2);
119
110
  i0.ɵɵattribute("aria-label", "Remove " + config_r5.entity.Name);
120
111
  } }
121
- function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_Template(rf, ctx) { if (rf & 1) {
112
+ function ApplicationDialogComponent_Conditional_0_Conditional_36_Template(rf, ctx) { if (rf & 1) {
122
113
  const _r3 = i0.ɵɵgetCurrentView();
123
- i0.ɵɵelementStart(0, "div", 38)(1, "h4", 42);
114
+ i0.ɵɵelementStart(0, "div", 26)(1, "h4", 41);
124
115
  i0.ɵɵtext(2);
125
116
  i0.ɵɵelementEnd();
126
- i0.ɵɵelementStart(3, "div", 43);
127
- i0.ɵɵlistener("cdkDropListDropped", function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_Template_div_cdkDropListDropped_3_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onEntityDrop($event)); });
128
- i0.ɵɵrepeaterCreate(4, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_For_5_Template, 20, 12, "div", 44, _forTrack0);
117
+ i0.ɵɵelementStart(3, "div", 42);
118
+ i0.ɵɵlistener("cdkDropListDropped", function ApplicationDialogComponent_Conditional_0_Conditional_36_Template_div_cdkDropListDropped_3_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onEntityDrop($event)); });
119
+ i0.ɵɵrepeaterCreate(4, ApplicationDialogComponent_Conditional_0_Conditional_36_For_5_Template, 20, 12, "div", 43, _forTrack0);
129
120
  i0.ɵɵelementEnd()();
130
121
  } if (rf & 2) {
131
- const ctx_r1 = i0.ɵɵnextContext(3);
122
+ const ctx_r1 = i0.ɵɵnextContext(2);
132
123
  i0.ɵɵadvance(2);
133
124
  i0.ɵɵtextInterpolate1("Assigned Entities (", ctx_r1.applicationEntities.length, ")");
134
125
  i0.ɵɵadvance(2);
135
126
  i0.ɵɵrepeater(ctx_r1.applicationEntities);
136
127
  } }
137
- function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_3_Template(rf, ctx) { if (rf & 1) {
138
- i0.ɵɵelementStart(0, "div", 39);
139
- i0.ɵɵelement(1, "i", 23);
128
+ function ApplicationDialogComponent_Conditional_0_Conditional_37_Template(rf, ctx) { if (rf & 1) {
129
+ i0.ɵɵelementStart(0, "div", 27);
130
+ i0.ɵɵelement(1, "i", 40);
140
131
  i0.ɵɵelementStart(2, "p");
141
132
  i0.ɵɵtext(3, "No entities assigned to this application");
142
133
  i0.ɵɵelementEnd();
143
- i0.ɵɵelementStart(4, "p", 61);
134
+ i0.ɵɵelementStart(4, "p", 60);
144
135
  i0.ɵɵtext(5, "Add entities from the available list below");
145
136
  i0.ɵɵelementEnd()();
146
137
  } }
147
- function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_7_Template(rf, ctx) { if (rf & 1) {
138
+ function ApplicationDialogComponent_Conditional_0_Conditional_38_Conditional_7_Template(rf, ctx) { if (rf & 1) {
148
139
  const _r7 = i0.ɵɵgetCurrentView();
149
- i0.ɵɵelementStart(0, "button", 69);
150
- i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.clearEntitySearch()); });
140
+ i0.ɵɵelementStart(0, "button", 68);
141
+ i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Conditional_38_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.clearEntitySearch()); });
151
142
  i0.ɵɵelement(1, "i", 11);
152
143
  i0.ɵɵelementEnd();
153
144
  } }
154
- function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
145
+ function ApplicationDialogComponent_Conditional_0_Conditional_38_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
155
146
  const _r8 = i0.ɵɵgetCurrentView();
156
- i0.ɵɵelementStart(0, "button", 71);
157
- i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_8_For_2_Template_button_click_0_listener() { const entity_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(5); return i0.ɵɵresetView(ctx_r1.addEntity(entity_r9)); });
158
- i0.ɵɵelementStart(1, "div", 72);
159
- i0.ɵɵelement(2, "i", 73);
160
- i0.ɵɵelementStart(3, "span", 74);
147
+ i0.ɵɵelementStart(0, "button", 70);
148
+ i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Conditional_38_Conditional_8_For_2_Template_button_click_0_listener() { const entity_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.addEntity(entity_r9)); });
149
+ i0.ɵɵelementStart(1, "div", 71);
150
+ i0.ɵɵelement(2, "i", 72);
151
+ i0.ɵɵelementStart(3, "span", 73);
161
152
  i0.ɵɵtext(4);
162
153
  i0.ɵɵelementEnd()()();
163
154
  } if (rf & 2) {
@@ -166,42 +157,42 @@ function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_C
166
157
  i0.ɵɵadvance(4);
167
158
  i0.ɵɵtextInterpolate(entity_r9.Name);
168
159
  } }
169
- function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_8_Template(rf, ctx) { if (rf & 1) {
170
- i0.ɵɵelementStart(0, "div", 67);
171
- i0.ɵɵrepeaterCreate(1, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_8_For_2_Template, 5, 2, "button", 70, _forTrack1);
160
+ function ApplicationDialogComponent_Conditional_0_Conditional_38_Conditional_8_Template(rf, ctx) { if (rf & 1) {
161
+ i0.ɵɵelementStart(0, "div", 66);
162
+ i0.ɵɵrepeaterCreate(1, ApplicationDialogComponent_Conditional_0_Conditional_38_Conditional_8_For_2_Template, 5, 2, "button", 69, _forTrack1);
172
163
  i0.ɵɵelementEnd();
173
164
  } if (rf & 2) {
174
- const ctx_r1 = i0.ɵɵnextContext(4);
165
+ const ctx_r1 = i0.ɵɵnextContext(3);
175
166
  i0.ɵɵadvance();
176
167
  i0.ɵɵrepeater(ctx_r1.filteredAvailableEntities);
177
168
  } }
178
- function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_9_Template(rf, ctx) { if (rf & 1) {
179
- i0.ɵɵelementStart(0, "div", 68);
180
- i0.ɵɵelement(1, "i", 75);
169
+ function ApplicationDialogComponent_Conditional_0_Conditional_38_Conditional_9_Template(rf, ctx) { if (rf & 1) {
170
+ i0.ɵɵelementStart(0, "div", 67);
171
+ i0.ɵɵelement(1, "i", 74);
181
172
  i0.ɵɵelementStart(2, "p");
182
173
  i0.ɵɵtext(3);
183
174
  i0.ɵɵelementEnd()();
184
175
  } if (rf & 2) {
185
- const ctx_r1 = i0.ɵɵnextContext(4);
176
+ const ctx_r1 = i0.ɵɵnextContext(3);
186
177
  i0.ɵɵadvance(3);
187
178
  i0.ɵɵtextInterpolate1("No entities match \"", ctx_r1.entitySearchTerm, "\"");
188
179
  } }
189
- function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Template(rf, ctx) { if (rf & 1) {
180
+ function ApplicationDialogComponent_Conditional_0_Conditional_38_Template(rf, ctx) { if (rf & 1) {
190
181
  const _r6 = i0.ɵɵgetCurrentView();
191
- i0.ɵɵelementStart(0, "div", 40)(1, "div", 62)(2, "h4", 42);
182
+ i0.ɵɵelementStart(0, "div", 28)(1, "div", 61)(2, "h4", 41);
192
183
  i0.ɵɵtext(3);
193
184
  i0.ɵɵelementEnd();
194
- i0.ɵɵelementStart(4, "div", 63);
195
- i0.ɵɵelement(5, "i", 64);
196
- i0.ɵɵelementStart(6, "input", 65);
197
- i0.ɵɵlistener("input", function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Template_input_input_6_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onEntitySearchChange($event)); });
185
+ i0.ɵɵelementStart(4, "div", 62);
186
+ i0.ɵɵelement(5, "i", 63);
187
+ i0.ɵɵelementStart(6, "input", 64);
188
+ i0.ɵɵlistener("input", function ApplicationDialogComponent_Conditional_0_Conditional_38_Template_input_input_6_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onEntitySearchChange($event)); });
198
189
  i0.ɵɵelementEnd();
199
- i0.ɵɵconditionalCreate(7, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_7_Template, 2, 0, "button", 66);
190
+ i0.ɵɵconditionalCreate(7, ApplicationDialogComponent_Conditional_0_Conditional_38_Conditional_7_Template, 2, 0, "button", 65);
200
191
  i0.ɵɵelementEnd()();
201
- i0.ɵɵconditionalCreate(8, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_8_Template, 3, 0, "div", 67)(9, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_9_Template, 4, 1, "div", 68);
192
+ i0.ɵɵconditionalCreate(8, ApplicationDialogComponent_Conditional_0_Conditional_38_Conditional_8_Template, 3, 0, "div", 66)(9, ApplicationDialogComponent_Conditional_0_Conditional_38_Conditional_9_Template, 4, 1, "div", 67);
202
193
  i0.ɵɵelementEnd();
203
194
  } if (rf & 2) {
204
- const ctx_r1 = i0.ɵɵnextContext(3);
195
+ const ctx_r1 = i0.ɵɵnextContext(2);
205
196
  i0.ɵɵadvance(3);
206
197
  i0.ɵɵtextInterpolate2("Available Entities (", ctx_r1.filteredAvailableEntities.length, " of ", ctx_r1.availableEntities.length, ")");
207
198
  i0.ɵɵadvance(3);
@@ -211,91 +202,71 @@ function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_T
211
202
  i0.ɵɵadvance();
212
203
  i0.ɵɵconditional(ctx_r1.filteredAvailableEntities.length > 0 ? 8 : 9);
213
204
  } }
214
- function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_5_Template(rf, ctx) { if (rf & 1) {
215
- i0.ɵɵelementStart(0, "div", 41);
216
- i0.ɵɵelement(1, "i", 76);
205
+ function ApplicationDialogComponent_Conditional_0_Conditional_39_Template(rf, ctx) { if (rf & 1) {
206
+ i0.ɵɵelementStart(0, "div", 29);
207
+ i0.ɵɵelement(1, "i", 75);
217
208
  i0.ɵɵelementStart(2, "p");
218
209
  i0.ɵɵtext(3, "All entities have been assigned to this application");
219
210
  i0.ɵɵelementEnd()();
220
211
  } }
221
- function ApplicationDialogComponent_Conditional_0_Conditional_36_Template(rf, ctx) { if (rf & 1) {
222
- i0.ɵɵelementStart(0, "div", 22)(1, "div", 29);
223
- i0.ɵɵconditionalCreate(2, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_Template, 6, 1, "div", 38)(3, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_3_Template, 6, 0, "div", 39);
224
- i0.ɵɵconditionalCreate(4, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Template, 10, 5, "div", 40)(5, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_5_Template, 4, 0, "div", 41);
212
+ function ApplicationDialogComponent_Conditional_0_Conditional_40_ng_template_1_Template(rf, ctx) { if (rf & 1) {
213
+ i0.ɵɵelementStart(0, "span", 35)(1, "span", 36);
214
+ i0.ɵɵelement(2, "i", 37);
215
+ i0.ɵɵtext(3, " System Information ");
216
+ i0.ɵɵelementEnd();
217
+ i0.ɵɵelementStart(4, "span", 38);
218
+ i0.ɵɵtext(5, "Application metadata and audit information");
225
219
  i0.ɵɵelementEnd()();
226
- } if (rf & 2) {
227
- const ctx_r1 = i0.ɵɵnextContext(2);
228
- i0.ɵɵadvance(2);
229
- i0.ɵɵconditional(ctx_r1.applicationEntities.length > 0 ? 2 : 3);
230
- i0.ɵɵadvance(2);
231
- i0.ɵɵconditional(ctx_r1.availableEntities.length > 0 ? 4 : 5);
232
220
  } }
233
- function ApplicationDialogComponent_Conditional_0_Conditional_37_Conditional_9_Template(rf, ctx) { if (rf & 1) {
234
- i0.ɵɵelementStart(0, "div", 22)(1, "div", 29)(2, "div", 77)(3, "div", 78)(4, "span", 79);
235
- i0.ɵɵtext(5, "Created");
221
+ function ApplicationDialogComponent_Conditional_0_Conditional_40_Template(rf, ctx) { if (rf & 1) {
222
+ const _r10 = i0.ɵɵgetCurrentView();
223
+ i0.ɵɵelementStart(0, "mj-accordion-panel", 15);
224
+ i0.ɵɵlistener("ExpandedChange", function ApplicationDialogComponent_Conditional_0_Conditional_40_Template_mj_accordion_panel_ExpandedChange_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleSection("systemInfo")); });
225
+ i0.ɵɵtemplate(1, ApplicationDialogComponent_Conditional_0_Conditional_40_ng_template_1_Template, 6, 0, "ng-template", 16);
226
+ i0.ɵɵelementStart(2, "div", 17)(3, "div", 18)(4, "div", 76)(5, "div", 77)(6, "span", 78);
227
+ i0.ɵɵtext(7, "Created");
236
228
  i0.ɵɵelementEnd();
237
- i0.ɵɵelementStart(6, "span", 80);
238
- i0.ɵɵtext(7);
239
- i0.ɵɵpipe(8, "date");
229
+ i0.ɵɵelementStart(8, "span", 79);
230
+ i0.ɵɵtext(9);
231
+ i0.ɵɵpipe(10, "date");
240
232
  i0.ɵɵelementEnd()();
241
- i0.ɵɵelementStart(9, "div", 78)(10, "span", 79);
242
- i0.ɵɵtext(11, "Last Updated");
233
+ i0.ɵɵelementStart(11, "div", 77)(12, "span", 78);
234
+ i0.ɵɵtext(13, "Last Updated");
243
235
  i0.ɵɵelementEnd();
244
- i0.ɵɵelementStart(12, "span", 80);
245
- i0.ɵɵtext(13);
246
- i0.ɵɵpipe(14, "date");
236
+ i0.ɵɵelementStart(14, "span", 79);
237
+ i0.ɵɵtext(15);
238
+ i0.ɵɵpipe(16, "date");
247
239
  i0.ɵɵelementEnd()();
248
- i0.ɵɵelementStart(15, "div", 78)(16, "span", 79);
249
- i0.ɵɵtext(17, "Application ID");
240
+ i0.ɵɵelementStart(17, "div", 77)(18, "span", 78);
241
+ i0.ɵɵtext(19, "Application ID");
250
242
  i0.ɵɵelementEnd();
251
- i0.ɵɵelementStart(18, "span", 80);
252
- i0.ɵɵtext(19);
243
+ i0.ɵɵelementStart(20, "span", 79);
244
+ i0.ɵɵtext(21);
253
245
  i0.ɵɵelementEnd()();
254
- i0.ɵɵelementStart(20, "div", 78)(21, "span", 79);
255
- i0.ɵɵtext(22, "Total Entities");
246
+ i0.ɵɵelementStart(22, "div", 77)(23, "span", 78);
247
+ i0.ɵɵtext(24, "Total Entities");
256
248
  i0.ɵɵelementEnd();
257
- i0.ɵɵelementStart(23, "span", 80);
258
- i0.ɵɵtext(24);
259
- i0.ɵɵelementEnd()()()()();
249
+ i0.ɵɵelementStart(25, "span", 79);
250
+ i0.ɵɵtext(26);
251
+ i0.ɵɵelementEnd()()()()()();
260
252
  } if (rf & 2) {
261
- const ctx_r1 = i0.ɵɵnextContext(3);
262
- i0.ɵɵadvance(7);
263
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(8, 4, ctx_r1.data == null ? null : ctx_r1.data.application == null ? null : ctx_r1.data.application.__mj_CreatedAt, "medium"));
253
+ const ctx_r1 = i0.ɵɵnextContext(2);
254
+ i0.ɵɵproperty("Expanded", ctx_r1.sectionExpanded.systemInfo);
255
+ i0.ɵɵadvance(9);
256
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(10, 5, ctx_r1.data == null ? null : ctx_r1.data.application == null ? null : ctx_r1.data.application.__mj_CreatedAt, "medium"));
264
257
  i0.ɵɵadvance(6);
265
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(14, 7, ctx_r1.data == null ? null : ctx_r1.data.application == null ? null : ctx_r1.data.application.__mj_UpdatedAt, "medium"));
258
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(16, 8, ctx_r1.data == null ? null : ctx_r1.data.application == null ? null : ctx_r1.data.application.__mj_UpdatedAt, "medium"));
266
259
  i0.ɵɵadvance(6);
267
260
  i0.ɵɵtextInterpolate(ctx_r1.data == null ? null : ctx_r1.data.application == null ? null : ctx_r1.data.application.ID);
268
261
  i0.ɵɵadvance(5);
269
262
  i0.ɵɵtextInterpolate(ctx_r1.applicationEntities.length);
270
263
  } }
271
- function ApplicationDialogComponent_Conditional_0_Conditional_37_Template(rf, ctx) { if (rf & 1) {
272
- const _r10 = i0.ɵɵgetCurrentView();
273
- i0.ɵɵelementStart(0, "fieldset", 15)(1, "legend", 16);
274
- i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Conditional_37_Template_legend_click_1_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleSection("systemInfo")); });
275
- i0.ɵɵelementStart(2, "div", 17)(3, "span", 18);
276
- i0.ɵɵelement(4, "i", 19);
277
- i0.ɵɵtext(5, " System Information ");
278
- i0.ɵɵelementEnd();
279
- i0.ɵɵelement(6, "i", 20);
280
- i0.ɵɵelementEnd();
281
- i0.ɵɵelementStart(7, "span", 21);
282
- i0.ɵɵtext(8, "Application metadata and audit information");
283
- i0.ɵɵelementEnd()();
284
- i0.ɵɵconditionalCreate(9, ApplicationDialogComponent_Conditional_0_Conditional_37_Conditional_9_Template, 25, 10, "div", 22);
285
- i0.ɵɵelementEnd();
286
- } if (rf & 2) {
287
- const ctx_r1 = i0.ɵɵnextContext(2);
288
- i0.ɵɵadvance(6);
289
- i0.ɵɵclassProp("fa-chevron-up", ctx_r1.sectionExpanded.systemInfo)("fa-chevron-down", !ctx_r1.sectionExpanded.systemInfo);
290
- i0.ɵɵadvance(3);
291
- i0.ɵɵconditional(ctx_r1.sectionExpanded.systemInfo ? 9 : -1);
292
- } }
293
- function ApplicationDialogComponent_Conditional_0_Conditional_40_Template(rf, ctx) { if (rf & 1) {
294
- i0.ɵɵelement(0, "i", 81);
264
+ function ApplicationDialogComponent_Conditional_0_Conditional_43_Template(rf, ctx) { if (rf & 1) {
265
+ i0.ɵɵelement(0, "i", 80);
295
266
  i0.ɵɵtext(1, " Saving... ");
296
267
  } }
297
- function ApplicationDialogComponent_Conditional_0_Conditional_41_Template(rf, ctx) { if (rf & 1) {
298
- i0.ɵɵelement(0, "i", 82);
268
+ function ApplicationDialogComponent_Conditional_0_Conditional_44_Template(rf, ctx) { if (rf & 1) {
269
+ i0.ɵɵelement(0, "i", 81);
299
270
  i0.ɵɵtext(1);
300
271
  } if (rf & 2) {
301
272
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -325,44 +296,44 @@ function ApplicationDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
325
296
  i0.ɵɵelementEnd()()();
326
297
  i0.ɵɵelementStart(14, "div", 12)(15, "form", 13);
327
298
  i0.ɵɵlistener("ngSubmit", function ApplicationDialogComponent_Conditional_0_Template_form_ngSubmit_15_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSubmit()); });
328
- i0.ɵɵconditionalCreate(16, ApplicationDialogComponent_Conditional_0_Conditional_16_Template, 5, 1, "div", 14);
329
- i0.ɵɵelementStart(17, "fieldset", 15)(18, "legend", 16);
330
- i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Template_legend_click_18_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSection("basicInfo")); });
331
- i0.ɵɵelementStart(19, "div", 17)(20, "span", 18);
332
- i0.ɵɵelement(21, "i", 19);
333
- i0.ɵɵtext(22, " Application Information ");
299
+ i0.ɵɵconditionalCreate(16, ApplicationDialogComponent_Conditional_0_Conditional_16_Template, 2, 1, "div", 14);
300
+ i0.ɵɵelementStart(17, "mj-accordion-panel", 15);
301
+ i0.ɵɵlistener("ExpandedChange", function ApplicationDialogComponent_Conditional_0_Template_mj_accordion_panel_ExpandedChange_17_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSection("basicInfo")); });
302
+ i0.ɵɵtemplate(18, ApplicationDialogComponent_Conditional_0_ng_template_18_Template, 6, 0, "ng-template", 16);
303
+ i0.ɵɵelementStart(19, "div", 17)(20, "div", 18)(21, "div", 19)(22, "label", 20);
304
+ i0.ɵɵtext(23, "Application Name");
334
305
  i0.ɵɵelementEnd();
335
- i0.ɵɵelement(23, "i", 20);
336
- i0.ɵɵelementEnd();
337
- i0.ɵɵelementStart(24, "span", 21);
338
- i0.ɵɵtext(25, "Define the application's basic properties");
339
- i0.ɵɵelementEnd()();
340
- i0.ɵɵconditionalCreate(26, ApplicationDialogComponent_Conditional_0_Conditional_26_Template, 13, 4, "div", 22);
306
+ i0.ɵɵelement(24, "input", 21);
307
+ i0.ɵɵconditionalCreate(25, ApplicationDialogComponent_Conditional_0_Conditional_25_Template, 4, 2, "div", 22);
341
308
  i0.ɵɵelementEnd();
342
- i0.ɵɵelementStart(27, "fieldset", 15)(28, "legend", 16);
343
- i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Template_legend_click_28_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSection("entities")); });
344
- i0.ɵɵelementStart(29, "div", 17)(30, "span", 18);
345
- i0.ɵɵelement(31, "i", 23);
346
- i0.ɵɵtext(32, " Application Entities ");
309
+ i0.ɵɵelementStart(26, "div", 19)(27, "label", 23);
310
+ i0.ɵɵtext(28, "Description");
347
311
  i0.ɵɵelementEnd();
348
- i0.ɵɵelement(33, "i", 20);
349
- i0.ɵɵelementEnd();
350
- i0.ɵɵelementStart(34, "span", 21);
351
- i0.ɵɵtext(35, "Manage which entities are included in this application");
352
- i0.ɵɵelementEnd()();
353
- i0.ɵɵconditionalCreate(36, ApplicationDialogComponent_Conditional_0_Conditional_36_Template, 6, 2, "div", 22);
354
- i0.ɵɵelementEnd();
355
- i0.ɵɵconditionalCreate(37, ApplicationDialogComponent_Conditional_0_Conditional_37_Template, 10, 5, "fieldset", 15);
312
+ i0.ɵɵelement(29, "textarea", 24);
313
+ i0.ɵɵelementStart(30, "div", 25);
314
+ i0.ɵɵtext(31, " Provide a clear description of what this application does and its main features. ");
315
+ i0.ɵɵelementEnd()()()()();
316
+ i0.ɵɵelementStart(32, "mj-accordion-panel", 15);
317
+ i0.ɵɵlistener("ExpandedChange", function ApplicationDialogComponent_Conditional_0_Template_mj_accordion_panel_ExpandedChange_32_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSection("entities")); });
318
+ i0.ɵɵtemplate(33, ApplicationDialogComponent_Conditional_0_ng_template_33_Template, 6, 0, "ng-template", 16);
319
+ i0.ɵɵelementStart(34, "div", 17)(35, "div", 18);
320
+ i0.ɵɵconditionalCreate(36, ApplicationDialogComponent_Conditional_0_Conditional_36_Template, 6, 1, "div", 26)(37, ApplicationDialogComponent_Conditional_0_Conditional_37_Template, 6, 0, "div", 27);
321
+ i0.ɵɵconditionalCreate(38, ApplicationDialogComponent_Conditional_0_Conditional_38_Template, 10, 5, "div", 28)(39, ApplicationDialogComponent_Conditional_0_Conditional_39_Template, 4, 0, "div", 29);
322
+ i0.ɵɵelementEnd()()();
323
+ i0.ɵɵconditionalCreate(40, ApplicationDialogComponent_Conditional_0_Conditional_40_Template, 27, 11, "mj-accordion-panel", 30);
356
324
  i0.ɵɵelementEnd()();
357
- i0.ɵɵelementStart(38, "div", 24)(39, "button", 25);
358
- i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Template_button_click_39_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSubmit()); });
359
- i0.ɵɵconditionalCreate(40, ApplicationDialogComponent_Conditional_0_Conditional_40_Template, 2, 0)(41, ApplicationDialogComponent_Conditional_0_Conditional_41_Template, 2, 1);
325
+ i0.ɵɵelementStart(41, "div", 31)(42, "button", 32);
326
+ i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Template_button_click_42_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSubmit()); });
327
+ i0.ɵɵconditionalCreate(43, ApplicationDialogComponent_Conditional_0_Conditional_43_Template, 2, 0)(44, ApplicationDialogComponent_Conditional_0_Conditional_44_Template, 2, 1);
360
328
  i0.ɵɵelementEnd();
361
- i0.ɵɵelementStart(42, "button", 26);
362
- i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Template_button_click_42_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
363
- i0.ɵɵtext(43, " Cancel ");
329
+ i0.ɵɵelementStart(45, "button", 33);
330
+ i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Template_button_click_45_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
331
+ i0.ɵɵtext(46, " Cancel ");
364
332
  i0.ɵɵelementEnd()()()();
365
333
  } if (rf & 2) {
334
+ let tmp_14_0;
335
+ let tmp_15_0;
336
+ let tmp_16_0;
366
337
  const ctx_r1 = i0.ɵɵnextContext();
367
338
  i0.ɵɵadvance();
368
339
  i0.ɵɵclassProp("fullscreen", ctx_r1.isFullscreen);
@@ -382,21 +353,26 @@ function ApplicationDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
382
353
  i0.ɵɵproperty("formGroup", ctx_r1.applicationForm);
383
354
  i0.ɵɵadvance();
384
355
  i0.ɵɵconditional(ctx_r1.error ? 16 : -1);
356
+ i0.ɵɵadvance();
357
+ i0.ɵɵproperty("Expanded", ctx_r1.sectionExpanded.basicInfo);
385
358
  i0.ɵɵadvance(7);
386
- i0.ɵɵclassProp("fa-chevron-up", ctx_r1.sectionExpanded.basicInfo)("fa-chevron-down", !ctx_r1.sectionExpanded.basicInfo);
387
- i0.ɵɵadvance(3);
388
- i0.ɵɵconditional(ctx_r1.sectionExpanded.basicInfo ? 26 : -1);
389
- i0.ɵɵadvance(7);
390
- i0.ɵɵclassProp("fa-chevron-up", ctx_r1.sectionExpanded.entities)("fa-chevron-down", !ctx_r1.sectionExpanded.entities);
391
- i0.ɵɵadvance(3);
392
- i0.ɵɵconditional(ctx_r1.sectionExpanded.entities ? 36 : -1);
359
+ i0.ɵɵclassProp("error", ((tmp_14_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_14_0.invalid) && ((tmp_14_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_14_0.touched));
360
+ i0.ɵɵattribute("aria-invalid", ((tmp_15_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_15_0.invalid) && ((tmp_15_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_15_0.touched));
393
361
  i0.ɵɵadvance();
394
- i0.ɵɵconditional(ctx_r1.isEditMode ? 37 : -1);
362
+ i0.ɵɵconditional(((tmp_16_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_16_0.invalid) && ((tmp_16_0 = ctx_r1.applicationForm.get("name")) == null ? null : tmp_16_0.touched) ? 25 : -1);
363
+ i0.ɵɵadvance(7);
364
+ i0.ɵɵproperty("Expanded", ctx_r1.sectionExpanded.entities);
365
+ i0.ɵɵadvance(4);
366
+ i0.ɵɵconditional(ctx_r1.applicationEntities.length > 0 ? 36 : 37);
367
+ i0.ɵɵadvance(2);
368
+ i0.ɵɵconditional(ctx_r1.availableEntities.length > 0 ? 38 : 39);
369
+ i0.ɵɵadvance(2);
370
+ i0.ɵɵconditional(ctx_r1.isEditMode ? 40 : -1);
395
371
  i0.ɵɵadvance(2);
396
372
  i0.ɵɵproperty("disabled", ctx_r1.applicationForm.invalid || ctx_r1.isLoading);
397
373
  i0.ɵɵattribute("aria-busy", ctx_r1.isLoading);
398
374
  i0.ɵɵadvance();
399
- i0.ɵɵconditional(ctx_r1.isLoading ? 40 : 41);
375
+ i0.ɵɵconditional(ctx_r1.isLoading ? 43 : 44);
400
376
  } }
401
377
  export class ApplicationDialogComponent extends BaseAngularComponent {
402
378
  data = null;
@@ -718,15 +694,15 @@ export class ApplicationDialogComponent extends BaseAngularComponent {
718
694
  static ɵfac = function ApplicationDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ApplicationDialogComponent)(); };
719
695
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ApplicationDialogComponent, selectors: [["mj-application-dialog"]], hostBindings: function ApplicationDialogComponent_HostBindings(rf, ctx) { if (rf & 1) {
720
696
  i0.ɵɵlistener("keydown.escape", function ApplicationDialogComponent_keydown_escape_HostBindingHandler() { return ctx.onEscapeKey(); }, i0.ɵɵresolveDocument);
721
- } }, inputs: { data: "data", visible: "visible" }, outputs: { result: "result" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["role", "presentation", 1, "modal-backdrop"], ["role", "presentation", 1, "modal-backdrop", 3, "click"], ["role", "dialog", "aria-modal", "true", "aria-labelledby", "application-dialog-title", "aria-describedby", "application-dialog-description", 1, "modal-dialog", 3, "click"], [1, "modal-header"], [1, "modal-header-content"], ["id", "application-dialog-title", 1, "modal-title"], ["aria-hidden", "true", 1, "fa-solid"], ["id", "application-dialog-description", 1, "modal-subtitle"], [1, "modal-header-actions"], ["type", "button", 1, "modal-action-btn", 3, "click"], ["aria-label", "Close dialog", "type", "button", 1, "modal-close", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-times"], [1, "modal-body"], [3, "ngSubmit", "formGroup"], [1, "form-section"], [1, "form-section", "collapsible-section"], [1, "section-header", "clickable", 3, "click"], [1, "section-title-row"], [1, "section-title"], ["aria-hidden", "true", 1, "fa-solid", "fa-info-circle"], ["aria-hidden", "true", 1, "fa-solid", "chevron-icon"], [1, "section-description"], [1, "section-content"], ["aria-hidden", "true", 1, "fa-solid", "fa-database"], [1, "modal-footer"], ["type", "submit", "mjButton", "", "variant", "primary", 3, "click", "disabled"], ["type", "button", "mjButton", "", 3, "click"], ["role", "alert", 1, "alert", "alert-error"], ["aria-hidden", "true", 1, "fa-solid", "fa-exclamation-triangle"], [1, "form-grid"], [1, "form-field"], ["for", "app-name", 1, "field-label", "required"], ["id", "app-name", "type", "text", "formControlName", "name", "placeholder", "My Application", "aria-describedby", "app-name-error", 1, "field-input"], ["id", "app-name-error", "role", "alert", 1, "field-error"], ["for", "app-description", 1, "field-label"], ["id", "app-description", "formControlName", "description", "placeholder", "Describe the application's purpose and functionality...", "rows", "4", 1, "field-textarea"], [1, "field-hint"], ["aria-hidden", "true", 1, "fa-solid", "fa-exclamation-circle"], [1, "assigned-entities"], [1, "no-entities"], [1, "available-entities"], [1, "all-assigned"], [1, "subsection-title"], ["role", "list", "cdkDropList", "", 1, "entities-list", 3, "cdkDropListDropped"], ["role", "listitem", "cdkDrag", "", 1, "entity-item", 3, "is-new", "has-changes"], ["role", "listitem", "cdkDrag", "", 1, "entity-item"], ["aria-hidden", "true", 1, "fa-solid", "fa-grip-vertical", "drag-handle"], [1, "entity-info"], [1, "entity-icon"], ["aria-hidden", "true", 1, "fa-solid", "fa-table"], [1, "entity-details"], [1, "entity-name"], [1, "fa-solid", "fa-info-circle", "entity-info-icon", 3, "title"], [1, "entity-config"], [1, "config-item"], [1, "config-label"], ["type", "checkbox", 1, "config-checkbox", 3, "ngModelChange", "change", "ngModel", "ngModelOptions"], [1, "checkbox-text"], [1, "sequence-badge"], [1, "entity-actions"], ["type", "button", "title", "Remove entity", 1, "btn-icon", "btn-danger", 3, "click"], [1, "empty-subtext"], [1, "available-entities-header"], [1, "entity-search"], ["aria-hidden", "true", 1, "fa-solid", "fa-search", "entity-search-icon"], ["type", "text", "placeholder", "Search entities...", "aria-label", "Search available entities", 1, "entity-search-input", 3, "input", "value"], ["type", "button", "aria-label", "Clear search", 1, "entity-search-clear"], ["role", "list", 1, "entities-grid"], [1, "no-search-results"], ["type", "button", "aria-label", "Clear search", 1, "entity-search-clear", 3, "click"], ["type", "button", "role", "listitem", 1, "entity-chip"], ["type", "button", "role", "listitem", 1, "entity-chip", 3, "click"], [1, "chip-content"], ["aria-hidden", "true", 1, "fa-solid", "fa-plus"], [1, "chip-name"], ["aria-hidden", "true", 1, "fa-solid", "fa-search"], ["aria-hidden", "true", 1, "fa-solid", "fa-check-circle"], [1, "info-grid"], [1, "info-item"], [1, "info-label"], [1, "info-value"], ["aria-hidden", "true", 1, "fa-solid", "fa-spinner", "fa-spin"], ["aria-hidden", "true", 1, "fa-solid", "fa-save"]], template: function ApplicationDialogComponent_Template(rf, ctx) { if (rf & 1) {
722
- i0.ɵɵconditionalCreate(0, ApplicationDialogComponent_Conditional_0_Template, 44, 33, "div", 0);
697
+ } }, inputs: { data: "data", visible: "visible" }, outputs: { result: "result" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["role", "presentation", 1, "modal-backdrop"], ["role", "presentation", 1, "modal-backdrop", 3, "click"], ["role", "dialog", "aria-modal", "true", "aria-labelledby", "application-dialog-title", "aria-describedby", "application-dialog-description", 1, "modal-dialog", 3, "click"], [1, "modal-header"], [1, "modal-header-content"], ["id", "application-dialog-title", 1, "modal-title"], ["aria-hidden", "true", 1, "fa-solid"], ["id", "application-dialog-description", 1, "modal-subtitle"], [1, "modal-header-actions"], ["type", "button", 1, "modal-action-btn", 3, "click"], ["aria-label", "Close dialog", "type", "button", 1, "modal-close", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-times"], [1, "modal-body"], [3, "ngSubmit", "formGroup"], [1, "form-section"], [1, "app-dialog-section", 3, "ExpandedChange", "Expanded"], ["mjAccordionTitle", ""], [1, "section-content"], [1, "form-grid"], [1, "form-field"], ["for", "app-name", 1, "field-label", "required"], ["id", "app-name", "type", "text", "formControlName", "name", "placeholder", "My Application", "aria-describedby", "app-name-error", 1, "field-input"], ["id", "app-name-error", "role", "alert", 1, "field-error"], ["for", "app-description", 1, "field-label"], ["id", "app-description", "formControlName", "description", "placeholder", "Describe the application's purpose and functionality...", "rows", "4", 1, "field-textarea"], [1, "field-hint"], [1, "assigned-entities"], [1, "no-entities"], [1, "available-entities"], [1, "all-assigned"], [1, "app-dialog-section", 3, "Expanded"], [1, "modal-footer"], ["type", "submit", "mjButton", "", "variant", "primary", 3, "click", "disabled"], ["type", "button", "mjButton", "", 3, "click"], ["Variant", "error", 3, "Message"], [1, "app-dialog-section-title"], [1, "section-title"], ["aria-hidden", "true", 1, "fa-solid", "fa-info-circle"], [1, "section-description"], ["aria-hidden", "true", 1, "fa-solid", "fa-exclamation-circle"], ["aria-hidden", "true", 1, "fa-solid", "fa-database"], [1, "subsection-title"], ["role", "list", "cdkDropList", "", 1, "entities-list", 3, "cdkDropListDropped"], ["role", "listitem", "cdkDrag", "", 1, "entity-item", 3, "is-new", "has-changes"], ["role", "listitem", "cdkDrag", "", 1, "entity-item"], ["aria-hidden", "true", 1, "fa-solid", "fa-grip-vertical", "drag-handle"], [1, "entity-info"], [1, "entity-icon"], ["aria-hidden", "true", 1, "fa-solid", "fa-table"], [1, "entity-details"], [1, "entity-name"], [1, "fa-solid", "fa-info-circle", "entity-info-icon", 3, "title"], [1, "entity-config"], [1, "config-item"], [1, "config-label"], ["type", "checkbox", 1, "config-checkbox", 3, "ngModelChange", "change", "ngModel", "ngModelOptions"], [1, "checkbox-text"], [1, "sequence-badge"], [1, "entity-actions"], ["type", "button", "title", "Remove entity", 1, "btn-icon", "btn-danger", 3, "click"], [1, "empty-subtext"], [1, "available-entities-header"], [1, "entity-search"], ["aria-hidden", "true", 1, "fa-solid", "fa-search", "entity-search-icon"], ["type", "text", "placeholder", "Search entities...", "aria-label", "Search available entities", 1, "entity-search-input", 3, "input", "value"], ["type", "button", "aria-label", "Clear search", 1, "entity-search-clear"], ["role", "list", 1, "entities-grid"], [1, "no-search-results"], ["type", "button", "aria-label", "Clear search", 1, "entity-search-clear", 3, "click"], ["type", "button", "role", "listitem", 1, "entity-chip"], ["type", "button", "role", "listitem", 1, "entity-chip", 3, "click"], [1, "chip-content"], ["aria-hidden", "true", 1, "fa-solid", "fa-plus"], [1, "chip-name"], ["aria-hidden", "true", 1, "fa-solid", "fa-search"], ["aria-hidden", "true", 1, "fa-solid", "fa-check-circle"], [1, "info-grid"], [1, "info-item"], [1, "info-label"], [1, "info-value"], ["aria-hidden", "true", 1, "fa-solid", "fa-spinner", "fa-spin"], ["aria-hidden", "true", 1, "fa-solid", "fa-save"]], template: function ApplicationDialogComponent_Template(rf, ctx) { if (rf & 1) {
698
+ i0.ɵɵconditionalCreate(0, ApplicationDialogComponent_Conditional_0_Template, 47, 31, "div", 0);
723
699
  } if (rf & 2) {
724
700
  i0.ɵɵconditional(ctx.visible ? 0 : -1);
725
- } }, dependencies: [i1.ɵNgNoValidate, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.NgControlStatus, i1.NgControlStatusGroup, i1.NgModel, i1.FormGroupDirective, i1.FormControlName, i2.CdkDropList, i2.CdkDrag, i3.MJButtonDirective, i4.DatePipe], styles: ["\n\n\n\n\n\n\n\n\n\n.modal-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s cubic-bezier(0, 0, 0.2, 1);\n padding: 1rem;\n}\n\n.modal-dialog[_ngcontent-%COMP%] {\n background: var(--mj-bg-page);\n border-radius: var(--mj-radius-2xl);\n box-shadow: var(--mj-shadow-2xl);\n max-width: 900px;\n width: 100%;\n max-height: 90vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_slideUp 0.3s cubic-bezier(0, 0, 0.2, 1);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n\n\n.modal-dialog.fullscreen[_ngcontent-%COMP%] {\n max-width: 100vw;\n width: 100vw;\n max-height: 100vh;\n height: 100vh;\n border-radius: 0;\n margin: 0;\n}\n\n\n\n\n\n.modal-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 1.5rem 1.5rem 1rem 1.5rem;\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n flex-shrink: 0;\n}\n\n.modal-header-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: 1.375rem;\n font-weight: 600;\n color: var(--mj-brand-on-primary);\n margin: 0;\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.2);\n border-radius: var(--mj-radius-lg);\n font-size: 1.125rem;\n flex-shrink: 0;\n}\n\n\n\n.modal-header.create-mode[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n background: var(--mj-brand-on-primary);\n color: var(--mj-brand-primary);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n\n\n.modal-header.edit-mode[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n background: rgba(255, 255, 255, 0.2);\n color: var(--mj-brand-on-primary);\n}\n\n\n\n.modal-header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n flex-shrink: 0;\n margin-left: 0.5rem;\n}\n\n.modal-action-btn[_ngcontent-%COMP%] {\n padding: 0.625rem;\n border: none;\n background: transparent;\n color: var(--mj-brand-on-primary);\n font-size: 1.125rem;\n cursor: pointer;\n border-radius: var(--mj-radius-full);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.modal-action-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.modal-action-btn[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-brand-on-primary);\n outline-offset: 2px;\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-subtitle[_ngcontent-%COMP%] {\n margin: 0.375rem 0 0 0;\n font-size: 0.8125rem;\n color: var(--mj-brand-on-primary);\n opacity: 0.85;\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-close[_ngcontent-%COMP%] {\n padding: 0.625rem;\n border: none;\n background: transparent;\n color: var(--mj-brand-on-primary);\n font-size: 1.25rem;\n cursor: pointer;\n border-radius: var(--mj-radius-full);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-left: 0.5rem;\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-close[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-close[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-brand-on-primary);\n outline-offset: 2px;\n}\n\n\n\n\n\n.modal-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n padding: 0;\n background: var(--mj-bg-page);\n}\n\n\n\n\n\n.modal-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding: 1.25rem 1.5rem;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n flex-shrink: 0;\n}\n\n\n\n\n\n.form-section[_ngcontent-%COMP%] {\n border: none;\n margin: 0;\n padding: 1.5rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.form-section[_ngcontent-%COMP%]:last-of-type {\n border-bottom: none;\n}\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n margin-bottom: 1.25rem;\n padding: 0;\n font-weight: normal;\n}\n\n.section-header[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 1.0625rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.section-header[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 0.875rem;\n}\n\n.section-header[_ngcontent-%COMP%] .section-description[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n\n\n\n\n.collapsible-section[_ngcontent-%COMP%] .section-header.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n transition: background-color 0.2s ease;\n padding: 0.75rem 0;\n margin: -0.75rem 0 0.75rem 0;\n}\n\n.collapsible-section[_ngcontent-%COMP%] .section-header.clickable[_ngcontent-%COMP%]:hover {\n opacity: 0.8;\n}\n\n.section-title-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n margin-bottom: 0.25rem;\n}\n\n.chevron-icon[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n transition: transform 0.2s ease;\n flex-shrink: 0;\n}\n\n.section-content[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_expandSection 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes _ngcontent-%COMP%_expandSection {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n\n\n\n\n.form-grid[_ngcontent-%COMP%] {\n display: grid;\n gap: 1.25rem;\n}\n\n.form-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.25rem;\n}\n\n\n\n\n\n.form-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.form-field[_ngcontent-%COMP%] .field-label[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.form-field[_ngcontent-%COMP%] .field-label.required[_ngcontent-%COMP%]::after {\n content: ' *';\n color: var(--mj-status-error);\n}\n\n.form-field[_ngcontent-%COMP%] .field-input[_ngcontent-%COMP%], \n.form-field[_ngcontent-%COMP%] .field-select[_ngcontent-%COMP%], \n.form-field[_ngcontent-%COMP%] .field-textarea[_ngcontent-%COMP%] {\n width: 100%;\n min-height: 44px;\n padding: 0.75rem 1rem;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-md);\n font-size: 0.9375rem;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n}\n\n.form-field[_ngcontent-%COMP%] .field-input[_ngcontent-%COMP%]:focus, \n.form-field[_ngcontent-%COMP%] .field-select[_ngcontent-%COMP%]:focus, \n.form-field[_ngcontent-%COMP%] .field-textarea[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-field[_ngcontent-%COMP%] .field-input.error[_ngcontent-%COMP%], \n.form-field[_ngcontent-%COMP%] .field-select.error[_ngcontent-%COMP%], \n.form-field[_ngcontent-%COMP%] .field-textarea.error[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.form-field[_ngcontent-%COMP%] .field-input.error[_ngcontent-%COMP%]:focus, \n.form-field[_ngcontent-%COMP%] .field-select.error[_ngcontent-%COMP%]:focus, \n.form-field[_ngcontent-%COMP%] .field-textarea.error[_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) 12%, transparent);\n}\n\n.form-field[_ngcontent-%COMP%] .field-input[_ngcontent-%COMP%]::placeholder, \n.form-field[_ngcontent-%COMP%] .field-textarea[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-secondary);\n}\n\n.form-field[_ngcontent-%COMP%] .field-textarea[_ngcontent-%COMP%] {\n min-height: 100px;\n resize: vertical;\n line-height: 1.5;\n}\n\n.form-field[_ngcontent-%COMP%] .field-error[_ngcontent-%COMP%] {\n margin-top: 0.25rem;\n font-size: 0.8125rem;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n\n.form-field[_ngcontent-%COMP%] .field-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n}\n\n.form-field[_ngcontent-%COMP%] .field-hint[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n}\n\n\n\n\n\n.alert[_ngcontent-%COMP%] {\n padding: 1rem 1.25rem;\n border-radius: var(--mj-radius-md);\n margin-bottom: 1rem;\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n}\n\n.alert[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1rem;\n flex-shrink: 0;\n margin-top: 0.125rem;\n}\n\n.alert.alert-error[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 20%, transparent);\n color: var(--mj-status-error);\n}\n\n.alert.alert-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n\n\n\n.subsection-title[_ngcontent-%COMP%] {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 1rem 0;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.assigned-entities[_ngcontent-%COMP%] {\n margin-bottom: 1.5rem;\n}\n\n.assigned-entities[_ngcontent-%COMP%] .entities-list[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n background: var(--mj-bg-page);\n}\n\n.entity-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 1rem 1.25rem;\n border-bottom: 1px solid var(--mj-bg-surface);\n transition: all 0.15s ease;\n}\n\n.entity-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.entity-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.entity-item.is-new[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 8%, transparent);\n border-left: 3px solid var(--mj-status-success);\n}\n\n.entity-item.has-changes[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex: 1;\n min-width: 0;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n background: var(--mj-brand-accent-subtle);\n border-radius: var(--mj-radius-md);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-details[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-details[_ngcontent-%COMP%] .entity-name[_ngcontent-%COMP%] {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 0.125rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-details[_ngcontent-%COMP%] .entity-name[_ngcontent-%COMP%] .entity-info-icon[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n font-size: 0.875rem;\n cursor: help;\n opacity: 0.7;\n transition: all 0.15s ease;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-details[_ngcontent-%COMP%] .entity-name[_ngcontent-%COMP%] .entity-info-icon[_ngcontent-%COMP%]:hover {\n opacity: 1;\n transform: scale(1.1);\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n margin: 0 1.5rem;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] .config-item[_ngcontent-%COMP%] .config-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] .config-item[_ngcontent-%COMP%] .config-label[_ngcontent-%COMP%] .config-checkbox[_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] .sequence-badge[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n padding: 0.25rem 0.5rem;\n border-radius: var(--mj-radius-sm);\n font-size: 0.75rem;\n font-weight: 600;\n min-width: 24px;\n text-align: center;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.25rem;\n}\n\n\n\n\n\n.drag-handle[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n cursor: grab;\n margin-right: 0.75rem;\n font-size: 1rem;\n transition: color 0.2s ease;\n flex-shrink: 0;\n}\n\n.drag-handle[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n}\n\n.drag-handle[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.entity-item.cdk-drag-preview[_ngcontent-%COMP%] {\n box-shadow: var(--mj-shadow-xl);\n transform: rotate(1deg);\n opacity: 0.9;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-page);\n}\n\n.entity-item.cdk-drag-placeholder[_ngcontent-%COMP%] {\n opacity: 0.4;\n border-style: dashed;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.entity-item.cdk-drag-animating[_ngcontent-%COMP%] {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n.entities-list.cdk-drop-list-dragging[_ngcontent-%COMP%] .entity-item[_ngcontent-%COMP%]:not(.cdk-drag-placeholder) {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n\n\n\n\n.no-entities[_ngcontent-%COMP%], \n.all-assigned[_ngcontent-%COMP%] {\n text-align: center;\n padding: 2rem;\n color: var(--mj-text-secondary);\n}\n\n.no-entities[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.all-assigned[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n color: var(--mj-border-default);\n margin-bottom: 1rem;\n display: block;\n}\n\n.no-entities[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.all-assigned[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 0.25rem 0;\n font-size: 0.9375rem;\n}\n\n.no-entities[_ngcontent-%COMP%] .empty-subtext[_ngcontent-%COMP%], \n.all-assigned[_ngcontent-%COMP%] .empty-subtext[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n\n\n\n\n.available-entities-header[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-bottom: 1rem;\n}\n\n@media (min-width: 640px) {\n .available-entities-header[_ngcontent-%COMP%] {\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n }\n}\n\n.available-entities-header[_ngcontent-%COMP%] .subsection-title[_ngcontent-%COMP%] {\n margin: 0;\n}\n\n\n\n.entity-search[_ngcontent-%COMP%] {\n position: relative;\n min-width: 200px;\n max-width: 100%;\n width: 100%;\n}\n\n@media (min-width: 640px) {\n .entity-search[_ngcontent-%COMP%] {\n min-width: 280px;\n max-width: 400px;\n width: auto;\n }\n}\n\n@media (min-width: 768px) {\n .entity-search[_ngcontent-%COMP%] {\n min-width: 320px;\n max-width: 450px;\n }\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 1rem;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-secondary);\n font-size: 1rem;\n pointer-events: none;\n transition: color 0.2s ease;\n}\n\n@media (min-width: 768px) {\n .entity-search[_ngcontent-%COMP%] .entity-search-icon[_ngcontent-%COMP%] {\n left: 1.125rem;\n font-size: 1.125rem;\n }\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 0.875rem 2.75rem 0.875rem 2.75rem;\n border: 2px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-full);\n font-size: 1rem;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;\n min-height: 48px;\n box-shadow: var(--mj-shadow-sm);\n}\n\n@media (min-width: 768px) {\n .entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%] {\n padding: 1rem 3rem 1rem 3rem;\n min-height: 52px;\n font-size: 1.0625rem;\n border-radius: var(--mj-radius-full);\n }\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-secondary);\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-md), 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n background: var(--mj-bg-page);\n}\n\n.entity-search[_ngcontent-%COMP%]:focus-within .entity-search-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 0.75rem;\n top: 50%;\n transform: translateY(-50%);\n padding: 0.375rem;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n min-height: 28px;\n transition: all 0.15s ease;\n}\n\n@media (min-width: 768px) {\n .entity-search[_ngcontent-%COMP%] .entity-search-clear[_ngcontent-%COMP%] {\n right: 0.875rem;\n min-width: 32px;\n min-height: 32px;\n }\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-clear[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n}\n\n\n\n.no-search-results[_ngcontent-%COMP%] {\n text-align: center;\n padding: 1.5rem;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-md);\n}\n\n.no-search-results[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n color: var(--mj-border-default);\n margin-bottom: 0.5rem;\n display: block;\n}\n\n.no-search-results[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.8125rem;\n}\n\n\n\n\n\n.available-entities[_ngcontent-%COMP%] .entities-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n gap: 0.5rem;\n}\n\n.entity-chip[_ngcontent-%COMP%] {\n padding: 0.75rem 1rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-page);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.entity-chip[_ngcontent-%COMP%] .chip-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.entity-chip[_ngcontent-%COMP%] .chip-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 0.875rem;\n}\n\n.entity-chip[_ngcontent-%COMP%] .chip-content[_ngcontent-%COMP%] .chip-name[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.entity-chip[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-brand-accent-subtle);\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-sm);\n}\n\n\n\n\n\n.info-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 1rem;\n}\n\n.info-grid[_ngcontent-%COMP%] .info-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.info-grid[_ngcontent-%COMP%] .info-item[_ngcontent-%COMP%] .info-label[_ngcontent-%COMP%] {\n font-size: 0.6875rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.info-grid[_ngcontent-%COMP%] .info-item[_ngcontent-%COMP%] .info-value[_ngcontent-%COMP%] {\n font-size: 0.9375rem;\n color: var(--mj-text-primary);\n}\n\n\n\n\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: none;\n border-radius: var(--mj-radius-full);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.875rem;\n}\n\n.btn-icon[_ngcontent-%COMP%]:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n.btn-icon.btn-neutral[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n}\n\n.btn-icon.btn-neutral[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n}\n\n.btn-icon.btn-danger[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.btn-icon.btn-danger[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n\n\n.btn-icon.btn-add[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.btn-icon.btn-add[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-light);\n box-shadow: var(--mj-shadow-md);\n}\n\n.btn-icon.btn-add[_ngcontent-%COMP%]:active:not(:disabled) {\n background: var(--mj-brand-primary-light);\n transform: scale(0.95);\n}\n\n\n\n\n\n.icon-wrapper[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.icon-wrapper-sm[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: var(--mj-radius-md);\n font-size: 0.875rem;\n}\n\n.icon-wrapper-md[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n border-radius: var(--mj-radius-md);\n font-size: 1rem;\n}\n\n.icon-wrapper-lg[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: var(--mj-radius-lg);\n font-size: 1.25rem;\n}\n\n.icon-wrapper-xl[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: var(--mj-radius-lg);\n font-size: 1.5rem;\n}\n\n\n\n.icon-wrapper-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-accent-subtle);\n color: var(--mj-brand-primary);\n}\n\n.icon-wrapper-secondary[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning);\n}\n\n.icon-wrapper-tertiary[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success);\n}\n\n.icon-wrapper-error[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n\n\n.icon-wrapper-inverted[_ngcontent-%COMP%] {\n background: var(--mj-brand-on-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n.mj-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.75rem 1.5rem;\n font-size: 0.875rem;\n font-weight: 600;\n border: none;\n border-radius: var(--mj-radius-full);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n white-space: nowrap;\n min-height: 44px;\n}\n\n.mj-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n\n\n.mj-btn-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.mj-btn-primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-light);\n box-shadow: var(--mj-shadow-md);\n}\n\n.mj-btn-primary[_ngcontent-%COMP%]:active:not(:disabled) {\n background: var(--mj-brand-primary-light);\n transform: scale(0.98);\n}\n\n\n\n.mj-btn-secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-page);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-border-strong);\n}\n\n.mj-btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-btn-secondary[_ngcontent-%COMP%]:active:not(:disabled) {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n\n\n\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes _ngcontent-%COMP%_slideUp {\n from {\n transform: translateY(20px);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n\n\n\n\n.field-input[_ngcontent-%COMP%]:focus-visible, \n.field-select[_ngcontent-%COMP%]:focus-visible, \n.field-textarea[_ngcontent-%COMP%]:focus-visible, \n.mj-btn[_ngcontent-%COMP%]:focus-visible, \n.btn-icon[_ngcontent-%COMP%]:focus-visible, \n.entity-chip[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n}\n\n\n\n\n\n@media (prefers-reduced-motion: reduce) {\n *[_ngcontent-%COMP%], \n *[_ngcontent-%COMP%]::before, \n *[_ngcontent-%COMP%]::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n\n\n\n\n@media (max-width: 639px) {\n .modal-backdrop[_ngcontent-%COMP%] {\n padding: 0.5rem;\n }\n\n .modal-dialog[_ngcontent-%COMP%] {\n border-radius: var(--mj-radius-2xl);\n max-height: 95vh;\n }\n\n \n\n .modal-dialog.fullscreen[_ngcontent-%COMP%] {\n border-radius: 0;\n max-height: 100vh;\n }\n\n .modal-header[_ngcontent-%COMP%] {\n padding: 1.25rem 1rem 1rem 1rem;\n }\n\n .modal-header[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] {\n font-size: 1.125rem;\n }\n\n .modal-header[_ngcontent-%COMP%] .modal-close[_ngcontent-%COMP%] {\n border-radius: var(--mj-radius-full);\n }\n\n \n\n .modal-header[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n font-size: 1rem;\n }\n\n \n\n .icon-wrapper-lg[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n font-size: 1rem;\n }\n\n .icon-wrapper-xl[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n font-size: 1.25rem;\n }\n\n \n\n .btn-icon.btn-add[_ngcontent-%COMP%] {\n border-radius: var(--mj-radius-full);\n }\n\n .form-section[_ngcontent-%COMP%] {\n padding: 1.25rem 1rem;\n }\n\n .form-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n\n .modal-footer[_ngcontent-%COMP%] {\n padding: 1rem;\n flex-direction: column;\n }\n\n .modal-footer[_ngcontent-%COMP%] .mj-btn[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: center;\n border-radius: var(--mj-radius-full);\n }\n\n \n\n .entity-item[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n gap: 0.75rem;\n padding: 0.875rem 1rem;\n position: relative;\n }\n\n \n\n .drag-handle[_ngcontent-%COMP%] {\n position: static;\n margin-right: 0.75rem;\n margin-bottom: 0.5rem;\n font-size: 1.25rem;\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n padding: 0.5rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-md);\n cursor: grab;\n }\n\n .drag-handle[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n background: var(--mj-brand-accent-subtle);\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] {\n gap: 0.75rem;\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n font-size: 0.875rem;\n border-radius: var(--mj-radius-md);\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-details[_ngcontent-%COMP%] .entity-name[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n word-break: break-word;\n overflow-wrap: break-word;\n line-height: 1.3;\n flex-wrap: wrap;\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] {\n margin: 0;\n width: 100%;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 0.75rem;\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] .config-item[_ngcontent-%COMP%] .config-label[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-actions[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: flex-end;\n gap: 0.5rem;\n }\n\n \n\n .available-entities[_ngcontent-%COMP%] .entities-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .entity-chip[_ngcontent-%COMP%] {\n padding: 0.625rem 0.875rem;\n border-radius: var(--mj-radius-md);\n }\n\n .entity-chip[_ngcontent-%COMP%] .chip-content[_ngcontent-%COMP%] .chip-name[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n word-break: break-word;\n }\n\n \n\n .entity-search[_ngcontent-%COMP%] {\n max-width: none;\n width: 100%;\n }\n\n .entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%] {\n padding: 0.75rem 2.5rem 0.75rem 2.5rem;\n min-height: 44px;\n font-size: 0.9375rem;\n border-radius: var(--mj-radius-full);\n }\n\n .entity-search[_ngcontent-%COMP%] .entity-search-icon[_ngcontent-%COMP%] {\n left: 0.875rem;\n font-size: 0.875rem;\n }\n\n .entity-search[_ngcontent-%COMP%] .entity-search-clear[_ngcontent-%COMP%] {\n right: 0.625rem;\n border-radius: var(--mj-radius-full);\n }\n\n .info-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr 1fr;\n }\n\n \n\n .btn-icon[_ngcontent-%COMP%] {\n border-radius: var(--mj-radius-full);\n }\n}\n\n\n\n@media (min-width: 640px) {\n .modal-dialog[_ngcontent-%COMP%] {\n max-width: 650px;\n }\n\n .available-entities[_ngcontent-%COMP%] .entities-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n }\n}\n\n\n\n@media (min-width: 768px) {\n .modal-dialog[_ngcontent-%COMP%] {\n max-width: 800px;\n }\n\n .modal-header[_ngcontent-%COMP%] {\n padding: 1.5rem 2rem 1.25rem 2rem;\n }\n\n .form-section[_ngcontent-%COMP%] {\n padding: 1.75rem 2rem;\n }\n\n .modal-footer[_ngcontent-%COMP%] {\n padding: 1.25rem 2rem;\n }\n}\n\n\n\n@media (min-width: 1024px) {\n .modal-dialog[_ngcontent-%COMP%] {\n max-width: 900px;\n }\n\n .available-entities[_ngcontent-%COMP%] .entities-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n }\n}"] });
701
+ } }, dependencies: [i1.ɵNgNoValidate, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.NgControlStatus, i1.NgControlStatusGroup, i1.NgModel, i1.FormGroupDirective, i1.FormControlName, i2.CdkDropList, i2.CdkDrag, i3.MJButtonDirective, i3.MJAlertComponent, i3.MJAccordionPanelComponent, i3.MJAccordionTitleDirective, i4.DatePipe], styles: ["\n\n\n\n\n\n\n\n\n\n.modal-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s cubic-bezier(0, 0, 0.2, 1);\n padding: 1rem;\n}\n\n.modal-dialog[_ngcontent-%COMP%] {\n background: var(--mj-bg-page);\n border-radius: var(--mj-radius-2xl);\n box-shadow: var(--mj-shadow-2xl);\n max-width: 900px;\n width: 100%;\n max-height: 90vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_slideUp 0.3s cubic-bezier(0, 0, 0.2, 1);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n\n\n.modal-dialog.fullscreen[_ngcontent-%COMP%] {\n max-width: 100vw;\n width: 100vw;\n max-height: 100vh;\n height: 100vh;\n border-radius: 0;\n margin: 0;\n}\n\n\n\n\n\n.modal-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 1.5rem 1.5rem 1rem 1.5rem;\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n flex-shrink: 0;\n}\n\n.modal-header-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: 1.375rem;\n font-weight: 600;\n color: var(--mj-brand-on-primary);\n margin: 0;\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.2);\n border-radius: var(--mj-radius-lg);\n font-size: 1.125rem;\n flex-shrink: 0;\n}\n\n\n\n.modal-header.create-mode[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n background: var(--mj-brand-on-primary);\n color: var(--mj-brand-primary);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n\n\n.modal-header.edit-mode[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n background: rgba(255, 255, 255, 0.2);\n color: var(--mj-brand-on-primary);\n}\n\n\n\n.modal-header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n flex-shrink: 0;\n margin-left: 0.5rem;\n}\n\n.modal-action-btn[_ngcontent-%COMP%] {\n padding: 0.625rem;\n border: none;\n background: transparent;\n color: var(--mj-brand-on-primary);\n font-size: 1.125rem;\n cursor: pointer;\n border-radius: var(--mj-radius-full);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.modal-action-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.modal-action-btn[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-brand-on-primary);\n outline-offset: 2px;\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-subtitle[_ngcontent-%COMP%] {\n margin: 0.375rem 0 0 0;\n font-size: 0.8125rem;\n color: var(--mj-brand-on-primary);\n opacity: 0.85;\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-close[_ngcontent-%COMP%] {\n padding: 0.625rem;\n border: none;\n background: transparent;\n color: var(--mj-brand-on-primary);\n font-size: 1.25rem;\n cursor: pointer;\n border-radius: var(--mj-radius-full);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-left: 0.5rem;\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-close[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-close[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-brand-on-primary);\n outline-offset: 2px;\n}\n\n\n\n\n\n.modal-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n padding: 0;\n background: var(--mj-bg-page);\n}\n\n\n\n\n\n.modal-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding: 1.25rem 1.5rem;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n flex-shrink: 0;\n}\n\n\n\n\n\n.form-section[_ngcontent-%COMP%] {\n border: none;\n margin: 0;\n padding: 1.5rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.form-section[_ngcontent-%COMP%]:last-of-type {\n border-bottom: none;\n}\n\n\n\n\n\n\n\n.app-dialog-section-title[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n min-width: 0;\n}\n\n.app-dialog-section-title[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 1.0625rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.app-dialog-section-title[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 0.875rem;\n}\n\n.app-dialog-section-title[_ngcontent-%COMP%] .section-description[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n font-weight: normal;\n}\n\n.section-content[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_expandSection 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes _ngcontent-%COMP%_expandSection {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n\n\n\n\n.form-grid[_ngcontent-%COMP%] {\n display: grid;\n gap: 1.25rem;\n}\n\n.form-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.25rem;\n}\n\n\n\n\n\n.form-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.form-field[_ngcontent-%COMP%] .field-label[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.form-field[_ngcontent-%COMP%] .field-label.required[_ngcontent-%COMP%]::after {\n content: ' *';\n color: var(--mj-status-error);\n}\n\n.form-field[_ngcontent-%COMP%] .field-input[_ngcontent-%COMP%], \n.form-field[_ngcontent-%COMP%] .field-select[_ngcontent-%COMP%], \n.form-field[_ngcontent-%COMP%] .field-textarea[_ngcontent-%COMP%] {\n width: 100%;\n min-height: 44px;\n padding: 0.75rem 1rem;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-md);\n font-size: 0.9375rem;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n}\n\n.form-field[_ngcontent-%COMP%] .field-input[_ngcontent-%COMP%]:focus, \n.form-field[_ngcontent-%COMP%] .field-select[_ngcontent-%COMP%]:focus, \n.form-field[_ngcontent-%COMP%] .field-textarea[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-field[_ngcontent-%COMP%] .field-input.error[_ngcontent-%COMP%], \n.form-field[_ngcontent-%COMP%] .field-select.error[_ngcontent-%COMP%], \n.form-field[_ngcontent-%COMP%] .field-textarea.error[_ngcontent-%COMP%] {\n border-color: var(--mj-status-error);\n}\n\n.form-field[_ngcontent-%COMP%] .field-input.error[_ngcontent-%COMP%]:focus, \n.form-field[_ngcontent-%COMP%] .field-select.error[_ngcontent-%COMP%]:focus, \n.form-field[_ngcontent-%COMP%] .field-textarea.error[_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) 12%, transparent);\n}\n\n.form-field[_ngcontent-%COMP%] .field-input[_ngcontent-%COMP%]::placeholder, \n.form-field[_ngcontent-%COMP%] .field-textarea[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-secondary);\n}\n\n.form-field[_ngcontent-%COMP%] .field-textarea[_ngcontent-%COMP%] {\n min-height: 100px;\n resize: vertical;\n line-height: 1.5;\n}\n\n.form-field[_ngcontent-%COMP%] .field-error[_ngcontent-%COMP%] {\n margin-top: 0.25rem;\n font-size: 0.8125rem;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n\n.form-field[_ngcontent-%COMP%] .field-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n}\n\n.form-field[_ngcontent-%COMP%] .field-hint[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n}\n\n\n\n\n\n.subsection-title[_ngcontent-%COMP%] {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 1rem 0;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.assigned-entities[_ngcontent-%COMP%] {\n margin-bottom: 1.5rem;\n}\n\n.assigned-entities[_ngcontent-%COMP%] .entities-list[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n background: var(--mj-bg-page);\n}\n\n.entity-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 1rem 1.25rem;\n border-bottom: 1px solid var(--mj-bg-surface);\n transition: all 0.15s ease;\n}\n\n.entity-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.entity-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.entity-item.is-new[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 8%, transparent);\n border-left: 3px solid var(--mj-status-success);\n}\n\n.entity-item.has-changes[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex: 1;\n min-width: 0;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n background: var(--mj-brand-accent-subtle);\n border-radius: var(--mj-radius-md);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-details[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-details[_ngcontent-%COMP%] .entity-name[_ngcontent-%COMP%] {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 0.125rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-details[_ngcontent-%COMP%] .entity-name[_ngcontent-%COMP%] .entity-info-icon[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n font-size: 0.875rem;\n cursor: help;\n opacity: 0.7;\n transition: all 0.15s ease;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-details[_ngcontent-%COMP%] .entity-name[_ngcontent-%COMP%] .entity-info-icon[_ngcontent-%COMP%]:hover {\n opacity: 1;\n transform: scale(1.1);\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n margin: 0 1.5rem;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] .config-item[_ngcontent-%COMP%] .config-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] .config-item[_ngcontent-%COMP%] .config-label[_ngcontent-%COMP%] .config-checkbox[_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] .sequence-badge[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n padding: 0.25rem 0.5rem;\n border-radius: var(--mj-radius-sm);\n font-size: 0.75rem;\n font-weight: 600;\n min-width: 24px;\n text-align: center;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.25rem;\n}\n\n\n\n\n\n.drag-handle[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n cursor: grab;\n margin-right: 0.75rem;\n font-size: 1rem;\n transition: color 0.2s ease;\n flex-shrink: 0;\n}\n\n.drag-handle[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary);\n}\n\n.drag-handle[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.entity-item.cdk-drag-preview[_ngcontent-%COMP%] {\n box-shadow: var(--mj-shadow-xl);\n transform: rotate(1deg);\n opacity: 0.9;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-page);\n}\n\n.entity-item.cdk-drag-placeholder[_ngcontent-%COMP%] {\n opacity: 0.4;\n border-style: dashed;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.entity-item.cdk-drag-animating[_ngcontent-%COMP%] {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n.entities-list.cdk-drop-list-dragging[_ngcontent-%COMP%] .entity-item[_ngcontent-%COMP%]:not(.cdk-drag-placeholder) {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n\n\n\n\n.no-entities[_ngcontent-%COMP%], \n.all-assigned[_ngcontent-%COMP%] {\n text-align: center;\n padding: 2rem;\n color: var(--mj-text-secondary);\n}\n\n.no-entities[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.all-assigned[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n color: var(--mj-border-default);\n margin-bottom: 1rem;\n display: block;\n}\n\n.no-entities[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.all-assigned[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 0.25rem 0;\n font-size: 0.9375rem;\n}\n\n.no-entities[_ngcontent-%COMP%] .empty-subtext[_ngcontent-%COMP%], \n.all-assigned[_ngcontent-%COMP%] .empty-subtext[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n\n\n\n\n.available-entities-header[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-bottom: 1rem;\n}\n\n@media (min-width: 640px) {\n .available-entities-header[_ngcontent-%COMP%] {\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n }\n}\n\n.available-entities-header[_ngcontent-%COMP%] .subsection-title[_ngcontent-%COMP%] {\n margin: 0;\n}\n\n\n\n.entity-search[_ngcontent-%COMP%] {\n position: relative;\n min-width: 200px;\n max-width: 100%;\n width: 100%;\n}\n\n@media (min-width: 640px) {\n .entity-search[_ngcontent-%COMP%] {\n min-width: 280px;\n max-width: 400px;\n width: auto;\n }\n}\n\n@media (min-width: 768px) {\n .entity-search[_ngcontent-%COMP%] {\n min-width: 320px;\n max-width: 450px;\n }\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 1rem;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-secondary);\n font-size: 1rem;\n pointer-events: none;\n transition: color 0.2s ease;\n}\n\n@media (min-width: 768px) {\n .entity-search[_ngcontent-%COMP%] .entity-search-icon[_ngcontent-%COMP%] {\n left: 1.125rem;\n font-size: 1.125rem;\n }\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 0.875rem 2.75rem 0.875rem 2.75rem;\n border: 2px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-full);\n font-size: 1rem;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;\n min-height: 48px;\n box-shadow: var(--mj-shadow-sm);\n}\n\n@media (min-width: 768px) {\n .entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%] {\n padding: 1rem 3rem 1rem 3rem;\n min-height: 52px;\n font-size: 1.0625rem;\n border-radius: var(--mj-radius-full);\n }\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-secondary);\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-md), 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n background: var(--mj-bg-page);\n}\n\n.entity-search[_ngcontent-%COMP%]:focus-within .entity-search-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 0.75rem;\n top: 50%;\n transform: translateY(-50%);\n padding: 0.375rem;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n min-height: 28px;\n transition: all 0.15s ease;\n}\n\n@media (min-width: 768px) {\n .entity-search[_ngcontent-%COMP%] .entity-search-clear[_ngcontent-%COMP%] {\n right: 0.875rem;\n min-width: 32px;\n min-height: 32px;\n }\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-clear[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n}\n\n\n\n.no-search-results[_ngcontent-%COMP%] {\n text-align: center;\n padding: 1.5rem;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-md);\n}\n\n.no-search-results[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n color: var(--mj-border-default);\n margin-bottom: 0.5rem;\n display: block;\n}\n\n.no-search-results[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.8125rem;\n}\n\n\n\n\n\n.available-entities[_ngcontent-%COMP%] .entities-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n gap: 0.5rem;\n}\n\n.entity-chip[_ngcontent-%COMP%] {\n padding: 0.75rem 1rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-page);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.entity-chip[_ngcontent-%COMP%] .chip-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.entity-chip[_ngcontent-%COMP%] .chip-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 0.875rem;\n}\n\n.entity-chip[_ngcontent-%COMP%] .chip-content[_ngcontent-%COMP%] .chip-name[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.entity-chip[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-brand-accent-subtle);\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-sm);\n}\n\n\n\n\n\n.info-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 1rem;\n}\n\n.info-grid[_ngcontent-%COMP%] .info-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.info-grid[_ngcontent-%COMP%] .info-item[_ngcontent-%COMP%] .info-label[_ngcontent-%COMP%] {\n font-size: 0.6875rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.info-grid[_ngcontent-%COMP%] .info-item[_ngcontent-%COMP%] .info-value[_ngcontent-%COMP%] {\n font-size: 0.9375rem;\n color: var(--mj-text-primary);\n}\n\n\n\n\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: none;\n border-radius: var(--mj-radius-full);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.875rem;\n}\n\n.btn-icon[_ngcontent-%COMP%]:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n.btn-icon.btn-neutral[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n}\n\n.btn-icon.btn-neutral[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n}\n\n.btn-icon.btn-danger[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.btn-icon.btn-danger[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n\n\n.btn-icon.btn-add[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.btn-icon.btn-add[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-light);\n box-shadow: var(--mj-shadow-md);\n}\n\n.btn-icon.btn-add[_ngcontent-%COMP%]:active:not(:disabled) {\n background: var(--mj-brand-primary-light);\n transform: scale(0.95);\n}\n\n\n\n\n\n.icon-wrapper[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.icon-wrapper-sm[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: var(--mj-radius-md);\n font-size: 0.875rem;\n}\n\n.icon-wrapper-md[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n border-radius: var(--mj-radius-md);\n font-size: 1rem;\n}\n\n.icon-wrapper-lg[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: var(--mj-radius-lg);\n font-size: 1.25rem;\n}\n\n.icon-wrapper-xl[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: var(--mj-radius-lg);\n font-size: 1.5rem;\n}\n\n\n\n.icon-wrapper-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-accent-subtle);\n color: var(--mj-brand-primary);\n}\n\n.icon-wrapper-secondary[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning);\n}\n\n.icon-wrapper-tertiary[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success);\n}\n\n.icon-wrapper-error[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n\n\n.icon-wrapper-inverted[_ngcontent-%COMP%] {\n background: var(--mj-brand-on-primary);\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n\n\n\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes _ngcontent-%COMP%_slideUp {\n from {\n transform: translateY(20px);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n\n\n\n\n.field-input[_ngcontent-%COMP%]:focus-visible, \n.field-select[_ngcontent-%COMP%]:focus-visible, \n.field-textarea[_ngcontent-%COMP%]:focus-visible, \n.btn-icon[_ngcontent-%COMP%]:focus-visible, \n.entity-chip[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n}\n\n\n\n\n\n@media (prefers-reduced-motion: reduce) {\n *[_ngcontent-%COMP%], \n *[_ngcontent-%COMP%]::before, \n *[_ngcontent-%COMP%]::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n\n\n\n\n@media (max-width: 639px) {\n .modal-backdrop[_ngcontent-%COMP%] {\n padding: 0.5rem;\n }\n\n .modal-dialog[_ngcontent-%COMP%] {\n border-radius: var(--mj-radius-2xl);\n max-height: 95vh;\n }\n\n \n\n .modal-dialog.fullscreen[_ngcontent-%COMP%] {\n border-radius: 0;\n max-height: 100vh;\n }\n\n .modal-header[_ngcontent-%COMP%] {\n padding: 1.25rem 1rem 1rem 1rem;\n }\n\n .modal-header[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] {\n font-size: 1.125rem;\n }\n\n .modal-header[_ngcontent-%COMP%] .modal-close[_ngcontent-%COMP%] {\n border-radius: var(--mj-radius-full);\n }\n\n \n\n .modal-header[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n font-size: 1rem;\n }\n\n \n\n .icon-wrapper-lg[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n font-size: 1rem;\n }\n\n .icon-wrapper-xl[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n font-size: 1.25rem;\n }\n\n \n\n .btn-icon.btn-add[_ngcontent-%COMP%] {\n border-radius: var(--mj-radius-full);\n }\n\n .form-section[_ngcontent-%COMP%] {\n padding: 1.25rem 1rem;\n }\n\n .form-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n\n .modal-footer[_ngcontent-%COMP%] {\n padding: 1rem;\n flex-direction: column;\n }\n\n \n\n\n .modal-footer[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: center;\n }\n\n \n\n .entity-item[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n gap: 0.75rem;\n padding: 0.875rem 1rem;\n position: relative;\n }\n\n \n\n .drag-handle[_ngcontent-%COMP%] {\n position: static;\n margin-right: 0.75rem;\n margin-bottom: 0.5rem;\n font-size: 1.25rem;\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n padding: 0.5rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-md);\n cursor: grab;\n }\n\n .drag-handle[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n background: var(--mj-brand-accent-subtle);\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] {\n gap: 0.75rem;\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n font-size: 0.875rem;\n border-radius: var(--mj-radius-md);\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-details[_ngcontent-%COMP%] .entity-name[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n word-break: break-word;\n overflow-wrap: break-word;\n line-height: 1.3;\n flex-wrap: wrap;\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] {\n margin: 0;\n width: 100%;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 0.75rem;\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] .config-item[_ngcontent-%COMP%] .config-label[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-actions[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: flex-end;\n gap: 0.5rem;\n }\n\n \n\n .available-entities[_ngcontent-%COMP%] .entities-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .entity-chip[_ngcontent-%COMP%] {\n padding: 0.625rem 0.875rem;\n border-radius: var(--mj-radius-md);\n }\n\n .entity-chip[_ngcontent-%COMP%] .chip-content[_ngcontent-%COMP%] .chip-name[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n word-break: break-word;\n }\n\n \n\n .entity-search[_ngcontent-%COMP%] {\n max-width: none;\n width: 100%;\n }\n\n .entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%] {\n padding: 0.75rem 2.5rem 0.75rem 2.5rem;\n min-height: 44px;\n font-size: 0.9375rem;\n border-radius: var(--mj-radius-full);\n }\n\n .entity-search[_ngcontent-%COMP%] .entity-search-icon[_ngcontent-%COMP%] {\n left: 0.875rem;\n font-size: 0.875rem;\n }\n\n .entity-search[_ngcontent-%COMP%] .entity-search-clear[_ngcontent-%COMP%] {\n right: 0.625rem;\n border-radius: var(--mj-radius-full);\n }\n\n .info-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr 1fr;\n }\n\n \n\n .btn-icon[_ngcontent-%COMP%] {\n border-radius: var(--mj-radius-full);\n }\n}\n\n\n\n@media (min-width: 640px) {\n .modal-dialog[_ngcontent-%COMP%] {\n max-width: 650px;\n }\n\n .available-entities[_ngcontent-%COMP%] .entities-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n }\n}\n\n\n\n@media (min-width: 768px) {\n .modal-dialog[_ngcontent-%COMP%] {\n max-width: 800px;\n }\n\n .modal-header[_ngcontent-%COMP%] {\n padding: 1.5rem 2rem 1.25rem 2rem;\n }\n\n .form-section[_ngcontent-%COMP%] {\n padding: 1.75rem 2rem;\n }\n\n .modal-footer[_ngcontent-%COMP%] {\n padding: 1.25rem 2rem;\n }\n}\n\n\n\n@media (min-width: 1024px) {\n .modal-dialog[_ngcontent-%COMP%] {\n max-width: 900px;\n }\n\n .available-entities[_ngcontent-%COMP%] .entities-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n }\n}"] });
726
702
  }
727
703
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ApplicationDialogComponent, [{
728
704
  type: Component,
729
- args: [{ standalone: false, selector: 'mj-application-dialog', template: "@if (visible) {\n <div class=\"modal-backdrop\" (click)=\"onCancel()\" role=\"presentation\">\n <div\n class=\"modal-dialog\"\n [class.fullscreen]=\"isFullscreen\"\n (click)=\"$event.stopPropagation()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"application-dialog-title\"\n aria-describedby=\"application-dialog-description\"\n >\n <!-- Modal Header -->\n <div class=\"modal-header\" [class.create-mode]=\"!isEditMode\" [class.edit-mode]=\"isEditMode\">\n <div class=\"modal-header-content\">\n <h2 class=\"modal-title\" id=\"application-dialog-title\">\n <i class=\"fa-solid\" [class.fa-plus]=\"!isEditMode\" [class.fa-layer-group]=\"isEditMode\" aria-hidden=\"true\"></i>\n {{ isEditMode ? 'Edit Application' : 'Create New Application' }}\n </h2>\n <p class=\"modal-subtitle\" id=\"application-dialog-description\">\n {{ isEditMode ? 'Update application information and settings' : 'Add a new application to the system' }}\n </p>\n </div>\n <div class=\"modal-header-actions\">\n <button\n class=\"modal-action-btn\"\n (click)=\"toggleFullscreen()\"\n [attr.aria-label]=\"isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'\"\n type=\"button\"\n >\n <i class=\"fa-solid\" [class.fa-compress]=\"isFullscreen\" [class.fa-expand]=\"!isFullscreen\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"modal-close\"\n (click)=\"onCancel()\"\n aria-label=\"Close dialog\"\n type=\"button\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <!-- Modal Body -->\n <div class=\"modal-body\">\n <form [formGroup]=\"applicationForm\" (ngSubmit)=\"onSubmit()\">\n <!-- Error Alert -->\n @if (error) {\n <div class=\"form-section\">\n <div class=\"alert alert-error\" role=\"alert\">\n <i class=\"fa-solid fa-exclamation-triangle\" aria-hidden=\"true\"></i>\n <div>{{ error }}</div>\n </div>\n </div>\n }\n\n <!-- Basic Information Section -->\n <fieldset class=\"form-section collapsible-section\">\n <legend class=\"section-header clickable\" (click)=\"toggleSection('basicInfo')\">\n <div class=\"section-title-row\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-info-circle\" aria-hidden=\"true\"></i>\n Application Information\n </span>\n <i class=\"fa-solid chevron-icon\"\n [class.fa-chevron-up]=\"sectionExpanded.basicInfo\"\n [class.fa-chevron-down]=\"!sectionExpanded.basicInfo\"\n aria-hidden=\"true\"></i>\n </div>\n <span class=\"section-description\">Define the application's basic properties</span>\n </legend>\n\n @if (sectionExpanded.basicInfo) {\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <div class=\"form-field\">\n <label class=\"field-label required\" for=\"app-name\">Application Name</label>\n <input\n id=\"app-name\"\n type=\"text\"\n class=\"field-input\"\n formControlName=\"name\"\n placeholder=\"My Application\"\n [class.error]=\"applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched\"\n [attr.aria-invalid]=\"applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched\"\n aria-describedby=\"app-name-error\"\n />\n @if (applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched) {\n <div class=\"field-error\" id=\"app-name-error\" role=\"alert\">\n <i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"></i>\n @if (applicationForm.get('name')?.errors?.['required']) {\n Application name is required\n }\n @if (applicationForm.get('name')?.errors?.['maxlength']) {\n Application name cannot exceed 100 characters\n }\n </div>\n }\n </div>\n\n <div class=\"form-field\">\n <label class=\"field-label\" for=\"app-description\">Description</label>\n <textarea\n id=\"app-description\"\n class=\"field-textarea\"\n formControlName=\"description\"\n placeholder=\"Describe the application's purpose and functionality...\"\n rows=\"4\"\n ></textarea>\n <div class=\"field-hint\">\n Provide a clear description of what this application does and its main features.\n </div>\n </div>\n </div>\n </div>\n }\n </fieldset>\n\n <!-- Entity Management Section -->\n <fieldset class=\"form-section collapsible-section\">\n <legend class=\"section-header clickable\" (click)=\"toggleSection('entities')\">\n <div class=\"section-title-row\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n Application Entities\n </span>\n <i class=\"fa-solid chevron-icon\"\n [class.fa-chevron-up]=\"sectionExpanded.entities\"\n [class.fa-chevron-down]=\"!sectionExpanded.entities\"\n aria-hidden=\"true\"></i>\n </div>\n <span class=\"section-description\">Manage which entities are included in this application</span>\n </legend>\n\n @if (sectionExpanded.entities) {\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <!-- Assigned Entities -->\n @if (applicationEntities.length > 0) {\n <div class=\"assigned-entities\">\n <h4 class=\"subsection-title\">Assigned Entities ({{ applicationEntities.length }})</h4>\n <div class=\"entities-list\"\n role=\"list\"\n cdkDropList\n (cdkDropListDropped)=\"onEntityDrop($event)\">\n @for (config of applicationEntities; track config.entity.ID; let i = $index) {\n <div\n class=\"entity-item\"\n [class.is-new]=\"config.isNew\"\n [class.has-changes]=\"config.hasChanges\"\n role=\"listitem\"\n cdkDrag\n >\n <i class=\"fa-solid fa-grip-vertical drag-handle\" aria-hidden=\"true\"></i>\n <div class=\"entity-info\">\n <div class=\"entity-icon\">\n <i class=\"fa-solid fa-table\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"entity-details\">\n <div class=\"entity-name\">\n {{ config.entity.Name }}\n @if (config.entity.Description) {\n <i\n class=\"fa-solid fa-info-circle entity-info-icon\"\n [title]=\"config.entity.Description\"\n [attr.aria-label]=\"'Entity description: ' + config.entity.Description\"\n ></i>\n }\n </div>\n </div>\n </div>\n\n <div class=\"entity-config\">\n <div class=\"config-item\">\n <label class=\"config-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"config.defaultForNewUser\"\n [ngModelOptions]=\"{standalone: true}\"\n (change)=\"onDefaultForNewUserChange(config)\"\n class=\"config-checkbox\"\n />\n <span class=\"checkbox-text\">Default for new users</span>\n </label>\n </div>\n <div class=\"sequence-badge\" [attr.aria-label]=\"'Sequence ' + config.sequence\">{{ config.sequence }}</div>\n </div>\n\n <div class=\"entity-actions\">\n <button\n type=\"button\"\n class=\"btn-icon btn-danger\"\n (click)=\"removeEntity(config)\"\n title=\"Remove entity\"\n [attr.aria-label]=\"'Remove ' + config.entity.Name\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"no-entities\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n <p>No entities assigned to this application</p>\n <p class=\"empty-subtext\">Add entities from the available list below</p>\n </div>\n }\n\n <!-- Available Entities -->\n @if (availableEntities.length > 0) {\n <div class=\"available-entities\">\n <div class=\"available-entities-header\">\n <h4 class=\"subsection-title\">Available Entities ({{ filteredAvailableEntities.length }} of {{ availableEntities.length }})</h4>\n <div class=\"entity-search\">\n <i class=\"fa-solid fa-search entity-search-icon\" aria-hidden=\"true\"></i>\n <input\n type=\"text\"\n class=\"entity-search-input\"\n placeholder=\"Search entities...\"\n [value]=\"entitySearchTerm\"\n (input)=\"onEntitySearchChange($event)\"\n aria-label=\"Search available entities\"\n />\n @if (entitySearchTerm) {\n <button\n type=\"button\"\n class=\"entity-search-clear\"\n (click)=\"clearEntitySearch()\"\n aria-label=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n @if (filteredAvailableEntities.length > 0) {\n <div class=\"entities-grid\" role=\"list\">\n @for (entity of filteredAvailableEntities; track entity.ID) {\n <button\n type=\"button\"\n class=\"entity-chip\"\n (click)=\"addEntity(entity)\"\n role=\"listitem\"\n [attr.aria-label]=\"'Add ' + entity.Name\"\n >\n <div class=\"chip-content\">\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n <span class=\"chip-name\">{{ entity.Name }}</span>\n </div>\n </button>\n }\n </div>\n } @else {\n <div class=\"no-search-results\">\n <i class=\"fa-solid fa-search\" aria-hidden=\"true\"></i>\n <p>No entities match \"{{ entitySearchTerm }}\"</p>\n </div>\n }\n </div>\n } @else {\n <div class=\"all-assigned\">\n <i class=\"fa-solid fa-check-circle\" aria-hidden=\"true\"></i>\n <p>All entities have been assigned to this application</p>\n </div>\n }\n </div>\n </div>\n }\n </fieldset>\n\n <!-- System Information Section (Edit Mode Only) -->\n @if (isEditMode) {\n <fieldset class=\"form-section collapsible-section\">\n <legend class=\"section-header clickable\" (click)=\"toggleSection('systemInfo')\">\n <div class=\"section-title-row\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-info-circle\" aria-hidden=\"true\"></i>\n System Information\n </span>\n <i class=\"fa-solid chevron-icon\"\n [class.fa-chevron-up]=\"sectionExpanded.systemInfo\"\n [class.fa-chevron-down]=\"!sectionExpanded.systemInfo\"\n aria-hidden=\"true\"></i>\n </div>\n <span class=\"section-description\">Application metadata and audit information</span>\n </legend>\n\n @if (sectionExpanded.systemInfo) {\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Created</span>\n <span class=\"info-value\">{{ data?.application?.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Last Updated</span>\n <span class=\"info-value\">{{ data?.application?.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Application ID</span>\n <span class=\"info-value\">{{ data?.application?.ID }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Total Entities</span>\n <span class=\"info-value\">{{ applicationEntities.length }}</span>\n </div>\n </div>\n </div>\n </div>\n }\n </fieldset>\n }\n </form>\n </div>\n\n <!-- Modal Footer - Primary and Cancel buttons on RIGHT -->\n <div class=\"modal-footer\">\n <button\n type=\"submit\"\n mjButton variant=\"primary\"\n [disabled]=\"applicationForm.invalid || isLoading\"\n (click)=\"onSubmit()\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-save\" aria-hidden=\"true\"></i>\n {{ isEditMode ? 'Update Application' : 'Create Application' }}\n }\n </button>\n <button type=\"button\" mjButton (click)=\"onCancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n}\n", styles: ["/* =============================================================================\n Application Dialog Component\n Uses MJ Design Tokens (--mj-*)\n ============================================================================= */\n\n/* -----------------------------------------------------------------------------\n Modal Backdrop & Container\n ----------------------------------------------------------------------------- */\n.modal-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n animation: fadeIn 0.2s cubic-bezier(0, 0, 0.2, 1);\n padding: 1rem;\n}\n\n.modal-dialog {\n background: var(--mj-bg-page);\n border-radius: var(--mj-radius-2xl);\n box-shadow: var(--mj-shadow-2xl);\n max-width: 900px;\n width: 100%;\n max-height: 90vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n animation: slideUp 0.3s cubic-bezier(0, 0, 0.2, 1);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n/* Fullscreen mode */\n.modal-dialog.fullscreen {\n max-width: 100vw;\n width: 100vw;\n max-height: 100vh;\n height: 100vh;\n border-radius: 0;\n margin: 0;\n}\n\n/* -----------------------------------------------------------------------------\n Modal Header\n ----------------------------------------------------------------------------- */\n.modal-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 1.5rem 1.5rem 1rem 1.5rem;\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n flex-shrink: 0;\n}\n\n.modal-header-content {\n flex: 1;\n min-width: 0;\n}\n\n.modal-header .modal-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: 1.375rem;\n font-weight: 600;\n color: var(--mj-brand-on-primary);\n margin: 0;\n}\n\n.modal-header .modal-title i {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.2);\n border-radius: var(--mj-radius-lg);\n font-size: 1.125rem;\n flex-shrink: 0;\n}\n\n/* Create mode - Plus icon with inverted styling */\n.modal-header.create-mode .modal-title i {\n background: var(--mj-brand-on-primary);\n color: var(--mj-brand-primary);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n/* Edit mode - Grid icon with semi-transparent background */\n.modal-header.edit-mode .modal-title i {\n background: rgba(255, 255, 255, 0.2);\n color: var(--mj-brand-on-primary);\n}\n\n/* Modal Header Actions */\n.modal-header-actions {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n flex-shrink: 0;\n margin-left: 0.5rem;\n}\n\n.modal-action-btn {\n padding: 0.625rem;\n border: none;\n background: transparent;\n color: var(--mj-brand-on-primary);\n font-size: 1.125rem;\n cursor: pointer;\n border-radius: var(--mj-radius-full);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.modal-action-btn:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.modal-action-btn:focus-visible {\n outline: 2px solid var(--mj-brand-on-primary);\n outline-offset: 2px;\n}\n\n.modal-header .modal-subtitle {\n margin: 0.375rem 0 0 0;\n font-size: 0.8125rem;\n color: var(--mj-brand-on-primary);\n opacity: 0.85;\n}\n\n.modal-header .modal-close {\n padding: 0.625rem;\n border: none;\n background: transparent;\n color: var(--mj-brand-on-primary);\n font-size: 1.25rem;\n cursor: pointer;\n border-radius: var(--mj-radius-full);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-left: 0.5rem;\n}\n\n.modal-header .modal-close:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.modal-header .modal-close:focus-visible {\n outline: 2px solid var(--mj-brand-on-primary);\n outline-offset: 2px;\n}\n\n/* -----------------------------------------------------------------------------\n Modal Body\n ----------------------------------------------------------------------------- */\n.modal-body {\n flex: 1;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n padding: 0;\n background: var(--mj-bg-page);\n}\n\n/* -----------------------------------------------------------------------------\n Modal Footer - Primary and Cancel buttons on RIGHT\n ----------------------------------------------------------------------------- */\n.modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding: 1.25rem 1.5rem;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n flex-shrink: 0;\n}\n\n/* -----------------------------------------------------------------------------\n Form Sections (Fieldset)\n ----------------------------------------------------------------------------- */\n.form-section {\n border: none;\n margin: 0;\n padding: 1.5rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.form-section:last-of-type {\n border-bottom: none;\n}\n\n.section-header {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n margin-bottom: 1.25rem;\n padding: 0;\n font-weight: normal;\n}\n\n.section-header .section-title {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 1.0625rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.section-header .section-title i {\n color: var(--mj-brand-primary);\n font-size: 0.875rem;\n}\n\n.section-header .section-description {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n/* -----------------------------------------------------------------------------\n Collapsible Sections\n ----------------------------------------------------------------------------- */\n.collapsible-section .section-header.clickable {\n cursor: pointer;\n user-select: none;\n transition: background-color 0.2s ease;\n padding: 0.75rem 0;\n margin: -0.75rem 0 0.75rem 0;\n}\n\n.collapsible-section .section-header.clickable:hover {\n opacity: 0.8;\n}\n\n.section-title-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n margin-bottom: 0.25rem;\n}\n\n.chevron-icon {\n color: var(--mj-text-secondary);\n font-size: 0.875rem;\n transition: transform 0.2s ease;\n flex-shrink: 0;\n}\n\n.section-content {\n animation: expandSection 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes expandSection {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* -----------------------------------------------------------------------------\n Form Grid Layout\n ----------------------------------------------------------------------------- */\n.form-grid {\n display: grid;\n gap: 1.25rem;\n}\n\n.form-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.25rem;\n}\n\n/* -----------------------------------------------------------------------------\n Form Fields\n ----------------------------------------------------------------------------- */\n.form-field {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.form-field .field-label {\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.form-field .field-label.required::after {\n content: ' *';\n color: var(--mj-status-error);\n}\n\n.form-field .field-input,\n.form-field .field-select,\n.form-field .field-textarea {\n width: 100%;\n min-height: 44px;\n padding: 0.75rem 1rem;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-md);\n font-size: 0.9375rem;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n}\n\n.form-field .field-input:focus,\n.form-field .field-select:focus,\n.form-field .field-textarea:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-field .field-input.error,\n.form-field .field-select.error,\n.form-field .field-textarea.error {\n border-color: var(--mj-status-error);\n}\n\n.form-field .field-input.error:focus,\n.form-field .field-select.error:focus,\n.form-field .field-textarea.error:focus {\n border-color: var(--mj-status-error);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.form-field .field-input::placeholder,\n.form-field .field-textarea::placeholder {\n color: var(--mj-text-secondary);\n}\n\n.form-field .field-textarea {\n min-height: 100px;\n resize: vertical;\n line-height: 1.5;\n}\n\n.form-field .field-error {\n margin-top: 0.25rem;\n font-size: 0.8125rem;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n\n.form-field .field-error i {\n font-size: 0.625rem;\n}\n\n.form-field .field-hint {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n}\n\n/* -----------------------------------------------------------------------------\n Alert Messages\n ----------------------------------------------------------------------------- */\n.alert {\n padding: 1rem 1.25rem;\n border-radius: var(--mj-radius-md);\n margin-bottom: 1rem;\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n}\n\n.alert i {\n font-size: 1rem;\n flex-shrink: 0;\n margin-top: 0.125rem;\n}\n\n.alert.alert-error {\n background: var(--mj-status-error-bg);\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 20%, transparent);\n color: var(--mj-status-error);\n}\n\n.alert.alert-error i {\n color: var(--mj-status-error);\n}\n\n/* -----------------------------------------------------------------------------\n Entity Management Styles\n ----------------------------------------------------------------------------- */\n.subsection-title {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 1rem 0;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.assigned-entities {\n margin-bottom: 1.5rem;\n}\n\n.assigned-entities .entities-list {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n background: var(--mj-bg-page);\n}\n\n.entity-item {\n display: flex;\n align-items: center;\n padding: 1rem 1.25rem;\n border-bottom: 1px solid var(--mj-bg-surface);\n transition: all 0.15s ease;\n}\n\n.entity-item:last-child {\n border-bottom: none;\n}\n\n.entity-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.entity-item.is-new {\n background: color-mix(in srgb, var(--mj-status-success) 8%, transparent);\n border-left: 3px solid var(--mj-status-success);\n}\n\n.entity-item.has-changes {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.entity-item .entity-info {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex: 1;\n min-width: 0;\n}\n\n.entity-item .entity-info .entity-icon {\n width: 40px;\n height: 40px;\n background: var(--mj-brand-accent-subtle);\n border-radius: var(--mj-radius-md);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.entity-item .entity-info .entity-details {\n flex: 1;\n min-width: 0;\n}\n\n.entity-item .entity-info .entity-details .entity-name {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 0.125rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.entity-item .entity-info .entity-details .entity-name .entity-info-icon {\n color: var(--mj-status-warning);\n font-size: 0.875rem;\n cursor: help;\n opacity: 0.7;\n transition: all 0.15s ease;\n}\n\n.entity-item .entity-info .entity-details .entity-name .entity-info-icon:hover {\n opacity: 1;\n transform: scale(1.1);\n}\n\n.entity-item .entity-config {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n margin: 0 1.5rem;\n}\n\n.entity-item .entity-config .config-item .config-label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.entity-item .entity-config .config-item .config-label .config-checkbox {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.entity-item .entity-config .sequence-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n padding: 0.25rem 0.5rem;\n border-radius: var(--mj-radius-sm);\n font-size: 0.75rem;\n font-weight: 600;\n min-width: 24px;\n text-align: center;\n}\n\n.entity-item .entity-actions {\n display: flex;\n gap: 0.25rem;\n}\n\n/* -----------------------------------------------------------------------------\n Drag and Drop Styles\n ----------------------------------------------------------------------------- */\n.drag-handle {\n color: var(--mj-text-secondary);\n cursor: grab;\n margin-right: 0.75rem;\n font-size: 1rem;\n transition: color 0.2s ease;\n flex-shrink: 0;\n}\n\n.drag-handle:hover {\n color: var(--mj-brand-primary);\n}\n\n.drag-handle:active {\n cursor: grabbing;\n}\n\n.entity-item.cdk-drag-preview {\n box-shadow: var(--mj-shadow-xl);\n transform: rotate(1deg);\n opacity: 0.9;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-page);\n}\n\n.entity-item.cdk-drag-placeholder {\n opacity: 0.4;\n border-style: dashed;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.entity-item.cdk-drag-animating {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n.entities-list.cdk-drop-list-dragging .entity-item:not(.cdk-drag-placeholder) {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n/* -----------------------------------------------------------------------------\n Empty States\n ----------------------------------------------------------------------------- */\n.no-entities,\n.all-assigned {\n text-align: center;\n padding: 2rem;\n color: var(--mj-text-secondary);\n}\n\n.no-entities i,\n.all-assigned i {\n font-size: 2rem;\n color: var(--mj-border-default);\n margin-bottom: 1rem;\n display: block;\n}\n\n.no-entities p,\n.all-assigned p {\n margin: 0 0 0.25rem 0;\n font-size: 0.9375rem;\n}\n\n.no-entities .empty-subtext,\n.all-assigned .empty-subtext {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n/* -----------------------------------------------------------------------------\n Available Entities Section\n ----------------------------------------------------------------------------- */\n.available-entities-header {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-bottom: 1rem;\n}\n\n@media (min-width: 640px) {\n .available-entities-header {\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n }\n}\n\n.available-entities-header .subsection-title {\n margin: 0;\n}\n\n/* Entity Search Bar - Enhanced prominent search */\n.entity-search {\n position: relative;\n min-width: 200px;\n max-width: 100%;\n width: 100%;\n}\n\n@media (min-width: 640px) {\n .entity-search {\n min-width: 280px;\n max-width: 400px;\n width: auto;\n }\n}\n\n@media (min-width: 768px) {\n .entity-search {\n min-width: 320px;\n max-width: 450px;\n }\n}\n\n.entity-search .entity-search-icon {\n position: absolute;\n left: 1rem;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-secondary);\n font-size: 1rem;\n pointer-events: none;\n transition: color 0.2s ease;\n}\n\n@media (min-width: 768px) {\n .entity-search .entity-search-icon {\n left: 1.125rem;\n font-size: 1.125rem;\n }\n}\n\n.entity-search .entity-search-input {\n width: 100%;\n padding: 0.875rem 2.75rem 0.875rem 2.75rem;\n border: 2px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-full);\n font-size: 1rem;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;\n min-height: 48px;\n box-shadow: var(--mj-shadow-sm);\n}\n\n@media (min-width: 768px) {\n .entity-search .entity-search-input {\n padding: 1rem 3rem 1rem 3rem;\n min-height: 52px;\n font-size: 1.0625rem;\n border-radius: var(--mj-radius-full);\n }\n}\n\n.entity-search .entity-search-input::placeholder {\n color: var(--mj-text-secondary);\n}\n\n.entity-search .entity-search-input:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.entity-search .entity-search-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-md), 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n background: var(--mj-bg-page);\n}\n\n.entity-search:focus-within .entity-search-icon {\n color: var(--mj-brand-primary);\n}\n\n.entity-search .entity-search-clear {\n position: absolute;\n right: 0.75rem;\n top: 50%;\n transform: translateY(-50%);\n padding: 0.375rem;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n min-height: 28px;\n transition: all 0.15s ease;\n}\n\n@media (min-width: 768px) {\n .entity-search .entity-search-clear {\n right: 0.875rem;\n min-width: 32px;\n min-height: 32px;\n }\n}\n\n.entity-search .entity-search-clear:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n}\n\n/* No Search Results State */\n.no-search-results {\n text-align: center;\n padding: 1.5rem;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-md);\n}\n\n.no-search-results i {\n font-size: 1.5rem;\n color: var(--mj-border-default);\n margin-bottom: 0.5rem;\n display: block;\n}\n\n.no-search-results p {\n margin: 0;\n font-size: 0.8125rem;\n}\n\n/* -----------------------------------------------------------------------------\n Available Entities Grid\n ----------------------------------------------------------------------------- */\n.available-entities .entities-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n gap: 0.5rem;\n}\n\n.entity-chip {\n padding: 0.75rem 1rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-page);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.entity-chip .chip-content {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.entity-chip .chip-content i {\n color: var(--mj-brand-primary);\n font-size: 0.875rem;\n}\n\n.entity-chip .chip-content .chip-name {\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.entity-chip:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-brand-accent-subtle);\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-sm);\n}\n\n/* -----------------------------------------------------------------------------\n Info Grid for System Information\n ----------------------------------------------------------------------------- */\n.info-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 1rem;\n}\n\n.info-grid .info-item {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.info-grid .info-item .info-label {\n font-size: 0.6875rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.info-grid .info-item .info-value {\n font-size: 0.9375rem;\n color: var(--mj-text-primary);\n}\n\n/* -----------------------------------------------------------------------------\n Button Icon Styles\n ----------------------------------------------------------------------------- */\n.btn-icon {\n width: 36px;\n height: 36px;\n border: none;\n border-radius: var(--mj-radius-full);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.875rem;\n}\n\n.btn-icon:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n.btn-icon.btn-neutral {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n}\n\n.btn-icon.btn-neutral:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n}\n\n.btn-icon.btn-danger {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.btn-icon.btn-danger:hover:not(:disabled) {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n/* Add/Create Icon Button */\n.btn-icon.btn-add {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.btn-icon.btn-add:hover:not(:disabled) {\n background: var(--mj-brand-primary-light);\n box-shadow: var(--mj-shadow-md);\n}\n\n.btn-icon.btn-add:active:not(:disabled) {\n background: var(--mj-brand-primary-light);\n transform: scale(0.95);\n}\n\n/* -----------------------------------------------------------------------------\n Icon Wrapper - Prominent display icons\n ----------------------------------------------------------------------------- */\n.icon-wrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.icon-wrapper-sm {\n width: 32px;\n height: 32px;\n border-radius: var(--mj-radius-md);\n font-size: 0.875rem;\n}\n\n.icon-wrapper-md {\n width: 40px;\n height: 40px;\n border-radius: var(--mj-radius-md);\n font-size: 1rem;\n}\n\n.icon-wrapper-lg {\n width: 48px;\n height: 48px;\n border-radius: var(--mj-radius-lg);\n font-size: 1.25rem;\n}\n\n.icon-wrapper-xl {\n width: 56px;\n height: 56px;\n border-radius: var(--mj-radius-lg);\n font-size: 1.5rem;\n}\n\n/* Icon wrapper color variants */\n.icon-wrapper-primary {\n background: var(--mj-brand-accent-subtle);\n color: var(--mj-brand-primary);\n}\n\n.icon-wrapper-secondary {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning);\n}\n\n.icon-wrapper-tertiary {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success);\n}\n\n.icon-wrapper-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n/* Inverted icon wrapper (for dark backgrounds) */\n.icon-wrapper-inverted {\n background: var(--mj-brand-on-primary);\n color: var(--mj-brand-primary);\n}\n\n/* -----------------------------------------------------------------------------\n MJ Button System\n ----------------------------------------------------------------------------- */\n.mj-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.75rem 1.5rem;\n font-size: 0.875rem;\n font-weight: 600;\n border: none;\n border-radius: var(--mj-radius-full);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n white-space: nowrap;\n min-height: 44px;\n}\n\n.mj-btn:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n/* Primary Button - Dark, lightens on hover */\n.mj-btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.mj-btn-primary:hover:not(:disabled) {\n background: var(--mj-brand-primary-light);\n box-shadow: var(--mj-shadow-md);\n}\n\n.mj-btn-primary:active:not(:disabled) {\n background: var(--mj-brand-primary-light);\n transform: scale(0.98);\n}\n\n/* Secondary Button - Light, darkens on hover */\n.mj-btn-secondary {\n background: var(--mj-bg-page);\n color: var(--mj-brand-primary);\n border: 1px solid var(--mj-border-strong);\n}\n\n.mj-btn-secondary:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.mj-btn-secondary:active:not(:disabled) {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n/* -----------------------------------------------------------------------------\n Animations\n ----------------------------------------------------------------------------- */\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes slideUp {\n from {\n transform: translateY(20px);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n/* -----------------------------------------------------------------------------\n Focus Indicators - Accessibility\n ----------------------------------------------------------------------------- */\n.field-input:focus-visible,\n.field-select:focus-visible,\n.field-textarea:focus-visible,\n.mj-btn:focus-visible,\n.btn-icon:focus-visible,\n.entity-chip:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n}\n\n/* -----------------------------------------------------------------------------\n Reduced Motion Support\n ----------------------------------------------------------------------------- */\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n/* -----------------------------------------------------------------------------\n Responsive Design - Mobile (< 640px)\n ----------------------------------------------------------------------------- */\n@media (max-width: 639px) {\n .modal-backdrop {\n padding: 0.5rem;\n }\n\n .modal-dialog {\n border-radius: var(--mj-radius-2xl);\n max-height: 95vh;\n }\n\n /* Fullscreen mode on mobile */\n .modal-dialog.fullscreen {\n border-radius: 0;\n max-height: 100vh;\n }\n\n .modal-header {\n padding: 1.25rem 1rem 1rem 1rem;\n }\n\n .modal-header .modal-title {\n font-size: 1.125rem;\n }\n\n .modal-header .modal-close {\n border-radius: var(--mj-radius-full);\n }\n\n /* Modal title icon on mobile */\n .modal-header .modal-title i {\n width: 36px;\n height: 36px;\n font-size: 1rem;\n }\n\n /* Icon wrappers on mobile - slightly smaller */\n .icon-wrapper-lg {\n width: 40px;\n height: 40px;\n font-size: 1rem;\n }\n\n .icon-wrapper-xl {\n width: 48px;\n height: 48px;\n font-size: 1.25rem;\n }\n\n /* Add button on mobile */\n .btn-icon.btn-add {\n border-radius: var(--mj-radius-full);\n }\n\n .form-section {\n padding: 1.25rem 1rem;\n }\n\n .form-row {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n\n .modal-footer {\n padding: 1rem;\n flex-direction: column;\n }\n\n .modal-footer .mj-btn {\n width: 100%;\n justify-content: center;\n border-radius: var(--mj-radius-full);\n }\n\n /* Entity item mobile layout */\n .entity-item {\n flex-direction: column;\n align-items: stretch;\n gap: 0.75rem;\n padding: 0.875rem 1rem;\n position: relative;\n }\n\n /* Drag handle on mobile - Keep visible and touch-friendly */\n .drag-handle {\n position: static;\n margin-right: 0.75rem;\n margin-bottom: 0.5rem;\n font-size: 1.25rem;\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n padding: 0.5rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-md);\n cursor: grab;\n }\n\n .drag-handle:active {\n cursor: grabbing;\n background: var(--mj-brand-accent-subtle);\n }\n\n .entity-item .entity-info {\n gap: 0.75rem;\n }\n\n .entity-item .entity-info .entity-icon {\n width: 36px;\n height: 36px;\n font-size: 0.875rem;\n border-radius: var(--mj-radius-md);\n }\n\n .entity-item .entity-info .entity-details .entity-name {\n font-size: 0.875rem;\n word-break: break-word;\n overflow-wrap: break-word;\n line-height: 1.3;\n flex-wrap: wrap;\n }\n\n .entity-item .entity-config {\n margin: 0;\n width: 100%;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 0.75rem;\n }\n\n .entity-item .entity-config .config-item .config-label {\n font-size: 0.8125rem;\n }\n\n .entity-item .entity-actions {\n width: 100%;\n justify-content: flex-end;\n gap: 0.5rem;\n }\n\n /* Entity chips in mobile */\n .available-entities .entities-grid {\n grid-template-columns: 1fr;\n }\n\n .entity-chip {\n padding: 0.625rem 0.875rem;\n border-radius: var(--mj-radius-md);\n }\n\n .entity-chip .chip-content .chip-name {\n font-size: 0.75rem;\n word-break: break-word;\n }\n\n /* Entity search on mobile - still prominent */\n .entity-search {\n max-width: none;\n width: 100%;\n }\n\n .entity-search .entity-search-input {\n padding: 0.75rem 2.5rem 0.75rem 2.5rem;\n min-height: 44px;\n font-size: 0.9375rem;\n border-radius: var(--mj-radius-full);\n }\n\n .entity-search .entity-search-icon {\n left: 0.875rem;\n font-size: 0.875rem;\n }\n\n .entity-search .entity-search-clear {\n right: 0.625rem;\n border-radius: var(--mj-radius-full);\n }\n\n .info-grid {\n grid-template-columns: 1fr 1fr;\n }\n\n /* Icon buttons on mobile - keep rounded */\n .btn-icon {\n border-radius: var(--mj-radius-full);\n }\n}\n\n/* Tablet Portrait (640px - 767px) */\n@media (min-width: 640px) {\n .modal-dialog {\n max-width: 650px;\n }\n\n .available-entities .entities-grid {\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n }\n}\n\n/* Tablet Landscape (768px - 1023px) */\n@media (min-width: 768px) {\n .modal-dialog {\n max-width: 800px;\n }\n\n .modal-header {\n padding: 1.5rem 2rem 1.25rem 2rem;\n }\n\n .form-section {\n padding: 1.75rem 2rem;\n }\n\n .modal-footer {\n padding: 1.25rem 2rem;\n }\n}\n\n/* Laptop (1024px+) */\n@media (min-width: 1024px) {\n .modal-dialog {\n max-width: 900px;\n }\n\n .available-entities .entities-grid {\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n }\n}\n"] }]
705
+ args: [{ standalone: false, selector: 'mj-application-dialog', template: "@if (visible) {\n <div class=\"modal-backdrop\" (click)=\"onCancel()\" role=\"presentation\">\n <div\n class=\"modal-dialog\"\n [class.fullscreen]=\"isFullscreen\"\n (click)=\"$event.stopPropagation()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"application-dialog-title\"\n aria-describedby=\"application-dialog-description\"\n >\n <!-- Modal Header -->\n <div class=\"modal-header\" [class.create-mode]=\"!isEditMode\" [class.edit-mode]=\"isEditMode\">\n <div class=\"modal-header-content\">\n <h2 class=\"modal-title\" id=\"application-dialog-title\">\n <i class=\"fa-solid\" [class.fa-plus]=\"!isEditMode\" [class.fa-layer-group]=\"isEditMode\" aria-hidden=\"true\"></i>\n {{ isEditMode ? 'Edit Application' : 'Create New Application' }}\n </h2>\n <p class=\"modal-subtitle\" id=\"application-dialog-description\">\n {{ isEditMode ? 'Update application information and settings' : 'Add a new application to the system' }}\n </p>\n </div>\n <div class=\"modal-header-actions\">\n <button\n class=\"modal-action-btn\"\n (click)=\"toggleFullscreen()\"\n [attr.aria-label]=\"isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'\"\n type=\"button\"\n >\n <i class=\"fa-solid\" [class.fa-compress]=\"isFullscreen\" [class.fa-expand]=\"!isFullscreen\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"modal-close\"\n (click)=\"onCancel()\"\n aria-label=\"Close dialog\"\n type=\"button\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <!-- Modal Body -->\n <div class=\"modal-body\">\n <form [formGroup]=\"applicationForm\" (ngSubmit)=\"onSubmit()\">\n <!-- Error Alert -->\n @if (error) {\n <div class=\"form-section\">\n <mj-alert Variant=\"error\" [Message]=\"error\" />\n </div>\n }\n\n <!-- Basic Information Section -->\n <mj-accordion-panel class=\"app-dialog-section\" [Expanded]=\"sectionExpanded.basicInfo\" (ExpandedChange)=\"toggleSection('basicInfo')\">\n <ng-template mjAccordionTitle>\n <span class=\"app-dialog-section-title\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-info-circle\" aria-hidden=\"true\"></i>\n Application Information\n </span>\n <span class=\"section-description\">Define the application's basic properties</span>\n </span>\n </ng-template>\n\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <div class=\"form-field\">\n <label class=\"field-label required\" for=\"app-name\">Application Name</label>\n <input\n id=\"app-name\"\n type=\"text\"\n class=\"field-input\"\n formControlName=\"name\"\n placeholder=\"My Application\"\n [class.error]=\"applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched\"\n [attr.aria-invalid]=\"applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched\"\n aria-describedby=\"app-name-error\"\n />\n @if (applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched) {\n <div class=\"field-error\" id=\"app-name-error\" role=\"alert\">\n <i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"></i>\n @if (applicationForm.get('name')?.errors?.['required']) {\n Application name is required\n }\n @if (applicationForm.get('name')?.errors?.['maxlength']) {\n Application name cannot exceed 100 characters\n }\n </div>\n }\n </div>\n\n <div class=\"form-field\">\n <label class=\"field-label\" for=\"app-description\">Description</label>\n <textarea\n id=\"app-description\"\n class=\"field-textarea\"\n formControlName=\"description\"\n placeholder=\"Describe the application's purpose and functionality...\"\n rows=\"4\"\n ></textarea>\n <div class=\"field-hint\">\n Provide a clear description of what this application does and its main features.\n </div>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n\n <!-- Entity Management Section -->\n <mj-accordion-panel class=\"app-dialog-section\" [Expanded]=\"sectionExpanded.entities\" (ExpandedChange)=\"toggleSection('entities')\">\n <ng-template mjAccordionTitle>\n <span class=\"app-dialog-section-title\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n Application Entities\n </span>\n <span class=\"section-description\">Manage which entities are included in this application</span>\n </span>\n </ng-template>\n\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <!-- Assigned Entities -->\n @if (applicationEntities.length > 0) {\n <div class=\"assigned-entities\">\n <h4 class=\"subsection-title\">Assigned Entities ({{ applicationEntities.length }})</h4>\n <div class=\"entities-list\"\n role=\"list\"\n cdkDropList\n (cdkDropListDropped)=\"onEntityDrop($event)\">\n @for (config of applicationEntities; track config.entity.ID; let i = $index) {\n <div\n class=\"entity-item\"\n [class.is-new]=\"config.isNew\"\n [class.has-changes]=\"config.hasChanges\"\n role=\"listitem\"\n cdkDrag\n >\n <i class=\"fa-solid fa-grip-vertical drag-handle\" aria-hidden=\"true\"></i>\n <div class=\"entity-info\">\n <div class=\"entity-icon\">\n <i class=\"fa-solid fa-table\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"entity-details\">\n <div class=\"entity-name\">\n {{ config.entity.Name }}\n @if (config.entity.Description) {\n <i\n class=\"fa-solid fa-info-circle entity-info-icon\"\n [title]=\"config.entity.Description\"\n [attr.aria-label]=\"'Entity description: ' + config.entity.Description\"\n ></i>\n }\n </div>\n </div>\n </div>\n\n <div class=\"entity-config\">\n <div class=\"config-item\">\n <label class=\"config-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"config.defaultForNewUser\"\n [ngModelOptions]=\"{standalone: true}\"\n (change)=\"onDefaultForNewUserChange(config)\"\n class=\"config-checkbox\"\n />\n <span class=\"checkbox-text\">Default for new users</span>\n </label>\n </div>\n <div class=\"sequence-badge\" [attr.aria-label]=\"'Sequence ' + config.sequence\">{{ config.sequence }}</div>\n </div>\n\n <div class=\"entity-actions\">\n <button\n type=\"button\"\n class=\"btn-icon btn-danger\"\n (click)=\"removeEntity(config)\"\n title=\"Remove entity\"\n [attr.aria-label]=\"'Remove ' + config.entity.Name\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"no-entities\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n <p>No entities assigned to this application</p>\n <p class=\"empty-subtext\">Add entities from the available list below</p>\n </div>\n }\n\n <!-- Available Entities -->\n @if (availableEntities.length > 0) {\n <div class=\"available-entities\">\n <div class=\"available-entities-header\">\n <h4 class=\"subsection-title\">Available Entities ({{ filteredAvailableEntities.length }} of {{ availableEntities.length }})</h4>\n <div class=\"entity-search\">\n <i class=\"fa-solid fa-search entity-search-icon\" aria-hidden=\"true\"></i>\n <input\n type=\"text\"\n class=\"entity-search-input\"\n placeholder=\"Search entities...\"\n [value]=\"entitySearchTerm\"\n (input)=\"onEntitySearchChange($event)\"\n aria-label=\"Search available entities\"\n />\n @if (entitySearchTerm) {\n <button\n type=\"button\"\n class=\"entity-search-clear\"\n (click)=\"clearEntitySearch()\"\n aria-label=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n @if (filteredAvailableEntities.length > 0) {\n <div class=\"entities-grid\" role=\"list\">\n @for (entity of filteredAvailableEntities; track entity.ID) {\n <button\n type=\"button\"\n class=\"entity-chip\"\n (click)=\"addEntity(entity)\"\n role=\"listitem\"\n [attr.aria-label]=\"'Add ' + entity.Name\"\n >\n <div class=\"chip-content\">\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n <span class=\"chip-name\">{{ entity.Name }}</span>\n </div>\n </button>\n }\n </div>\n } @else {\n <div class=\"no-search-results\">\n <i class=\"fa-solid fa-search\" aria-hidden=\"true\"></i>\n <p>No entities match \"{{ entitySearchTerm }}\"</p>\n </div>\n }\n </div>\n } @else {\n <div class=\"all-assigned\">\n <i class=\"fa-solid fa-check-circle\" aria-hidden=\"true\"></i>\n <p>All entities have been assigned to this application</p>\n </div>\n }\n </div>\n </div>\n </mj-accordion-panel>\n\n <!-- System Information Section (Edit Mode Only) -->\n @if (isEditMode) {\n <mj-accordion-panel class=\"app-dialog-section\" [Expanded]=\"sectionExpanded.systemInfo\" (ExpandedChange)=\"toggleSection('systemInfo')\">\n <ng-template mjAccordionTitle>\n <span class=\"app-dialog-section-title\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-info-circle\" aria-hidden=\"true\"></i>\n System Information\n </span>\n <span class=\"section-description\">Application metadata and audit information</span>\n </span>\n </ng-template>\n\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Created</span>\n <span class=\"info-value\">{{ data?.application?.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Last Updated</span>\n <span class=\"info-value\">{{ data?.application?.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Application ID</span>\n <span class=\"info-value\">{{ data?.application?.ID }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Total Entities</span>\n <span class=\"info-value\">{{ applicationEntities.length }}</span>\n </div>\n </div>\n </div>\n </div>\n </mj-accordion-panel>\n }\n </form>\n </div>\n\n <!-- Modal Footer - Primary and Cancel buttons on RIGHT -->\n <div class=\"modal-footer\">\n <button\n type=\"submit\"\n mjButton variant=\"primary\"\n [disabled]=\"applicationForm.invalid || isLoading\"\n (click)=\"onSubmit()\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-save\" aria-hidden=\"true\"></i>\n {{ isEditMode ? 'Update Application' : 'Create Application' }}\n }\n </button>\n <button type=\"button\" mjButton (click)=\"onCancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n}\n", styles: ["/* =============================================================================\n Application Dialog Component\n Uses MJ Design Tokens (--mj-*)\n ============================================================================= */\n\n/* -----------------------------------------------------------------------------\n Modal Backdrop & Container\n ----------------------------------------------------------------------------- */\n.modal-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n animation: fadeIn 0.2s cubic-bezier(0, 0, 0.2, 1);\n padding: 1rem;\n}\n\n.modal-dialog {\n background: var(--mj-bg-page);\n border-radius: var(--mj-radius-2xl);\n box-shadow: var(--mj-shadow-2xl);\n max-width: 900px;\n width: 100%;\n max-height: 90vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n animation: slideUp 0.3s cubic-bezier(0, 0, 0.2, 1);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n/* Fullscreen mode */\n.modal-dialog.fullscreen {\n max-width: 100vw;\n width: 100vw;\n max-height: 100vh;\n height: 100vh;\n border-radius: 0;\n margin: 0;\n}\n\n/* -----------------------------------------------------------------------------\n Modal Header\n ----------------------------------------------------------------------------- */\n.modal-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 1.5rem 1.5rem 1rem 1.5rem;\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n flex-shrink: 0;\n}\n\n.modal-header-content {\n flex: 1;\n min-width: 0;\n}\n\n.modal-header .modal-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: 1.375rem;\n font-weight: 600;\n color: var(--mj-brand-on-primary);\n margin: 0;\n}\n\n.modal-header .modal-title i {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.2);\n border-radius: var(--mj-radius-lg);\n font-size: 1.125rem;\n flex-shrink: 0;\n}\n\n/* Create mode - Plus icon with inverted styling */\n.modal-header.create-mode .modal-title i {\n background: var(--mj-brand-on-primary);\n color: var(--mj-brand-primary);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n/* Edit mode - Grid icon with semi-transparent background */\n.modal-header.edit-mode .modal-title i {\n background: rgba(255, 255, 255, 0.2);\n color: var(--mj-brand-on-primary);\n}\n\n/* Modal Header Actions */\n.modal-header-actions {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n flex-shrink: 0;\n margin-left: 0.5rem;\n}\n\n.modal-action-btn {\n padding: 0.625rem;\n border: none;\n background: transparent;\n color: var(--mj-brand-on-primary);\n font-size: 1.125rem;\n cursor: pointer;\n border-radius: var(--mj-radius-full);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.modal-action-btn:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.modal-action-btn:focus-visible {\n outline: 2px solid var(--mj-brand-on-primary);\n outline-offset: 2px;\n}\n\n.modal-header .modal-subtitle {\n margin: 0.375rem 0 0 0;\n font-size: 0.8125rem;\n color: var(--mj-brand-on-primary);\n opacity: 0.85;\n}\n\n.modal-header .modal-close {\n padding: 0.625rem;\n border: none;\n background: transparent;\n color: var(--mj-brand-on-primary);\n font-size: 1.25rem;\n cursor: pointer;\n border-radius: var(--mj-radius-full);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-left: 0.5rem;\n}\n\n.modal-header .modal-close:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.modal-header .modal-close:focus-visible {\n outline: 2px solid var(--mj-brand-on-primary);\n outline-offset: 2px;\n}\n\n/* -----------------------------------------------------------------------------\n Modal Body\n ----------------------------------------------------------------------------- */\n.modal-body {\n flex: 1;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n padding: 0;\n background: var(--mj-bg-page);\n}\n\n/* -----------------------------------------------------------------------------\n Modal Footer - Primary and Cancel buttons on RIGHT\n ----------------------------------------------------------------------------- */\n.modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding: 1.25rem 1.5rem;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n flex-shrink: 0;\n}\n\n/* -----------------------------------------------------------------------------\n Form Sections (Fieldset)\n ----------------------------------------------------------------------------- */\n.form-section {\n border: none;\n margin: 0;\n padding: 1.5rem;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.form-section:last-of-type {\n border-bottom: none;\n}\n\n/* -----------------------------------------------------------------------------\n Collapsible Sections \u2014 now <mj-accordion-panel>. The bespoke fieldset/legend\n chrome (.section-header / .section-title-row / .chevron-icon) was removed; the\n title (icon + title + description) is projected into the accordion title slot.\n ----------------------------------------------------------------------------- */\n.app-dialog-section-title {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n min-width: 0;\n}\n\n.app-dialog-section-title .section-title {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 1.0625rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.app-dialog-section-title .section-title i {\n color: var(--mj-brand-primary);\n font-size: 0.875rem;\n}\n\n.app-dialog-section-title .section-description {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n font-weight: normal;\n}\n\n.section-content {\n animation: expandSection 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes expandSection {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* -----------------------------------------------------------------------------\n Form Grid Layout\n ----------------------------------------------------------------------------- */\n.form-grid {\n display: grid;\n gap: 1.25rem;\n}\n\n.form-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.25rem;\n}\n\n/* -----------------------------------------------------------------------------\n Form Fields\n ----------------------------------------------------------------------------- */\n.form-field {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.form-field .field-label {\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.form-field .field-label.required::after {\n content: ' *';\n color: var(--mj-status-error);\n}\n\n.form-field .field-input,\n.form-field .field-select,\n.form-field .field-textarea {\n width: 100%;\n min-height: 44px;\n padding: 0.75rem 1rem;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-md);\n font-size: 0.9375rem;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n}\n\n.form-field .field-input:focus,\n.form-field .field-select:focus,\n.form-field .field-textarea:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n}\n\n.form-field .field-input.error,\n.form-field .field-select.error,\n.form-field .field-textarea.error {\n border-color: var(--mj-status-error);\n}\n\n.form-field .field-input.error:focus,\n.form-field .field-select.error:focus,\n.form-field .field-textarea.error:focus {\n border-color: var(--mj-status-error);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.form-field .field-input::placeholder,\n.form-field .field-textarea::placeholder {\n color: var(--mj-text-secondary);\n}\n\n.form-field .field-textarea {\n min-height: 100px;\n resize: vertical;\n line-height: 1.5;\n}\n\n.form-field .field-error {\n margin-top: 0.25rem;\n font-size: 0.8125rem;\n color: var(--mj-status-error);\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n\n.form-field .field-error i {\n font-size: 0.625rem;\n}\n\n.form-field .field-hint {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n line-height: 1.4;\n}\n\n/* -----------------------------------------------------------------------------\n Entity Management Styles\n ----------------------------------------------------------------------------- */\n.subsection-title {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 1rem 0;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.assigned-entities {\n margin-bottom: 1.5rem;\n}\n\n.assigned-entities .entities-list {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n overflow: hidden;\n background: var(--mj-bg-page);\n}\n\n.entity-item {\n display: flex;\n align-items: center;\n padding: 1rem 1.25rem;\n border-bottom: 1px solid var(--mj-bg-surface);\n transition: all 0.15s ease;\n}\n\n.entity-item:last-child {\n border-bottom: none;\n}\n\n.entity-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.entity-item.is-new {\n background: color-mix(in srgb, var(--mj-status-success) 8%, transparent);\n border-left: 3px solid var(--mj-status-success);\n}\n\n.entity-item.has-changes {\n background: color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.entity-item .entity-info {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex: 1;\n min-width: 0;\n}\n\n.entity-item .entity-info .entity-icon {\n width: 40px;\n height: 40px;\n background: var(--mj-brand-accent-subtle);\n border-radius: var(--mj-radius-md);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.entity-item .entity-info .entity-details {\n flex: 1;\n min-width: 0;\n}\n\n.entity-item .entity-info .entity-details .entity-name {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 0.125rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.entity-item .entity-info .entity-details .entity-name .entity-info-icon {\n color: var(--mj-status-warning);\n font-size: 0.875rem;\n cursor: help;\n opacity: 0.7;\n transition: all 0.15s ease;\n}\n\n.entity-item .entity-info .entity-details .entity-name .entity-info-icon:hover {\n opacity: 1;\n transform: scale(1.1);\n}\n\n.entity-item .entity-config {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n margin: 0 1.5rem;\n}\n\n.entity-item .entity-config .config-item .config-label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.entity-item .entity-config .config-item .config-label .config-checkbox {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n}\n\n.entity-item .entity-config .sequence-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n padding: 0.25rem 0.5rem;\n border-radius: var(--mj-radius-sm);\n font-size: 0.75rem;\n font-weight: 600;\n min-width: 24px;\n text-align: center;\n}\n\n.entity-item .entity-actions {\n display: flex;\n gap: 0.25rem;\n}\n\n/* -----------------------------------------------------------------------------\n Drag and Drop Styles\n ----------------------------------------------------------------------------- */\n.drag-handle {\n color: var(--mj-text-secondary);\n cursor: grab;\n margin-right: 0.75rem;\n font-size: 1rem;\n transition: color 0.2s ease;\n flex-shrink: 0;\n}\n\n.drag-handle:hover {\n color: var(--mj-brand-primary);\n}\n\n.drag-handle:active {\n cursor: grabbing;\n}\n\n.entity-item.cdk-drag-preview {\n box-shadow: var(--mj-shadow-xl);\n transform: rotate(1deg);\n opacity: 0.9;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-page);\n}\n\n.entity-item.cdk-drag-placeholder {\n opacity: 0.4;\n border-style: dashed;\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.entity-item.cdk-drag-animating {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n.entities-list.cdk-drop-list-dragging .entity-item:not(.cdk-drag-placeholder) {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n/* -----------------------------------------------------------------------------\n Empty States\n ----------------------------------------------------------------------------- */\n.no-entities,\n.all-assigned {\n text-align: center;\n padding: 2rem;\n color: var(--mj-text-secondary);\n}\n\n.no-entities i,\n.all-assigned i {\n font-size: 2rem;\n color: var(--mj-border-default);\n margin-bottom: 1rem;\n display: block;\n}\n\n.no-entities p,\n.all-assigned p {\n margin: 0 0 0.25rem 0;\n font-size: 0.9375rem;\n}\n\n.no-entities .empty-subtext,\n.all-assigned .empty-subtext {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n/* -----------------------------------------------------------------------------\n Available Entities Section\n ----------------------------------------------------------------------------- */\n.available-entities-header {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-bottom: 1rem;\n}\n\n@media (min-width: 640px) {\n .available-entities-header {\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n }\n}\n\n.available-entities-header .subsection-title {\n margin: 0;\n}\n\n/* Entity Search Bar - Enhanced prominent search */\n.entity-search {\n position: relative;\n min-width: 200px;\n max-width: 100%;\n width: 100%;\n}\n\n@media (min-width: 640px) {\n .entity-search {\n min-width: 280px;\n max-width: 400px;\n width: auto;\n }\n}\n\n@media (min-width: 768px) {\n .entity-search {\n min-width: 320px;\n max-width: 450px;\n }\n}\n\n.entity-search .entity-search-icon {\n position: absolute;\n left: 1rem;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-secondary);\n font-size: 1rem;\n pointer-events: none;\n transition: color 0.2s ease;\n}\n\n@media (min-width: 768px) {\n .entity-search .entity-search-icon {\n left: 1.125rem;\n font-size: 1.125rem;\n }\n}\n\n.entity-search .entity-search-input {\n width: 100%;\n padding: 0.875rem 2.75rem 0.875rem 2.75rem;\n border: 2px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-full);\n font-size: 1rem;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;\n min-height: 48px;\n box-shadow: var(--mj-shadow-sm);\n}\n\n@media (min-width: 768px) {\n .entity-search .entity-search-input {\n padding: 1rem 3rem 1rem 3rem;\n min-height: 52px;\n font-size: 1.0625rem;\n border-radius: var(--mj-radius-full);\n }\n}\n\n.entity-search .entity-search-input::placeholder {\n color: var(--mj-text-secondary);\n}\n\n.entity-search .entity-search-input:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-bg-surface-sunken);\n}\n\n.entity-search .entity-search-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-md), 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n background: var(--mj-bg-page);\n}\n\n.entity-search:focus-within .entity-search-icon {\n color: var(--mj-brand-primary);\n}\n\n.entity-search .entity-search-clear {\n position: absolute;\n right: 0.75rem;\n top: 50%;\n transform: translateY(-50%);\n padding: 0.375rem;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n border-radius: var(--mj-radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n min-height: 28px;\n transition: all 0.15s ease;\n}\n\n@media (min-width: 768px) {\n .entity-search .entity-search-clear {\n right: 0.875rem;\n min-width: 32px;\n min-height: 32px;\n }\n}\n\n.entity-search .entity-search-clear:hover {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n}\n\n/* No Search Results State */\n.no-search-results {\n text-align: center;\n padding: 1.5rem;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-md);\n}\n\n.no-search-results i {\n font-size: 1.5rem;\n color: var(--mj-border-default);\n margin-bottom: 0.5rem;\n display: block;\n}\n\n.no-search-results p {\n margin: 0;\n font-size: 0.8125rem;\n}\n\n/* -----------------------------------------------------------------------------\n Available Entities Grid\n ----------------------------------------------------------------------------- */\n.available-entities .entities-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n gap: 0.5rem;\n}\n\n.entity-chip {\n padding: 0.75rem 1rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: var(--mj-bg-page);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.entity-chip .chip-content {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.entity-chip .chip-content i {\n color: var(--mj-brand-primary);\n font-size: 0.875rem;\n}\n\n.entity-chip .chip-content .chip-name {\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.entity-chip:hover {\n border-color: var(--mj-brand-primary);\n background: var(--mj-brand-accent-subtle);\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-sm);\n}\n\n/* -----------------------------------------------------------------------------\n Info Grid for System Information\n ----------------------------------------------------------------------------- */\n.info-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 1rem;\n}\n\n.info-grid .info-item {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.info-grid .info-item .info-label {\n font-size: 0.6875rem;\n font-weight: 500;\n color: var(--mj-text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.info-grid .info-item .info-value {\n font-size: 0.9375rem;\n color: var(--mj-text-primary);\n}\n\n/* -----------------------------------------------------------------------------\n Button Icon Styles\n ----------------------------------------------------------------------------- */\n.btn-icon {\n width: 36px;\n height: 36px;\n border: none;\n border-radius: var(--mj-radius-full);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.875rem;\n}\n\n.btn-icon:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n.btn-icon.btn-neutral {\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n}\n\n.btn-icon.btn-neutral:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n}\n\n.btn-icon.btn-danger {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.btn-icon.btn-danger:hover:not(:disabled) {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n/* Add/Create Icon Button */\n.btn-icon.btn-add {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.btn-icon.btn-add:hover:not(:disabled) {\n background: var(--mj-brand-primary-light);\n box-shadow: var(--mj-shadow-md);\n}\n\n.btn-icon.btn-add:active:not(:disabled) {\n background: var(--mj-brand-primary-light);\n transform: scale(0.95);\n}\n\n/* -----------------------------------------------------------------------------\n Icon Wrapper - Prominent display icons\n ----------------------------------------------------------------------------- */\n.icon-wrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.icon-wrapper-sm {\n width: 32px;\n height: 32px;\n border-radius: var(--mj-radius-md);\n font-size: 0.875rem;\n}\n\n.icon-wrapper-md {\n width: 40px;\n height: 40px;\n border-radius: var(--mj-radius-md);\n font-size: 1rem;\n}\n\n.icon-wrapper-lg {\n width: 48px;\n height: 48px;\n border-radius: var(--mj-radius-lg);\n font-size: 1.25rem;\n}\n\n.icon-wrapper-xl {\n width: 56px;\n height: 56px;\n border-radius: var(--mj-radius-lg);\n font-size: 1.5rem;\n}\n\n/* Icon wrapper color variants */\n.icon-wrapper-primary {\n background: var(--mj-brand-accent-subtle);\n color: var(--mj-brand-primary);\n}\n\n.icon-wrapper-secondary {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning);\n}\n\n.icon-wrapper-tertiary {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success);\n}\n\n.icon-wrapper-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n/* Inverted icon wrapper (for dark backgrounds) */\n.icon-wrapper-inverted {\n background: var(--mj-brand-on-primary);\n color: var(--mj-brand-primary);\n}\n\n/* Buttons use the global `mjButton` directive (variant/size inputs) \u2014 no\n component-scoped `.mj-btn` overrides (they would collide with the directive). */\n\n/* -----------------------------------------------------------------------------\n Animations\n ----------------------------------------------------------------------------- */\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes slideUp {\n from {\n transform: translateY(20px);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n/* -----------------------------------------------------------------------------\n Focus Indicators - Accessibility\n ----------------------------------------------------------------------------- */\n.field-input:focus-visible,\n.field-select:focus-visible,\n.field-textarea:focus-visible,\n.btn-icon:focus-visible,\n.entity-chip:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n}\n\n/* -----------------------------------------------------------------------------\n Reduced Motion Support\n ----------------------------------------------------------------------------- */\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n/* -----------------------------------------------------------------------------\n Responsive Design - Mobile (< 640px)\n ----------------------------------------------------------------------------- */\n@media (max-width: 639px) {\n .modal-backdrop {\n padding: 0.5rem;\n }\n\n .modal-dialog {\n border-radius: var(--mj-radius-2xl);\n max-height: 95vh;\n }\n\n /* Fullscreen mode on mobile */\n .modal-dialog.fullscreen {\n border-radius: 0;\n max-height: 100vh;\n }\n\n .modal-header {\n padding: 1.25rem 1rem 1rem 1rem;\n }\n\n .modal-header .modal-title {\n font-size: 1.125rem;\n }\n\n .modal-header .modal-close {\n border-radius: var(--mj-radius-full);\n }\n\n /* Modal title icon on mobile */\n .modal-header .modal-title i {\n width: 36px;\n height: 36px;\n font-size: 1rem;\n }\n\n /* Icon wrappers on mobile - slightly smaller */\n .icon-wrapper-lg {\n width: 40px;\n height: 40px;\n font-size: 1rem;\n }\n\n .icon-wrapper-xl {\n width: 48px;\n height: 48px;\n font-size: 1.25rem;\n }\n\n /* Add button on mobile */\n .btn-icon.btn-add {\n border-radius: var(--mj-radius-full);\n }\n\n .form-section {\n padding: 1.25rem 1rem;\n }\n\n .form-row {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n\n .modal-footer {\n padding: 1rem;\n flex-direction: column;\n }\n\n /* Full-width footer buttons on mobile \u2014 wrapper-scoped layout only, so the\n global mjButton directive still owns each button's appearance/shape. */\n .modal-footer button {\n width: 100%;\n justify-content: center;\n }\n\n /* Entity item mobile layout */\n .entity-item {\n flex-direction: column;\n align-items: stretch;\n gap: 0.75rem;\n padding: 0.875rem 1rem;\n position: relative;\n }\n\n /* Drag handle on mobile - Keep visible and touch-friendly */\n .drag-handle {\n position: static;\n margin-right: 0.75rem;\n margin-bottom: 0.5rem;\n font-size: 1.25rem;\n color: var(--mj-brand-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n padding: 0.5rem;\n background: var(--mj-bg-surface-sunken);\n border-radius: var(--mj-radius-md);\n cursor: grab;\n }\n\n .drag-handle:active {\n cursor: grabbing;\n background: var(--mj-brand-accent-subtle);\n }\n\n .entity-item .entity-info {\n gap: 0.75rem;\n }\n\n .entity-item .entity-info .entity-icon {\n width: 36px;\n height: 36px;\n font-size: 0.875rem;\n border-radius: var(--mj-radius-md);\n }\n\n .entity-item .entity-info .entity-details .entity-name {\n font-size: 0.875rem;\n word-break: break-word;\n overflow-wrap: break-word;\n line-height: 1.3;\n flex-wrap: wrap;\n }\n\n .entity-item .entity-config {\n margin: 0;\n width: 100%;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 0.75rem;\n }\n\n .entity-item .entity-config .config-item .config-label {\n font-size: 0.8125rem;\n }\n\n .entity-item .entity-actions {\n width: 100%;\n justify-content: flex-end;\n gap: 0.5rem;\n }\n\n /* Entity chips in mobile */\n .available-entities .entities-grid {\n grid-template-columns: 1fr;\n }\n\n .entity-chip {\n padding: 0.625rem 0.875rem;\n border-radius: var(--mj-radius-md);\n }\n\n .entity-chip .chip-content .chip-name {\n font-size: 0.75rem;\n word-break: break-word;\n }\n\n /* Entity search on mobile - still prominent */\n .entity-search {\n max-width: none;\n width: 100%;\n }\n\n .entity-search .entity-search-input {\n padding: 0.75rem 2.5rem 0.75rem 2.5rem;\n min-height: 44px;\n font-size: 0.9375rem;\n border-radius: var(--mj-radius-full);\n }\n\n .entity-search .entity-search-icon {\n left: 0.875rem;\n font-size: 0.875rem;\n }\n\n .entity-search .entity-search-clear {\n right: 0.625rem;\n border-radius: var(--mj-radius-full);\n }\n\n .info-grid {\n grid-template-columns: 1fr 1fr;\n }\n\n /* Icon buttons on mobile - keep rounded */\n .btn-icon {\n border-radius: var(--mj-radius-full);\n }\n}\n\n/* Tablet Portrait (640px - 767px) */\n@media (min-width: 640px) {\n .modal-dialog {\n max-width: 650px;\n }\n\n .available-entities .entities-grid {\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n }\n}\n\n/* Tablet Landscape (768px - 1023px) */\n@media (min-width: 768px) {\n .modal-dialog {\n max-width: 800px;\n }\n\n .modal-header {\n padding: 1.5rem 2rem 1.25rem 2rem;\n }\n\n .form-section {\n padding: 1.75rem 2rem;\n }\n\n .modal-footer {\n padding: 1.25rem 2rem;\n }\n}\n\n/* Laptop (1024px+) */\n@media (min-width: 1024px) {\n .modal-dialog {\n max-width: 900px;\n }\n\n .available-entities .entities-grid {\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n }\n}\n"] }]
730
706
  }], () => [], { data: [{
731
707
  type: Input
732
708
  }], visible: [{