@memberjunction/ng-explorer-settings 3.3.0 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/account-info/account-info.component.d.ts +23 -0
- package/dist/lib/account-info/account-info.component.d.ts.map +1 -0
- package/dist/lib/account-info/account-info.component.js +155 -0
- package/dist/lib/account-info/account-info.component.js.map +1 -0
- package/dist/lib/appearance-settings/appearance-settings.component.d.ts +15 -0
- package/dist/lib/appearance-settings/appearance-settings.component.d.ts.map +1 -0
- package/dist/lib/appearance-settings/appearance-settings.component.js +79 -0
- package/dist/lib/appearance-settings/appearance-settings.component.js.map +1 -0
- package/dist/lib/application-settings/application-settings.component.d.ts +113 -0
- package/dist/lib/application-settings/application-settings.component.d.ts.map +1 -0
- package/dist/lib/application-settings/application-settings.component.js +520 -0
- package/dist/lib/application-settings/application-settings.component.js.map +1 -0
- package/dist/lib/general-settings/general-settings.component.d.ts +14 -0
- package/dist/lib/general-settings/general-settings.component.d.ts.map +1 -0
- package/dist/lib/general-settings/general-settings.component.js +50 -0
- package/dist/lib/general-settings/general-settings.component.js.map +1 -0
- package/dist/lib/module.d.ts +31 -28
- package/dist/lib/module.d.ts.map +1 -1
- package/dist/lib/module.js +64 -33
- package/dist/lib/module.js.map +1 -1
- package/dist/lib/settings/settings.component.d.ts +5 -14
- package/dist/lib/settings/settings.component.d.ts.map +1 -1
- package/dist/lib/settings/settings.component.js +141 -417
- package/dist/lib/settings/settings.component.js.map +1 -1
- package/dist/lib/sql-logging/sql-logging.component.d.ts +1 -1
- package/package.json +19 -20
|
@@ -11,15 +11,11 @@ import { takeUntil, debounceTime, distinctUntilChanged } from 'rxjs/operators';
|
|
|
11
11
|
import { BaseNavigationComponent } from '@memberjunction/ng-shared';
|
|
12
12
|
import * as i0 from "@angular/core";
|
|
13
13
|
import * as i1 from "@angular/common";
|
|
14
|
-
import * as i2 from "
|
|
15
|
-
import * as i3 from "
|
|
16
|
-
import * as i4 from "../
|
|
17
|
-
import * as i5 from "../
|
|
18
|
-
import * as i6 from "../
|
|
19
|
-
import * as i7 from "../application-management/application-management.component";
|
|
20
|
-
import * as i8 from "../entity-permissions/entity-permissions.component";
|
|
21
|
-
import * as i9 from "../user-profile-settings/user-profile-settings.component";
|
|
22
|
-
import * as i10 from "../notification-preferences/notification-preferences.component";
|
|
14
|
+
import * as i2 from "@memberjunction/ng-shared-generic";
|
|
15
|
+
import * as i3 from "../notification-preferences/notification-preferences.component";
|
|
16
|
+
import * as i4 from "../general-settings/general-settings.component";
|
|
17
|
+
import * as i5 from "../application-settings/application-settings.component";
|
|
18
|
+
import * as i6 from "../appearance-settings/appearance-settings.component";
|
|
23
19
|
const _forTrack0 = ($index, $item) => $item.id;
|
|
24
20
|
function SettingsComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
25
21
|
i0.ɵɵelementStart(0, "div", 1);
|
|
@@ -45,13 +41,18 @@ function SettingsComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
|
45
41
|
} }
|
|
46
42
|
function SettingsComponent_Conditional_3_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
47
43
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
48
|
-
i0.ɵɵelementStart(0, "button",
|
|
44
|
+
i0.ɵɵelementStart(0, "button", 22);
|
|
49
45
|
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_1_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.clearSearch()); });
|
|
50
|
-
i0.ɵɵelement(1, "i",
|
|
46
|
+
i0.ɵɵelement(1, "i", 23);
|
|
51
47
|
i0.ɵɵelementEnd();
|
|
52
48
|
} }
|
|
53
49
|
function SettingsComponent_Conditional_3_Conditional_1_For_8_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
54
|
-
i0.ɵɵelementStart(0, "span",
|
|
50
|
+
i0.ɵɵelementStart(0, "span", 27);
|
|
51
|
+
i0.ɵɵtext(1, "Soon");
|
|
52
|
+
i0.ɵɵelementEnd();
|
|
53
|
+
} }
|
|
54
|
+
function SettingsComponent_Conditional_3_Conditional_1_For_8_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
55
|
+
i0.ɵɵelementStart(0, "span", 29);
|
|
55
56
|
i0.ɵɵtext(1);
|
|
56
57
|
i0.ɵɵelementEnd();
|
|
57
58
|
} if (rf & 2) {
|
|
@@ -62,151 +63,46 @@ function SettingsComponent_Conditional_3_Conditional_1_For_8_Conditional_4_Templ
|
|
|
62
63
|
} }
|
|
63
64
|
function SettingsComponent_Conditional_3_Conditional_1_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
64
65
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
65
|
-
i0.ɵɵelementStart(0, "li",
|
|
66
|
+
i0.ɵɵelementStart(0, "li", 24);
|
|
66
67
|
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_1_For_8_Template_li_click_0_listener() { const tab_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onTabChange(tab_r6.id)); })("keydown.enter", function SettingsComponent_Conditional_3_Conditional_1_For_8_Template_li_keydown_enter_0_listener() { const tab_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onTabChange(tab_r6.id)); });
|
|
67
|
-
i0.ɵɵelement(1, "i",
|
|
68
|
-
i0.ɵɵelementStart(2, "span",
|
|
68
|
+
i0.ɵɵelement(1, "i", 25);
|
|
69
|
+
i0.ɵɵelementStart(2, "span", 26);
|
|
69
70
|
i0.ɵɵtext(3);
|
|
70
71
|
i0.ɵɵelementEnd();
|
|
71
|
-
i0.ɵɵtemplate(4, SettingsComponent_Conditional_3_Conditional_1_For_8_Conditional_4_Template, 2, 3, "span",
|
|
72
|
+
i0.ɵɵtemplate(4, SettingsComponent_Conditional_3_Conditional_1_For_8_Conditional_4_Template, 2, 0, "span", 27)(5, SettingsComponent_Conditional_3_Conditional_1_For_8_Conditional_5_Template, 2, 3, "span", 28);
|
|
72
73
|
i0.ɵɵelementEnd();
|
|
73
74
|
} if (rf & 2) {
|
|
74
75
|
const tab_r6 = ctx.$implicit;
|
|
75
76
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
76
|
-
i0.ɵɵclassProp("active", ctx_r1.activeTab === tab_r6.id);
|
|
77
|
-
i0.ɵɵattribute("aria-selected", ctx_r1.activeTab === tab_r6.id)("aria-controls", "panel-" + tab_r6.id);
|
|
77
|
+
i0.ɵɵclassProp("active", ctx_r1.activeTab === tab_r6.id)("disabled", tab_r6.disabled);
|
|
78
|
+
i0.ɵɵattribute("aria-selected", ctx_r1.activeTab === tab_r6.id)("aria-controls", "panel-" + tab_r6.id)("aria-disabled", tab_r6.disabled);
|
|
78
79
|
i0.ɵɵadvance();
|
|
79
80
|
i0.ɵɵclassMap(tab_r6.icon);
|
|
80
81
|
i0.ɵɵadvance(2);
|
|
81
82
|
i0.ɵɵtextInterpolate(tab_r6.label);
|
|
82
83
|
i0.ɵɵadvance();
|
|
83
|
-
i0.ɵɵconditional(tab_r6.
|
|
84
|
+
i0.ɵɵconditional(tab_r6.disabled ? 4 : -1);
|
|
85
|
+
i0.ɵɵadvance();
|
|
86
|
+
i0.ɵɵconditional(tab_r6.badgeCount && tab_r6.badgeCount > 0 ? 5 : -1);
|
|
84
87
|
} }
|
|
85
88
|
function SettingsComponent_Conditional_3_Conditional_1_Case_11_Template(rf, ctx) { if (rf & 1) {
|
|
86
|
-
|
|
87
|
-
i0.ɵɵelementStart(0, "div", 21)(1, "h2", 35);
|
|
88
|
-
i0.ɵɵtext(2, "General Settings");
|
|
89
|
-
i0.ɵɵelementEnd();
|
|
90
|
-
i0.ɵɵelementStart(3, "div", 36)(4, "mj-settings-card", 37);
|
|
91
|
-
i0.ɵɵlistener("toggle", function SettingsComponent_Conditional_3_Conditional_1_Case_11_Template_mj_settings_card_toggle_4_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleSection("profile")); });
|
|
92
|
-
i0.ɵɵelementStart(5, "div", 38);
|
|
93
|
-
i0.ɵɵelement(6, "mj-user-profile-settings");
|
|
94
|
-
i0.ɵɵelementEnd()();
|
|
95
|
-
i0.ɵɵelementStart(7, "mj-settings-card", 39);
|
|
96
|
-
i0.ɵɵlistener("toggle", function SettingsComponent_Conditional_3_Conditional_1_Case_11_Template_mj_settings_card_toggle_7_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleSection("preferences")); });
|
|
97
|
-
i0.ɵɵelementStart(8, "div", 38)(9, "p");
|
|
98
|
-
i0.ɵɵtext(10, "Customize your experience with display and behavior preferences.");
|
|
99
|
-
i0.ɵɵelementEnd()()()()();
|
|
100
|
-
} if (rf & 2) {
|
|
101
|
-
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
102
|
-
i0.ɵɵadvance(4);
|
|
103
|
-
i0.ɵɵproperty("expanded", ctx_r1.isSectionExpanded("profile"));
|
|
104
|
-
i0.ɵɵadvance(3);
|
|
105
|
-
i0.ɵɵproperty("expanded", ctx_r1.isSectionExpanded("preferences"));
|
|
89
|
+
i0.ɵɵelement(0, "mj-general-settings");
|
|
106
90
|
} }
|
|
107
91
|
function SettingsComponent_Conditional_3_Conditional_1_Case_12_Template(rf, ctx) { if (rf & 1) {
|
|
108
|
-
i0.ɵɵelementStart(0, "div",
|
|
109
|
-
i0.ɵɵtext(2, "User Management");
|
|
110
|
-
i0.ɵɵelementEnd();
|
|
111
|
-
i0.ɵɵelementStart(3, "p", 40);
|
|
112
|
-
i0.ɵɵtext(4, "Manage user accounts, roles, and permissions");
|
|
113
|
-
i0.ɵɵelementEnd();
|
|
114
|
-
i0.ɵɵelement(5, "mj-user-management");
|
|
115
|
-
i0.ɵɵelementEnd();
|
|
116
|
-
} }
|
|
117
|
-
function SettingsComponent_Conditional_3_Conditional_1_Case_13_Template(rf, ctx) { if (rf & 1) {
|
|
118
|
-
i0.ɵɵelementStart(0, "div", 23)(1, "h2", 35);
|
|
119
|
-
i0.ɵɵtext(2, "Role Management");
|
|
120
|
-
i0.ɵɵelementEnd();
|
|
121
|
-
i0.ɵɵelementStart(3, "p", 40);
|
|
122
|
-
i0.ɵɵtext(4, "Define and manage security roles.");
|
|
123
|
-
i0.ɵɵelementEnd();
|
|
124
|
-
i0.ɵɵelement(5, "mj-role-management");
|
|
125
|
-
i0.ɵɵelementEnd();
|
|
126
|
-
} }
|
|
127
|
-
function SettingsComponent_Conditional_3_Conditional_1_Case_14_Template(rf, ctx) { if (rf & 1) {
|
|
128
|
-
i0.ɵɵelementStart(0, "div", 24);
|
|
129
|
-
i0.ɵɵelement(1, "mj-application-management");
|
|
130
|
-
i0.ɵɵelementEnd();
|
|
131
|
-
} }
|
|
132
|
-
function SettingsComponent_Conditional_3_Conditional_1_Case_15_Template(rf, ctx) { if (rf & 1) {
|
|
133
|
-
i0.ɵɵelementStart(0, "div", 25);
|
|
134
|
-
i0.ɵɵelement(1, "mj-entity-permissions");
|
|
135
|
-
i0.ɵɵelementEnd();
|
|
136
|
-
} }
|
|
137
|
-
function SettingsComponent_Conditional_3_Conditional_1_Case_16_Template(rf, ctx) { if (rf & 1) {
|
|
138
|
-
i0.ɵɵelementStart(0, "div", 26)(1, "h2", 35);
|
|
92
|
+
i0.ɵɵelementStart(0, "div", 21)(1, "h2", 30);
|
|
139
93
|
i0.ɵɵtext(2, "Notifications");
|
|
140
94
|
i0.ɵɵelementEnd();
|
|
141
|
-
i0.ɵɵelementStart(3, "p",
|
|
95
|
+
i0.ɵɵelementStart(3, "p", 31);
|
|
142
96
|
i0.ɵɵtext(4, "Configure how and when you receive notifications");
|
|
143
97
|
i0.ɵɵelementEnd();
|
|
144
98
|
i0.ɵɵelement(5, "mj-notification-preferences");
|
|
145
99
|
i0.ɵɵelementEnd();
|
|
146
100
|
} }
|
|
147
|
-
function
|
|
148
|
-
i0.ɵɵ
|
|
149
|
-
i0.ɵɵelement(1, "mj-sql-logging");
|
|
150
|
-
i0.ɵɵelementEnd();
|
|
151
|
-
} }
|
|
152
|
-
function SettingsComponent_Conditional_3_Conditional_1_Case_17_Case_19_Template(rf, ctx) { if (rf & 1) {
|
|
153
|
-
i0.ɵɵelementStart(0, "div", 52)(1, "h3");
|
|
154
|
-
i0.ɵɵtext(2, "Performance Settings");
|
|
155
|
-
i0.ɵɵelementEnd();
|
|
156
|
-
i0.ɵɵelementStart(3, "p");
|
|
157
|
-
i0.ɵɵtext(4, "Performance monitoring and optimization tools coming soon.");
|
|
158
|
-
i0.ɵɵelementEnd()();
|
|
159
|
-
} }
|
|
160
|
-
function SettingsComponent_Conditional_3_Conditional_1_Case_17_Case_20_Template(rf, ctx) { if (rf & 1) {
|
|
161
|
-
i0.ɵɵelementStart(0, "div", 53)(1, "h3");
|
|
162
|
-
i0.ɵɵtext(2, "Developer Tools");
|
|
163
|
-
i0.ɵɵelementEnd();
|
|
164
|
-
i0.ɵɵelementStart(3, "p");
|
|
165
|
-
i0.ɵɵtext(4, "Advanced developer options coming soon.");
|
|
166
|
-
i0.ɵɵelementEnd()();
|
|
101
|
+
function SettingsComponent_Conditional_3_Conditional_1_Case_13_Template(rf, ctx) { if (rf & 1) {
|
|
102
|
+
i0.ɵɵelement(0, "mj-application-settings");
|
|
167
103
|
} }
|
|
168
|
-
function
|
|
169
|
-
|
|
170
|
-
i0.ɵɵelementStart(0, "div", 27)(1, "h2", 35);
|
|
171
|
-
i0.ɵɵtext(2, "Advanced Settings");
|
|
172
|
-
i0.ɵɵelementEnd();
|
|
173
|
-
i0.ɵɵelementStart(3, "div", 41);
|
|
174
|
-
i0.ɵɵelement(4, "i", 42);
|
|
175
|
-
i0.ɵɵelementStart(5, "span");
|
|
176
|
-
i0.ɵɵtext(6, "Beta features - Use with caution");
|
|
177
|
-
i0.ɵɵelementEnd()();
|
|
178
|
-
i0.ɵɵelementStart(7, "div", 43)(8, "button", 44);
|
|
179
|
-
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_1_Case_17_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.setAdvancedTab("sql-logging")); });
|
|
180
|
-
i0.ɵɵelement(9, "i", 45);
|
|
181
|
-
i0.ɵɵtext(10, " SQL Logging ");
|
|
182
|
-
i0.ɵɵelementEnd();
|
|
183
|
-
i0.ɵɵelementStart(11, "button", 46);
|
|
184
|
-
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_1_Case_17_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.setAdvancedTab("performance")); });
|
|
185
|
-
i0.ɵɵelement(12, "i", 47);
|
|
186
|
-
i0.ɵɵtext(13, " Performance ");
|
|
187
|
-
i0.ɵɵelementEnd();
|
|
188
|
-
i0.ɵɵelementStart(14, "button", 48);
|
|
189
|
-
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_1_Case_17_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.setAdvancedTab("developer")); });
|
|
190
|
-
i0.ɵɵelement(15, "i", 49);
|
|
191
|
-
i0.ɵɵtext(16, " Developer Tools ");
|
|
192
|
-
i0.ɵɵelementEnd()();
|
|
193
|
-
i0.ɵɵelementStart(17, "div", 50);
|
|
194
|
-
i0.ɵɵtemplate(18, SettingsComponent_Conditional_3_Conditional_1_Case_17_Case_18_Template, 2, 0, "div", 51)(19, SettingsComponent_Conditional_3_Conditional_1_Case_17_Case_19_Template, 5, 0, "div", 52)(20, SettingsComponent_Conditional_3_Conditional_1_Case_17_Case_20_Template, 5, 0, "div", 53);
|
|
195
|
-
i0.ɵɵelementEnd()();
|
|
196
|
-
} if (rf & 2) {
|
|
197
|
-
let tmp_9_0;
|
|
198
|
-
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
199
|
-
i0.ɵɵadvance(8);
|
|
200
|
-
i0.ɵɵclassProp("active", ctx_r1.advancedActiveTab === "sql-logging");
|
|
201
|
-
i0.ɵɵattribute("aria-selected", ctx_r1.advancedActiveTab === "sql-logging");
|
|
202
|
-
i0.ɵɵadvance(3);
|
|
203
|
-
i0.ɵɵclassProp("active", ctx_r1.advancedActiveTab === "performance");
|
|
204
|
-
i0.ɵɵattribute("aria-selected", ctx_r1.advancedActiveTab === "performance");
|
|
205
|
-
i0.ɵɵadvance(3);
|
|
206
|
-
i0.ɵɵclassProp("active", ctx_r1.advancedActiveTab === "developer");
|
|
207
|
-
i0.ɵɵattribute("aria-selected", ctx_r1.advancedActiveTab === "developer");
|
|
208
|
-
i0.ɵɵadvance(4);
|
|
209
|
-
i0.ɵɵconditional((tmp_9_0 = ctx_r1.advancedActiveTab) === "sql-logging" ? 18 : tmp_9_0 === "performance" ? 19 : tmp_9_0 === "developer" ? 20 : -1);
|
|
104
|
+
function SettingsComponent_Conditional_3_Conditional_1_Case_14_Template(rf, ctx) { if (rf & 1) {
|
|
105
|
+
i0.ɵɵelement(0, "mj-appearance-settings");
|
|
210
106
|
} }
|
|
211
107
|
function SettingsComponent_Conditional_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
212
108
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
@@ -218,10 +114,10 @@ function SettingsComponent_Conditional_3_Conditional_1_Template(rf, ctx) { if (r
|
|
|
218
114
|
i0.ɵɵtemplate(5, SettingsComponent_Conditional_3_Conditional_1_Conditional_5_Template, 2, 0, "button", 16);
|
|
219
115
|
i0.ɵɵelementEnd();
|
|
220
116
|
i0.ɵɵelementStart(6, "ul", 17);
|
|
221
|
-
i0.ɵɵrepeaterCreate(7, SettingsComponent_Conditional_3_Conditional_1_For_8_Template,
|
|
117
|
+
i0.ɵɵrepeaterCreate(7, SettingsComponent_Conditional_3_Conditional_1_For_8_Template, 6, 12, "li", 18, _forTrack0);
|
|
222
118
|
i0.ɵɵelementEnd()();
|
|
223
119
|
i0.ɵɵelementStart(9, "div", 19)(10, "div", 20);
|
|
224
|
-
i0.ɵɵtemplate(11, SettingsComponent_Conditional_3_Conditional_1_Case_11_Template,
|
|
120
|
+
i0.ɵɵtemplate(11, SettingsComponent_Conditional_3_Conditional_1_Case_11_Template, 1, 0, "mj-general-settings")(12, SettingsComponent_Conditional_3_Conditional_1_Case_12_Template, 6, 0, "div", 21)(13, SettingsComponent_Conditional_3_Conditional_1_Case_13_Template, 1, 0, "mj-application-settings")(14, SettingsComponent_Conditional_3_Conditional_1_Case_14_Template, 1, 0, "mj-appearance-settings");
|
|
225
121
|
i0.ɵɵelementEnd()()();
|
|
226
122
|
} if (rf & 2) {
|
|
227
123
|
let tmp_6_0;
|
|
@@ -235,18 +131,18 @@ function SettingsComponent_Conditional_3_Conditional_1_Template(rf, ctx) { if (r
|
|
|
235
131
|
i0.ɵɵadvance(2);
|
|
236
132
|
i0.ɵɵattribute("id", "panel-" + ctx_r1.activeTab);
|
|
237
133
|
i0.ɵɵadvance(2);
|
|
238
|
-
i0.ɵɵconditional((tmp_6_0 = ctx_r1.activeTab) === "general" ? 11 : tmp_6_0 === "
|
|
134
|
+
i0.ɵɵconditional((tmp_6_0 = ctx_r1.activeTab) === "general" ? 11 : tmp_6_0 === "notifications" ? 12 : tmp_6_0 === "applications" ? 13 : tmp_6_0 === "appearance" ? 14 : -1);
|
|
239
135
|
} }
|
|
240
136
|
function SettingsComponent_Conditional_3_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
241
|
-
const
|
|
242
|
-
i0.ɵɵelementStart(0, "header",
|
|
243
|
-
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_Conditional_1_Template_button_click_1_listener() { i0.ɵɵrestoreView(
|
|
244
|
-
i0.ɵɵelement(2, "i",
|
|
137
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
138
|
+
i0.ɵɵelementStart(0, "header", 32)(1, "button", 42);
|
|
139
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_Conditional_1_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleMobileNav()); });
|
|
140
|
+
i0.ɵɵelement(2, "i", 43);
|
|
245
141
|
i0.ɵɵelementEnd();
|
|
246
|
-
i0.ɵɵelementStart(3, "h1",
|
|
142
|
+
i0.ɵɵelementStart(3, "h1", 44);
|
|
247
143
|
i0.ɵɵtext(4, "Settings");
|
|
248
144
|
i0.ɵɵelementEnd();
|
|
249
|
-
i0.ɵɵelement(5, "div",
|
|
145
|
+
i0.ɵɵelement(5, "div", 45);
|
|
250
146
|
i0.ɵɵelementEnd();
|
|
251
147
|
} if (rf & 2) {
|
|
252
148
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
@@ -254,186 +150,87 @@ function SettingsComponent_Conditional_3_Conditional_2_Conditional_1_Template(rf
|
|
|
254
150
|
i0.ɵɵattribute("aria-expanded", ctx_r1.isMobileNavOpen);
|
|
255
151
|
} }
|
|
256
152
|
function SettingsComponent_Conditional_3_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
257
|
-
const
|
|
258
|
-
i0.ɵɵelementStart(0, "div",
|
|
259
|
-
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_Conditional_2_Template_div_click_0_listener() { i0.ɵɵrestoreView(
|
|
153
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
154
|
+
i0.ɵɵelementStart(0, "div", 46);
|
|
155
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_Conditional_2_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.closeMobileNav()); });
|
|
260
156
|
i0.ɵɵelementEnd();
|
|
261
157
|
} }
|
|
262
158
|
function SettingsComponent_Conditional_3_Conditional_2_For_9_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
263
|
-
i0.ɵɵelementStart(0, "span",
|
|
159
|
+
i0.ɵɵelementStart(0, "span", 27);
|
|
160
|
+
i0.ɵɵtext(1, "Soon");
|
|
161
|
+
i0.ɵɵelementEnd();
|
|
162
|
+
} }
|
|
163
|
+
function SettingsComponent_Conditional_3_Conditional_2_For_9_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
164
|
+
i0.ɵɵelementStart(0, "span", 49);
|
|
264
165
|
i0.ɵɵtext(1);
|
|
265
166
|
i0.ɵɵelementEnd();
|
|
266
167
|
} if (rf & 2) {
|
|
267
|
-
const
|
|
268
|
-
i0.ɵɵclassMap("badge-" + (
|
|
168
|
+
const tab_r11 = i0.ɵɵnextContext().$implicit;
|
|
169
|
+
i0.ɵɵclassMap("badge-" + (tab_r11.badgeColor || "primary"));
|
|
269
170
|
i0.ɵɵadvance();
|
|
270
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
171
|
+
i0.ɵɵtextInterpolate1(" ", tab_r11.badgeCount, " ");
|
|
271
172
|
} }
|
|
272
173
|
function SettingsComponent_Conditional_3_Conditional_2_For_9_Template(rf, ctx) { if (rf & 1) {
|
|
273
|
-
const
|
|
274
|
-
i0.ɵɵelementStart(0, "button",
|
|
275
|
-
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_For_9_Template_button_click_0_listener() { const
|
|
276
|
-
i0.ɵɵelement(1, "i",
|
|
277
|
-
i0.ɵɵelementStart(2, "span",
|
|
174
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
175
|
+
i0.ɵɵelementStart(0, "button", 47);
|
|
176
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_For_9_Template_button_click_0_listener() { const tab_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onMobileTabChange(tab_r11.id)); });
|
|
177
|
+
i0.ɵɵelement(1, "i", 25);
|
|
178
|
+
i0.ɵɵelementStart(2, "span", 40);
|
|
278
179
|
i0.ɵɵtext(3);
|
|
279
180
|
i0.ɵɵelementEnd();
|
|
280
|
-
i0.ɵɵtemplate(4, SettingsComponent_Conditional_3_Conditional_2_For_9_Conditional_4_Template, 2, 3, "span",
|
|
181
|
+
i0.ɵɵtemplate(4, SettingsComponent_Conditional_3_Conditional_2_For_9_Conditional_4_Template, 2, 0, "span", 27)(5, SettingsComponent_Conditional_3_Conditional_2_For_9_Conditional_5_Template, 2, 3, "span", 48);
|
|
281
182
|
i0.ɵɵelementEnd();
|
|
282
183
|
} if (rf & 2) {
|
|
283
|
-
const
|
|
184
|
+
const tab_r11 = ctx.$implicit;
|
|
284
185
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
285
|
-
i0.ɵɵclassProp("active", ctx_r1.activeTab ===
|
|
286
|
-
i0.ɵɵ
|
|
186
|
+
i0.ɵɵclassProp("active", ctx_r1.activeTab === tab_r11.id)("disabled", tab_r11.disabled);
|
|
187
|
+
i0.ɵɵproperty("disabled", tab_r11.disabled);
|
|
188
|
+
i0.ɵɵattribute("aria-selected", ctx_r1.activeTab === tab_r11.id)("aria-label", tab_r11.label);
|
|
287
189
|
i0.ɵɵadvance();
|
|
288
|
-
i0.ɵɵclassMap(
|
|
190
|
+
i0.ɵɵclassMap(tab_r11.icon);
|
|
289
191
|
i0.ɵɵadvance(2);
|
|
290
|
-
i0.ɵɵtextInterpolate(
|
|
192
|
+
i0.ɵɵtextInterpolate(tab_r11.label);
|
|
291
193
|
i0.ɵɵadvance();
|
|
292
|
-
i0.ɵɵconditional(
|
|
194
|
+
i0.ɵɵconditional(tab_r11.disabled ? 4 : -1);
|
|
195
|
+
i0.ɵɵadvance();
|
|
196
|
+
i0.ɵɵconditional(tab_r11.badgeCount && tab_r11.badgeCount > 0 ? 5 : -1);
|
|
293
197
|
} }
|
|
294
198
|
function SettingsComponent_Conditional_3_Conditional_2_Case_16_Template(rf, ctx) { if (rf & 1) {
|
|
295
|
-
|
|
296
|
-
i0.ɵɵelementStart(0, "div", 21)(1, "h2", 35);
|
|
297
|
-
i0.ɵɵtext(2, "General Settings");
|
|
298
|
-
i0.ɵɵelementEnd();
|
|
299
|
-
i0.ɵɵelementStart(3, "div", 36)(4, "mj-settings-card", 37);
|
|
300
|
-
i0.ɵɵlistener("toggle", function SettingsComponent_Conditional_3_Conditional_2_Case_16_Template_mj_settings_card_toggle_4_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleSection("profile")); });
|
|
301
|
-
i0.ɵɵelementStart(5, "div", 38);
|
|
302
|
-
i0.ɵɵelement(6, "mj-user-profile-settings");
|
|
303
|
-
i0.ɵɵelementEnd()();
|
|
304
|
-
i0.ɵɵelementStart(7, "mj-settings-card", 39);
|
|
305
|
-
i0.ɵɵlistener("toggle", function SettingsComponent_Conditional_3_Conditional_2_Case_16_Template_mj_settings_card_toggle_7_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.toggleSection("preferences")); });
|
|
306
|
-
i0.ɵɵelementStart(8, "div", 38)(9, "p");
|
|
307
|
-
i0.ɵɵtext(10, "Customize your experience with display and behavior preferences.");
|
|
308
|
-
i0.ɵɵelementEnd()()()()();
|
|
309
|
-
} if (rf & 2) {
|
|
310
|
-
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
311
|
-
i0.ɵɵadvance(4);
|
|
312
|
-
i0.ɵɵproperty("expanded", ctx_r1.isSectionExpanded("profile"));
|
|
313
|
-
i0.ɵɵadvance(3);
|
|
314
|
-
i0.ɵɵproperty("expanded", ctx_r1.isSectionExpanded("preferences"));
|
|
199
|
+
i0.ɵɵelement(0, "mj-general-settings");
|
|
315
200
|
} }
|
|
316
201
|
function SettingsComponent_Conditional_3_Conditional_2_Case_17_Template(rf, ctx) { if (rf & 1) {
|
|
317
|
-
i0.ɵɵelementStart(0, "div",
|
|
318
|
-
i0.ɵɵtext(2, "User Management");
|
|
319
|
-
i0.ɵɵelementEnd();
|
|
320
|
-
i0.ɵɵelementStart(3, "p", 40);
|
|
321
|
-
i0.ɵɵtext(4, "Manage user accounts, roles, and permissions");
|
|
322
|
-
i0.ɵɵelementEnd();
|
|
323
|
-
i0.ɵɵelement(5, "mj-user-management");
|
|
324
|
-
i0.ɵɵelementEnd();
|
|
325
|
-
} }
|
|
326
|
-
function SettingsComponent_Conditional_3_Conditional_2_Case_18_Template(rf, ctx) { if (rf & 1) {
|
|
327
|
-
i0.ɵɵelementStart(0, "div", 23)(1, "h2", 35);
|
|
328
|
-
i0.ɵɵtext(2, "Role Management");
|
|
329
|
-
i0.ɵɵelementEnd();
|
|
330
|
-
i0.ɵɵelementStart(3, "p", 40);
|
|
331
|
-
i0.ɵɵtext(4, "Define and manage security roles.");
|
|
332
|
-
i0.ɵɵelementEnd();
|
|
333
|
-
i0.ɵɵelement(5, "mj-role-management");
|
|
334
|
-
i0.ɵɵelementEnd();
|
|
335
|
-
} }
|
|
336
|
-
function SettingsComponent_Conditional_3_Conditional_2_Case_19_Template(rf, ctx) { if (rf & 1) {
|
|
337
|
-
i0.ɵɵelementStart(0, "div", 24);
|
|
338
|
-
i0.ɵɵelement(1, "mj-application-management");
|
|
339
|
-
i0.ɵɵelementEnd();
|
|
340
|
-
} }
|
|
341
|
-
function SettingsComponent_Conditional_3_Conditional_2_Case_20_Template(rf, ctx) { if (rf & 1) {
|
|
342
|
-
i0.ɵɵelementStart(0, "div", 25);
|
|
343
|
-
i0.ɵɵelement(1, "mj-entity-permissions");
|
|
344
|
-
i0.ɵɵelementEnd();
|
|
345
|
-
} }
|
|
346
|
-
function SettingsComponent_Conditional_3_Conditional_2_Case_21_Template(rf, ctx) { if (rf & 1) {
|
|
347
|
-
i0.ɵɵelementStart(0, "div", 26)(1, "h2", 35);
|
|
202
|
+
i0.ɵɵelementStart(0, "div", 21)(1, "h2", 30);
|
|
348
203
|
i0.ɵɵtext(2, "Notifications");
|
|
349
204
|
i0.ɵɵelementEnd();
|
|
350
|
-
i0.ɵɵelementStart(3, "p",
|
|
205
|
+
i0.ɵɵelementStart(3, "p", 31);
|
|
351
206
|
i0.ɵɵtext(4, "Configure how and when you receive notifications");
|
|
352
207
|
i0.ɵɵelementEnd();
|
|
353
208
|
i0.ɵɵelement(5, "mj-notification-preferences");
|
|
354
209
|
i0.ɵɵelementEnd();
|
|
355
210
|
} }
|
|
356
|
-
function
|
|
357
|
-
i0.ɵɵ
|
|
358
|
-
i0.ɵɵelement(1, "mj-sql-logging");
|
|
359
|
-
i0.ɵɵelementEnd();
|
|
360
|
-
} }
|
|
361
|
-
function SettingsComponent_Conditional_3_Conditional_2_Case_22_Case_19_Template(rf, ctx) { if (rf & 1) {
|
|
362
|
-
i0.ɵɵelementStart(0, "div", 76)(1, "h3");
|
|
363
|
-
i0.ɵɵtext(2, "Performance Settings");
|
|
364
|
-
i0.ɵɵelementEnd();
|
|
365
|
-
i0.ɵɵelementStart(3, "p");
|
|
366
|
-
i0.ɵɵtext(4, "Performance monitoring and optimization tools coming soon.");
|
|
367
|
-
i0.ɵɵelementEnd()();
|
|
368
|
-
} }
|
|
369
|
-
function SettingsComponent_Conditional_3_Conditional_2_Case_22_Case_20_Template(rf, ctx) { if (rf & 1) {
|
|
370
|
-
i0.ɵɵelementStart(0, "div", 77)(1, "h3");
|
|
371
|
-
i0.ɵɵtext(2, "Developer Tools");
|
|
372
|
-
i0.ɵɵelementEnd();
|
|
373
|
-
i0.ɵɵelementStart(3, "p");
|
|
374
|
-
i0.ɵɵtext(4, "Advanced developer options coming soon.");
|
|
375
|
-
i0.ɵɵelementEnd()();
|
|
211
|
+
function SettingsComponent_Conditional_3_Conditional_2_Case_18_Template(rf, ctx) { if (rf & 1) {
|
|
212
|
+
i0.ɵɵelement(0, "mj-application-settings");
|
|
376
213
|
} }
|
|
377
|
-
function
|
|
378
|
-
|
|
379
|
-
i0.ɵɵelementStart(0, "div", 27)(1, "h2", 35);
|
|
380
|
-
i0.ɵɵtext(2, "Advanced Settings");
|
|
381
|
-
i0.ɵɵelementEnd();
|
|
382
|
-
i0.ɵɵelementStart(3, "div", 41);
|
|
383
|
-
i0.ɵɵelement(4, "i", 42);
|
|
384
|
-
i0.ɵɵelementStart(5, "span");
|
|
385
|
-
i0.ɵɵtext(6, "Beta features - Use with caution");
|
|
386
|
-
i0.ɵɵelementEnd()();
|
|
387
|
-
i0.ɵɵelementStart(7, "div", 43)(8, "button", 72);
|
|
388
|
-
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_Case_22_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.setAdvancedTab("sql-logging")); });
|
|
389
|
-
i0.ɵɵelement(9, "i", 45);
|
|
390
|
-
i0.ɵɵtext(10, " SQL Logging ");
|
|
391
|
-
i0.ɵɵelementEnd();
|
|
392
|
-
i0.ɵɵelementStart(11, "button", 73);
|
|
393
|
-
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_Case_22_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.setAdvancedTab("performance")); });
|
|
394
|
-
i0.ɵɵelement(12, "i", 47);
|
|
395
|
-
i0.ɵɵtext(13, " Performance ");
|
|
396
|
-
i0.ɵɵelementEnd();
|
|
397
|
-
i0.ɵɵelementStart(14, "button", 74);
|
|
398
|
-
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_Case_22_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.setAdvancedTab("developer")); });
|
|
399
|
-
i0.ɵɵelement(15, "i", 49);
|
|
400
|
-
i0.ɵɵtext(16, " Developer Tools ");
|
|
401
|
-
i0.ɵɵelementEnd()();
|
|
402
|
-
i0.ɵɵelementStart(17, "div", 50);
|
|
403
|
-
i0.ɵɵtemplate(18, SettingsComponent_Conditional_3_Conditional_2_Case_22_Case_18_Template, 2, 0, "div", 75)(19, SettingsComponent_Conditional_3_Conditional_2_Case_22_Case_19_Template, 5, 0, "div", 76)(20, SettingsComponent_Conditional_3_Conditional_2_Case_22_Case_20_Template, 5, 0, "div", 77);
|
|
404
|
-
i0.ɵɵelementEnd()();
|
|
405
|
-
} if (rf & 2) {
|
|
406
|
-
let tmp_9_0;
|
|
407
|
-
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
408
|
-
i0.ɵɵadvance(8);
|
|
409
|
-
i0.ɵɵclassProp("active", ctx_r1.advancedActiveTab === "sql-logging");
|
|
410
|
-
i0.ɵɵattribute("aria-selected", ctx_r1.advancedActiveTab === "sql-logging");
|
|
411
|
-
i0.ɵɵadvance(3);
|
|
412
|
-
i0.ɵɵclassProp("active", ctx_r1.advancedActiveTab === "performance");
|
|
413
|
-
i0.ɵɵattribute("aria-selected", ctx_r1.advancedActiveTab === "performance");
|
|
414
|
-
i0.ɵɵadvance(3);
|
|
415
|
-
i0.ɵɵclassProp("active", ctx_r1.advancedActiveTab === "developer");
|
|
416
|
-
i0.ɵɵattribute("aria-selected", ctx_r1.advancedActiveTab === "developer");
|
|
417
|
-
i0.ɵɵadvance(4);
|
|
418
|
-
i0.ɵɵconditional((tmp_9_0 = ctx_r1.advancedActiveTab) === "sql-logging" ? 18 : tmp_9_0 === "performance" ? 19 : tmp_9_0 === "developer" ? 20 : -1);
|
|
214
|
+
function SettingsComponent_Conditional_3_Conditional_2_Case_19_Template(rf, ctx) { if (rf & 1) {
|
|
215
|
+
i0.ɵɵelement(0, "mj-appearance-settings");
|
|
419
216
|
} }
|
|
420
217
|
function SettingsComponent_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
421
|
-
const
|
|
218
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
422
219
|
i0.ɵɵelementStart(0, "div", 11);
|
|
423
|
-
i0.ɵɵtemplate(1, SettingsComponent_Conditional_3_Conditional_2_Conditional_1_Template, 6, 1, "header",
|
|
424
|
-
i0.ɵɵelementStart(3, "nav",
|
|
220
|
+
i0.ɵɵtemplate(1, SettingsComponent_Conditional_3_Conditional_2_Conditional_1_Template, 6, 1, "header", 32)(2, SettingsComponent_Conditional_3_Conditional_2_Conditional_2_Template, 1, 0, "div", 33);
|
|
221
|
+
i0.ɵɵelementStart(3, "nav", 34)(4, "div", 35)(5, "span", 36);
|
|
425
222
|
i0.ɵɵtext(6, "Settings");
|
|
426
223
|
i0.ɵɵelementEnd()();
|
|
427
|
-
i0.ɵɵelementStart(7, "div",
|
|
428
|
-
i0.ɵɵrepeaterCreate(8, SettingsComponent_Conditional_3_Conditional_2_For_9_Template,
|
|
429
|
-
i0.ɵɵelementStart(10, "button",
|
|
430
|
-
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_Template_button_click_10_listener() { i0.ɵɵrestoreView(
|
|
431
|
-
i0.ɵɵelement(11, "i",
|
|
432
|
-
i0.ɵɵelementStart(12, "span",
|
|
224
|
+
i0.ɵɵelementStart(7, "div", 37);
|
|
225
|
+
i0.ɵɵrepeaterCreate(8, SettingsComponent_Conditional_3_Conditional_2_For_9_Template, 6, 12, "button", 38, _forTrack0);
|
|
226
|
+
i0.ɵɵelementStart(10, "button", 39);
|
|
227
|
+
i0.ɵɵlistener("click", function SettingsComponent_Conditional_3_Conditional_2_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.closeSettings()); });
|
|
228
|
+
i0.ɵɵelement(11, "i", 23);
|
|
229
|
+
i0.ɵɵelementStart(12, "span", 40);
|
|
433
230
|
i0.ɵɵtext(13, "Close");
|
|
434
231
|
i0.ɵɵelementEnd()()()();
|
|
435
|
-
i0.ɵɵelementStart(14, "div",
|
|
436
|
-
i0.ɵɵtemplate(16, SettingsComponent_Conditional_3_Conditional_2_Case_16_Template,
|
|
232
|
+
i0.ɵɵelementStart(14, "div", 41)(15, "div", 20);
|
|
233
|
+
i0.ɵɵtemplate(16, SettingsComponent_Conditional_3_Conditional_2_Case_16_Template, 1, 0, "mj-general-settings")(17, SettingsComponent_Conditional_3_Conditional_2_Case_17_Template, 6, 0, "div", 21)(18, SettingsComponent_Conditional_3_Conditional_2_Case_18_Template, 1, 0, "mj-application-settings")(19, SettingsComponent_Conditional_3_Conditional_2_Case_19_Template, 1, 0, "mj-appearance-settings");
|
|
437
234
|
i0.ɵɵelementEnd()()();
|
|
438
235
|
} if (rf & 2) {
|
|
439
236
|
let tmp_6_0;
|
|
@@ -447,11 +244,11 @@ function SettingsComponent_Conditional_3_Conditional_2_Template(rf, ctx) { if (r
|
|
|
447
244
|
i0.ɵɵadvance(5);
|
|
448
245
|
i0.ɵɵrepeater(ctx_r1.filteredTabs);
|
|
449
246
|
i0.ɵɵadvance(8);
|
|
450
|
-
i0.ɵɵconditional((tmp_6_0 = ctx_r1.activeTab) === "general" ? 16 : tmp_6_0 === "
|
|
247
|
+
i0.ɵɵconditional((tmp_6_0 = ctx_r1.activeTab) === "general" ? 16 : tmp_6_0 === "notifications" ? 17 : tmp_6_0 === "applications" ? 18 : tmp_6_0 === "appearance" ? 19 : -1);
|
|
451
248
|
} }
|
|
452
249
|
function SettingsComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
453
250
|
i0.ɵɵelementStart(0, "div", 3);
|
|
454
|
-
i0.ɵɵtemplate(1, SettingsComponent_Conditional_3_Conditional_1_Template,
|
|
251
|
+
i0.ɵɵtemplate(1, SettingsComponent_Conditional_3_Conditional_1_Template, 15, 4, "div", 10)(2, SettingsComponent_Conditional_3_Conditional_2_Template, 20, 5, "div", 11);
|
|
455
252
|
i0.ɵɵelementEnd();
|
|
456
253
|
} if (rf & 2) {
|
|
457
254
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -465,7 +262,6 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
465
262
|
stateChange = new EventEmitter();
|
|
466
263
|
// State management
|
|
467
264
|
activeTab = 'general';
|
|
468
|
-
advancedActiveTab = 'sql-logging';
|
|
469
265
|
searchTerm$ = new BehaviorSubject('');
|
|
470
266
|
isLoading = false;
|
|
471
267
|
error = null;
|
|
@@ -474,53 +270,35 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
474
270
|
searchResults = [];
|
|
475
271
|
isSearching = false;
|
|
476
272
|
showSearchResults = false;
|
|
477
|
-
// Tab configuration
|
|
273
|
+
// Tab configuration - User-focused tabs only
|
|
478
274
|
tabs = [
|
|
479
275
|
{
|
|
480
276
|
id: 'general',
|
|
481
277
|
label: 'General',
|
|
482
|
-
icon: 'fa-solid fa-
|
|
483
|
-
|
|
484
|
-
},
|
|
485
|
-
{
|
|
486
|
-
id: 'users',
|
|
487
|
-
label: 'Users',
|
|
488
|
-
icon: 'fa-solid fa-users',
|
|
489
|
-
badgeCount: 0
|
|
278
|
+
icon: 'fa-solid fa-user',
|
|
279
|
+
description: 'Profile and account information'
|
|
490
280
|
},
|
|
491
281
|
{
|
|
492
|
-
id: '
|
|
493
|
-
label: '
|
|
494
|
-
icon: 'fa-solid fa-
|
|
495
|
-
|
|
282
|
+
id: 'notifications',
|
|
283
|
+
label: 'Notifications',
|
|
284
|
+
icon: 'fa-solid fa-bell',
|
|
285
|
+
description: 'Notification preferences and delivery channels'
|
|
496
286
|
},
|
|
497
287
|
{
|
|
498
288
|
id: 'applications',
|
|
499
289
|
label: 'Applications',
|
|
500
290
|
icon: 'fa-solid fa-th-large',
|
|
501
|
-
|
|
502
|
-
},
|
|
503
|
-
{
|
|
504
|
-
id: 'permissions',
|
|
505
|
-
label: 'Permissions',
|
|
506
|
-
icon: 'fa-solid fa-lock',
|
|
507
|
-
badgeCount: 0
|
|
291
|
+
description: 'Manage visible applications and ordering'
|
|
508
292
|
},
|
|
509
293
|
{
|
|
510
|
-
id: '
|
|
511
|
-
label: '
|
|
512
|
-
icon: 'fa-solid fa-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
{
|
|
516
|
-
id: 'advanced',
|
|
517
|
-
label: 'Advanced',
|
|
518
|
-
icon: 'fa-solid fa-flask',
|
|
519
|
-
badgeCount: 1,
|
|
520
|
-
badgeColor: 'warning'
|
|
294
|
+
id: 'appearance',
|
|
295
|
+
label: 'Appearance',
|
|
296
|
+
icon: 'fa-solid fa-palette',
|
|
297
|
+
description: 'Theme and display settings',
|
|
298
|
+
disabled: true
|
|
521
299
|
}
|
|
522
300
|
];
|
|
523
|
-
// Searchable content registry
|
|
301
|
+
// Searchable content registry - User settings only
|
|
524
302
|
searchableItems = [
|
|
525
303
|
// General tab
|
|
526
304
|
{
|
|
@@ -532,95 +310,53 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
532
310
|
description: 'Manage your profile picture and account information'
|
|
533
311
|
},
|
|
534
312
|
{
|
|
535
|
-
id: '
|
|
313
|
+
id: 'account',
|
|
536
314
|
tabId: 'general',
|
|
537
|
-
sectionId: '
|
|
538
|
-
label: '
|
|
539
|
-
keywords: ['
|
|
540
|
-
description: '
|
|
315
|
+
sectionId: 'account',
|
|
316
|
+
label: 'Account Information',
|
|
317
|
+
keywords: ['account', 'email', 'role', 'login', 'status', 'type'],
|
|
318
|
+
description: 'View your account details and status'
|
|
541
319
|
},
|
|
320
|
+
// Notifications tab
|
|
542
321
|
{
|
|
543
322
|
id: 'notifications',
|
|
544
323
|
tabId: 'notifications',
|
|
545
324
|
sectionId: 'notifications',
|
|
546
|
-
label: '
|
|
547
|
-
keywords: ['notifications', 'alerts', 'email', '
|
|
325
|
+
label: 'Notification Preferences',
|
|
326
|
+
keywords: ['notifications', 'alerts', 'email', 'sms', 'in-app', 'messages'],
|
|
548
327
|
description: 'Configure how and when you receive notifications'
|
|
549
328
|
},
|
|
550
|
-
// Users tab
|
|
551
|
-
{
|
|
552
|
-
id: 'users',
|
|
553
|
-
tabId: 'users',
|
|
554
|
-
label: 'User Management',
|
|
555
|
-
keywords: ['users', 'accounts', 'members', 'people', 'employees', 'team', 'manage users', 'add user', 'delete user'],
|
|
556
|
-
description: 'Manage user accounts, roles, and permissions'
|
|
557
|
-
},
|
|
558
|
-
// Roles tab
|
|
559
|
-
{
|
|
560
|
-
id: 'roles',
|
|
561
|
-
tabId: 'roles',
|
|
562
|
-
label: 'Role Management',
|
|
563
|
-
keywords: ['roles', 'permissions', 'security', 'access', 'groups', 'authorization', 'admin', 'moderator'],
|
|
564
|
-
description: 'Define and manage security roles'
|
|
565
|
-
},
|
|
566
329
|
// Applications tab
|
|
567
330
|
{
|
|
568
331
|
id: 'applications',
|
|
569
332
|
tabId: 'applications',
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
// Permissions tab
|
|
575
|
-
{
|
|
576
|
-
id: 'permissions',
|
|
577
|
-
tabId: 'permissions',
|
|
578
|
-
label: 'Entity Permissions',
|
|
579
|
-
keywords: ['permissions', 'entities', 'access', 'crud', 'security', 'read', 'write', 'delete', 'create'],
|
|
580
|
-
description: 'Manage entity-level permissions and access control'
|
|
581
|
-
},
|
|
582
|
-
// Advanced tab - SQL Logging
|
|
583
|
-
{
|
|
584
|
-
id: 'sql-logging',
|
|
585
|
-
tabId: 'advanced',
|
|
586
|
-
sectionId: 'sql-logging',
|
|
587
|
-
label: 'SQL Logging',
|
|
588
|
-
keywords: ['sql', 'logging', 'database', 'queries', 'debug', 'performance', 'trace', 'monitor'],
|
|
589
|
-
description: 'Monitor and debug SQL queries'
|
|
590
|
-
},
|
|
591
|
-
// Advanced tab - Performance
|
|
592
|
-
{
|
|
593
|
-
id: 'performance',
|
|
594
|
-
tabId: 'advanced',
|
|
595
|
-
sectionId: 'performance',
|
|
596
|
-
label: 'Performance',
|
|
597
|
-
keywords: ['performance', 'speed', 'optimization', 'monitoring', 'metrics', 'cache'],
|
|
598
|
-
description: 'Performance monitoring and optimization tools'
|
|
333
|
+
sectionId: 'applications',
|
|
334
|
+
label: 'Application Settings',
|
|
335
|
+
keywords: ['applications', 'apps', 'switcher', 'order', 'visibility', 'menu'],
|
|
336
|
+
description: 'Choose which applications appear in your app switcher'
|
|
599
337
|
},
|
|
600
|
-
//
|
|
338
|
+
// Appearance tab
|
|
601
339
|
{
|
|
602
|
-
id: '
|
|
603
|
-
tabId: '
|
|
604
|
-
sectionId: '
|
|
605
|
-
label: '
|
|
606
|
-
keywords: ['
|
|
607
|
-
description: '
|
|
340
|
+
id: 'appearance',
|
|
341
|
+
tabId: 'appearance',
|
|
342
|
+
sectionId: 'appearance',
|
|
343
|
+
label: 'Appearance Settings',
|
|
344
|
+
keywords: ['appearance', 'theme', 'dark', 'light', 'display', 'font', 'density'],
|
|
345
|
+
description: 'Customize how the application looks'
|
|
608
346
|
}
|
|
609
347
|
];
|
|
610
348
|
// Section expansion state
|
|
611
|
-
expandedSections = ['profile', '
|
|
349
|
+
expandedSections = ['profile', 'account'];
|
|
612
350
|
// Mobile state
|
|
613
351
|
isMobile = window.innerWidth < 768;
|
|
614
352
|
isMobileNavOpen = false;
|
|
615
353
|
destroy$ = new Subject();
|
|
616
354
|
constructor(location) {
|
|
617
|
-
// Listen for window resize
|
|
618
355
|
super();
|
|
619
356
|
this.location = location;
|
|
620
357
|
window.addEventListener('resize', this.handleResize.bind(this));
|
|
621
358
|
}
|
|
622
359
|
ngOnInit() {
|
|
623
|
-
// Initialize filtered tabs with all tabs
|
|
624
360
|
this.filteredTabs = [...this.tabs];
|
|
625
361
|
this.setupSearchFilter();
|
|
626
362
|
this.loadInitialData();
|
|
@@ -641,7 +377,6 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
641
377
|
async loadInitialData() {
|
|
642
378
|
try {
|
|
643
379
|
this.isLoading = true;
|
|
644
|
-
// TODO: Load user settings, roles, applications data
|
|
645
380
|
await this.simulateDataLoad();
|
|
646
381
|
this.isLoading = false;
|
|
647
382
|
}
|
|
@@ -651,9 +386,13 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
651
386
|
}
|
|
652
387
|
}
|
|
653
388
|
async simulateDataLoad() {
|
|
654
|
-
return new Promise(resolve => setTimeout(resolve,
|
|
389
|
+
return new Promise(resolve => setTimeout(resolve, 300));
|
|
655
390
|
}
|
|
656
391
|
onTabChange(tabId) {
|
|
392
|
+
const tab = this.tabs.find(t => t.id === tabId);
|
|
393
|
+
if (tab?.disabled) {
|
|
394
|
+
return; // Don't switch to disabled tabs
|
|
395
|
+
}
|
|
657
396
|
this.activeTab = tabId;
|
|
658
397
|
this.emitStateChange();
|
|
659
398
|
}
|
|
@@ -674,12 +413,8 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
674
413
|
isSectionExpanded(sectionId) {
|
|
675
414
|
return this.expandedSections.includes(sectionId);
|
|
676
415
|
}
|
|
677
|
-
setAdvancedTab(tabId) {
|
|
678
|
-
this.advancedActiveTab = tabId;
|
|
679
|
-
}
|
|
680
416
|
/**
|
|
681
417
|
* Filters searchable content based on search term
|
|
682
|
-
* Matches against labels, keywords, and descriptions
|
|
683
418
|
*/
|
|
684
419
|
filterContent(term) {
|
|
685
420
|
if (!term || term.trim() === '') {
|
|
@@ -705,19 +440,17 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
705
440
|
}
|
|
706
441
|
/**
|
|
707
442
|
* Navigates to a search result
|
|
708
|
-
* Switches to the correct tab and expands the relevant section
|
|
709
443
|
*/
|
|
710
444
|
navigateToSearchResult(result) {
|
|
445
|
+
const tab = this.tabs.find(t => t.id === result.tabId);
|
|
446
|
+
if (tab?.disabled) {
|
|
447
|
+
return; // Don't navigate to disabled tabs
|
|
448
|
+
}
|
|
711
449
|
this.activeTab = result.tabId;
|
|
712
|
-
//
|
|
450
|
+
// Expand the section if applicable
|
|
713
451
|
if (result.sectionId && !this.expandedSections.includes(result.sectionId)) {
|
|
714
452
|
this.expandedSections.push(result.sectionId);
|
|
715
453
|
}
|
|
716
|
-
// If advanced tab, set the sub-tab
|
|
717
|
-
if (result.tabId === 'advanced' && result.sectionId) {
|
|
718
|
-
this.advancedActiveTab = result.sectionId;
|
|
719
|
-
}
|
|
720
|
-
// Clear search after navigation
|
|
721
454
|
this.clearSearch();
|
|
722
455
|
this.emitStateChange();
|
|
723
456
|
}
|
|
@@ -731,7 +464,7 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
731
464
|
this.filteredTabs = [...this.tabs];
|
|
732
465
|
}
|
|
733
466
|
/**
|
|
734
|
-
* Toggles the mobile navigation rail
|
|
467
|
+
* Toggles the mobile navigation rail
|
|
735
468
|
*/
|
|
736
469
|
toggleMobileNav() {
|
|
737
470
|
this.isMobileNavOpen = !this.isMobileNavOpen;
|
|
@@ -749,7 +482,7 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
749
482
|
this.location.back();
|
|
750
483
|
}
|
|
751
484
|
/**
|
|
752
|
-
* Handles tab change on mobile
|
|
485
|
+
* Handles tab change on mobile
|
|
753
486
|
*/
|
|
754
487
|
onMobileTabChange(tabId) {
|
|
755
488
|
this.onTabChange(tabId);
|
|
@@ -757,7 +490,6 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
757
490
|
}
|
|
758
491
|
handleResize() {
|
|
759
492
|
this.isMobile = window.innerWidth < 768;
|
|
760
|
-
// Close mobile nav on resize to desktop
|
|
761
493
|
if (!this.isMobile) {
|
|
762
494
|
this.isMobileNavOpen = false;
|
|
763
495
|
}
|
|
@@ -781,20 +513,6 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
781
513
|
this.expandedSections = [...state.expandedSections];
|
|
782
514
|
}
|
|
783
515
|
}
|
|
784
|
-
/**
|
|
785
|
-
* Gets the icon for a tab by its ID
|
|
786
|
-
*/
|
|
787
|
-
getTabIconById(tabId) {
|
|
788
|
-
const tab = this.tabs.find(t => t.id === tabId);
|
|
789
|
-
return tab?.icon || 'fa-solid fa-cog';
|
|
790
|
-
}
|
|
791
|
-
/**
|
|
792
|
-
* Gets the label for a tab by its ID
|
|
793
|
-
*/
|
|
794
|
-
getTabLabelById(tabId) {
|
|
795
|
-
const tab = this.tabs.find(t => t.id === tabId);
|
|
796
|
-
return tab?.label || tabId;
|
|
797
|
-
}
|
|
798
516
|
getTabIcon(tab) {
|
|
799
517
|
return tab.icon;
|
|
800
518
|
}
|
|
@@ -803,13 +521,19 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
803
521
|
if (this.activeTab === tab.id) {
|
|
804
522
|
classes.push('active');
|
|
805
523
|
}
|
|
524
|
+
if (tab.disabled) {
|
|
525
|
+
classes.push('disabled');
|
|
526
|
+
}
|
|
806
527
|
if (tab.badgeCount && tab.badgeCount > 0) {
|
|
807
528
|
classes.push('has-badge');
|
|
808
529
|
}
|
|
809
530
|
return classes.join(' ');
|
|
810
531
|
}
|
|
532
|
+
isTabDisabled(tab) {
|
|
533
|
+
return tab.disabled || false;
|
|
534
|
+
}
|
|
811
535
|
static ɵfac = function SettingsComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SettingsComponent)(i0.ɵɵdirectiveInject(i1.Location)); };
|
|
812
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SettingsComponent, selectors: [["mj-settings"]], outputs: { stateChange: "stateChange" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 3, consts: [[1, "mj-page-container"], ["role", "status", "aria-live", "polite", 1, "loading-container"], ["role", "alert", 1, "error-container"], [1, "settings-content"], ["text", "Loading settings..."], [1, "error-content"], ["aria-hidden", "true", 1, "fa-solid", "fa-exclamation-triangle", "error-icon"], [1, "error-message"], [1, "retry-button", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-refresh"], [1, "desktop-layout", 2, "display", "flex"], [1, "mobile-layout"], ["role", "navigation", "aria-label", "Settings navigation", 1, "side-navigation"], [1, "nav-search"], ["aria-hidden", "true", 1, "fa-solid", "fa-search", "nav-search-icon"], ["type", "text", "placeholder", "Search settings...", "aria-label", "Search settings", 1, "nav-search-input", 3, "input", "value"], ["aria-label", "Clear search", "tabindex", "0", 1, "nav-search-clear"], ["role", "tablist", "aria-orientation", "vertical", 1, "nav-list"], ["role", "tab", "tabindex", "0", 1, "nav-item", 3, "active"], ["role", "tabpanel", 1, "content-area"], [1, "tab-content"], [1, "
|
|
536
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SettingsComponent, selectors: [["mj-settings"]], outputs: { stateChange: "stateChange" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 3, consts: [[1, "mj-page-container"], ["role", "status", "aria-live", "polite", 1, "loading-container"], ["role", "alert", 1, "error-container"], [1, "settings-content"], ["text", "Loading settings..."], [1, "error-content"], ["aria-hidden", "true", 1, "fa-solid", "fa-exclamation-triangle", "error-icon"], [1, "error-message"], [1, "retry-button", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-refresh"], [1, "desktop-layout", 2, "display", "flex"], [1, "mobile-layout"], ["role", "navigation", "aria-label", "Settings navigation", 1, "side-navigation"], [1, "nav-search"], ["aria-hidden", "true", 1, "fa-solid", "fa-search", "nav-search-icon"], ["type", "text", "placeholder", "Search settings...", "aria-label", "Search settings", 1, "nav-search-input", 3, "input", "value"], ["aria-label", "Clear search", "tabindex", "0", 1, "nav-search-clear"], ["role", "tablist", "aria-orientation", "vertical", 1, "nav-list"], ["role", "tab", "tabindex", "0", 1, "nav-item", 3, "active", "disabled"], ["role", "tabpanel", 1, "content-area"], [1, "tab-content"], [1, "notifications-settings"], ["aria-label", "Clear search", "tabindex", "0", 1, "nav-search-clear", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-xmark"], ["role", "tab", "tabindex", "0", 1, "nav-item", 3, "click", "keydown.enter"], ["aria-hidden", "true"], [1, "nav-label"], [1, "coming-soon-badge"], [1, "nav-badge", 3, "class"], [1, "nav-badge"], [1, "section-title"], [1, "section-description"], [1, "mobile-header"], ["aria-hidden", "true", 1, "mobile-nav-backdrop"], ["role", "navigation", "aria-label", "Settings navigation", 1, "mobile-nav-rail"], [1, "nav-rail-header"], [1, "nav-rail-title"], ["role", "tablist", 1, "nav-rail-items"], ["role", "tab", 1, "nav-rail-item", 3, "active", "disabled"], ["aria-label", "Close settings", 1, "nav-rail-item", "nav-rail-close-item", 3, "click"], [1, "nav-rail-label"], [1, "mobile-content"], ["aria-label", "Toggle navigation menu", 1, "mobile-header-icon", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-bars"], [1, "mobile-header-title"], [1, "mobile-header-spacer"], ["aria-hidden", "true", 1, "mobile-nav-backdrop", 3, "click"], ["role", "tab", 1, "nav-rail-item", 3, "click", "disabled"], [1, "rail-badge", 3, "class"], [1, "rail-badge"]], template: function SettingsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
813
537
|
i0.ɵɵelementStart(0, "div", 0);
|
|
814
538
|
i0.ɵɵtemplate(1, SettingsComponent_Conditional_1_Template, 2, 0, "div", 1)(2, SettingsComponent_Conditional_2_Template, 8, 1, "div", 2)(3, SettingsComponent_Conditional_3_Template, 3, 2, "div", 3);
|
|
815
539
|
i0.ɵɵelementEnd();
|
|
@@ -820,7 +544,7 @@ let SettingsComponent = class SettingsComponent extends BaseNavigationComponent
|
|
|
820
544
|
i0.ɵɵconditional(ctx.error && !ctx.isLoading ? 2 : -1);
|
|
821
545
|
i0.ɵɵadvance();
|
|
822
546
|
i0.ɵɵconditional(!ctx.isLoading && !ctx.error ? 3 : -1);
|
|
823
|
-
} }, dependencies: [i2.SettingsCardComponent, i3.LoadingComponent, i4.SqlLoggingComponent, i5.UserManagementComponent, i6.RoleManagementComponent, i7.ApplicationManagementComponent, i8.EntityPermissionsComponent, i9.UserProfileSettingsComponent, i10.NotificationPreferencesComponent], styles: ["\n\n\n\n\n\n\n\n\n\n[_nghost-%COMP%] {\n --settings-primary: #0076B6;\n --settings-primary-container: #AAE7FD;\n --settings-secondary: #F5A623;\n --settings-secondary-container: #FFECD6;\n --settings-tertiary: #4CAF50;\n --settings-tertiary-container: #C8E6C9;\n --settings-error: #D32F2F;\n --settings-error-container: #FFCDD2;\n}\n\n\n\n\n\n\n\n\n[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\n@media (max-width: 768px) {\n [_nghost-%COMP%] {\n height: auto;\n min-height: 100vh;\n overflow: visible;\n }\n}\n\n\n\n.mj-page-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n@media (max-width: 768px) {\n .mj-page-container[_ngcontent-%COMP%] {\n overflow-y: visible;\n overflow-x: hidden;\n height: auto;\n min-height: 100vh;\n }\n}\n\n\n\n\n\n\n@keyframes _ngcontent-%COMP%_shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes _ngcontent-%COMP%_spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n\n\n\n\n\n.settings-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: var(--mat-sys-surface);\n overflow-y: auto;\n position: relative;\n}\n\n\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.loading-content[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.loading-text[_ngcontent-%COMP%] {\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n}\n\n\n\n\n\n.error-container[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.error-content[_ngcontent-%COMP%] {\n text-align: center;\n max-width: 400px;\n}\n\n.error-content[_ngcontent-%COMP%] .error-icon[_ngcontent-%COMP%] {\n font-size: 3rem;\n color: var(--mat-sys-error);\n margin-bottom: 1rem;\n}\n\n.error-content[_ngcontent-%COMP%] .error-message[_ngcontent-%COMP%] {\n color: var(--mat-sys-on-surface);\n margin-bottom: 1.5rem;\n font: var(--mat-sys-body-large);\n}\n\n.error-content[_ngcontent-%COMP%] .retry-button[_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: var(--mat-sys-label-large);\n font-weight: 500;\n border: none;\n border-radius: 20px;\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 background-color: var(--mat-sys-primary);\n color: var(--mat-sys-on-primary);\n}\n\n.error-content[_ngcontent-%COMP%] .retry-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.error-content[_ngcontent-%COMP%] .retry-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: var(--mat-sys-primary-hover, var(--mat-sys-primary));\n transform: translateY(-1px);\n box-shadow: var(--mat-sys-elevation-2);\n}\n\n.error-content[_ngcontent-%COMP%] .retry-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n}\n\n\n\n\n\n\n.settings-content[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n flex-direction: column;\n width: 100%;\n min-height: 0;\n}\n\n@media (max-width: 768px) {\n .settings-content[_ngcontent-%COMP%] {\n overflow-y: visible;\n overflow-x: hidden;\n height: auto;\n min-height: 0;\n flex: none;\n }\n}\n\n.desktop-layout[_ngcontent-%COMP%] {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n.settings-content[_ngcontent-%COMP%] .desktop-layout[_ngcontent-%COMP%] {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n\n\n\n\n\n.side-navigation[_ngcontent-%COMP%] {\n width: 280px;\n background: linear-gradient(180deg, var(--mat-sys-surface) 0%, var(--mat-sys-surface-container-lowest) 100%);\n border-right: 1px solid var(--mat-sys-outline-variant);\n overflow-y: auto;\n flex-shrink: 0;\n box-shadow: var(--mat-sys-elevation-1);\n}\n\n\n\n.nav-search[_ngcontent-%COMP%] {\n position: relative;\n padding: 1rem;\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n background-color: var(--mat-sys-surface);\n}\n\n.nav-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 1.75rem;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mat-sys-on-surface-variant);\n font-size: 1rem;\n pointer-events: none;\n z-index: 1;\n}\n\n.nav-search-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 0.75rem 2.75rem 0.75rem 2.5rem;\n border: 1px solid var(--mat-sys-outline-variant);\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-body-medium);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-search-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--settings-primary);\n background-color: var(--mat-sys-surface);\n box-shadow: 0 0 0 2px rgba(0, 118, 182, 0.1);\n}\n\n.nav-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mat-sys-on-surface-variant);\n}\n\n.nav-search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 1.25rem;\n top: 50%;\n transform: translateY(-50%);\n padding: 0.25rem;\n background: transparent;\n border: none;\n color: var(--mat-sys-on-surface-variant);\n cursor: pointer;\n border-radius: var(--mat-sys-corner-full);\n min-width: 32px;\n min-height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n z-index: 1;\n}\n\n.nav-search-clear[_ngcontent-%COMP%]:hover {\n background: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-search-clear[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--settings-primary);\n outline-offset: 2px;\n}\n\n.nav-list[_ngcontent-%COMP%] {\n list-style: none;\n margin: 0;\n padding: 1rem 0;\n}\n\n.nav-item[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n padding: 1rem 1.5rem;\n margin: 0.25rem 0.75rem;\n border-radius: var(--mat-sys-corner-medium);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n border: 2px solid transparent;\n}\n\n.nav-item[_ngcontent-%COMP%]:hover {\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n transform: translateX(4px);\n}\n\n.nav-item[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: 2px;\n}\n\n\n\n.nav-item[aria-controls=\"panel-general\"][_ngcontent-%COMP%] {\n --item-color: var(--settings-primary);\n --item-container: var(--settings-primary-container);\n}\n\n.nav-item[aria-controls=\"panel-users\"][_ngcontent-%COMP%] {\n --item-color: var(--settings-secondary);\n --item-container: var(--settings-secondary-container);\n}\n\n.nav-item[aria-controls=\"panel-roles\"][_ngcontent-%COMP%] {\n --item-color: var(--settings-tertiary);\n --item-container: var(--settings-tertiary-container);\n}\n\n.nav-item[aria-controls=\"panel-applications\"][_ngcontent-%COMP%] {\n --item-color: #9C27B0;\n --item-container: #E1BEE7;\n}\n\n.nav-item[aria-controls=\"panel-permissions\"][_ngcontent-%COMP%] {\n --item-color: var(--settings-error);\n --item-container: var(--settings-error-container);\n}\n\n.nav-item[aria-controls=\"panel-advanced\"][_ngcontent-%COMP%] {\n --item-color: #FF6F00;\n --item-container: #FFE0B2;\n}\n\n.nav-item.active[_ngcontent-%COMP%] {\n background-color: var(--item-container);\n color: var(--item-color);\n font-weight: 600;\n border-color: var(--item-color);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.nav-item[_ngcontent-%COMP%]:hover:not(.active) {\n border-color: var(--item-color);\n background-color: rgba(255, 255, 255, 0.5);\n}\n\n.nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 20px;\n margin-right: 0.75rem;\n font-size: 1.1rem;\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-label[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-badge[_ngcontent-%COMP%] {\n padding: 0.125rem 0.5rem;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-small);\n font-weight: 600;\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-primary[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-primary-container);\n color: var(--mat-sys-on-primary-container);\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-danger[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-error-container);\n color: var(--mat-sys-on-error-container);\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-warning[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-tertiary-container);\n color: var(--mat-sys-on-tertiary-container);\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-success[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-secondary-container);\n color: var(--mat-sys-on-secondary-container);\n}\n\n\n\n\n\n\n.content-area[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 0;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n background: linear-gradient(180deg, var(--mat-sys-surface-container-lowest) 0%, var(--mat-sys-surface) 100%);\n}\n\n@media (max-width: 768px) {\n .content-area[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n}\n\n.tab-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n max-width: 100%;\n min-height: 0;\n box-sizing: border-box;\n overflow-x: hidden;\n padding: 1.5rem 2rem;\n}\n\n@media (max-width: 768px) {\n .tab-content[_ngcontent-%COMP%] {\n height: auto;\n min-height: 0;\n overflow-y: visible;\n overflow-x: hidden;\n padding: 0.5rem;\n }\n}\n\n\n\n\n\n.section-title[_ngcontent-%COMP%] {\n font: var(--mat-sys-headline-small);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n margin: 0 0 1rem 0;\n padding-bottom: 0.75rem;\n border-bottom: 3px solid var(--mat-sys-outline-variant);\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.section-title[_ngcontent-%COMP%]::before {\n content: \"\";\n width: 4px;\n height: 2rem;\n background: linear-gradient(180deg, var(--settings-primary) 0%, var(--settings-tertiary) 100%);\n border-radius: 2px;\n}\n\n.section-description[_ngcontent-%COMP%] {\n color: var(--mat-sys-on-surface-variant);\n margin: 0 0 1.5rem 0;\n font: var(--mat-sys-body-large);\n padding: 1rem 1.25rem;\n background-color: var(--mat-sys-surface-container);\n border-radius: var(--mat-sys-corner-medium);\n}\n\n\n\n\n\n.settings-grid[_ngcontent-%COMP%], \n.mj-grid[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n margin-top: 1.5rem;\n}\n\n.mj-grid-responsive[_ngcontent-%COMP%] {\n \n\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n@media (max-width: 768px) {\n .settings-grid[_ngcontent-%COMP%], \n .mj-grid[_ngcontent-%COMP%], \n .mj-grid-responsive[_ngcontent-%COMP%] {\n gap: 1rem;\n margin-top: 0.5rem;\n }\n}\n\n\n\n\n\n.general-settings[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%] {\n margin-bottom: 0.25rem;\n}\n\n.users-settings[_ngcontent-%COMP%] .section-description[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] .section-description[_ngcontent-%COMP%] {\n margin-bottom: 0.5rem;\n}\n\n\n\n\n\n.card-content[_ngcontent-%COMP%] {\n padding: 1rem;\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-medium);\n}\n\n.card-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n line-height: 1.6;\n}\n\n\n\n\n\n.beta-warning[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1.25rem;\n background: linear-gradient(135deg, #FFE0B2 0%, var(--settings-secondary-container) 100%);\n color: #FF6F00;\n border-radius: var(--mat-sys-corner-medium);\n font: var(--mat-sys-label-large);\n font-weight: 600;\n margin-bottom: 1.5rem;\n max-width: 100%;\n box-sizing: border-box;\n border: 2px solid #FF6F00;\n box-shadow: 0 2px 8px rgba(255, 111, 0, 0.2);\n}\n\n.beta-warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n@media (max-width: 768px) {\n .beta-warning[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n padding: 0.5rem 0.75rem;\n margin-bottom: 0.75rem;\n }\n}\n\n\n\n\n\n\n.mobile-layout[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n width: 100%;\n max-width: 100vw;\n overflow: visible;\n box-sizing: border-box;\n}\n\n\n\n.mobile-header[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: 56px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 0.5rem;\n background-color: var(--mat-sys-surface-container);\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n z-index: 100;\n box-sizing: border-box;\n}\n\n.mobile-header-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n min-width: 48px;\n border-radius: var(--mat-sys-corner-full);\n background: transparent;\n color: var(--mat-sys-on-surface);\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.mobile-header-icon[_ngcontent-%COMP%]:hover {\n background-color: var(--mat-sys-surface-container-high);\n}\n\n.mobile-header-icon[_ngcontent-%COMP%]:active {\n transform: scale(0.95);\n}\n\n.mobile-header-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n}\n\n.mobile-header-title[_ngcontent-%COMP%] {\n flex: 1;\n text-align: center;\n font: var(--mat-sys-title-large);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n margin: 0;\n padding: 0 0.5rem;\n}\n\n.mobile-header-spacer[_ngcontent-%COMP%] {\n width: 48px;\n min-width: 48px;\n}\n\n\n\n.mobile-nav-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 1000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n\n\n.mobile-nav-rail[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n width: 280px;\n max-width: 80vw;\n background-color: var(--mat-sys-surface);\n border-right: 1px solid var(--mat-sys-outline-variant);\n display: flex;\n flex-direction: column;\n z-index: 1001;\n transform: translateX(-100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: var(--mat-sys-elevation-4);\n overflow: hidden;\n}\n\n.mobile-nav-rail.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n\n\n.nav-rail-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 1rem 1.5rem;\n min-height: 64px;\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n background-color: var(--mat-sys-surface-container);\n flex-shrink: 0;\n}\n\n.nav-rail-title[_ngcontent-%COMP%] {\n font: var(--mat-sys-title-large);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n}\n\n\n\n.nav-rail-items[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n padding: 0.5rem;\n gap: 0.25rem;\n overflow-y: auto;\n overflow-x: hidden;\n flex: 1;\n}\n\n\n\n.nav-rail-close-item[_ngcontent-%COMP%] {\n margin-top: auto;\n border-top: 1px solid var(--mat-sys-outline-variant);\n padding-top: 0.75rem !important;\n margin-top: 0.5rem;\n background-color: var(--mat-sys-error-container) !important;\n color: var(--mat-sys-on-error-container) !important;\n}\n\n.nav-rail-close-item[_ngcontent-%COMP%]:hover {\n background-color: var(--mat-sys-error) !important;\n color: var(--mat-sys-on-error) !important;\n}\n\n.nav-rail-close-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n}\n\n\n\n.nav-rail-item[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 1rem;\n width: 100%;\n padding: 0.875rem 1rem;\n background: transparent;\n border: none;\n border-radius: var(--mat-sys-corner-medium);\n color: var(--mat-sys-on-surface-variant);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n text-align: left;\n min-height: 56px;\n}\n\n.nav-rail-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.nav-rail-label[_ngcontent-%COMP%] {\n font: var(--mat-sys-body-large);\n font-weight: 500;\n flex: 1;\n}\n\n.nav-rail-item[_ngcontent-%COMP%]:hover:not(.active) {\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-rail-item.active[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-primary-container);\n color: var(--mat-sys-primary);\n}\n\n.nav-rail-item.active[_ngcontent-%COMP%] .nav-rail-label[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.nav-rail-item[_ngcontent-%COMP%]:active {\n transform: scale(0.98);\n}\n\n.nav-rail-item[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: 2px;\n}\n\n\n\n.rail-badge[_ngcontent-%COMP%] {\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-small);\n font-size: 11px;\n font-weight: 700;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.rail-badge.badge-primary[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-primary);\n color: var(--mat-sys-on-primary);\n}\n\n.rail-badge.badge-danger[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-error);\n color: var(--mat-sys-on-error);\n}\n\n.rail-badge.badge-warning[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-tertiary);\n color: var(--mat-sys-on-tertiary);\n}\n\n.rail-badge.badge-success[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-secondary);\n color: var(--mat-sys-on-secondary);\n}\n\n\n\n.mobile-content[_ngcontent-%COMP%] {\n width: 100%;\n max-width: 100vw;\n overflow-y: visible;\n overflow-x: hidden;\n padding: 72px 0.75rem 2rem 0.75rem;\n min-width: 0;\n box-sizing: border-box;\n -webkit-overflow-scrolling: touch;\n flex: 1;\n}\n\n\n\n@media (max-width: 374px) {\n .mobile-nav-rail[_ngcontent-%COMP%] {\n width: 260px;\n }\n\n .mobile-content[_ngcontent-%COMP%] {\n padding: 64px 0.5rem 1.5rem 0.5rem;\n }\n\n .mobile-header[_ngcontent-%COMP%] {\n height: 52px;\n padding: 0 0.25rem;\n }\n\n .mobile-header-icon[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\n min-width: 44px;\n }\n\n .mobile-header-spacer[_ngcontent-%COMP%] {\n width: 44px;\n min-width: 44px;\n }\n\n .mobile-header-title[_ngcontent-%COMP%] {\n font-size: 1.125rem;\n }\n}\n\n\n\n\n\n\n.advanced-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n border-bottom: 2px solid var(--mat-sys-outline-variant);\n margin-bottom: 1rem;\n margin-top: 1rem;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: thin;\n -webkit-overflow-scrolling: touch;\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n background: transparent;\n border: none;\n border-bottom: 3px solid transparent;\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-label-large);\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n min-height: 44px;\n white-space: nowrap;\n flex-shrink: 0;\n}\n\n\n\n@media (max-width: 768px) {\n .advanced-tabs[_ngcontent-%COMP%] {\n gap: 0;\n margin-bottom: 1rem;\n margin-top: 1rem;\n border-bottom: none;\n border: 1px solid var(--mat-sys-outline);\n border-radius: var(--mat-sys-corner-full);\n padding: 0;\n background-color: var(--mat-sys-surface-container-low);\n overflow-x: hidden;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] {\n flex: 1;\n padding: 0.625rem 0.5rem;\n font-size: 0.75rem;\n border-bottom: none;\n border-radius: 0;\n border-right: 1px solid var(--mat-sys-outline);\n min-width: 0;\n justify-content: center;\n text-align: center;\n white-space: nowrap;\n overflow: hidden;\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:last-child {\n border-right: none;\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:first-child {\n border-radius: var(--mat-sys-corner-full) 0 0 var(--mat-sys-corner-full);\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:last-child {\n border-radius: 0 var(--mat-sys-corner-full) var(--mat-sys-corner-full) 0;\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn.active[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-secondary-container);\n color: var(--mat-sys-on-secondary-container);\n border-bottom: none;\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n }\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:hover {\n color: var(--mat-sys-on-surface);\n background: var(--mat-sys-surface-container);\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: -2px;\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn.active[_ngcontent-%COMP%] {\n color: var(--mat-sys-primary);\n border-bottom-color: var(--mat-sys-primary);\n background: var(--mat-sys-primary-container);\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mat-sys-primary);\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.125rem;\n}\n\n\n\n\n\n\n.advanced-tab-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: visible;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n background: var(--mat-sys-surface);\n border-radius: var(--mat-sys-corner-large);\n padding: 0;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n}\n\n\n\n@media (max-width: 768px) {\n .advanced-tab-content[_ngcontent-%COMP%] {\n height: auto;\n min-height: 200px;\n overflow-y: visible;\n }\n}\n\n.performance-settings[_ngcontent-%COMP%], \n.developer-settings[_ngcontent-%COMP%] {\n padding: 2rem;\n}\n\n.performance-settings[_ngcontent-%COMP%] h3[_ngcontent-%COMP%], \n.developer-settings[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n font: var(--mat-sys-title-large);\n color: var(--mat-sys-on-surface);\n}\n\n.performance-settings[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.developer-settings[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n}\n\n\n\n\n\n\n.general-settings[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%], \n.applications-settings[_ngcontent-%COMP%], \n.permissions-settings[_ngcontent-%COMP%], \n.advanced-settings[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_fadeIn 0.3s ease-out;\n width: 100%;\n max-width: 100%;\n height: auto;\n min-height: 100%;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n overflow-y: visible;\n overflow-x: hidden;\n box-sizing: border-box;\n}\n\n\n\n@media (max-width: 768px) {\n .general-settings[_ngcontent-%COMP%], \n .users-settings[_ngcontent-%COMP%], \n .roles-settings[_ngcontent-%COMP%], \n .applications-settings[_ngcontent-%COMP%], \n .permissions-settings[_ngcontent-%COMP%], \n .advanced-settings[_ngcontent-%COMP%] {\n gap: 0.75rem;\n height: auto;\n min-height: auto;\n }\n\n .section-title[_ngcontent-%COMP%] {\n margin-bottom: 0.5rem;\n font-size: 1.375rem;\n }\n\n .section-description[_ngcontent-%COMP%] {\n margin-bottom: 0.75rem;\n }\n}\n\n\n\n.general-settings[_ngcontent-%COMP%] > mj-settings-card[_ngcontent-%COMP%], \n.general-settings[_ngcontent-%COMP%] > .mj-grid[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%] > mj-user-management[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] > mj-role-management[_ngcontent-%COMP%], \n.applications-settings[_ngcontent-%COMP%] > mj-application-management[_ngcontent-%COMP%], \n.permissions-settings[_ngcontent-%COMP%] > mj-entity-permissions[_ngcontent-%COMP%], \n.advanced-settings[_ngcontent-%COMP%] > .advanced-tabs[_ngcontent-%COMP%], \n.advanced-settings[_ngcontent-%COMP%] > .advanced-tab-content[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n}\n\n\n\n@media (max-width: 768px) {\n .users-settings[_ngcontent-%COMP%] > mj-user-management[_ngcontent-%COMP%], \n .roles-settings[_ngcontent-%COMP%] > mj-role-management[_ngcontent-%COMP%], \n .applications-settings[_ngcontent-%COMP%] > mj-application-management[_ngcontent-%COMP%], \n .permissions-settings[_ngcontent-%COMP%] > mj-entity-permissions[_ngcontent-%COMP%], \n .advanced-settings[_ngcontent-%COMP%] > .advanced-tab-content[_ngcontent-%COMP%] {\n flex: none;\n height: auto !important;\n min-height: 0;\n max-height: none !important;\n overflow-y: visible !important;\n overflow-x: hidden;\n }\n}\n\n\n\n.general-settings[_ngcontent-%COMP%] > .section-title[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%] > .section-title[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] > .section-title[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%] > .section-description[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] > .section-description[_ngcontent-%COMP%] {\n flex-shrink: 0;\n flex-grow: 0;\n}\n\n\n\n\n\n\n@media (prefers-reduced-motion: reduce) {\n .general-settings[_ngcontent-%COMP%], \n .users-settings[_ngcontent-%COMP%], \n .roles-settings[_ngcontent-%COMP%], \n .applications-settings[_ngcontent-%COMP%], \n .permissions-settings[_ngcontent-%COMP%], \n .advanced-settings[_ngcontent-%COMP%] {\n animation: none;\n }\n\n .nav-tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n .nav-item[_ngcontent-%COMP%], \n .tab-btn[_ngcontent-%COMP%], \n .search-input[_ngcontent-%COMP%], \n .retry-button[_ngcontent-%COMP%], \n .search-result-item[_ngcontent-%COMP%] {\n transition: none;\n }\n}\n\n\n\n\n\n@media (max-width: 640px) {\n .side-navigation[_ngcontent-%COMP%] {\n width: 200px;\n }\n\n .nav-item[_ngcontent-%COMP%] {\n padding: 0.75rem 1rem;\n }\n}\n\n@media (max-width: 1024px) {\n .content-area[_ngcontent-%COMP%] {\n padding: 1.5rem;\n }\n}\n\n\n\n@media (max-width: 768px) {\n .mobile-layout[_ngcontent-%COMP%] mj-user-management[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-role-management[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-application-management[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-entity-permissions[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-sql-logging[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-settings-card[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-user-profile-settings[_ngcontent-%COMP%] {\n display: block;\n height: auto !important;\n max-height: none !important;\n overflow: visible !important;\n }\n\n \n\n .mobile-layout[_ngcontent-%COMP%] .general-settings[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .users-settings[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .roles-settings[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .applications-settings[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .permissions-settings[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .advanced-settings[_ngcontent-%COMP%] {\n height: auto !important;\n min-height: 0 !important;\n max-height: none !important;\n }\n\n \n\n .mobile-layout[_ngcontent-%COMP%] .mj-grid[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .mj-grid-responsive[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .card-content[_ngcontent-%COMP%] {\n height: auto !important;\n min-height: 0 !important;\n }\n}\n\n@media (min-width: 1440px) {\n .content-area[_ngcontent-%COMP%] {\n padding: 2.5rem 3rem;\n }\n\n .side-navigation[_ngcontent-%COMP%] {\n width: 280px;\n }\n}\n\n\n\n\n\n@media (max-width: 768px) {\n \n\n body[_ngcontent-%COMP%] {\n position: relative;\n overflow-y: visible;\n -webkit-overflow-scrolling: touch;\n }\n\n \n\n .mobile-layout[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] > *[_ngcontent-%COMP%], \n .mobile-content[_ngcontent-%COMP%] > *[_ngcontent-%COMP%], \n .tab-content[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] {\n -webkit-overflow-scrolling: touch;\n }\n\n \n\n .mobile-layout[_ngcontent-%COMP%] *[_ngcontent-%COMP%] {\n box-sizing: border-box;\n }\n}"] });
|
|
547
|
+
} }, dependencies: [i2.LoadingComponent, i3.NotificationPreferencesComponent, i4.GeneralSettingsComponent, i5.ApplicationSettingsComponent, i6.AppearanceSettingsComponent], styles: ["\n\n\n\n\n\n\n\n\n\n[_nghost-%COMP%] {\n --settings-primary: #0076B6;\n --settings-primary-container: #AAE7FD;\n --settings-secondary: #F5A623;\n --settings-secondary-container: #FFECD6;\n --settings-tertiary: #4CAF50;\n --settings-tertiary-container: #C8E6C9;\n --settings-error: #D32F2F;\n --settings-error-container: #FFCDD2;\n}\n\n\n\n\n\n\n\n\n[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\n@media (max-width: 768px) {\n [_nghost-%COMP%] {\n height: auto;\n min-height: 100vh;\n overflow: visible;\n }\n}\n\n\n\n.mj-page-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n@media (max-width: 768px) {\n .mj-page-container[_ngcontent-%COMP%] {\n overflow-y: visible;\n overflow-x: hidden;\n height: auto;\n min-height: 100vh;\n }\n}\n\n\n\n\n\n\n@keyframes _ngcontent-%COMP%_shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes _ngcontent-%COMP%_spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n\n\n\n\n\n.settings-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: var(--mat-sys-surface);\n overflow-y: auto;\n position: relative;\n}\n\n\n\n\n\n.loading-container[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.loading-content[_ngcontent-%COMP%] {\n text-align: center;\n}\n\n.loading-text[_ngcontent-%COMP%] {\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n}\n\n\n\n\n\n.error-container[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.error-content[_ngcontent-%COMP%] {\n text-align: center;\n max-width: 400px;\n}\n\n.error-content[_ngcontent-%COMP%] .error-icon[_ngcontent-%COMP%] {\n font-size: 3rem;\n color: var(--mat-sys-error);\n margin-bottom: 1rem;\n}\n\n.error-content[_ngcontent-%COMP%] .error-message[_ngcontent-%COMP%] {\n color: var(--mat-sys-on-surface);\n margin-bottom: 1.5rem;\n font: var(--mat-sys-body-large);\n}\n\n.error-content[_ngcontent-%COMP%] .retry-button[_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: var(--mat-sys-label-large);\n font-weight: 500;\n border: none;\n border-radius: 20px;\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 background-color: var(--mat-sys-primary);\n color: var(--mat-sys-on-primary);\n}\n\n.error-content[_ngcontent-%COMP%] .retry-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.error-content[_ngcontent-%COMP%] .retry-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: var(--mat-sys-primary-hover, var(--mat-sys-primary));\n transform: translateY(-1px);\n box-shadow: var(--mat-sys-elevation-2);\n}\n\n.error-content[_ngcontent-%COMP%] .retry-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n}\n\n\n\n\n\n\n.settings-content[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n flex-direction: column;\n width: 100%;\n min-height: 0;\n}\n\n@media (max-width: 768px) {\n .settings-content[_ngcontent-%COMP%] {\n overflow-y: visible;\n overflow-x: hidden;\n height: auto;\n min-height: 0;\n flex: none;\n }\n}\n\n.desktop-layout[_ngcontent-%COMP%] {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n.settings-content[_ngcontent-%COMP%] .desktop-layout[_ngcontent-%COMP%] {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n\n\n\n\n\n.side-navigation[_ngcontent-%COMP%] {\n width: 280px;\n background: linear-gradient(180deg, var(--mat-sys-surface) 0%, var(--mat-sys-surface-container-lowest) 100%);\n border-right: 1px solid var(--mat-sys-outline-variant);\n overflow-y: auto;\n flex-shrink: 0;\n box-shadow: var(--mat-sys-elevation-1);\n}\n\n\n\n.nav-search[_ngcontent-%COMP%] {\n position: relative;\n padding: 1rem;\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n background-color: var(--mat-sys-surface);\n}\n\n.nav-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 1.75rem;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mat-sys-on-surface-variant);\n font-size: 1rem;\n pointer-events: none;\n z-index: 1;\n}\n\n.nav-search-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 0.75rem 2.75rem 0.75rem 2.5rem;\n border: 1px solid var(--mat-sys-outline-variant);\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-body-medium);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-search-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--settings-primary);\n background-color: var(--mat-sys-surface);\n box-shadow: 0 0 0 2px rgba(0, 118, 182, 0.1);\n}\n\n.nav-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mat-sys-on-surface-variant);\n}\n\n.nav-search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 1.25rem;\n top: 50%;\n transform: translateY(-50%);\n padding: 0.25rem;\n background: transparent;\n border: none;\n color: var(--mat-sys-on-surface-variant);\n cursor: pointer;\n border-radius: var(--mat-sys-corner-full);\n min-width: 32px;\n min-height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n z-index: 1;\n}\n\n.nav-search-clear[_ngcontent-%COMP%]:hover {\n background: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-search-clear[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--settings-primary);\n outline-offset: 2px;\n}\n\n.nav-list[_ngcontent-%COMP%] {\n list-style: none;\n margin: 0;\n padding: 1rem 0;\n}\n\n.nav-item[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n padding: 1rem 1.5rem;\n margin: 0.25rem 0.75rem;\n border-radius: var(--mat-sys-corner-medium);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n border: 2px solid transparent;\n}\n\n.nav-item[_ngcontent-%COMP%]:hover {\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n transform: translateX(4px);\n}\n\n.nav-item[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: 2px;\n}\n\n\n\n.nav-item[aria-controls=\"panel-general\"][_ngcontent-%COMP%] {\n --item-color: var(--settings-primary);\n --item-container: var(--settings-primary-container);\n}\n\n.nav-item[aria-controls=\"panel-users\"][_ngcontent-%COMP%] {\n --item-color: var(--settings-secondary);\n --item-container: var(--settings-secondary-container);\n}\n\n.nav-item[aria-controls=\"panel-roles\"][_ngcontent-%COMP%] {\n --item-color: var(--settings-tertiary);\n --item-container: var(--settings-tertiary-container);\n}\n\n.nav-item[aria-controls=\"panel-applications\"][_ngcontent-%COMP%] {\n --item-color: #9C27B0;\n --item-container: #E1BEE7;\n}\n\n.nav-item[aria-controls=\"panel-permissions\"][_ngcontent-%COMP%] {\n --item-color: var(--settings-error);\n --item-container: var(--settings-error-container);\n}\n\n.nav-item[aria-controls=\"panel-advanced\"][_ngcontent-%COMP%] {\n --item-color: #FF6F00;\n --item-container: #FFE0B2;\n}\n\n.nav-item.active[_ngcontent-%COMP%] {\n background-color: var(--item-container);\n color: var(--item-color);\n font-weight: 600;\n border-color: var(--item-color);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.nav-item[_ngcontent-%COMP%]:hover:not(.active) {\n border-color: var(--item-color);\n background-color: rgba(255, 255, 255, 0.5);\n}\n\n.nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 20px;\n margin-right: 0.75rem;\n font-size: 1.1rem;\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-label[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-badge[_ngcontent-%COMP%] {\n padding: 0.125rem 0.5rem;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-small);\n font-weight: 600;\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-primary[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-primary-container);\n color: var(--mat-sys-on-primary-container);\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-danger[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-error-container);\n color: var(--mat-sys-on-error-container);\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-warning[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-tertiary-container);\n color: var(--mat-sys-on-tertiary-container);\n}\n\n.nav-item[_ngcontent-%COMP%] .nav-badge.badge-success[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-secondary-container);\n color: var(--mat-sys-on-secondary-container);\n}\n\n\n\n.nav-item.disabled[_ngcontent-%COMP%] {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.nav-item.disabled[_ngcontent-%COMP%]:hover {\n background-color: transparent;\n transform: none;\n}\n\n\n\n.coming-soon-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n padding: 0.125rem 0.5rem;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-small);\n font-size: 0.625rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n background: linear-gradient(135deg, var(--mat-sys-tertiary-container) 0%, var(--mat-sys-secondary-container) 100%);\n color: var(--mat-sys-on-tertiary-container);\n border: 1px solid var(--mat-sys-outline-variant);\n}\n\n\n\n.nav-rail-item.disabled[_ngcontent-%COMP%] {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.nav-rail-item.disabled[_ngcontent-%COMP%]:hover {\n background-color: transparent;\n}\n\n\n\n\n\n\n.content-area[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 0;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n background: linear-gradient(180deg, var(--mat-sys-surface-container-lowest) 0%, var(--mat-sys-surface) 100%);\n}\n\n@media (max-width: 768px) {\n .content-area[_ngcontent-%COMP%] {\n padding: 1rem;\n }\n}\n\n.tab-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n max-width: 100%;\n min-height: 0;\n box-sizing: border-box;\n overflow-x: hidden;\n padding: 1.5rem 2rem;\n}\n\n@media (max-width: 768px) {\n .tab-content[_ngcontent-%COMP%] {\n height: auto;\n min-height: 0;\n overflow-y: visible;\n overflow-x: hidden;\n padding: 0.5rem;\n }\n}\n\n\n\n\n\n.section-title[_ngcontent-%COMP%] {\n font: var(--mat-sys-headline-small);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n margin: 0 0 1rem 0;\n padding-bottom: 0.75rem;\n border-bottom: 3px solid var(--mat-sys-outline-variant);\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.section-title[_ngcontent-%COMP%]::before {\n content: \"\";\n width: 4px;\n height: 2rem;\n background: linear-gradient(180deg, var(--settings-primary) 0%, var(--settings-tertiary) 100%);\n border-radius: 2px;\n}\n\n.section-description[_ngcontent-%COMP%] {\n color: var(--mat-sys-on-surface-variant);\n margin: 0 0 1.5rem 0;\n font: var(--mat-sys-body-large);\n padding: 1rem 1.25rem;\n background-color: var(--mat-sys-surface-container);\n border-radius: var(--mat-sys-corner-medium);\n}\n\n\n\n\n\n.settings-grid[_ngcontent-%COMP%], \n.mj-grid[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n margin-top: 1.5rem;\n}\n\n.mj-grid-responsive[_ngcontent-%COMP%] {\n \n\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n@media (max-width: 768px) {\n .settings-grid[_ngcontent-%COMP%], \n .mj-grid[_ngcontent-%COMP%], \n .mj-grid-responsive[_ngcontent-%COMP%] {\n gap: 1rem;\n margin-top: 0.5rem;\n }\n}\n\n\n\n\n\n.general-settings[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%] {\n margin-bottom: 0.25rem;\n}\n\n.users-settings[_ngcontent-%COMP%] .section-description[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] .section-description[_ngcontent-%COMP%] {\n margin-bottom: 0.5rem;\n}\n\n\n\n\n\n.card-content[_ngcontent-%COMP%] {\n padding: 1rem;\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-medium);\n}\n\n.card-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n line-height: 1.6;\n}\n\n\n\n\n\n.beta-warning[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1.25rem;\n background: linear-gradient(135deg, #FFE0B2 0%, var(--settings-secondary-container) 100%);\n color: #FF6F00;\n border-radius: var(--mat-sys-corner-medium);\n font: var(--mat-sys-label-large);\n font-weight: 600;\n margin-bottom: 1.5rem;\n max-width: 100%;\n box-sizing: border-box;\n border: 2px solid #FF6F00;\n box-shadow: 0 2px 8px rgba(255, 111, 0, 0.2);\n}\n\n.beta-warning[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n@media (max-width: 768px) {\n .beta-warning[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n padding: 0.5rem 0.75rem;\n margin-bottom: 0.75rem;\n }\n}\n\n\n\n\n\n\n.mobile-layout[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n width: 100%;\n max-width: 100vw;\n overflow: visible;\n box-sizing: border-box;\n}\n\n\n\n.mobile-header[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: 56px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 0.5rem;\n background-color: var(--mat-sys-surface-container);\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n z-index: 100;\n box-sizing: border-box;\n}\n\n.mobile-header-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n min-width: 48px;\n border-radius: var(--mat-sys-corner-full);\n background: transparent;\n color: var(--mat-sys-on-surface);\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.mobile-header-icon[_ngcontent-%COMP%]:hover {\n background-color: var(--mat-sys-surface-container-high);\n}\n\n.mobile-header-icon[_ngcontent-%COMP%]:active {\n transform: scale(0.95);\n}\n\n.mobile-header-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n}\n\n.mobile-header-title[_ngcontent-%COMP%] {\n flex: 1;\n text-align: center;\n font: var(--mat-sys-title-large);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n margin: 0;\n padding: 0 0.5rem;\n}\n\n.mobile-header-spacer[_ngcontent-%COMP%] {\n width: 48px;\n min-width: 48px;\n}\n\n\n\n.mobile-nav-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 1000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n\n\n.mobile-nav-rail[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n width: 280px;\n max-width: 80vw;\n background-color: var(--mat-sys-surface);\n border-right: 1px solid var(--mat-sys-outline-variant);\n display: flex;\n flex-direction: column;\n z-index: 1001;\n transform: translateX(-100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: var(--mat-sys-elevation-4);\n overflow: hidden;\n}\n\n.mobile-nav-rail.open[_ngcontent-%COMP%] {\n transform: translateX(0);\n}\n\n\n\n.nav-rail-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 1rem 1.5rem;\n min-height: 64px;\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n background-color: var(--mat-sys-surface-container);\n flex-shrink: 0;\n}\n\n.nav-rail-title[_ngcontent-%COMP%] {\n font: var(--mat-sys-title-large);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n}\n\n\n\n.nav-rail-items[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n padding: 0.5rem;\n gap: 0.25rem;\n overflow-y: auto;\n overflow-x: hidden;\n flex: 1;\n}\n\n\n\n.nav-rail-close-item[_ngcontent-%COMP%] {\n margin-top: auto;\n border-top: 1px solid var(--mat-sys-outline-variant);\n padding-top: 0.75rem !important;\n margin-top: 0.5rem;\n background-color: var(--mat-sys-error-container) !important;\n color: var(--mat-sys-on-error-container) !important;\n}\n\n.nav-rail-close-item[_ngcontent-%COMP%]:hover {\n background-color: var(--mat-sys-error) !important;\n color: var(--mat-sys-on-error) !important;\n}\n\n.nav-rail-close-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n}\n\n\n\n.nav-rail-item[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 1rem;\n width: 100%;\n padding: 0.875rem 1rem;\n background: transparent;\n border: none;\n border-radius: var(--mat-sys-corner-medium);\n color: var(--mat-sys-on-surface-variant);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n text-align: left;\n min-height: 56px;\n}\n\n.nav-rail-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.nav-rail-label[_ngcontent-%COMP%] {\n font: var(--mat-sys-body-large);\n font-weight: 500;\n flex: 1;\n}\n\n.nav-rail-item[_ngcontent-%COMP%]:hover:not(.active) {\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-rail-item.active[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-primary-container);\n color: var(--mat-sys-primary);\n}\n\n.nav-rail-item.active[_ngcontent-%COMP%] .nav-rail-label[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n.nav-rail-item[_ngcontent-%COMP%]:active {\n transform: scale(0.98);\n}\n\n.nav-rail-item[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: 2px;\n}\n\n\n\n.rail-badge[_ngcontent-%COMP%] {\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-small);\n font-size: 11px;\n font-weight: 700;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.rail-badge.badge-primary[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-primary);\n color: var(--mat-sys-on-primary);\n}\n\n.rail-badge.badge-danger[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-error);\n color: var(--mat-sys-on-error);\n}\n\n.rail-badge.badge-warning[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-tertiary);\n color: var(--mat-sys-on-tertiary);\n}\n\n.rail-badge.badge-success[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-secondary);\n color: var(--mat-sys-on-secondary);\n}\n\n\n\n.mobile-content[_ngcontent-%COMP%] {\n width: 100%;\n max-width: 100vw;\n overflow-y: visible;\n overflow-x: hidden;\n padding: 72px 0.75rem 2rem 0.75rem;\n min-width: 0;\n box-sizing: border-box;\n -webkit-overflow-scrolling: touch;\n flex: 1;\n}\n\n\n\n@media (max-width: 374px) {\n .mobile-nav-rail[_ngcontent-%COMP%] {\n width: 260px;\n }\n\n .mobile-content[_ngcontent-%COMP%] {\n padding: 64px 0.5rem 1.5rem 0.5rem;\n }\n\n .mobile-header[_ngcontent-%COMP%] {\n height: 52px;\n padding: 0 0.25rem;\n }\n\n .mobile-header-icon[_ngcontent-%COMP%] {\n width: 44px;\n height: 44px;\n min-width: 44px;\n }\n\n .mobile-header-spacer[_ngcontent-%COMP%] {\n width: 44px;\n min-width: 44px;\n }\n\n .mobile-header-title[_ngcontent-%COMP%] {\n font-size: 1.125rem;\n }\n}\n\n\n\n\n\n\n.advanced-tabs[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n border-bottom: 2px solid var(--mat-sys-outline-variant);\n margin-bottom: 1rem;\n margin-top: 1rem;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: thin;\n -webkit-overflow-scrolling: touch;\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n background: transparent;\n border: none;\n border-bottom: 3px solid transparent;\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-label-large);\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n min-height: 44px;\n white-space: nowrap;\n flex-shrink: 0;\n}\n\n\n\n@media (max-width: 768px) {\n .advanced-tabs[_ngcontent-%COMP%] {\n gap: 0;\n margin-bottom: 1rem;\n margin-top: 1rem;\n border-bottom: none;\n border: 1px solid var(--mat-sys-outline);\n border-radius: var(--mat-sys-corner-full);\n padding: 0;\n background-color: var(--mat-sys-surface-container-low);\n overflow-x: hidden;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] {\n flex: 1;\n padding: 0.625rem 0.5rem;\n font-size: 0.75rem;\n border-bottom: none;\n border-radius: 0;\n border-right: 1px solid var(--mat-sys-outline);\n min-width: 0;\n justify-content: center;\n text-align: center;\n white-space: nowrap;\n overflow: hidden;\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:last-child {\n border-right: none;\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:first-child {\n border-radius: var(--mat-sys-corner-full) 0 0 var(--mat-sys-corner-full);\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:last-child {\n border-radius: 0 var(--mat-sys-corner-full) var(--mat-sys-corner-full) 0;\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn.active[_ngcontent-%COMP%] {\n background-color: var(--mat-sys-secondary-container);\n color: var(--mat-sys-on-secondary-container);\n border-bottom: none;\n }\n\n .advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n }\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:hover {\n color: var(--mat-sys-on-surface);\n background: var(--mat-sys-surface-container);\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: -2px;\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn.active[_ngcontent-%COMP%] {\n color: var(--mat-sys-primary);\n border-bottom-color: var(--mat-sys-primary);\n background: var(--mat-sys-primary-container);\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn.active[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mat-sys-primary);\n}\n\n.advanced-tabs[_ngcontent-%COMP%] .tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.125rem;\n}\n\n\n\n\n\n\n.advanced-tab-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: visible;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n background: var(--mat-sys-surface);\n border-radius: var(--mat-sys-corner-large);\n padding: 0;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n}\n\n\n\n@media (max-width: 768px) {\n .advanced-tab-content[_ngcontent-%COMP%] {\n height: auto;\n min-height: 200px;\n overflow-y: visible;\n }\n}\n\n.performance-settings[_ngcontent-%COMP%], \n.developer-settings[_ngcontent-%COMP%] {\n padding: 2rem;\n}\n\n.performance-settings[_ngcontent-%COMP%] h3[_ngcontent-%COMP%], \n.developer-settings[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0 0 1rem 0;\n font: var(--mat-sys-title-large);\n color: var(--mat-sys-on-surface);\n}\n\n.performance-settings[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.developer-settings[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n}\n\n\n\n\n\n\n.general-settings[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%], \n.applications-settings[_ngcontent-%COMP%], \n.permissions-settings[_ngcontent-%COMP%], \n.advanced-settings[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_fadeIn 0.3s ease-out;\n width: 100%;\n max-width: 100%;\n height: auto;\n min-height: 100%;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n overflow-y: visible;\n overflow-x: hidden;\n box-sizing: border-box;\n}\n\n\n\n@media (max-width: 768px) {\n .general-settings[_ngcontent-%COMP%], \n .users-settings[_ngcontent-%COMP%], \n .roles-settings[_ngcontent-%COMP%], \n .applications-settings[_ngcontent-%COMP%], \n .permissions-settings[_ngcontent-%COMP%], \n .advanced-settings[_ngcontent-%COMP%] {\n gap: 0.75rem;\n height: auto;\n min-height: auto;\n }\n\n .section-title[_ngcontent-%COMP%] {\n margin-bottom: 0.5rem;\n font-size: 1.375rem;\n }\n\n .section-description[_ngcontent-%COMP%] {\n margin-bottom: 0.75rem;\n }\n}\n\n\n\n.general-settings[_ngcontent-%COMP%] > mj-settings-card[_ngcontent-%COMP%], \n.general-settings[_ngcontent-%COMP%] > .mj-grid[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%] > mj-user-management[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] > mj-role-management[_ngcontent-%COMP%], \n.applications-settings[_ngcontent-%COMP%] > mj-application-management[_ngcontent-%COMP%], \n.permissions-settings[_ngcontent-%COMP%] > mj-entity-permissions[_ngcontent-%COMP%], \n.advanced-settings[_ngcontent-%COMP%] > .advanced-tabs[_ngcontent-%COMP%], \n.advanced-settings[_ngcontent-%COMP%] > .advanced-tab-content[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n}\n\n\n\n@media (max-width: 768px) {\n .users-settings[_ngcontent-%COMP%] > mj-user-management[_ngcontent-%COMP%], \n .roles-settings[_ngcontent-%COMP%] > mj-role-management[_ngcontent-%COMP%], \n .applications-settings[_ngcontent-%COMP%] > mj-application-management[_ngcontent-%COMP%], \n .permissions-settings[_ngcontent-%COMP%] > mj-entity-permissions[_ngcontent-%COMP%], \n .advanced-settings[_ngcontent-%COMP%] > .advanced-tab-content[_ngcontent-%COMP%] {\n flex: none;\n height: auto !important;\n min-height: 0;\n max-height: none !important;\n overflow-y: visible !important;\n overflow-x: hidden;\n }\n}\n\n\n\n.general-settings[_ngcontent-%COMP%] > .section-title[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%] > .section-title[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] > .section-title[_ngcontent-%COMP%], \n.users-settings[_ngcontent-%COMP%] > .section-description[_ngcontent-%COMP%], \n.roles-settings[_ngcontent-%COMP%] > .section-description[_ngcontent-%COMP%] {\n flex-shrink: 0;\n flex-grow: 0;\n}\n\n\n\n\n\n\n@media (prefers-reduced-motion: reduce) {\n .general-settings[_ngcontent-%COMP%], \n .users-settings[_ngcontent-%COMP%], \n .roles-settings[_ngcontent-%COMP%], \n .applications-settings[_ngcontent-%COMP%], \n .permissions-settings[_ngcontent-%COMP%], \n .advanced-settings[_ngcontent-%COMP%] {\n animation: none;\n }\n\n .nav-tab[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n .nav-item[_ngcontent-%COMP%], \n .tab-btn[_ngcontent-%COMP%], \n .search-input[_ngcontent-%COMP%], \n .retry-button[_ngcontent-%COMP%], \n .search-result-item[_ngcontent-%COMP%] {\n transition: none;\n }\n}\n\n\n\n\n\n@media (max-width: 640px) {\n .side-navigation[_ngcontent-%COMP%] {\n width: 200px;\n }\n\n .nav-item[_ngcontent-%COMP%] {\n padding: 0.75rem 1rem;\n }\n}\n\n@media (max-width: 1024px) {\n .content-area[_ngcontent-%COMP%] {\n padding: 1.5rem;\n }\n}\n\n\n\n@media (max-width: 768px) {\n .mobile-layout[_ngcontent-%COMP%] mj-user-management[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-role-management[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-application-management[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-entity-permissions[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-sql-logging[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-settings-card[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] mj-user-profile-settings[_ngcontent-%COMP%] {\n display: block;\n height: auto !important;\n max-height: none !important;\n overflow: visible !important;\n }\n\n \n\n .mobile-layout[_ngcontent-%COMP%] .general-settings[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .users-settings[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .roles-settings[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .applications-settings[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .permissions-settings[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .advanced-settings[_ngcontent-%COMP%] {\n height: auto !important;\n min-height: 0 !important;\n max-height: none !important;\n }\n\n \n\n .mobile-layout[_ngcontent-%COMP%] .mj-grid[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .mj-grid-responsive[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] .card-content[_ngcontent-%COMP%] {\n height: auto !important;\n min-height: 0 !important;\n }\n}\n\n@media (min-width: 1440px) {\n .content-area[_ngcontent-%COMP%] {\n padding: 2.5rem 3rem;\n }\n\n .side-navigation[_ngcontent-%COMP%] {\n width: 280px;\n }\n}\n\n\n\n\n\n@media (max-width: 768px) {\n \n\n body[_ngcontent-%COMP%] {\n position: relative;\n overflow-y: visible;\n -webkit-overflow-scrolling: touch;\n }\n\n \n\n .mobile-layout[_ngcontent-%COMP%], \n .mobile-layout[_ngcontent-%COMP%] > *[_ngcontent-%COMP%], \n .mobile-content[_ngcontent-%COMP%] > *[_ngcontent-%COMP%], \n .tab-content[_ngcontent-%COMP%] > *[_ngcontent-%COMP%] {\n -webkit-overflow-scrolling: touch;\n }\n\n \n\n .mobile-layout[_ngcontent-%COMP%] *[_ngcontent-%COMP%] {\n box-sizing: border-box;\n }\n}"] });
|
|
824
548
|
};
|
|
825
549
|
SettingsComponent = __decorate([
|
|
826
550
|
RegisterClass(BaseNavigationComponent, 'Settings')
|
|
@@ -828,9 +552,9 @@ SettingsComponent = __decorate([
|
|
|
828
552
|
export { SettingsComponent };
|
|
829
553
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SettingsComponent, [{
|
|
830
554
|
type: Component,
|
|
831
|
-
args: [{ selector: 'mj-settings', template: "<div class=\"mj-page-container\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\" role=\"status\" aria-live=\"polite\">\n <mj-loading text=\"Loading settings...\"></mj-loading>\n </div>\n }\n\n <!-- Error State -->\n @if (error && !isLoading) {\n <div class=\"error-container\" role=\"alert\">\n <div class=\"error-content\">\n <i class=\"fa-solid fa-exclamation-triangle error-icon\" aria-hidden=\"true\"></i>\n <p class=\"error-message\">{{ error }}</p>\n <button class=\"retry-button\" (click)=\"loadInitialData()\">\n <i class=\"fa-solid fa-refresh\" aria-hidden=\"true\"></i>\n Try Again\n </button>\n </div>\n </div>\n }\n\n <!-- Main Content -->\n @if (!isLoading && !error) {\n <div class=\"settings-content\">\n <!-- Desktop Layout -->\n @if (!isMobile) {\n <div class=\"desktop-layout\" style=\"display: flex;\">\n <!-- Side Navigation -->\n <nav class=\"side-navigation\" role=\"navigation\" aria-label=\"Settings navigation\">\n <!-- Search Bar -->\n <div class=\"nav-search\">\n <i class=\"fa-solid fa-search nav-search-icon\" aria-hidden=\"true\"></i>\n <input\n type=\"text\"\n class=\"nav-search-input\"\n placeholder=\"Search settings...\"\n (input)=\"onSearchChange($event)\"\n [value]=\"searchTerm$.value\"\n aria-label=\"Search settings\"\n />\n @if (searchTerm$.value) {\n <button\n class=\"nav-search-clear\"\n (click)=\"clearSearch()\"\n aria-label=\"Clear search\"\n tabindex=\"0\"\n >\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n\n <ul class=\"nav-list\" role=\"tablist\" aria-orientation=\"vertical\">\n @for (tab of filteredTabs; track tab.id) {\n <li\n class=\"nav-item\"\n [class.active]=\"activeTab === tab.id\"\n (click)=\"onTabChange(tab.id)\"\n (keydown.enter)=\"onTabChange(tab.id)\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === tab.id\"\n [attr.aria-controls]=\"'panel-' + tab.id\"\n tabindex=\"0\"\n >\n <i [class]=\"tab.icon\" aria-hidden=\"true\"></i>\n <span class=\"nav-label\">{{ tab.label }}</span>\n @if (tab.badgeCount && tab.badgeCount > 0) {\n <span class=\"nav-badge\" [class]=\"'badge-' + (tab.badgeColor || 'primary')\">\n {{ tab.badgeCount }}\n </span>\n }\n </li>\n }\n </ul>\n </nav>\n\n <!-- Content Area -->\n <div class=\"content-area\" role=\"tabpanel\" [attr.id]=\"'panel-' + activeTab\">\n <div class=\"tab-content\">\n @switch (activeTab) {\n @case ('general') {\n <div class=\"general-settings\">\n <h2 class=\"section-title\">General Settings</h2>\n <div class=\"mj-grid mj-grid-responsive\">\n <mj-settings-card\n title=\"Profile Information\"\n icon=\"fa-solid fa-user\"\n [expanded]=\"isSectionExpanded('profile')\"\n (toggle)=\"toggleSection('profile')\"\n >\n <div class=\"card-content\">\n <mj-user-profile-settings></mj-user-profile-settings>\n </div>\n </mj-settings-card>\n\n <mj-settings-card\n title=\"Preferences\"\n icon=\"fa-solid fa-sliders\"\n [expanded]=\"isSectionExpanded('preferences')\"\n (toggle)=\"toggleSection('preferences')\"\n >\n <div class=\"card-content\">\n <p>Customize your experience with display and behavior preferences.</p>\n <!-- Preferences content will go here -->\n </div>\n </mj-settings-card>\n </div>\n </div>\n }\n\n @case ('users') {\n <div class=\"users-settings\">\n <h2 class=\"section-title\">User Management</h2>\n <p class=\"section-description\">Manage user accounts, roles, and permissions</p>\n <mj-user-management></mj-user-management>\n </div>\n }\n\n @case ('roles') {\n <div class=\"roles-settings\">\n <h2 class=\"section-title\">Role Management</h2>\n <p class=\"section-description\">Define and manage security roles.</p>\n <mj-role-management></mj-role-management>\n </div>\n }\n\n @case ('applications') {\n <div class=\"applications-settings\">\n <mj-application-management></mj-application-management>\n </div>\n }\n\n @case ('permissions') {\n <div class=\"permissions-settings\">\n <mj-entity-permissions></mj-entity-permissions>\n </div>\n }\n\n @case ('notifications') {\n <div class=\"notifications-settings\">\n <h2 class=\"section-title\">Notifications</h2>\n <p class=\"section-description\">Configure how and when you receive notifications</p>\n <mj-notification-preferences></mj-notification-preferences>\n </div>\n }\n\n @case ('advanced') {\n <div class=\"advanced-settings\">\n <h2 class=\"section-title\">Advanced Settings</h2>\n <div class=\"beta-warning\">\n <i class=\"fa-solid fa-flask\" aria-hidden=\"true\"></i>\n <span>Beta features - Use with caution</span>\n </div>\n\n <!-- Tab Navigation -->\n <div class=\"advanced-tabs\" role=\"tablist\" aria-label=\"Advanced settings tabs\">\n <button\n class=\"tab-btn\"\n [class.active]=\"advancedActiveTab === 'sql-logging'\"\n (click)=\"setAdvancedTab('sql-logging')\"\n role=\"tab\"\n [attr.aria-selected]=\"advancedActiveTab === 'sql-logging'\"\n aria-controls=\"panel-sql-logging\"\n >\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n SQL Logging\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"advancedActiveTab === 'performance'\"\n (click)=\"setAdvancedTab('performance')\"\n role=\"tab\"\n [attr.aria-selected]=\"advancedActiveTab === 'performance'\"\n aria-controls=\"panel-performance\"\n >\n <i class=\"fa-solid fa-gauge-high\" aria-hidden=\"true\"></i>\n Performance\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"advancedActiveTab === 'developer'\"\n (click)=\"setAdvancedTab('developer')\"\n role=\"tab\"\n [attr.aria-selected]=\"advancedActiveTab === 'developer'\"\n aria-controls=\"panel-developer\"\n >\n <i class=\"fa-solid fa-code\" aria-hidden=\"true\"></i>\n Developer Tools\n </button>\n </div>\n\n <!-- Tab Content -->\n <div class=\"advanced-tab-content\">\n @switch (advancedActiveTab) {\n @case ('sql-logging') {\n <div id=\"panel-sql-logging\" role=\"tabpanel\">\n <mj-sql-logging></mj-sql-logging>\n </div>\n }\n @case ('performance') {\n <div id=\"panel-performance\" role=\"tabpanel\" class=\"performance-settings\">\n <h3>Performance Settings</h3>\n <p>Performance monitoring and optimization tools coming soon.</p>\n </div>\n }\n @case ('developer') {\n <div id=\"panel-developer\" role=\"tabpanel\" class=\"developer-settings\">\n <h3>Developer Tools</h3>\n <p>Advanced developer options coming soon.</p>\n </div>\n }\n }\n </div>\n </div>\n }\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Mobile Layout -->\n @if (isMobile) {\n <div class=\"mobile-layout\">\n <!-- Mobile Header (Hidden when nav is open) -->\n @if (!isMobileNavOpen) {\n <header class=\"mobile-header\">\n <button\n class=\"mobile-header-icon\"\n (click)=\"toggleMobileNav()\"\n aria-label=\"Toggle navigation menu\"\n [attr.aria-expanded]=\"isMobileNavOpen\"\n >\n <i class=\"fa-solid fa-bars\" aria-hidden=\"true\"></i>\n </button>\n <h1 class=\"mobile-header-title\">Settings</h1>\n <div class=\"mobile-header-spacer\"></div>\n </header>\n }\n\n <!-- Backdrop Overlay -->\n @if (isMobileNavOpen) {\n <div\n class=\"mobile-nav-backdrop\"\n (click)=\"closeMobileNav()\"\n aria-hidden=\"true\"\n ></div>\n }\n\n <!-- Mobile Navigation Rail (Collapsible) -->\n <nav\n class=\"mobile-nav-rail\"\n [class.open]=\"isMobileNavOpen\"\n role=\"navigation\"\n aria-label=\"Settings navigation\"\n >\n <!-- Navigation Header -->\n <div class=\"nav-rail-header\">\n <span class=\"nav-rail-title\">Settings</span>\n </div>\n\n <!-- Navigation Items -->\n <div class=\"nav-rail-items\" role=\"tablist\">\n @for (tab of filteredTabs; track tab.id) {\n <button\n class=\"nav-rail-item\"\n [class.active]=\"activeTab === tab.id\"\n (click)=\"onMobileTabChange(tab.id)\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === tab.id\"\n [attr.aria-label]=\"tab.label\"\n >\n <i [class]=\"tab.icon\" aria-hidden=\"true\"></i>\n <span class=\"nav-rail-label\">{{ tab.label }}</span>\n @if (tab.badgeCount && tab.badgeCount > 0) {\n <span class=\"rail-badge\" [class]=\"'badge-' + (tab.badgeColor || 'primary')\">\n {{ tab.badgeCount }}\n </span>\n }\n </button>\n }\n\n <!-- Close Navigation Item -->\n <button\n class=\"nav-rail-item nav-rail-close-item\"\n (click)=\"closeSettings()\"\n aria-label=\"Close settings\"\n >\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n <span class=\"nav-rail-label\">Close</span>\n </button>\n </div>\n </nav>\n\n <!-- Mobile Content Area -->\n <div class=\"mobile-content\">\n <div class=\"tab-content\">\n @switch (activeTab) {\n @case ('general') {\n <div class=\"general-settings\">\n <h2 class=\"section-title\">General Settings</h2>\n <div class=\"mj-grid mj-grid-responsive\">\n <mj-settings-card\n title=\"Profile Information\"\n icon=\"fa-solid fa-user\"\n [expanded]=\"isSectionExpanded('profile')\"\n (toggle)=\"toggleSection('profile')\"\n >\n <div class=\"card-content\">\n <mj-user-profile-settings></mj-user-profile-settings>\n </div>\n </mj-settings-card>\n\n <mj-settings-card\n title=\"Preferences\"\n icon=\"fa-solid fa-sliders\"\n [expanded]=\"isSectionExpanded('preferences')\"\n (toggle)=\"toggleSection('preferences')\"\n >\n <div class=\"card-content\">\n <p>Customize your experience with display and behavior preferences.</p>\n </div>\n </mj-settings-card>\n </div>\n </div>\n }\n @case ('users') {\n <div class=\"users-settings\">\n <h2 class=\"section-title\">User Management</h2>\n <p class=\"section-description\">Manage user accounts, roles, and permissions</p>\n <mj-user-management></mj-user-management>\n </div>\n }\n @case ('roles') {\n <div class=\"roles-settings\">\n <h2 class=\"section-title\">Role Management</h2>\n <p class=\"section-description\">Define and manage security roles.</p>\n <mj-role-management></mj-role-management>\n </div>\n }\n @case ('applications') {\n <div class=\"applications-settings\">\n <mj-application-management></mj-application-management>\n </div>\n }\n @case ('permissions') {\n <div class=\"permissions-settings\">\n <mj-entity-permissions></mj-entity-permissions>\n </div>\n }\n @case ('notifications') {\n <div class=\"notifications-settings\">\n <h2 class=\"section-title\">Notifications</h2>\n <p class=\"section-description\">Configure how and when you receive notifications</p>\n <mj-notification-preferences></mj-notification-preferences>\n </div>\n }\n @case ('advanced') {\n <div class=\"advanced-settings\">\n <h2 class=\"section-title\">Advanced Settings</h2>\n <div class=\"beta-warning\">\n <i class=\"fa-solid fa-flask\" aria-hidden=\"true\"></i>\n <span>Beta features - Use with caution</span>\n </div>\n\n <!-- Tab Navigation (Mobile) -->\n <div class=\"advanced-tabs\" role=\"tablist\" aria-label=\"Advanced settings tabs\">\n <button\n class=\"tab-btn\"\n [class.active]=\"advancedActiveTab === 'sql-logging'\"\n (click)=\"setAdvancedTab('sql-logging')\"\n role=\"tab\"\n [attr.aria-selected]=\"advancedActiveTab === 'sql-logging'\"\n aria-controls=\"panel-sql-logging-mobile\"\n >\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n SQL Logging\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"advancedActiveTab === 'performance'\"\n (click)=\"setAdvancedTab('performance')\"\n role=\"tab\"\n [attr.aria-selected]=\"advancedActiveTab === 'performance'\"\n aria-controls=\"panel-performance-mobile\"\n >\n <i class=\"fa-solid fa-gauge-high\" aria-hidden=\"true\"></i>\n Performance\n </button>\n <button\n class=\"tab-btn\"\n [class.active]=\"advancedActiveTab === 'developer'\"\n (click)=\"setAdvancedTab('developer')\"\n role=\"tab\"\n [attr.aria-selected]=\"advancedActiveTab === 'developer'\"\n aria-controls=\"panel-developer-mobile\"\n >\n <i class=\"fa-solid fa-code\" aria-hidden=\"true\"></i>\n Developer Tools\n </button>\n </div>\n\n <!-- Tab Content (Mobile) -->\n <div class=\"advanced-tab-content\">\n @switch (advancedActiveTab) {\n @case ('sql-logging') {\n <div id=\"panel-sql-logging-mobile\" role=\"tabpanel\">\n <mj-sql-logging></mj-sql-logging>\n </div>\n }\n @case ('performance') {\n <div id=\"panel-performance-mobile\" role=\"tabpanel\" class=\"performance-settings\">\n <h3>Performance Settings</h3>\n <p>Performance monitoring and optimization tools coming soon.</p>\n </div>\n }\n @case ('developer') {\n <div id=\"panel-developer-mobile\" role=\"tabpanel\" class=\"developer-settings\">\n <h3>Developer Tools</h3>\n <p>Advanced developer options coming soon.</p>\n </div>\n }\n }\n </div>\n </div>\n }\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n</div>\n", styles: ["/* ============================================\n Settings Component - MD3 Design System\n Material Design 3 compliant styles with proper token usage\n ============================================ */\n\n/* ============================================\n Custom Color Palette\n ============================================ */\n:host {\n --settings-primary: #0076B6;\n --settings-primary-container: #AAE7FD;\n --settings-secondary: #F5A623;\n --settings-secondary-container: #FFECD6;\n --settings-tertiary: #4CAF50;\n --settings-tertiary-container: #C8E6C9;\n --settings-error: #D32F2F;\n --settings-error-container: #FFCDD2;\n}\n\n/* ============================================\n Host & Page Container\n ============================================ */\n\n/* Host element must fill its container */\n:host {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\n@media (max-width: 768px) {\n :host {\n height: auto;\n min-height: 100vh;\n overflow: visible;\n }\n}\n\n/* Page container needs proper height and scrolling */\n.mj-page-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n@media (max-width: 768px) {\n .mj-page-container {\n overflow-y: visible;\n overflow-x: hidden;\n height: auto;\n min-height: 100vh;\n }\n}\n\n/* ============================================\n Keyframe Animations\n ============================================ */\n\n@keyframes shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n/* ============================================\n Settings Container & Main Layout\n ============================================ */\n\n.settings-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: var(--mat-sys-surface);\n overflow-y: auto;\n position: relative;\n}\n\n/* ============================================\n Loading State\n ============================================ */\n.loading-container {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.loading-content {\n text-align: center;\n}\n\n.loading-text {\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n}\n\n/* ============================================\n Error State\n ============================================ */\n.error-container {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.error-content {\n text-align: center;\n max-width: 400px;\n}\n\n.error-content .error-icon {\n font-size: 3rem;\n color: var(--mat-sys-error);\n margin-bottom: 1rem;\n}\n\n.error-content .error-message {\n color: var(--mat-sys-on-surface);\n margin-bottom: 1.5rem;\n font: var(--mat-sys-body-large);\n}\n\n.error-content .retry-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.75rem 1.5rem;\n font: var(--mat-sys-label-large);\n font-weight: 500;\n border: none;\n border-radius: 20px;\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 background-color: var(--mat-sys-primary);\n color: var(--mat-sys-on-primary);\n}\n\n.error-content .retry-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.error-content .retry-button:hover:not(:disabled) {\n background-color: var(--mat-sys-primary-hover, var(--mat-sys-primary));\n transform: translateY(-1px);\n box-shadow: var(--mat-sys-elevation-2);\n}\n\n.error-content .retry-button i {\n font-size: 0.875rem;\n}\n\n/* ============================================\n Main Content Area & Tab Layout\n ============================================ */\n\n.settings-content {\n display: flex;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n flex-direction: column;\n width: 100%;\n min-height: 0;\n}\n\n@media (max-width: 768px) {\n .settings-content {\n overflow-y: visible;\n overflow-x: hidden;\n height: auto;\n min-height: 0;\n flex: none;\n }\n}\n\n.desktop-layout {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n.settings-content .desktop-layout {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n/* ============================================\n Side Navigation (Desktop Only)\n ============================================ */\n\n.side-navigation {\n width: 280px;\n background: linear-gradient(180deg, var(--mat-sys-surface) 0%, var(--mat-sys-surface-container-lowest) 100%);\n border-right: 1px solid var(--mat-sys-outline-variant);\n overflow-y: auto;\n flex-shrink: 0;\n box-shadow: var(--mat-sys-elevation-1);\n}\n\n/* Navigation Search Bar */\n.nav-search {\n position: relative;\n padding: 1rem;\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n background-color: var(--mat-sys-surface);\n}\n\n.nav-search-icon {\n position: absolute;\n left: 1.75rem;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mat-sys-on-surface-variant);\n font-size: 1rem;\n pointer-events: none;\n z-index: 1;\n}\n\n.nav-search-input {\n width: 100%;\n padding: 0.75rem 2.75rem 0.75rem 2.5rem;\n border: 1px solid var(--mat-sys-outline-variant);\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-body-medium);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-search-input:focus {\n outline: none;\n border-color: var(--settings-primary);\n background-color: var(--mat-sys-surface);\n box-shadow: 0 0 0 2px rgba(0, 118, 182, 0.1);\n}\n\n.nav-search-input::placeholder {\n color: var(--mat-sys-on-surface-variant);\n}\n\n.nav-search-clear {\n position: absolute;\n right: 1.25rem;\n top: 50%;\n transform: translateY(-50%);\n padding: 0.25rem;\n background: transparent;\n border: none;\n color: var(--mat-sys-on-surface-variant);\n cursor: pointer;\n border-radius: var(--mat-sys-corner-full);\n min-width: 32px;\n min-height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n z-index: 1;\n}\n\n.nav-search-clear:hover {\n background: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-search-clear:focus-visible {\n outline: 2px solid var(--settings-primary);\n outline-offset: 2px;\n}\n\n.nav-list {\n list-style: none;\n margin: 0;\n padding: 1rem 0;\n}\n\n.nav-item {\n position: relative;\n display: flex;\n align-items: center;\n padding: 1rem 1.5rem;\n margin: 0.25rem 0.75rem;\n border-radius: var(--mat-sys-corner-medium);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n border: 2px solid transparent;\n}\n\n.nav-item:hover {\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n transform: translateX(4px);\n}\n\n.nav-item:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: 2px;\n}\n\n/* Color-coded navigation items */\n.nav-item[aria-controls=\"panel-general\"] {\n --item-color: var(--settings-primary);\n --item-container: var(--settings-primary-container);\n}\n\n.nav-item[aria-controls=\"panel-users\"] {\n --item-color: var(--settings-secondary);\n --item-container: var(--settings-secondary-container);\n}\n\n.nav-item[aria-controls=\"panel-roles\"] {\n --item-color: var(--settings-tertiary);\n --item-container: var(--settings-tertiary-container);\n}\n\n.nav-item[aria-controls=\"panel-applications\"] {\n --item-color: #9C27B0;\n --item-container: #E1BEE7;\n}\n\n.nav-item[aria-controls=\"panel-permissions\"] {\n --item-color: var(--settings-error);\n --item-container: var(--settings-error-container);\n}\n\n.nav-item[aria-controls=\"panel-advanced\"] {\n --item-color: #FF6F00;\n --item-container: #FFE0B2;\n}\n\n.nav-item.active {\n background-color: var(--item-container);\n color: var(--item-color);\n font-weight: 600;\n border-color: var(--item-color);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.nav-item:hover:not(.active) {\n border-color: var(--item-color);\n background-color: rgba(255, 255, 255, 0.5);\n}\n\n.nav-item i {\n width: 20px;\n margin-right: 0.75rem;\n font-size: 1.1rem;\n}\n\n.nav-item .nav-label {\n flex: 1;\n}\n\n.nav-item .nav-badge {\n padding: 0.125rem 0.5rem;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-small);\n font-weight: 600;\n}\n\n.nav-item .nav-badge.badge-primary {\n background-color: var(--mat-sys-primary-container);\n color: var(--mat-sys-on-primary-container);\n}\n\n.nav-item .nav-badge.badge-danger {\n background-color: var(--mat-sys-error-container);\n color: var(--mat-sys-on-error-container);\n}\n\n.nav-item .nav-badge.badge-warning {\n background-color: var(--mat-sys-tertiary-container);\n color: var(--mat-sys-on-tertiary-container);\n}\n\n.nav-item .nav-badge.badge-success {\n background-color: var(--mat-sys-secondary-container);\n color: var(--mat-sys-on-secondary-container);\n}\n\n/* ============================================\n Content Area & Tab Panels\n ============================================ */\n\n.content-area {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 0;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n background: linear-gradient(180deg, var(--mat-sys-surface-container-lowest) 0%, var(--mat-sys-surface) 100%);\n}\n\n@media (max-width: 768px) {\n .content-area {\n padding: 1rem;\n }\n}\n\n.tab-content {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n max-width: 100%;\n min-height: 0;\n box-sizing: border-box;\n overflow-x: hidden;\n padding: 1.5rem 2rem;\n}\n\n@media (max-width: 768px) {\n .tab-content {\n height: auto;\n min-height: 0;\n overflow-y: visible;\n overflow-x: hidden;\n padding: 0.5rem;\n }\n}\n\n/* ============================================\n Section Titles\n ============================================ */\n.section-title {\n font: var(--mat-sys-headline-small);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n margin: 0 0 1rem 0;\n padding-bottom: 0.75rem;\n border-bottom: 3px solid var(--mat-sys-outline-variant);\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.section-title::before {\n content: \"\";\n width: 4px;\n height: 2rem;\n background: linear-gradient(180deg, var(--settings-primary) 0%, var(--settings-tertiary) 100%);\n border-radius: 2px;\n}\n\n.section-description {\n color: var(--mat-sys-on-surface-variant);\n margin: 0 0 1.5rem 0;\n font: var(--mat-sys-body-large);\n padding: 1rem 1.25rem;\n background-color: var(--mat-sys-surface-container);\n border-radius: var(--mat-sys-corner-medium);\n}\n\n/* ============================================\n Settings Grid\n ============================================ */\n.settings-grid,\n.mj-grid {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n margin-top: 1.5rem;\n}\n\n.mj-grid-responsive {\n /* Single column stacked layout */\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n@media (max-width: 768px) {\n .settings-grid,\n .mj-grid,\n .mj-grid-responsive {\n gap: 1rem;\n margin-top: 0.5rem;\n }\n}\n\n/* ============================================\n Section Title & Description Spacing\n ============================================ */\n.general-settings .section-title,\n.users-settings .section-title,\n.roles-settings .section-title {\n margin-bottom: 0.25rem;\n}\n\n.users-settings .section-description,\n.roles-settings .section-description {\n margin-bottom: 0.5rem;\n}\n\n/* ============================================\n Card Content\n ============================================ */\n.card-content {\n padding: 1rem;\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-medium);\n}\n\n.card-content p {\n margin: 0 0 1rem 0;\n line-height: 1.6;\n}\n\n/* ============================================\n Beta Warning\n ============================================ */\n.beta-warning {\n display: inline-flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1.25rem;\n background: linear-gradient(135deg, #FFE0B2 0%, var(--settings-secondary-container) 100%);\n color: #FF6F00;\n border-radius: var(--mat-sys-corner-medium);\n font: var(--mat-sys-label-large);\n font-weight: 600;\n margin-bottom: 1.5rem;\n max-width: 100%;\n box-sizing: border-box;\n border: 2px solid #FF6F00;\n box-shadow: 0 2px 8px rgba(255, 111, 0, 0.2);\n}\n\n.beta-warning i {\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n@media (max-width: 768px) {\n .beta-warning {\n font-size: 0.8125rem;\n padding: 0.5rem 0.75rem;\n margin-bottom: 0.75rem;\n }\n}\n\n/* ============================================\n Mobile Layout with Collapsible Navigation Rail\n ============================================ */\n\n.mobile-layout {\n position: relative;\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n width: 100%;\n max-width: 100vw;\n overflow: visible;\n box-sizing: border-box;\n}\n\n/* Mobile Header */\n.mobile-header {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: 56px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 0.5rem;\n background-color: var(--mat-sys-surface-container);\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n z-index: 100;\n box-sizing: border-box;\n}\n\n.mobile-header-icon {\n width: 48px;\n height: 48px;\n min-width: 48px;\n border-radius: var(--mat-sys-corner-full);\n background: transparent;\n color: var(--mat-sys-on-surface);\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.mobile-header-icon:hover {\n background-color: var(--mat-sys-surface-container-high);\n}\n\n.mobile-header-icon:active {\n transform: scale(0.95);\n}\n\n.mobile-header-icon i {\n font-size: 1.25rem;\n}\n\n.mobile-header-title {\n flex: 1;\n text-align: center;\n font: var(--mat-sys-title-large);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n margin: 0;\n padding: 0 0.5rem;\n}\n\n.mobile-header-spacer {\n width: 48px;\n min-width: 48px;\n}\n\n/* Backdrop Overlay */\n.mobile-nav-backdrop {\n position: fixed;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 1000;\n animation: fadeIn 0.2s ease-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* Collapsible Navigation Rail */\n.mobile-nav-rail {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n width: 280px;\n max-width: 80vw;\n background-color: var(--mat-sys-surface);\n border-right: 1px solid var(--mat-sys-outline-variant);\n display: flex;\n flex-direction: column;\n z-index: 1001;\n transform: translateX(-100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: var(--mat-sys-elevation-4);\n overflow: hidden;\n}\n\n.mobile-nav-rail.open {\n transform: translateX(0);\n}\n\n/* Navigation Rail Header */\n.nav-rail-header {\n display: flex;\n align-items: center;\n padding: 1rem 1.5rem;\n min-height: 64px;\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n background-color: var(--mat-sys-surface-container);\n flex-shrink: 0;\n}\n\n.nav-rail-title {\n font: var(--mat-sys-title-large);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n}\n\n/* Navigation Items Container */\n.nav-rail-items {\n display: flex;\n flex-direction: column;\n padding: 0.5rem;\n gap: 0.25rem;\n overflow-y: auto;\n overflow-x: hidden;\n flex: 1;\n}\n\n/* Close Navigation Item */\n.nav-rail-close-item {\n margin-top: auto;\n border-top: 1px solid var(--mat-sys-outline-variant);\n padding-top: 0.75rem !important;\n margin-top: 0.5rem;\n background-color: var(--mat-sys-error-container) !important;\n color: var(--mat-sys-on-error-container) !important;\n}\n\n.nav-rail-close-item:hover {\n background-color: var(--mat-sys-error) !important;\n color: var(--mat-sys-on-error) !important;\n}\n\n.nav-rail-close-item i {\n font-size: 1.5rem;\n}\n\n/* Navigation Item */\n.nav-rail-item {\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 1rem;\n width: 100%;\n padding: 0.875rem 1rem;\n background: transparent;\n border: none;\n border-radius: var(--mat-sys-corner-medium);\n color: var(--mat-sys-on-surface-variant);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n text-align: left;\n min-height: 56px;\n}\n\n.nav-rail-item i {\n font-size: 1.5rem;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.nav-rail-label {\n font: var(--mat-sys-body-large);\n font-weight: 500;\n flex: 1;\n}\n\n.nav-rail-item:hover:not(.active) {\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-rail-item.active {\n background-color: var(--mat-sys-primary-container);\n color: var(--mat-sys-primary);\n}\n\n.nav-rail-item.active .nav-rail-label {\n font-weight: 600;\n}\n\n.nav-rail-item:active {\n transform: scale(0.98);\n}\n\n.nav-rail-item:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: 2px;\n}\n\n/* Badge indicator */\n.rail-badge {\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-small);\n font-size: 11px;\n font-weight: 700;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.rail-badge.badge-primary {\n background-color: var(--mat-sys-primary);\n color: var(--mat-sys-on-primary);\n}\n\n.rail-badge.badge-danger {\n background-color: var(--mat-sys-error);\n color: var(--mat-sys-on-error);\n}\n\n.rail-badge.badge-warning {\n background-color: var(--mat-sys-tertiary);\n color: var(--mat-sys-on-tertiary);\n}\n\n.rail-badge.badge-success {\n background-color: var(--mat-sys-secondary);\n color: var(--mat-sys-on-secondary);\n}\n\n/* Mobile Content Area */\n.mobile-content {\n width: 100%;\n max-width: 100vw;\n overflow-y: visible;\n overflow-x: hidden;\n padding: 72px 0.75rem 2rem 0.75rem;\n min-width: 0;\n box-sizing: border-box;\n -webkit-overflow-scrolling: touch;\n flex: 1;\n}\n\n/* Responsive adjustments */\n@media (max-width: 374px) {\n .mobile-nav-rail {\n width: 260px;\n }\n\n .mobile-content {\n padding: 64px 0.5rem 1.5rem 0.5rem;\n }\n\n .mobile-header {\n height: 52px;\n padding: 0 0.25rem;\n }\n\n .mobile-header-icon {\n width: 44px;\n height: 44px;\n min-width: 44px;\n }\n\n .mobile-header-spacer {\n width: 44px;\n min-width: 44px;\n }\n\n .mobile-header-title {\n font-size: 1.125rem;\n }\n}\n\n/* ============================================\n Advanced Settings Sub-Tabs\n ============================================ */\n\n.advanced-tabs {\n display: flex;\n gap: 0.5rem;\n border-bottom: 2px solid var(--mat-sys-outline-variant);\n margin-bottom: 1rem;\n margin-top: 1rem;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: thin;\n -webkit-overflow-scrolling: touch;\n}\n\n.advanced-tabs .tab-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n background: transparent;\n border: none;\n border-bottom: 3px solid transparent;\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-label-large);\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n min-height: 44px;\n white-space: nowrap;\n flex-shrink: 0;\n}\n\n/* Mobile-specific tab adjustments - Segmented Button Style */\n@media (max-width: 768px) {\n .advanced-tabs {\n gap: 0;\n margin-bottom: 1rem;\n margin-top: 1rem;\n border-bottom: none;\n border: 1px solid var(--mat-sys-outline);\n border-radius: var(--mat-sys-corner-full);\n padding: 0;\n background-color: var(--mat-sys-surface-container-low);\n overflow-x: hidden;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n }\n\n .advanced-tabs .tab-btn {\n flex: 1;\n padding: 0.625rem 0.5rem;\n font-size: 0.75rem;\n border-bottom: none;\n border-radius: 0;\n border-right: 1px solid var(--mat-sys-outline);\n min-width: 0;\n justify-content: center;\n text-align: center;\n white-space: nowrap;\n overflow: hidden;\n }\n\n .advanced-tabs .tab-btn:last-child {\n border-right: none;\n }\n\n .advanced-tabs .tab-btn:first-child {\n border-radius: var(--mat-sys-corner-full) 0 0 var(--mat-sys-corner-full);\n }\n\n .advanced-tabs .tab-btn:last-child {\n border-radius: 0 var(--mat-sys-corner-full) var(--mat-sys-corner-full) 0;\n }\n\n .advanced-tabs .tab-btn.active {\n background-color: var(--mat-sys-secondary-container);\n color: var(--mat-sys-on-secondary-container);\n border-bottom: none;\n }\n\n .advanced-tabs .tab-btn i {\n font-size: 0.875rem;\n }\n}\n\n.advanced-tabs .tab-btn:hover {\n color: var(--mat-sys-on-surface);\n background: var(--mat-sys-surface-container);\n}\n\n.advanced-tabs .tab-btn:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: -2px;\n}\n\n.advanced-tabs .tab-btn.active {\n color: var(--mat-sys-primary);\n border-bottom-color: var(--mat-sys-primary);\n background: var(--mat-sys-primary-container);\n}\n\n.advanced-tabs .tab-btn.active i {\n color: var(--mat-sys-primary);\n}\n\n.advanced-tabs .tab-btn i {\n font-size: 1.125rem;\n}\n\n/* ============================================\n Advanced Tab Content Panels\n ============================================ */\n\n.advanced-tab-content {\n flex: 1;\n overflow-y: visible;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n background: var(--mat-sys-surface);\n border-radius: var(--mat-sys-corner-large);\n padding: 0;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n}\n\n/* Ensure scrolling works on mobile */\n@media (max-width: 768px) {\n .advanced-tab-content {\n height: auto;\n min-height: 200px;\n overflow-y: visible;\n }\n}\n\n.performance-settings,\n.developer-settings {\n padding: 2rem;\n}\n\n.performance-settings h3,\n.developer-settings h3 {\n margin: 0 0 1rem 0;\n font: var(--mat-sys-title-large);\n color: var(--mat-sys-on-surface);\n}\n\n.performance-settings p,\n.developer-settings p {\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n}\n\n/* ============================================\n Settings Panel Containers with Fade-In Animation\n ============================================ */\n\n.general-settings,\n.users-settings,\n.roles-settings,\n.applications-settings,\n.permissions-settings,\n.advanced-settings {\n animation: fadeIn 0.3s ease-out;\n width: 100%;\n max-width: 100%;\n height: auto;\n min-height: 100%;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n overflow-y: visible;\n overflow-x: hidden;\n box-sizing: border-box;\n}\n\n/* Mobile-specific adjustments */\n@media (max-width: 768px) {\n .general-settings,\n .users-settings,\n .roles-settings,\n .applications-settings,\n .permissions-settings,\n .advanced-settings {\n gap: 0.75rem;\n height: auto;\n min-height: auto;\n }\n\n .section-title {\n margin-bottom: 0.5rem;\n font-size: 1.375rem;\n }\n\n .section-description {\n margin-bottom: 0.75rem;\n }\n}\n\n/* Only apply flex: 1 to actual content components, not titles/descriptions */\n.general-settings > mj-settings-card,\n.general-settings > .mj-grid,\n.users-settings > mj-user-management,\n.roles-settings > mj-role-management,\n.applications-settings > mj-application-management,\n.permissions-settings > mj-entity-permissions,\n.advanced-settings > .advanced-tabs,\n.advanced-settings > .advanced-tab-content {\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n}\n\n/* Allow content to flow naturally on mobile */\n@media (max-width: 768px) {\n .users-settings > mj-user-management,\n .roles-settings > mj-role-management,\n .applications-settings > mj-application-management,\n .permissions-settings > mj-entity-permissions,\n .advanced-settings > .advanced-tab-content {\n flex: none;\n height: auto !important;\n min-height: 0;\n max-height: none !important;\n overflow-y: visible !important;\n overflow-x: hidden;\n }\n}\n\n/* Titles and descriptions should not flex or grow */\n.general-settings > .section-title,\n.users-settings > .section-title,\n.roles-settings > .section-title,\n.users-settings > .section-description,\n.roles-settings > .section-description {\n flex-shrink: 0;\n flex-grow: 0;\n}\n\n/* ============================================\n Accessibility: Reduced Motion Support\n ============================================ */\n\n@media (prefers-reduced-motion: reduce) {\n .general-settings,\n .users-settings,\n .roles-settings,\n .applications-settings,\n .permissions-settings,\n .advanced-settings {\n animation: none;\n }\n\n .nav-tab i,\n .nav-item,\n .tab-btn,\n .search-input,\n .retry-button,\n .search-result-item {\n transition: none;\n }\n}\n\n/* ============================================\n Responsive Breakpoints\n ============================================ */\n@media (max-width: 640px) {\n .side-navigation {\n width: 200px;\n }\n\n .nav-item {\n padding: 0.75rem 1rem;\n }\n}\n\n@media (max-width: 1024px) {\n .content-area {\n padding: 1.5rem;\n }\n}\n\n/* Mobile scroll fix - ensure all child components flow naturally */\n@media (max-width: 768px) {\n .mobile-layout mj-user-management,\n .mobile-layout mj-role-management,\n .mobile-layout mj-application-management,\n .mobile-layout mj-entity-permissions,\n .mobile-layout mj-sql-logging,\n .mobile-layout mj-settings-card,\n .mobile-layout mj-user-profile-settings {\n display: block;\n height: auto !important;\n max-height: none !important;\n overflow: visible !important;\n }\n\n /* Ensure all nested content areas flow naturally */\n .mobile-layout .general-settings,\n .mobile-layout .users-settings,\n .mobile-layout .roles-settings,\n .mobile-layout .applications-settings,\n .mobile-layout .permissions-settings,\n .mobile-layout .advanced-settings {\n height: auto !important;\n min-height: 0 !important;\n max-height: none !important;\n }\n\n /* Ensure mj-grid and card content can expand */\n .mobile-layout .mj-grid,\n .mobile-layout .mj-grid-responsive,\n .mobile-layout .card-content {\n height: auto !important;\n min-height: 0 !important;\n }\n}\n\n@media (min-width: 1440px) {\n .content-area {\n padding: 2.5rem 3rem;\n }\n\n .side-navigation {\n width: 280px;\n }\n}\n\n/* ============================================\n iOS Safari Mobile Scrolling Fix\n ============================================ */\n@media (max-width: 768px) {\n /* Prevent iOS from restricting body scrolling */\n body {\n position: relative;\n overflow-y: visible;\n -webkit-overflow-scrolling: touch;\n }\n\n /* Allow mobile layout and all parents to expand naturally */\n .mobile-layout,\n .mobile-layout > *,\n .mobile-content > *,\n .tab-content > * {\n -webkit-overflow-scrolling: touch;\n }\n\n /* Prevent fixed heights from blocking scroll */\n .mobile-layout * {\n box-sizing: border-box;\n }\n}\n"] }]
|
|
555
|
+
args: [{ selector: 'mj-settings', template: "<div class=\"mj-page-container\">\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\" role=\"status\" aria-live=\"polite\">\n <mj-loading text=\"Loading settings...\"></mj-loading>\n </div>\n }\n\n <!-- Error State -->\n @if (error && !isLoading) {\n <div class=\"error-container\" role=\"alert\">\n <div class=\"error-content\">\n <i class=\"fa-solid fa-exclamation-triangle error-icon\" aria-hidden=\"true\"></i>\n <p class=\"error-message\">{{ error }}</p>\n <button class=\"retry-button\" (click)=\"loadInitialData()\">\n <i class=\"fa-solid fa-refresh\" aria-hidden=\"true\"></i>\n Try Again\n </button>\n </div>\n </div>\n }\n\n <!-- Main Content -->\n @if (!isLoading && !error) {\n <div class=\"settings-content\">\n <!-- Desktop Layout -->\n @if (!isMobile) {\n <div class=\"desktop-layout\" style=\"display: flex;\">\n <!-- Side Navigation -->\n <nav class=\"side-navigation\" role=\"navigation\" aria-label=\"Settings navigation\">\n <!-- Search Bar -->\n <div class=\"nav-search\">\n <i class=\"fa-solid fa-search nav-search-icon\" aria-hidden=\"true\"></i>\n <input\n type=\"text\"\n class=\"nav-search-input\"\n placeholder=\"Search settings...\"\n (input)=\"onSearchChange($event)\"\n [value]=\"searchTerm$.value\"\n aria-label=\"Search settings\"\n />\n @if (searchTerm$.value) {\n <button\n class=\"nav-search-clear\"\n (click)=\"clearSearch()\"\n aria-label=\"Clear search\"\n tabindex=\"0\"\n >\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n\n <ul class=\"nav-list\" role=\"tablist\" aria-orientation=\"vertical\">\n @for (tab of filteredTabs; track tab.id) {\n <li\n class=\"nav-item\"\n [class.active]=\"activeTab === tab.id\"\n [class.disabled]=\"tab.disabled\"\n (click)=\"onTabChange(tab.id)\"\n (keydown.enter)=\"onTabChange(tab.id)\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === tab.id\"\n [attr.aria-controls]=\"'panel-' + tab.id\"\n [attr.aria-disabled]=\"tab.disabled\"\n tabindex=\"0\"\n >\n <i [class]=\"tab.icon\" aria-hidden=\"true\"></i>\n <span class=\"nav-label\">{{ tab.label }}</span>\n @if (tab.disabled) {\n <span class=\"coming-soon-badge\">Soon</span>\n }\n @if (tab.badgeCount && tab.badgeCount > 0) {\n <span class=\"nav-badge\" [class]=\"'badge-' + (tab.badgeColor || 'primary')\">\n {{ tab.badgeCount }}\n </span>\n }\n </li>\n }\n </ul>\n </nav>\n\n <!-- Content Area -->\n <div class=\"content-area\" role=\"tabpanel\" [attr.id]=\"'panel-' + activeTab\">\n <div class=\"tab-content\">\n @switch (activeTab) {\n @case ('general') {\n <mj-general-settings></mj-general-settings>\n }\n\n @case ('notifications') {\n <div class=\"notifications-settings\">\n <h2 class=\"section-title\">Notifications</h2>\n <p class=\"section-description\">Configure how and when you receive notifications</p>\n <mj-notification-preferences></mj-notification-preferences>\n </div>\n }\n\n @case ('applications') {\n <mj-application-settings></mj-application-settings>\n }\n\n @case ('appearance') {\n <mj-appearance-settings></mj-appearance-settings>\n }\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Mobile Layout -->\n @if (isMobile) {\n <div class=\"mobile-layout\">\n <!-- Mobile Header -->\n @if (!isMobileNavOpen) {\n <header class=\"mobile-header\">\n <button\n class=\"mobile-header-icon\"\n (click)=\"toggleMobileNav()\"\n aria-label=\"Toggle navigation menu\"\n [attr.aria-expanded]=\"isMobileNavOpen\"\n >\n <i class=\"fa-solid fa-bars\" aria-hidden=\"true\"></i>\n </button>\n <h1 class=\"mobile-header-title\">Settings</h1>\n <div class=\"mobile-header-spacer\"></div>\n </header>\n }\n\n <!-- Backdrop Overlay -->\n @if (isMobileNavOpen) {\n <div\n class=\"mobile-nav-backdrop\"\n (click)=\"closeMobileNav()\"\n aria-hidden=\"true\"\n ></div>\n }\n\n <!-- Mobile Navigation Rail -->\n <nav\n class=\"mobile-nav-rail\"\n [class.open]=\"isMobileNavOpen\"\n role=\"navigation\"\n aria-label=\"Settings navigation\"\n >\n <div class=\"nav-rail-header\">\n <span class=\"nav-rail-title\">Settings</span>\n </div>\n\n <div class=\"nav-rail-items\" role=\"tablist\">\n @for (tab of filteredTabs; track tab.id) {\n <button\n class=\"nav-rail-item\"\n [class.active]=\"activeTab === tab.id\"\n [class.disabled]=\"tab.disabled\"\n [disabled]=\"tab.disabled\"\n (click)=\"onMobileTabChange(tab.id)\"\n role=\"tab\"\n [attr.aria-selected]=\"activeTab === tab.id\"\n [attr.aria-label]=\"tab.label\"\n >\n <i [class]=\"tab.icon\" aria-hidden=\"true\"></i>\n <span class=\"nav-rail-label\">{{ tab.label }}</span>\n @if (tab.disabled) {\n <span class=\"coming-soon-badge\">Soon</span>\n }\n @if (tab.badgeCount && tab.badgeCount > 0) {\n <span class=\"rail-badge\" [class]=\"'badge-' + (tab.badgeColor || 'primary')\">\n {{ tab.badgeCount }}\n </span>\n }\n </button>\n }\n\n <button\n class=\"nav-rail-item nav-rail-close-item\"\n (click)=\"closeSettings()\"\n aria-label=\"Close settings\"\n >\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n <span class=\"nav-rail-label\">Close</span>\n </button>\n </div>\n </nav>\n\n <!-- Mobile Content Area -->\n <div class=\"mobile-content\">\n <div class=\"tab-content\">\n @switch (activeTab) {\n @case ('general') {\n <mj-general-settings></mj-general-settings>\n }\n\n @case ('notifications') {\n <div class=\"notifications-settings\">\n <h2 class=\"section-title\">Notifications</h2>\n <p class=\"section-description\">Configure how and when you receive notifications</p>\n <mj-notification-preferences></mj-notification-preferences>\n </div>\n }\n\n @case ('applications') {\n <mj-application-settings></mj-application-settings>\n }\n\n @case ('appearance') {\n <mj-appearance-settings></mj-appearance-settings>\n }\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n</div>\n", styles: ["/* ============================================\n Settings Component - MD3 Design System\n Material Design 3 compliant styles with proper token usage\n ============================================ */\n\n/* ============================================\n Custom Color Palette\n ============================================ */\n:host {\n --settings-primary: #0076B6;\n --settings-primary-container: #AAE7FD;\n --settings-secondary: #F5A623;\n --settings-secondary-container: #FFECD6;\n --settings-tertiary: #4CAF50;\n --settings-tertiary-container: #C8E6C9;\n --settings-error: #D32F2F;\n --settings-error-container: #FFCDD2;\n}\n\n/* ============================================\n Host & Page Container\n ============================================ */\n\n/* Host element must fill its container */\n:host {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\n@media (max-width: 768px) {\n :host {\n height: auto;\n min-height: 100vh;\n overflow: visible;\n }\n}\n\n/* Page container needs proper height and scrolling */\n.mj-page-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n overflow-y: auto;\n overflow-x: hidden;\n}\n\n@media (max-width: 768px) {\n .mj-page-container {\n overflow-y: visible;\n overflow-x: hidden;\n height: auto;\n min-height: 100vh;\n }\n}\n\n/* ============================================\n Keyframe Animations\n ============================================ */\n\n@keyframes shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n/* ============================================\n Settings Container & Main Layout\n ============================================ */\n\n.settings-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background-color: var(--mat-sys-surface);\n overflow-y: auto;\n position: relative;\n}\n\n/* ============================================\n Loading State\n ============================================ */\n.loading-container {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.loading-content {\n text-align: center;\n}\n\n.loading-text {\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n}\n\n/* ============================================\n Error State\n ============================================ */\n.error-container {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n}\n\n.error-content {\n text-align: center;\n max-width: 400px;\n}\n\n.error-content .error-icon {\n font-size: 3rem;\n color: var(--mat-sys-error);\n margin-bottom: 1rem;\n}\n\n.error-content .error-message {\n color: var(--mat-sys-on-surface);\n margin-bottom: 1.5rem;\n font: var(--mat-sys-body-large);\n}\n\n.error-content .retry-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.75rem 1.5rem;\n font: var(--mat-sys-label-large);\n font-weight: 500;\n border: none;\n border-radius: 20px;\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 background-color: var(--mat-sys-primary);\n color: var(--mat-sys-on-primary);\n}\n\n.error-content .retry-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.error-content .retry-button:hover:not(:disabled) {\n background-color: var(--mat-sys-primary-hover, var(--mat-sys-primary));\n transform: translateY(-1px);\n box-shadow: var(--mat-sys-elevation-2);\n}\n\n.error-content .retry-button i {\n font-size: 0.875rem;\n}\n\n/* ============================================\n Main Content Area & Tab Layout\n ============================================ */\n\n.settings-content {\n display: flex;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n flex-direction: column;\n width: 100%;\n min-height: 0;\n}\n\n@media (max-width: 768px) {\n .settings-content {\n overflow-y: visible;\n overflow-x: hidden;\n height: auto;\n min-height: 0;\n flex: none;\n }\n}\n\n.desktop-layout {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n.settings-content .desktop-layout {\n display: flex !important;\n height: 100%;\n width: 100%;\n}\n\n/* ============================================\n Side Navigation (Desktop Only)\n ============================================ */\n\n.side-navigation {\n width: 280px;\n background: linear-gradient(180deg, var(--mat-sys-surface) 0%, var(--mat-sys-surface-container-lowest) 100%);\n border-right: 1px solid var(--mat-sys-outline-variant);\n overflow-y: auto;\n flex-shrink: 0;\n box-shadow: var(--mat-sys-elevation-1);\n}\n\n/* Navigation Search Bar */\n.nav-search {\n position: relative;\n padding: 1rem;\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n background-color: var(--mat-sys-surface);\n}\n\n.nav-search-icon {\n position: absolute;\n left: 1.75rem;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mat-sys-on-surface-variant);\n font-size: 1rem;\n pointer-events: none;\n z-index: 1;\n}\n\n.nav-search-input {\n width: 100%;\n padding: 0.75rem 2.75rem 0.75rem 2.5rem;\n border: 1px solid var(--mat-sys-outline-variant);\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-body-medium);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-search-input:focus {\n outline: none;\n border-color: var(--settings-primary);\n background-color: var(--mat-sys-surface);\n box-shadow: 0 0 0 2px rgba(0, 118, 182, 0.1);\n}\n\n.nav-search-input::placeholder {\n color: var(--mat-sys-on-surface-variant);\n}\n\n.nav-search-clear {\n position: absolute;\n right: 1.25rem;\n top: 50%;\n transform: translateY(-50%);\n padding: 0.25rem;\n background: transparent;\n border: none;\n color: var(--mat-sys-on-surface-variant);\n cursor: pointer;\n border-radius: var(--mat-sys-corner-full);\n min-width: 32px;\n min-height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n z-index: 1;\n}\n\n.nav-search-clear:hover {\n background: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-search-clear:focus-visible {\n outline: 2px solid var(--settings-primary);\n outline-offset: 2px;\n}\n\n.nav-list {\n list-style: none;\n margin: 0;\n padding: 1rem 0;\n}\n\n.nav-item {\n position: relative;\n display: flex;\n align-items: center;\n padding: 1rem 1.5rem;\n margin: 0.25rem 0.75rem;\n border-radius: var(--mat-sys-corner-medium);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n border: 2px solid transparent;\n}\n\n.nav-item:hover {\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n transform: translateX(4px);\n}\n\n.nav-item:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: 2px;\n}\n\n/* Color-coded navigation items */\n.nav-item[aria-controls=\"panel-general\"] {\n --item-color: var(--settings-primary);\n --item-container: var(--settings-primary-container);\n}\n\n.nav-item[aria-controls=\"panel-users\"] {\n --item-color: var(--settings-secondary);\n --item-container: var(--settings-secondary-container);\n}\n\n.nav-item[aria-controls=\"panel-roles\"] {\n --item-color: var(--settings-tertiary);\n --item-container: var(--settings-tertiary-container);\n}\n\n.nav-item[aria-controls=\"panel-applications\"] {\n --item-color: #9C27B0;\n --item-container: #E1BEE7;\n}\n\n.nav-item[aria-controls=\"panel-permissions\"] {\n --item-color: var(--settings-error);\n --item-container: var(--settings-error-container);\n}\n\n.nav-item[aria-controls=\"panel-advanced\"] {\n --item-color: #FF6F00;\n --item-container: #FFE0B2;\n}\n\n.nav-item.active {\n background-color: var(--item-container);\n color: var(--item-color);\n font-weight: 600;\n border-color: var(--item-color);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n\n.nav-item:hover:not(.active) {\n border-color: var(--item-color);\n background-color: rgba(255, 255, 255, 0.5);\n}\n\n.nav-item i {\n width: 20px;\n margin-right: 0.75rem;\n font-size: 1.1rem;\n}\n\n.nav-item .nav-label {\n flex: 1;\n}\n\n.nav-item .nav-badge {\n padding: 0.125rem 0.5rem;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-small);\n font-weight: 600;\n}\n\n.nav-item .nav-badge.badge-primary {\n background-color: var(--mat-sys-primary-container);\n color: var(--mat-sys-on-primary-container);\n}\n\n.nav-item .nav-badge.badge-danger {\n background-color: var(--mat-sys-error-container);\n color: var(--mat-sys-on-error-container);\n}\n\n.nav-item .nav-badge.badge-warning {\n background-color: var(--mat-sys-tertiary-container);\n color: var(--mat-sys-on-tertiary-container);\n}\n\n.nav-item .nav-badge.badge-success {\n background-color: var(--mat-sys-secondary-container);\n color: var(--mat-sys-on-secondary-container);\n}\n\n/* Disabled Navigation Items */\n.nav-item.disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.nav-item.disabled:hover {\n background-color: transparent;\n transform: none;\n}\n\n/* Coming Soon Badge */\n.coming-soon-badge {\n display: inline-flex;\n align-items: center;\n padding: 0.125rem 0.5rem;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-small);\n font-size: 0.625rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n background: linear-gradient(135deg, var(--mat-sys-tertiary-container) 0%, var(--mat-sys-secondary-container) 100%);\n color: var(--mat-sys-on-tertiary-container);\n border: 1px solid var(--mat-sys-outline-variant);\n}\n\n/* Mobile Navigation Disabled Items */\n.nav-rail-item.disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.nav-rail-item.disabled:hover {\n background-color: transparent;\n}\n\n/* ============================================\n Content Area & Tab Panels\n ============================================ */\n\n.content-area {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 0;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n background: linear-gradient(180deg, var(--mat-sys-surface-container-lowest) 0%, var(--mat-sys-surface) 100%);\n}\n\n@media (max-width: 768px) {\n .content-area {\n padding: 1rem;\n }\n}\n\n.tab-content {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n max-width: 100%;\n min-height: 0;\n box-sizing: border-box;\n overflow-x: hidden;\n padding: 1.5rem 2rem;\n}\n\n@media (max-width: 768px) {\n .tab-content {\n height: auto;\n min-height: 0;\n overflow-y: visible;\n overflow-x: hidden;\n padding: 0.5rem;\n }\n}\n\n/* ============================================\n Section Titles\n ============================================ */\n.section-title {\n font: var(--mat-sys-headline-small);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n margin: 0 0 1rem 0;\n padding-bottom: 0.75rem;\n border-bottom: 3px solid var(--mat-sys-outline-variant);\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.section-title::before {\n content: \"\";\n width: 4px;\n height: 2rem;\n background: linear-gradient(180deg, var(--settings-primary) 0%, var(--settings-tertiary) 100%);\n border-radius: 2px;\n}\n\n.section-description {\n color: var(--mat-sys-on-surface-variant);\n margin: 0 0 1.5rem 0;\n font: var(--mat-sys-body-large);\n padding: 1rem 1.25rem;\n background-color: var(--mat-sys-surface-container);\n border-radius: var(--mat-sys-corner-medium);\n}\n\n/* ============================================\n Settings Grid\n ============================================ */\n.settings-grid,\n.mj-grid {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n margin-top: 1.5rem;\n}\n\n.mj-grid-responsive {\n /* Single column stacked layout */\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n@media (max-width: 768px) {\n .settings-grid,\n .mj-grid,\n .mj-grid-responsive {\n gap: 1rem;\n margin-top: 0.5rem;\n }\n}\n\n/* ============================================\n Section Title & Description Spacing\n ============================================ */\n.general-settings .section-title,\n.users-settings .section-title,\n.roles-settings .section-title {\n margin-bottom: 0.25rem;\n}\n\n.users-settings .section-description,\n.roles-settings .section-description {\n margin-bottom: 0.5rem;\n}\n\n/* ============================================\n Card Content\n ============================================ */\n.card-content {\n padding: 1rem;\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-medium);\n}\n\n.card-content p {\n margin: 0 0 1rem 0;\n line-height: 1.6;\n}\n\n/* ============================================\n Beta Warning\n ============================================ */\n.beta-warning {\n display: inline-flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem 1.25rem;\n background: linear-gradient(135deg, #FFE0B2 0%, var(--settings-secondary-container) 100%);\n color: #FF6F00;\n border-radius: var(--mat-sys-corner-medium);\n font: var(--mat-sys-label-large);\n font-weight: 600;\n margin-bottom: 1.5rem;\n max-width: 100%;\n box-sizing: border-box;\n border: 2px solid #FF6F00;\n box-shadow: 0 2px 8px rgba(255, 111, 0, 0.2);\n}\n\n.beta-warning i {\n font-size: 1rem;\n flex-shrink: 0;\n}\n\n@media (max-width: 768px) {\n .beta-warning {\n font-size: 0.8125rem;\n padding: 0.5rem 0.75rem;\n margin-bottom: 0.75rem;\n }\n}\n\n/* ============================================\n Mobile Layout with Collapsible Navigation Rail\n ============================================ */\n\n.mobile-layout {\n position: relative;\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n width: 100%;\n max-width: 100vw;\n overflow: visible;\n box-sizing: border-box;\n}\n\n/* Mobile Header */\n.mobile-header {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n height: 56px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 0.5rem;\n background-color: var(--mat-sys-surface-container);\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n z-index: 100;\n box-sizing: border-box;\n}\n\n.mobile-header-icon {\n width: 48px;\n height: 48px;\n min-width: 48px;\n border-radius: var(--mat-sys-corner-full);\n background: transparent;\n color: var(--mat-sys-on-surface);\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.mobile-header-icon:hover {\n background-color: var(--mat-sys-surface-container-high);\n}\n\n.mobile-header-icon:active {\n transform: scale(0.95);\n}\n\n.mobile-header-icon i {\n font-size: 1.25rem;\n}\n\n.mobile-header-title {\n flex: 1;\n text-align: center;\n font: var(--mat-sys-title-large);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n margin: 0;\n padding: 0 0.5rem;\n}\n\n.mobile-header-spacer {\n width: 48px;\n min-width: 48px;\n}\n\n/* Backdrop Overlay */\n.mobile-nav-backdrop {\n position: fixed;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 1000;\n animation: fadeIn 0.2s ease-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* Collapsible Navigation Rail */\n.mobile-nav-rail {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n width: 280px;\n max-width: 80vw;\n background-color: var(--mat-sys-surface);\n border-right: 1px solid var(--mat-sys-outline-variant);\n display: flex;\n flex-direction: column;\n z-index: 1001;\n transform: translateX(-100%);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: var(--mat-sys-elevation-4);\n overflow: hidden;\n}\n\n.mobile-nav-rail.open {\n transform: translateX(0);\n}\n\n/* Navigation Rail Header */\n.nav-rail-header {\n display: flex;\n align-items: center;\n padding: 1rem 1.5rem;\n min-height: 64px;\n border-bottom: 1px solid var(--mat-sys-outline-variant);\n background-color: var(--mat-sys-surface-container);\n flex-shrink: 0;\n}\n\n.nav-rail-title {\n font: var(--mat-sys-title-large);\n font-weight: 600;\n color: var(--mat-sys-on-surface);\n}\n\n/* Navigation Items Container */\n.nav-rail-items {\n display: flex;\n flex-direction: column;\n padding: 0.5rem;\n gap: 0.25rem;\n overflow-y: auto;\n overflow-x: hidden;\n flex: 1;\n}\n\n/* Close Navigation Item */\n.nav-rail-close-item {\n margin-top: auto;\n border-top: 1px solid var(--mat-sys-outline-variant);\n padding-top: 0.75rem !important;\n margin-top: 0.5rem;\n background-color: var(--mat-sys-error-container) !important;\n color: var(--mat-sys-on-error-container) !important;\n}\n\n.nav-rail-close-item:hover {\n background-color: var(--mat-sys-error) !important;\n color: var(--mat-sys-on-error) !important;\n}\n\n.nav-rail-close-item i {\n font-size: 1.5rem;\n}\n\n/* Navigation Item */\n.nav-rail-item {\n position: relative;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 1rem;\n width: 100%;\n padding: 0.875rem 1rem;\n background: transparent;\n border: none;\n border-radius: var(--mat-sys-corner-medium);\n color: var(--mat-sys-on-surface-variant);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n text-align: left;\n min-height: 56px;\n}\n\n.nav-rail-item i {\n font-size: 1.5rem;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.nav-rail-label {\n font: var(--mat-sys-body-large);\n font-weight: 500;\n flex: 1;\n}\n\n.nav-rail-item:hover:not(.active) {\n background-color: var(--mat-sys-surface-container);\n color: var(--mat-sys-on-surface);\n}\n\n.nav-rail-item.active {\n background-color: var(--mat-sys-primary-container);\n color: var(--mat-sys-primary);\n}\n\n.nav-rail-item.active .nav-rail-label {\n font-weight: 600;\n}\n\n.nav-rail-item:active {\n transform: scale(0.98);\n}\n\n.nav-rail-item:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: 2px;\n}\n\n/* Badge indicator */\n.rail-badge {\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: var(--mat-sys-corner-full);\n font: var(--mat-sys-label-small);\n font-size: 11px;\n font-weight: 700;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.rail-badge.badge-primary {\n background-color: var(--mat-sys-primary);\n color: var(--mat-sys-on-primary);\n}\n\n.rail-badge.badge-danger {\n background-color: var(--mat-sys-error);\n color: var(--mat-sys-on-error);\n}\n\n.rail-badge.badge-warning {\n background-color: var(--mat-sys-tertiary);\n color: var(--mat-sys-on-tertiary);\n}\n\n.rail-badge.badge-success {\n background-color: var(--mat-sys-secondary);\n color: var(--mat-sys-on-secondary);\n}\n\n/* Mobile Content Area */\n.mobile-content {\n width: 100%;\n max-width: 100vw;\n overflow-y: visible;\n overflow-x: hidden;\n padding: 72px 0.75rem 2rem 0.75rem;\n min-width: 0;\n box-sizing: border-box;\n -webkit-overflow-scrolling: touch;\n flex: 1;\n}\n\n/* Responsive adjustments */\n@media (max-width: 374px) {\n .mobile-nav-rail {\n width: 260px;\n }\n\n .mobile-content {\n padding: 64px 0.5rem 1.5rem 0.5rem;\n }\n\n .mobile-header {\n height: 52px;\n padding: 0 0.25rem;\n }\n\n .mobile-header-icon {\n width: 44px;\n height: 44px;\n min-width: 44px;\n }\n\n .mobile-header-spacer {\n width: 44px;\n min-width: 44px;\n }\n\n .mobile-header-title {\n font-size: 1.125rem;\n }\n}\n\n/* ============================================\n Advanced Settings Sub-Tabs\n ============================================ */\n\n.advanced-tabs {\n display: flex;\n gap: 0.5rem;\n border-bottom: 2px solid var(--mat-sys-outline-variant);\n margin-bottom: 1rem;\n margin-top: 1rem;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: thin;\n -webkit-overflow-scrolling: touch;\n}\n\n.advanced-tabs .tab-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n background: transparent;\n border: none;\n border-bottom: 3px solid transparent;\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-label-large);\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n min-height: 44px;\n white-space: nowrap;\n flex-shrink: 0;\n}\n\n/* Mobile-specific tab adjustments - Segmented Button Style */\n@media (max-width: 768px) {\n .advanced-tabs {\n gap: 0;\n margin-bottom: 1rem;\n margin-top: 1rem;\n border-bottom: none;\n border: 1px solid var(--mat-sys-outline);\n border-radius: var(--mat-sys-corner-full);\n padding: 0;\n background-color: var(--mat-sys-surface-container-low);\n overflow-x: hidden;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n }\n\n .advanced-tabs .tab-btn {\n flex: 1;\n padding: 0.625rem 0.5rem;\n font-size: 0.75rem;\n border-bottom: none;\n border-radius: 0;\n border-right: 1px solid var(--mat-sys-outline);\n min-width: 0;\n justify-content: center;\n text-align: center;\n white-space: nowrap;\n overflow: hidden;\n }\n\n .advanced-tabs .tab-btn:last-child {\n border-right: none;\n }\n\n .advanced-tabs .tab-btn:first-child {\n border-radius: var(--mat-sys-corner-full) 0 0 var(--mat-sys-corner-full);\n }\n\n .advanced-tabs .tab-btn:last-child {\n border-radius: 0 var(--mat-sys-corner-full) var(--mat-sys-corner-full) 0;\n }\n\n .advanced-tabs .tab-btn.active {\n background-color: var(--mat-sys-secondary-container);\n color: var(--mat-sys-on-secondary-container);\n border-bottom: none;\n }\n\n .advanced-tabs .tab-btn i {\n font-size: 0.875rem;\n }\n}\n\n.advanced-tabs .tab-btn:hover {\n color: var(--mat-sys-on-surface);\n background: var(--mat-sys-surface-container);\n}\n\n.advanced-tabs .tab-btn:focus-visible {\n outline: 2px solid var(--mat-sys-primary);\n outline-offset: -2px;\n}\n\n.advanced-tabs .tab-btn.active {\n color: var(--mat-sys-primary);\n border-bottom-color: var(--mat-sys-primary);\n background: var(--mat-sys-primary-container);\n}\n\n.advanced-tabs .tab-btn.active i {\n color: var(--mat-sys-primary);\n}\n\n.advanced-tabs .tab-btn i {\n font-size: 1.125rem;\n}\n\n/* ============================================\n Advanced Tab Content Panels\n ============================================ */\n\n.advanced-tab-content {\n flex: 1;\n overflow-y: visible;\n overflow-x: hidden;\n min-height: 0;\n position: relative;\n background: var(--mat-sys-surface);\n border-radius: var(--mat-sys-corner-large);\n padding: 0;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n}\n\n/* Ensure scrolling works on mobile */\n@media (max-width: 768px) {\n .advanced-tab-content {\n height: auto;\n min-height: 200px;\n overflow-y: visible;\n }\n}\n\n.performance-settings,\n.developer-settings {\n padding: 2rem;\n}\n\n.performance-settings h3,\n.developer-settings h3 {\n margin: 0 0 1rem 0;\n font: var(--mat-sys-title-large);\n color: var(--mat-sys-on-surface);\n}\n\n.performance-settings p,\n.developer-settings p {\n color: var(--mat-sys-on-surface-variant);\n font: var(--mat-sys-body-large);\n}\n\n/* ============================================\n Settings Panel Containers with Fade-In Animation\n ============================================ */\n\n.general-settings,\n.users-settings,\n.roles-settings,\n.applications-settings,\n.permissions-settings,\n.advanced-settings {\n animation: fadeIn 0.3s ease-out;\n width: 100%;\n max-width: 100%;\n height: auto;\n min-height: 100%;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n overflow-y: visible;\n overflow-x: hidden;\n box-sizing: border-box;\n}\n\n/* Mobile-specific adjustments */\n@media (max-width: 768px) {\n .general-settings,\n .users-settings,\n .roles-settings,\n .applications-settings,\n .permissions-settings,\n .advanced-settings {\n gap: 0.75rem;\n height: auto;\n min-height: auto;\n }\n\n .section-title {\n margin-bottom: 0.5rem;\n font-size: 1.375rem;\n }\n\n .section-description {\n margin-bottom: 0.75rem;\n }\n}\n\n/* Only apply flex: 1 to actual content components, not titles/descriptions */\n.general-settings > mj-settings-card,\n.general-settings > .mj-grid,\n.users-settings > mj-user-management,\n.roles-settings > mj-role-management,\n.applications-settings > mj-application-management,\n.permissions-settings > mj-entity-permissions,\n.advanced-settings > .advanced-tabs,\n.advanced-settings > .advanced-tab-content {\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n}\n\n/* Allow content to flow naturally on mobile */\n@media (max-width: 768px) {\n .users-settings > mj-user-management,\n .roles-settings > mj-role-management,\n .applications-settings > mj-application-management,\n .permissions-settings > mj-entity-permissions,\n .advanced-settings > .advanced-tab-content {\n flex: none;\n height: auto !important;\n min-height: 0;\n max-height: none !important;\n overflow-y: visible !important;\n overflow-x: hidden;\n }\n}\n\n/* Titles and descriptions should not flex or grow */\n.general-settings > .section-title,\n.users-settings > .section-title,\n.roles-settings > .section-title,\n.users-settings > .section-description,\n.roles-settings > .section-description {\n flex-shrink: 0;\n flex-grow: 0;\n}\n\n/* ============================================\n Accessibility: Reduced Motion Support\n ============================================ */\n\n@media (prefers-reduced-motion: reduce) {\n .general-settings,\n .users-settings,\n .roles-settings,\n .applications-settings,\n .permissions-settings,\n .advanced-settings {\n animation: none;\n }\n\n .nav-tab i,\n .nav-item,\n .tab-btn,\n .search-input,\n .retry-button,\n .search-result-item {\n transition: none;\n }\n}\n\n/* ============================================\n Responsive Breakpoints\n ============================================ */\n@media (max-width: 640px) {\n .side-navigation {\n width: 200px;\n }\n\n .nav-item {\n padding: 0.75rem 1rem;\n }\n}\n\n@media (max-width: 1024px) {\n .content-area {\n padding: 1.5rem;\n }\n}\n\n/* Mobile scroll fix - ensure all child components flow naturally */\n@media (max-width: 768px) {\n .mobile-layout mj-user-management,\n .mobile-layout mj-role-management,\n .mobile-layout mj-application-management,\n .mobile-layout mj-entity-permissions,\n .mobile-layout mj-sql-logging,\n .mobile-layout mj-settings-card,\n .mobile-layout mj-user-profile-settings {\n display: block;\n height: auto !important;\n max-height: none !important;\n overflow: visible !important;\n }\n\n /* Ensure all nested content areas flow naturally */\n .mobile-layout .general-settings,\n .mobile-layout .users-settings,\n .mobile-layout .roles-settings,\n .mobile-layout .applications-settings,\n .mobile-layout .permissions-settings,\n .mobile-layout .advanced-settings {\n height: auto !important;\n min-height: 0 !important;\n max-height: none !important;\n }\n\n /* Ensure mj-grid and card content can expand */\n .mobile-layout .mj-grid,\n .mobile-layout .mj-grid-responsive,\n .mobile-layout .card-content {\n height: auto !important;\n min-height: 0 !important;\n }\n}\n\n@media (min-width: 1440px) {\n .content-area {\n padding: 2.5rem 3rem;\n }\n\n .side-navigation {\n width: 280px;\n }\n}\n\n/* ============================================\n iOS Safari Mobile Scrolling Fix\n ============================================ */\n@media (max-width: 768px) {\n /* Prevent iOS from restricting body scrolling */\n body {\n position: relative;\n overflow-y: visible;\n -webkit-overflow-scrolling: touch;\n }\n\n /* Allow mobile layout and all parents to expand naturally */\n .mobile-layout,\n .mobile-layout > *,\n .mobile-content > *,\n .tab-content > * {\n -webkit-overflow-scrolling: touch;\n }\n\n /* Prevent fixed heights from blocking scroll */\n .mobile-layout * {\n box-sizing: border-box;\n }\n}\n"] }]
|
|
832
556
|
}], () => [{ type: i1.Location }], { stateChange: [{
|
|
833
557
|
type: Output
|
|
834
558
|
}] }); })();
|
|
835
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SettingsComponent, { className: "SettingsComponent", filePath: "src/lib/settings/settings.component.ts", lineNumber:
|
|
559
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SettingsComponent, { className: "SettingsComponent", filePath: "src/lib/settings/settings.component.ts", lineNumber: 40 }); })();
|
|
836
560
|
//# sourceMappingURL=settings.component.js.map
|