@memberjunction/ng-ui-components 5.38.0 → 5.39.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/applied-filters/applied-filters.component.d.ts +55 -0
- package/dist/lib/applied-filters/applied-filters.component.d.ts.map +1 -0
- package/dist/lib/applied-filters/applied-filters.component.js +128 -0
- package/dist/lib/applied-filters/applied-filters.component.js.map +1 -0
- package/dist/lib/filter-panel/filter-panel.component.d.ts +14 -0
- package/dist/lib/filter-panel/filter-panel.component.d.ts.map +1 -1
- package/dist/lib/filter-panel/filter-panel.component.js +30 -5
- package/dist/lib/filter-panel/filter-panel.component.js.map +1 -1
- package/dist/lib/filter-popover/filter-popover.component.d.ts +14 -2
- package/dist/lib/filter-popover/filter-popover.component.d.ts.map +1 -1
- package/dist/lib/filter-popover/filter-popover.component.js +153 -52
- package/dist/lib/filter-popover/filter-popover.component.js.map +1 -1
- package/dist/lib/left-nav/left-nav-content.component.d.ts.map +1 -1
- package/dist/lib/left-nav/left-nav-content.component.js +3 -3
- package/dist/lib/left-nav/left-nav-content.component.js.map +1 -1
- package/dist/lib/left-nav/left-nav.component.d.ts +36 -9
- package/dist/lib/left-nav/left-nav.component.d.ts.map +1 -1
- package/dist/lib/left-nav/left-nav.component.js +253 -117
- package/dist/lib/left-nav/left-nav.component.js.map +1 -1
- package/dist/lib/page-body/page-body.component.d.ts.map +1 -1
- package/dist/lib/page-body/page-body.component.js +3 -3
- package/dist/lib/page-body/page-body.component.js.map +1 -1
- package/dist/lib/page-header/page-header.component.js +2 -2
- package/dist/lib/page-header/page-header.scss +51 -4
- package/dist/lib/page-header-interior/page-header-interior.component.d.ts.map +1 -1
- package/dist/lib/page-header-interior/page-header-interior.component.js +3 -3
- package/dist/lib/page-header-interior/page-header-interior.component.js.map +1 -1
- package/dist/lib/refresh-button/refresh-button.component.d.ts.map +1 -1
- package/dist/lib/refresh-button/refresh-button.component.js +13 -10
- package/dist/lib/refresh-button/refresh-button.component.js.map +1 -1
- package/dist/lib/slide-panel/slide-panel.component.d.ts +64 -0
- package/dist/lib/slide-panel/slide-panel.component.d.ts.map +1 -0
- package/dist/lib/slide-panel/slide-panel.component.js +256 -0
- package/dist/lib/slide-panel/slide-panel.component.js.map +1 -0
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
1
|
+
import { Component, EventEmitter, HostBinding, HostListener, Input, Output } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import * as i1 from "@angular/common";
|
|
@@ -8,163 +8,169 @@ const _c2 = (a0, a1) => ({ item: a0, depth: 0, hasExpandable: a1 });
|
|
|
8
8
|
const _c3 = a0 => ({ item: a0 });
|
|
9
9
|
const _c4 = (a0, a1, a2) => ({ item: a0, depth: a1, hasExpandable: a2 });
|
|
10
10
|
const _forTrack0 = ($index, $item) => $item.id;
|
|
11
|
-
function
|
|
12
|
-
i0.ɵɵ
|
|
11
|
+
function MJLeftNavComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
12
|
+
i0.ɵɵelement(0, "i", 12);
|
|
13
|
+
} if (rf & 2) {
|
|
14
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
15
|
+
i0.ɵɵclassMap(ctx_r1.ActiveTriggerItem.icon);
|
|
16
|
+
} }
|
|
17
|
+
function MJLeftNavComponent_For_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
18
|
+
i0.ɵɵelementStart(0, "div", 13);
|
|
13
19
|
i0.ɵɵtext(1);
|
|
14
20
|
i0.ɵɵelementEnd();
|
|
15
21
|
} if (rf & 2) {
|
|
16
|
-
const
|
|
22
|
+
const section_r3 = i0.ɵɵnextContext().$implicit;
|
|
17
23
|
i0.ɵɵadvance();
|
|
18
|
-
i0.ɵɵtextInterpolate(
|
|
24
|
+
i0.ɵɵtextInterpolate(section_r3.label);
|
|
19
25
|
} }
|
|
20
|
-
function
|
|
26
|
+
function MJLeftNavComponent_For_14_For_2_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
21
27
|
i0.ɵɵelementContainer(0);
|
|
22
28
|
} }
|
|
23
|
-
function
|
|
24
|
-
i0.ɵɵtemplate(0,
|
|
29
|
+
function MJLeftNavComponent_For_14_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
30
|
+
i0.ɵɵtemplate(0, MJLeftNavComponent_For_14_For_2_ng_container_0_Template, 1, 0, "ng-container", 14);
|
|
25
31
|
} if (rf & 2) {
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
i0.ɵɵproperty("ngTemplateOutlet",
|
|
32
|
+
const item_r4 = ctx.$implicit;
|
|
33
|
+
const section_r3 = i0.ɵɵnextContext().$implicit;
|
|
34
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
35
|
+
const itemTpl_r5 = i0.ɵɵreference(17);
|
|
36
|
+
i0.ɵɵproperty("ngTemplateOutlet", itemTpl_r5)("ngTemplateOutletContext", i0.ɵɵpureFunction2(2, _c2, item_r4, ctx_r1.HasExpandableItems(section_r3.items)));
|
|
31
37
|
} }
|
|
32
|
-
function
|
|
33
|
-
i0.ɵɵconditionalCreate(0,
|
|
34
|
-
i0.ɵɵrepeaterCreate(1,
|
|
38
|
+
function MJLeftNavComponent_For_14_Template(rf, ctx) { if (rf & 1) {
|
|
39
|
+
i0.ɵɵconditionalCreate(0, MJLeftNavComponent_For_14_Conditional_0_Template, 2, 1, "div", 13);
|
|
40
|
+
i0.ɵɵrepeaterCreate(1, MJLeftNavComponent_For_14_For_2_Template, 1, 5, "ng-container", null, _forTrack0);
|
|
35
41
|
} if (rf & 2) {
|
|
36
|
-
const
|
|
37
|
-
i0.ɵɵconditional(
|
|
42
|
+
const section_r3 = ctx.$implicit;
|
|
43
|
+
i0.ɵɵconditional(section_r3.label ? 0 : -1);
|
|
38
44
|
i0.ɵɵadvance();
|
|
39
|
-
i0.ɵɵrepeater(
|
|
45
|
+
i0.ɵɵrepeater(section_r3.items);
|
|
40
46
|
} }
|
|
41
|
-
function
|
|
42
|
-
const
|
|
43
|
-
i0.ɵɵelementStart(0, "button",
|
|
44
|
-
i0.ɵɵlistener("click", function
|
|
45
|
-
i0.ɵɵelement(1, "i",
|
|
47
|
+
function MJLeftNavComponent_ng_template_16_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
48
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
49
|
+
i0.ɵɵelementStart(0, "button", 18);
|
|
50
|
+
i0.ɵɵlistener("click", function MJLeftNavComponent_ng_template_16_Conditional_0_Conditional_1_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r6); const item_r7 = i0.ɵɵnextContext(2).item; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnItemToggle($event, item_r7)); });
|
|
51
|
+
i0.ɵɵelement(1, "i", 19);
|
|
46
52
|
i0.ɵɵelementEnd();
|
|
47
53
|
} if (rf & 2) {
|
|
48
|
-
const
|
|
49
|
-
const
|
|
50
|
-
i0.ɵɵattribute("aria-label",
|
|
54
|
+
const item_r7 = i0.ɵɵnextContext(2).item;
|
|
55
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
56
|
+
i0.ɵɵattribute("aria-label", ctx_r1.IsExpanded(item_r7.id) ? "Collapse" : "Expand")("aria-expanded", ctx_r1.IsExpanded(item_r7.id));
|
|
51
57
|
i0.ɵɵadvance();
|
|
52
|
-
i0.ɵɵclassProp("fa-chevron-down",
|
|
58
|
+
i0.ɵɵclassProp("fa-chevron-down", ctx_r1.IsExpanded(item_r7.id))("fa-chevron-right", !ctx_r1.IsExpanded(item_r7.id));
|
|
53
59
|
} }
|
|
54
|
-
function
|
|
55
|
-
i0.ɵɵelement(0, "span",
|
|
60
|
+
function MJLeftNavComponent_ng_template_16_Conditional_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
61
|
+
i0.ɵɵelement(0, "span", 17);
|
|
56
62
|
} }
|
|
57
|
-
function
|
|
63
|
+
function MJLeftNavComponent_ng_template_16_Conditional_0_ng_container_3_Template(rf, ctx) { if (rf & 1) {
|
|
58
64
|
i0.ɵɵelementContainer(0);
|
|
59
65
|
} }
|
|
60
|
-
function
|
|
66
|
+
function MJLeftNavComponent_ng_template_16_Conditional_0_Conditional_4_For_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
61
67
|
i0.ɵɵelementContainer(0);
|
|
62
68
|
} }
|
|
63
|
-
function
|
|
64
|
-
i0.ɵɵtemplate(0,
|
|
69
|
+
function MJLeftNavComponent_ng_template_16_Conditional_0_Conditional_4_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
70
|
+
i0.ɵɵtemplate(0, MJLeftNavComponent_ng_template_16_Conditional_0_Conditional_4_For_1_ng_container_0_Template, 1, 0, "ng-container", 14);
|
|
65
71
|
} if (rf & 2) {
|
|
66
|
-
const
|
|
67
|
-
const
|
|
68
|
-
const
|
|
69
|
-
const
|
|
72
|
+
const child_r8 = ctx.$implicit;
|
|
73
|
+
const ctx_r8 = i0.ɵɵnextContext(3);
|
|
74
|
+
const depth_r10 = ctx_r8.depth;
|
|
75
|
+
const hasExpandable_r11 = ctx_r8.hasExpandable;
|
|
70
76
|
i0.ɵɵnextContext();
|
|
71
|
-
const
|
|
72
|
-
i0.ɵɵproperty("ngTemplateOutlet",
|
|
77
|
+
const itemTpl_r5 = i0.ɵɵreference(17);
|
|
78
|
+
i0.ɵɵproperty("ngTemplateOutlet", itemTpl_r5)("ngTemplateOutletContext", i0.ɵɵpureFunction3(2, _c4, child_r8, depth_r10 + 1, hasExpandable_r11));
|
|
73
79
|
} }
|
|
74
|
-
function
|
|
75
|
-
i0.ɵɵrepeaterCreate(0,
|
|
80
|
+
function MJLeftNavComponent_ng_template_16_Conditional_0_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
81
|
+
i0.ɵɵrepeaterCreate(0, MJLeftNavComponent_ng_template_16_Conditional_0_Conditional_4_For_1_Template, 1, 6, "ng-container", null, _forTrack0);
|
|
76
82
|
} if (rf & 2) {
|
|
77
|
-
const
|
|
78
|
-
i0.ɵɵrepeater(
|
|
83
|
+
const item_r7 = i0.ɵɵnextContext(2).item;
|
|
84
|
+
i0.ɵɵrepeater(item_r7.children);
|
|
79
85
|
} }
|
|
80
|
-
function
|
|
81
|
-
i0.ɵɵelementStart(0, "div",
|
|
82
|
-
i0.ɵɵconditionalCreate(1,
|
|
83
|
-
i0.ɵɵtemplate(3,
|
|
86
|
+
function MJLeftNavComponent_ng_template_16_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
87
|
+
i0.ɵɵelementStart(0, "div", 15);
|
|
88
|
+
i0.ɵɵconditionalCreate(1, MJLeftNavComponent_ng_template_16_Conditional_0_Conditional_1_Template, 2, 6, "button", 16)(2, MJLeftNavComponent_ng_template_16_Conditional_0_Conditional_2_Template, 1, 0, "span", 17);
|
|
89
|
+
i0.ɵɵtemplate(3, MJLeftNavComponent_ng_template_16_Conditional_0_ng_container_3_Template, 1, 0, "ng-container", 14);
|
|
84
90
|
i0.ɵɵelementEnd();
|
|
85
|
-
i0.ɵɵconditionalCreate(4,
|
|
91
|
+
i0.ɵɵconditionalCreate(4, MJLeftNavComponent_ng_template_16_Conditional_0_Conditional_4_Template, 2, 0);
|
|
86
92
|
} if (rf & 2) {
|
|
87
|
-
const
|
|
88
|
-
const
|
|
89
|
-
const
|
|
90
|
-
const
|
|
91
|
-
const
|
|
92
|
-
i0.ɵɵstyleProp("padding-left",
|
|
93
|
+
const ctx_r8 = i0.ɵɵnextContext();
|
|
94
|
+
const item_r7 = ctx_r8.item;
|
|
95
|
+
const depth_r10 = ctx_r8.depth;
|
|
96
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
97
|
+
const itemBtn_r12 = i0.ɵɵreference(19);
|
|
98
|
+
i0.ɵɵstyleProp("padding-left", depth_r10 * 14, "px");
|
|
93
99
|
i0.ɵɵadvance();
|
|
94
|
-
i0.ɵɵconditional(
|
|
100
|
+
i0.ɵɵconditional(item_r7.children.length > 0 ? 1 : 2);
|
|
95
101
|
i0.ɵɵadvance(2);
|
|
96
|
-
i0.ɵɵproperty("ngTemplateOutlet",
|
|
102
|
+
i0.ɵɵproperty("ngTemplateOutlet", itemBtn_r12)("ngTemplateOutletContext", i0.ɵɵpureFunction1(6, _c3, item_r7));
|
|
97
103
|
i0.ɵɵadvance();
|
|
98
|
-
i0.ɵɵconditional(
|
|
104
|
+
i0.ɵɵconditional(item_r7.children.length > 0 && ctx_r1.IsExpanded(item_r7.id) ? 4 : -1);
|
|
99
105
|
} }
|
|
100
|
-
function
|
|
106
|
+
function MJLeftNavComponent_ng_template_16_Conditional_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
|
|
101
107
|
i0.ɵɵelementContainer(0);
|
|
102
108
|
} }
|
|
103
|
-
function
|
|
104
|
-
i0.ɵɵtemplate(0,
|
|
109
|
+
function MJLeftNavComponent_ng_template_16_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
110
|
+
i0.ɵɵtemplate(0, MJLeftNavComponent_ng_template_16_Conditional_1_ng_container_0_Template, 1, 0, "ng-container", 14);
|
|
105
111
|
} if (rf & 2) {
|
|
106
|
-
const
|
|
112
|
+
const item_r7 = i0.ɵɵnextContext().item;
|
|
107
113
|
i0.ɵɵnextContext();
|
|
108
|
-
const
|
|
109
|
-
i0.ɵɵproperty("ngTemplateOutlet",
|
|
114
|
+
const itemBtn_r12 = i0.ɵɵreference(19);
|
|
115
|
+
i0.ɵɵproperty("ngTemplateOutlet", itemBtn_r12)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c3, item_r7));
|
|
110
116
|
} }
|
|
111
|
-
function
|
|
112
|
-
i0.ɵɵconditionalCreate(0,
|
|
117
|
+
function MJLeftNavComponent_ng_template_16_Template(rf, ctx) { if (rf & 1) {
|
|
118
|
+
i0.ɵɵconditionalCreate(0, MJLeftNavComponent_ng_template_16_Conditional_0_Template, 5, 8)(1, MJLeftNavComponent_ng_template_16_Conditional_1_Template, 1, 4, "ng-container");
|
|
113
119
|
} if (rf & 2) {
|
|
114
|
-
const
|
|
115
|
-
const
|
|
116
|
-
i0.ɵɵconditional(
|
|
120
|
+
const item_r7 = ctx.item;
|
|
121
|
+
const hasExpandable_r11 = ctx.hasExpandable;
|
|
122
|
+
i0.ɵɵconditional(item_r7.children !== undefined && hasExpandable_r11 ? 0 : 1);
|
|
117
123
|
} }
|
|
118
|
-
function
|
|
119
|
-
i0.ɵɵelement(0, "i",
|
|
124
|
+
function MJLeftNavComponent_ng_template_18_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
125
|
+
i0.ɵɵelement(0, "i", 26);
|
|
120
126
|
} if (rf & 2) {
|
|
121
|
-
const
|
|
122
|
-
i0.ɵɵclassMap(
|
|
127
|
+
const item_r14 = i0.ɵɵnextContext().item;
|
|
128
|
+
i0.ɵɵclassMap(item_r14.icon);
|
|
123
129
|
} }
|
|
124
|
-
function
|
|
125
|
-
i0.ɵɵelementStart(0, "span",
|
|
130
|
+
function MJLeftNavComponent_ng_template_18_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
131
|
+
i0.ɵɵelementStart(0, "span", 24);
|
|
126
132
|
i0.ɵɵtext(1);
|
|
127
133
|
i0.ɵɵelementEnd();
|
|
128
134
|
} if (rf & 2) {
|
|
129
|
-
const
|
|
135
|
+
const item_r14 = i0.ɵɵnextContext().item;
|
|
130
136
|
i0.ɵɵadvance();
|
|
131
|
-
i0.ɵɵtextInterpolate(
|
|
137
|
+
i0.ɵɵtextInterpolate(item_r14.description);
|
|
132
138
|
} }
|
|
133
|
-
function
|
|
134
|
-
i0.ɵɵelementStart(0, "span",
|
|
139
|
+
function MJLeftNavComponent_ng_template_18_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
140
|
+
i0.ɵɵelementStart(0, "span", 25);
|
|
135
141
|
i0.ɵɵtext(1);
|
|
136
142
|
i0.ɵɵelementEnd();
|
|
137
143
|
} if (rf & 2) {
|
|
138
|
-
const
|
|
144
|
+
const item_r14 = i0.ɵɵnextContext().item;
|
|
139
145
|
i0.ɵɵadvance();
|
|
140
|
-
i0.ɵɵtextInterpolate(
|
|
146
|
+
i0.ɵɵtextInterpolate(item_r14.badge);
|
|
141
147
|
} }
|
|
142
|
-
function
|
|
143
|
-
const
|
|
144
|
-
i0.ɵɵelementStart(0, "button",
|
|
145
|
-
i0.ɵɵlistener("click", function
|
|
146
|
-
i0.ɵɵconditionalCreate(1,
|
|
147
|
-
i0.ɵɵelementStart(2, "span",
|
|
148
|
+
function MJLeftNavComponent_ng_template_18_Template(rf, ctx) { if (rf & 1) {
|
|
149
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
150
|
+
i0.ɵɵelementStart(0, "button", 20);
|
|
151
|
+
i0.ɵɵlistener("click", function MJLeftNavComponent_ng_template_18_Template_button_click_0_listener() { const item_r14 = i0.ɵɵrestoreView(_r13).item; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnItemClick(item_r14)); });
|
|
152
|
+
i0.ɵɵconditionalCreate(1, MJLeftNavComponent_ng_template_18_Conditional_1_Template, 1, 2, "i", 21);
|
|
153
|
+
i0.ɵɵelementStart(2, "span", 22)(3, "span", 23);
|
|
148
154
|
i0.ɵɵtext(4);
|
|
149
155
|
i0.ɵɵelementEnd();
|
|
150
|
-
i0.ɵɵconditionalCreate(5,
|
|
156
|
+
i0.ɵɵconditionalCreate(5, MJLeftNavComponent_ng_template_18_Conditional_5_Template, 2, 1, "span", 24);
|
|
151
157
|
i0.ɵɵelementEnd();
|
|
152
|
-
i0.ɵɵconditionalCreate(6,
|
|
158
|
+
i0.ɵɵconditionalCreate(6, MJLeftNavComponent_ng_template_18_Conditional_6_Template, 2, 1, "span", 25);
|
|
153
159
|
i0.ɵɵelementEnd();
|
|
154
160
|
} if (rf & 2) {
|
|
155
|
-
const
|
|
156
|
-
const
|
|
157
|
-
i0.ɵɵclassProp("mj-left-nav__item--active",
|
|
158
|
-
i0.ɵɵproperty("disabled",
|
|
159
|
-
i0.ɵɵattribute("aria-current",
|
|
161
|
+
const item_r14 = ctx.item;
|
|
162
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
163
|
+
i0.ɵɵclassProp("mj-left-nav__item--active", item_r14.id === ctx_r1.ActiveId)("mj-left-nav__item--disabled", item_r14.disabled);
|
|
164
|
+
i0.ɵɵproperty("disabled", item_r14.disabled);
|
|
165
|
+
i0.ɵɵattribute("aria-current", item_r14.id === ctx_r1.ActiveId ? "page" : null);
|
|
160
166
|
i0.ɵɵadvance();
|
|
161
|
-
i0.ɵɵconditional(
|
|
167
|
+
i0.ɵɵconditional(item_r14.icon ? 1 : -1);
|
|
162
168
|
i0.ɵɵadvance(3);
|
|
163
|
-
i0.ɵɵtextInterpolate(
|
|
169
|
+
i0.ɵɵtextInterpolate(item_r14.label);
|
|
164
170
|
i0.ɵɵadvance();
|
|
165
|
-
i0.ɵɵconditional(
|
|
171
|
+
i0.ɵɵconditional(item_r14.description ? 5 : -1);
|
|
166
172
|
i0.ɵɵadvance();
|
|
167
|
-
i0.ɵɵconditional(
|
|
173
|
+
i0.ɵɵconditional(item_r14.badge != null ? 6 : -1);
|
|
168
174
|
} }
|
|
169
175
|
/**
|
|
170
176
|
* `<mj-left-nav>` — Canonical left rail for MJ Explorer dashboards that have
|
|
@@ -180,9 +186,10 @@ function MJLeftNavComponent_ng_template_7_Template(rf, ctx) { if (rf & 1) {
|
|
|
180
186
|
* - Items with a count badge (APIKeys pattern)
|
|
181
187
|
* - Sections with uppercase headers (Communication / Credentials pattern)
|
|
182
188
|
* - Optional `[header]` and `[footer]` content slots (KH Config logo header, etc.)
|
|
183
|
-
* - Responsive
|
|
184
|
-
*
|
|
185
|
-
*
|
|
189
|
+
* - Responsive mobile drawer (≤700px): the rail hides off-canvas and a compact
|
|
190
|
+
* section switcher takes its place; tapping it slides the full rail in over a
|
|
191
|
+
* scrim. The rail keeps its full content (trees, slots, descriptions, badges)
|
|
192
|
+
* inside the drawer — no flattening. Set `[MobileTitle]` for the drawer label.
|
|
186
193
|
*
|
|
187
194
|
* ## Example
|
|
188
195
|
*
|
|
@@ -206,10 +213,11 @@ function MJLeftNavComponent_ng_template_7_Template(rf, ctx) { if (rf & 1) {
|
|
|
206
213
|
* </mj-left-nav>
|
|
207
214
|
* ```
|
|
208
215
|
*
|
|
209
|
-
* Responsive
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
*
|
|
216
|
+
* Responsive — at ≤700px the rail becomes an off-canvas drawer (see the feature
|
|
217
|
+
* list above). The consumer should still switch the parent's flex-direction from
|
|
218
|
+
* row → column at the same breakpoint (e.g. `<mj-page-body>` Direction="row" with
|
|
219
|
+
* a `@media` override) so the in-flow section switcher stacks above the content
|
|
220
|
+
* pane rather than competing with it for horizontal space.
|
|
213
221
|
*/
|
|
214
222
|
export class MJLeftNavComponent {
|
|
215
223
|
/**
|
|
@@ -224,9 +232,16 @@ export class MJLeftNavComponent {
|
|
|
224
232
|
ActiveId = null;
|
|
225
233
|
/**
|
|
226
234
|
* Width of the rail in pixels. Defaults to 240. Set to a smaller value
|
|
227
|
-
* (e.g., 200) for denser shells.
|
|
235
|
+
* (e.g., 200) for denser shells. Only applies to the desktop rail — on mobile
|
|
236
|
+
* the rail becomes a fixed-width off-canvas drawer.
|
|
228
237
|
*/
|
|
229
238
|
Width = 240;
|
|
239
|
+
/**
|
|
240
|
+
* Label shown on the mobile drawer header and used as the switcher fallback
|
|
241
|
+
* label when no item is active. Defaults to `'Menu'`. Set to something
|
|
242
|
+
* domain-specific (e.g. `'Sections'`, `'Test Suites'`) for clearer context.
|
|
243
|
+
*/
|
|
244
|
+
MobileTitle = 'Menu';
|
|
230
245
|
/**
|
|
231
246
|
* Ids of currently-expanded tree items. Items whose id appears here render
|
|
232
247
|
* with a down-chevron and their `children` are visible; items not in this
|
|
@@ -245,15 +260,61 @@ export class MJLeftNavComponent {
|
|
|
245
260
|
* the item's id in / out of `ExpandedIds`. Does NOT also fire `ItemClicked`.
|
|
246
261
|
*/
|
|
247
262
|
ItemToggled = new EventEmitter();
|
|
263
|
+
/**
|
|
264
|
+
* Whether the mobile off-canvas drawer is open. Component-owned, transient UI
|
|
265
|
+
* state — no effect above the 700px breakpoint where the rail is always inline.
|
|
266
|
+
*/
|
|
267
|
+
MobileNavOpen = false;
|
|
268
|
+
/** Reflects {@link MobileNavOpen} onto the host so CSS can drive the drawer. */
|
|
269
|
+
get isMobileNavOpen() {
|
|
270
|
+
return this.MobileNavOpen;
|
|
271
|
+
}
|
|
272
|
+
OpenMobileNav() {
|
|
273
|
+
this.MobileNavOpen = true;
|
|
274
|
+
}
|
|
275
|
+
CloseMobileNav() {
|
|
276
|
+
this.MobileNavOpen = false;
|
|
277
|
+
}
|
|
278
|
+
/** Escape closes the mobile drawer. No-op when it's already closed. */
|
|
279
|
+
onEscape() {
|
|
280
|
+
if (this.MobileNavOpen) {
|
|
281
|
+
this.MobileNavOpen = false;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
248
284
|
OnItemClick(item) {
|
|
249
285
|
if (item.disabled)
|
|
250
286
|
return;
|
|
287
|
+
// Selecting a leaf dismisses the mobile drawer; harmless on desktop.
|
|
288
|
+
this.MobileNavOpen = false;
|
|
251
289
|
this.ItemClicked.emit(item);
|
|
252
290
|
}
|
|
253
291
|
OnItemToggle(event, item) {
|
|
254
292
|
event.stopPropagation();
|
|
293
|
+
// Expanding/collapsing a tree branch keeps the drawer open.
|
|
255
294
|
this.ItemToggled.emit(item);
|
|
256
295
|
}
|
|
296
|
+
/**
|
|
297
|
+
* The item matching {@link ActiveId} (searched recursively through trees),
|
|
298
|
+
* used to label the mobile section switcher with the current section's icon
|
|
299
|
+
* and label. Returns `undefined` when nothing is active.
|
|
300
|
+
*/
|
|
301
|
+
get ActiveTriggerItem() {
|
|
302
|
+
if (!this.ActiveId)
|
|
303
|
+
return undefined;
|
|
304
|
+
return this.findItemById(this.Sections.flatMap((s) => s.items), this.ActiveId);
|
|
305
|
+
}
|
|
306
|
+
findItemById(items, id) {
|
|
307
|
+
for (const item of items) {
|
|
308
|
+
if (item.id === id)
|
|
309
|
+
return item;
|
|
310
|
+
if (item.children?.length) {
|
|
311
|
+
const found = this.findItemById(item.children, id);
|
|
312
|
+
if (found)
|
|
313
|
+
return found;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return undefined;
|
|
317
|
+
}
|
|
257
318
|
IsExpanded(id) {
|
|
258
319
|
return this.ExpandedIds.indexOf(id) >= 0;
|
|
259
320
|
}
|
|
@@ -274,24 +335,91 @@ export class MJLeftNavComponent {
|
|
|
274
335
|
return false;
|
|
275
336
|
}
|
|
276
337
|
static ɵfac = function MJLeftNavComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJLeftNavComponent)(); };
|
|
277
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJLeftNavComponent, selectors: [["mj-left-nav"]],
|
|
338
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJLeftNavComponent, selectors: [["mj-left-nav"]], hostVars: 2, hostBindings: function MJLeftNavComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
339
|
+
i0.ɵɵlistener("keydown.escape", function MJLeftNavComponent_keydown_escape_HostBindingHandler() { return ctx.onEscape(); }, i0.ɵɵresolveDocument);
|
|
340
|
+
} if (rf & 2) {
|
|
341
|
+
i0.ɵɵclassProp("mj-left-nav-host--open", ctx.isMobileNavOpen);
|
|
342
|
+
} }, inputs: { Sections: "Sections", ActiveId: "ActiveId", Width: "Width", MobileTitle: "MobileTitle", ExpandedIds: "ExpandedIds" }, outputs: { ItemClicked: "ItemClicked", ItemToggled: "ItemToggled" }, ngContentSelectors: _c1, decls: 20, vars: 7, consts: [["itemTpl", ""], ["itemBtn", ""], ["type", "button", "aria-haspopup", "dialog", 1, "mj-left-nav__switcher", 3, "click"], ["aria-hidden", "true", 1, "mj-left-nav__switcher-icon", 3, "class"], [1, "mj-left-nav__switcher-label"], ["aria-hidden", "true", 1, "fa-solid", "fa-bars-staggered", "mj-left-nav__switcher-hint"], ["aria-hidden", "true", 1, "mj-left-nav__scrim", 3, "click"], ["role", "navigation", 1, "mj-left-nav"], [1, "mj-left-nav__drawer-header"], [1, "mj-left-nav__drawer-title"], ["type", "button", "aria-label", "Close menu", 1, "mj-left-nav__drawer-close", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-xmark"], ["aria-hidden", "true", 1, "mj-left-nav__switcher-icon"], [1, "mj-left-nav__section-label"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "mj-left-nav__row"], ["type", "button", 1, "mj-left-nav__chevron"], ["aria-hidden", "true", 1, "mj-left-nav__chevron-placeholder"], ["type", "button", 1, "mj-left-nav__chevron", 3, "click"], ["aria-hidden", "true", 1, "fa-solid"], ["type", "button", 1, "mj-left-nav__item", 3, "click", "disabled"], ["aria-hidden", "true", 1, "mj-left-nav__icon", 3, "class"], [1, "mj-left-nav__text"], [1, "mj-left-nav__label"], [1, "mj-left-nav__description"], [1, "mj-left-nav__badge"], ["aria-hidden", "true", 1, "mj-left-nav__icon"]], template: function MJLeftNavComponent_Template(rf, ctx) { if (rf & 1) {
|
|
343
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
278
344
|
i0.ɵɵprojectionDef(_c0);
|
|
279
|
-
i0.ɵɵelementStart(0, "
|
|
280
|
-
i0.ɵɵ
|
|
281
|
-
i0.ɵɵ
|
|
282
|
-
i0.ɵɵ
|
|
345
|
+
i0.ɵɵelementStart(0, "button", 2);
|
|
346
|
+
i0.ɵɵlistener("click", function MJLeftNavComponent_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.OpenMobileNav()); });
|
|
347
|
+
i0.ɵɵconditionalCreate(1, MJLeftNavComponent_Conditional_1_Template, 1, 2, "i", 3);
|
|
348
|
+
i0.ɵɵelementStart(2, "span", 4);
|
|
349
|
+
i0.ɵɵtext(3);
|
|
350
|
+
i0.ɵɵelementEnd();
|
|
351
|
+
i0.ɵɵelement(4, "i", 5);
|
|
352
|
+
i0.ɵɵelementEnd();
|
|
353
|
+
i0.ɵɵelementStart(5, "div", 6);
|
|
354
|
+
i0.ɵɵlistener("click", function MJLeftNavComponent_Template_div_click_5_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.CloseMobileNav()); });
|
|
355
|
+
i0.ɵɵelementEnd();
|
|
356
|
+
i0.ɵɵelementStart(6, "aside", 7)(7, "div", 8)(8, "span", 9);
|
|
357
|
+
i0.ɵɵtext(9);
|
|
358
|
+
i0.ɵɵelementEnd();
|
|
359
|
+
i0.ɵɵelementStart(10, "button", 10);
|
|
360
|
+
i0.ɵɵlistener("click", function MJLeftNavComponent_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.CloseMobileNav()); });
|
|
361
|
+
i0.ɵɵelement(11, "i", 11);
|
|
362
|
+
i0.ɵɵelementEnd()();
|
|
363
|
+
i0.ɵɵprojection(12);
|
|
364
|
+
i0.ɵɵrepeaterCreate(13, MJLeftNavComponent_For_14_Template, 3, 1, null, null, i0.ɵɵrepeaterTrackByIndex);
|
|
365
|
+
i0.ɵɵprojection(15, 1);
|
|
283
366
|
i0.ɵɵelementEnd();
|
|
284
|
-
i0.ɵɵtemplate(
|
|
367
|
+
i0.ɵɵtemplate(16, MJLeftNavComponent_ng_template_16_Template, 2, 1, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor)(18, MJLeftNavComponent_ng_template_18_Template, 7, 10, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
|
|
285
368
|
} if (rf & 2) {
|
|
286
|
-
i0.ɵɵ
|
|
369
|
+
i0.ɵɵattribute("aria-expanded", ctx.MobileNavOpen);
|
|
370
|
+
i0.ɵɵadvance();
|
|
371
|
+
i0.ɵɵconditional((ctx.ActiveTriggerItem == null ? null : ctx.ActiveTriggerItem.icon) ? 1 : -1);
|
|
287
372
|
i0.ɵɵadvance(2);
|
|
373
|
+
i0.ɵɵtextInterpolate((ctx.ActiveTriggerItem == null ? null : ctx.ActiveTriggerItem.label) || ctx.MobileTitle);
|
|
374
|
+
i0.ɵɵadvance(3);
|
|
375
|
+
i0.ɵɵstyleProp("width", ctx.Width, "px");
|
|
376
|
+
i0.ɵɵattribute("aria-modal", ctx.MobileNavOpen ? true : null);
|
|
377
|
+
i0.ɵɵadvance(3);
|
|
378
|
+
i0.ɵɵtextInterpolate(ctx.MobileTitle);
|
|
379
|
+
i0.ɵɵadvance(4);
|
|
288
380
|
i0.ɵɵrepeater(ctx.Sections);
|
|
289
|
-
} }, dependencies: [CommonModule, i1.NgTemplateOutlet], styles: ["[_nghost-%COMP%] {\n display: block;\n flex-shrink: 0;\n }\n\n .mj-left-nav[_ngcontent-%COMP%] {\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n padding: 8px;\n box-sizing: border-box;\n }\n\n .mj-left-nav__section-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n padding: 12px 12px 6px;\n }\n\n .mj-left-nav__section-label[_ngcontent-%COMP%]:first-child {\n padding-top: 6px;\n }\n\n .mj-left-nav__item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n width: 100%;\n border: none;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: background-color 0.12s ease, color 0.12s ease;\n margin-bottom: 2px;\n font-family: inherit;\n color: var(--mj-text-secondary);\n text-align: left;\n }\n\n .mj-left-nav__item[_ngcontent-%COMP%]:hover:not(.mj-left-nav__item--disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .mj-left-nav__item--active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n }\n\n .mj-left-nav__item--active[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n }\n\n .mj-left-nav__item--disabled[_ngcontent-%COMP%] {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .mj-left-nav__icon[_ngcontent-%COMP%] {\n width: 18px;\n text-align: center;\n font-size: 13px;\n margin-top: 1px;\n flex-shrink: 0;\n color: inherit;\n }\n\n .mj-left-nav__text[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n }\n\n .mj-left-nav__label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n }\n\n .mj-left-nav__description[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 3px;\n line-height: 1.3;\n }\n\n .mj-left-nav__item--active[_ngcontent-%COMP%] .mj-left-nav__description[_ngcontent-%COMP%] {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\n }\n\n .mj-left-nav__badge[_ngcontent-%COMP%] {\n margin-left: auto;\n font-size: 11px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 999px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n align-self: center;\n }\n\n .mj-left-nav__item--active[_ngcontent-%COMP%] .mj-left-nav__badge[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n color: var(--mj-brand-primary);\n }\n\n \n\n\n\n\n\n\n .mj-left-nav__row[_ngcontent-%COMP%] {\n display: flex;\n align-items: stretch;\n gap: 2px;\n }\n\n .mj-left-nav__row[_ngcontent-%COMP%] .mj-left-nav__item[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }\n\n .mj-left-nav__chevron[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 20px;\n height: 32px;\n align-self: center;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 10px;\n padding: 0;\n transition: background-color 0.12s ease, color 0.12s ease;\n font-family: inherit;\n }\n\n .mj-left-nav__chevron[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .mj-left-nav__chevron-placeholder[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 20px;\n display: inline-block;\n }\n\n \n\n\n\n\n @media (max-width: 700px) {\n [_nghost-%COMP%] {\n width: 100% !important;\n }\n .mj-left-
|
|
381
|
+
} }, dependencies: [CommonModule, i1.NgTemplateOutlet], styles: ["[_nghost-%COMP%] {\n display: block;\n flex-shrink: 0;\n }\n\n .mj-left-nav[_ngcontent-%COMP%] {\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n padding: 8px;\n box-sizing: border-box;\n }\n\n .mj-left-nav__section-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n padding: 12px 12px 6px;\n }\n\n .mj-left-nav__section-label[_ngcontent-%COMP%]:first-child {\n padding-top: 6px;\n }\n\n .mj-left-nav__item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n width: 100%;\n border: none;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: background-color 0.12s ease, color 0.12s ease;\n margin-bottom: 2px;\n font-family: inherit;\n color: var(--mj-text-secondary);\n text-align: left;\n }\n\n .mj-left-nav__item[_ngcontent-%COMP%]:hover:not(.mj-left-nav__item--disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .mj-left-nav__item--active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n }\n\n .mj-left-nav__item--active[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n }\n\n .mj-left-nav__item--disabled[_ngcontent-%COMP%] {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .mj-left-nav__icon[_ngcontent-%COMP%] {\n width: 18px;\n text-align: center;\n font-size: 13px;\n margin-top: 1px;\n flex-shrink: 0;\n color: inherit;\n }\n\n .mj-left-nav__text[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n }\n\n .mj-left-nav__label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n }\n\n .mj-left-nav__description[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 3px;\n line-height: 1.3;\n }\n\n .mj-left-nav__item--active[_ngcontent-%COMP%] .mj-left-nav__description[_ngcontent-%COMP%] {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\n }\n\n .mj-left-nav__badge[_ngcontent-%COMP%] {\n margin-left: auto;\n font-size: 11px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 999px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n align-self: center;\n }\n\n .mj-left-nav__item--active[_ngcontent-%COMP%] .mj-left-nav__badge[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n color: var(--mj-brand-primary);\n }\n\n \n\n\n\n\n\n\n .mj-left-nav__row[_ngcontent-%COMP%] {\n display: flex;\n align-items: stretch;\n gap: 2px;\n }\n\n .mj-left-nav__row[_ngcontent-%COMP%] .mj-left-nav__item[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }\n\n .mj-left-nav__chevron[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 20px;\n height: 32px;\n align-self: center;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 10px;\n padding: 0;\n transition: background-color 0.12s ease, color 0.12s ease;\n font-family: inherit;\n }\n\n .mj-left-nav__chevron[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .mj-left-nav__chevron-placeholder[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 20px;\n display: inline-block;\n }\n\n \n\n\n\n\n\n\n\n\n\n .mj-left-nav__switcher[_ngcontent-%COMP%], \n .mj-left-nav__scrim[_ngcontent-%COMP%], \n .mj-left-nav__drawer-header[_ngcontent-%COMP%] {\n display: none;\n }\n\n @media (max-width: 700px) {\n \n\n [_nghost-%COMP%] {\n width: 100% !important;\n }\n\n \n\n\n .mj-left-nav__description[_ngcontent-%COMP%] {\n display: none;\n }\n\n \n\n .mj-left-nav__switcher[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 11px 14px;\n border: none;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-family: inherit;\n font-size: 14px;\n font-weight: 600;\n text-align: left;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n }\n .mj-left-nav__switcher[_ngcontent-%COMP%]:active {\n background: var(--mj-bg-surface-active);\n }\n .mj-left-nav__switcher-icon[_ngcontent-%COMP%] {\n width: 18px;\n text-align: center;\n font-size: 14px;\n flex-shrink: 0;\n color: var(--mj-brand-primary);\n }\n .mj-left-nav__switcher-label[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .mj-left-nav__switcher-hint[_ngcontent-%COMP%] {\n flex-shrink: 0;\n font-size: 15px;\n color: var(--mj-text-muted);\n }\n\n \n\n .mj-left-nav__scrim[_ngcontent-%COMP%] {\n display: block;\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.24s ease;\n z-index: 9998;\n }\n .mj-left-nav-host--open[_nghost-%COMP%] .mj-left-nav__scrim[_ngcontent-%COMP%] {\n opacity: 1;\n pointer-events: auto;\n }\n\n \n\n .mj-left-nav[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n width: min(320px, 84vw) !important;\n height: 100%;\n max-height: none;\n border-right: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-lg);\n transform: translateX(-100%);\n transition: transform 0.24s ease;\n z-index: 9999;\n padding-top: 0;\n }\n .mj-left-nav-host--open[_nghost-%COMP%] .mj-left-nav[_ngcontent-%COMP%] {\n transform: translateX(0);\n }\n\n \n\n .mj-left-nav__drawer-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n position: sticky;\n top: 0;\n z-index: 1;\n padding: 14px 12px 10px;\n margin: 0 -8px 4px;\n padding-left: 16px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n .mj-left-nav__drawer-title[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n }\n .mj-left-nav__drawer-close[_ngcontent-%COMP%] {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 16px;\n font-family: inherit;\n }\n .mj-left-nav__drawer-close[_ngcontent-%COMP%]:active {\n background: var(--mj-bg-surface-active);\n }\n }\n\n @media (max-width: 700px) and (prefers-reduced-motion: reduce) {\n .mj-left-nav[_ngcontent-%COMP%], \n .mj-left-nav__scrim[_ngcontent-%COMP%] {\n transition: none;\n }\n }"] });
|
|
290
382
|
}
|
|
291
383
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJLeftNavComponent, [{
|
|
292
384
|
type: Component,
|
|
293
385
|
args: [{ selector: 'mj-left-nav', standalone: true, imports: [CommonModule], template: `
|
|
294
|
-
|
|
386
|
+
<!-- Mobile-only section switcher (hidden ≥701px via CSS). Shows the active
|
|
387
|
+
section and opens the full rail as an off-canvas drawer on tap. The rail
|
|
388
|
+
itself is too rich (trees, header/footer slots, descriptions, badges) to
|
|
389
|
+
flatten into a dropdown or tab strip, so we surface it as-is in a drawer. -->
|
|
390
|
+
<button
|
|
391
|
+
type="button"
|
|
392
|
+
class="mj-left-nav__switcher"
|
|
393
|
+
[attr.aria-expanded]="MobileNavOpen"
|
|
394
|
+
aria-haspopup="dialog"
|
|
395
|
+
(click)="OpenMobileNav()">
|
|
396
|
+
@if (ActiveTriggerItem?.icon) {
|
|
397
|
+
<i class="mj-left-nav__switcher-icon" [class]="ActiveTriggerItem!.icon" aria-hidden="true"></i>
|
|
398
|
+
}
|
|
399
|
+
<span class="mj-left-nav__switcher-label">{{ ActiveTriggerItem?.label || MobileTitle }}</span>
|
|
400
|
+
<i class="fa-solid fa-bars-staggered mj-left-nav__switcher-hint" aria-hidden="true"></i>
|
|
401
|
+
</button>
|
|
402
|
+
|
|
403
|
+
<!-- Scrim behind the mobile drawer (hidden ≥701px / when closed via CSS). -->
|
|
404
|
+
<div class="mj-left-nav__scrim" (click)="CloseMobileNav()" aria-hidden="true"></div>
|
|
405
|
+
|
|
406
|
+
<aside
|
|
407
|
+
class="mj-left-nav"
|
|
408
|
+
[style.width.px]="Width"
|
|
409
|
+
role="navigation"
|
|
410
|
+
[attr.aria-modal]="MobileNavOpen ? true : null">
|
|
411
|
+
<!-- Drawer header — only visible on mobile when the rail is a drawer. -->
|
|
412
|
+
<div class="mj-left-nav__drawer-header">
|
|
413
|
+
<span class="mj-left-nav__drawer-title">{{ MobileTitle }}</span>
|
|
414
|
+
<button
|
|
415
|
+
type="button"
|
|
416
|
+
class="mj-left-nav__drawer-close"
|
|
417
|
+
aria-label="Close menu"
|
|
418
|
+
(click)="CloseMobileNav()">
|
|
419
|
+
<i class="fa-solid fa-xmark" aria-hidden="true"></i>
|
|
420
|
+
</button>
|
|
421
|
+
</div>
|
|
422
|
+
|
|
295
423
|
<ng-content select="[header]"></ng-content>
|
|
296
424
|
|
|
297
425
|
@for (section of Sections; track $index) {
|
|
@@ -381,19 +509,27 @@ export class MJLeftNavComponent {
|
|
|
381
509
|
}
|
|
382
510
|
</button>
|
|
383
511
|
</ng-template>
|
|
384
|
-
`, styles: ["\n :host {\n display: block;\n flex-shrink: 0;\n }\n\n .mj-left-nav {\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n padding: 8px;\n box-sizing: border-box;\n }\n\n .mj-left-nav__section-label {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n padding: 12px 12px 6px;\n }\n\n .mj-left-nav__section-label:first-child {\n padding-top: 6px;\n }\n\n .mj-left-nav__item {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n width: 100%;\n border: none;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: background-color 0.12s ease, color 0.12s ease;\n margin-bottom: 2px;\n font-family: inherit;\n color: var(--mj-text-secondary);\n text-align: left;\n }\n\n .mj-left-nav__item:hover:not(.mj-left-nav__item--disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .mj-left-nav__item--active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n }\n\n .mj-left-nav__item--active:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n }\n\n .mj-left-nav__item--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .mj-left-nav__icon {\n width: 18px;\n text-align: center;\n font-size: 13px;\n margin-top: 1px;\n flex-shrink: 0;\n color: inherit;\n }\n\n .mj-left-nav__text {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n }\n\n .mj-left-nav__label {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n }\n\n .mj-left-nav__description {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 3px;\n line-height: 1.3;\n }\n\n .mj-left-nav__item--active .mj-left-nav__description {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\n }\n\n .mj-left-nav__badge {\n margin-left: auto;\n font-size: 11px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 999px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n align-self: center;\n }\n\n .mj-left-nav__item--active .mj-left-nav__badge {\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n color: var(--mj-brand-primary);\n }\n\n /* \u2500\u2500 Tree rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Used when MJLeftNavItem.children is defined (even as an empty array).\n The row wraps a chevron/placeholder + the item button so they sit on\n one line, and depth-based padding-left is applied to the row (not the\n item) so the chevron aligns with the depth column. */\n\n .mj-left-nav__row {\n display: flex;\n align-items: stretch;\n gap: 2px;\n }\n\n .mj-left-nav__row .mj-left-nav__item {\n flex: 1;\n min-width: 0;\n }\n\n .mj-left-nav__chevron {\n flex-shrink: 0;\n width: 20px;\n height: 32px;\n align-self: center;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 10px;\n padding: 0;\n transition: background-color 0.12s ease, color 0.12s ease;\n font-family: inherit;\n }\n\n .mj-left-nav__chevron:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .mj-left-nav__chevron-placeholder {\n flex-shrink: 0;\n width: 20px;\n display: inline-block;\n }\n\n /*
|
|
512
|
+
`, styles: ["\n :host {\n display: block;\n flex-shrink: 0;\n }\n\n .mj-left-nav {\n height: 100%;\n background: var(--mj-bg-surface);\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n padding: 8px;\n box-sizing: border-box;\n }\n\n .mj-left-nav__section-label {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n padding: 12px 12px 6px;\n }\n\n .mj-left-nav__section-label:first-child {\n padding-top: 6px;\n }\n\n .mj-left-nav__item {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n padding: 10px 12px;\n width: 100%;\n border: none;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: background-color 0.12s ease, color 0.12s ease;\n margin-bottom: 2px;\n font-family: inherit;\n color: var(--mj-text-secondary);\n text-align: left;\n }\n\n .mj-left-nav__item:hover:not(.mj-left-nav__item--disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .mj-left-nav__item--active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n }\n\n .mj-left-nav__item--active:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 14%, transparent);\n }\n\n .mj-left-nav__item--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .mj-left-nav__icon {\n width: 18px;\n text-align: center;\n font-size: 13px;\n margin-top: 1px;\n flex-shrink: 0;\n color: inherit;\n }\n\n .mj-left-nav__text {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n }\n\n .mj-left-nav__label {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.2;\n }\n\n .mj-left-nav__description {\n font-size: 11px;\n color: var(--mj-text-muted);\n margin-top: 3px;\n line-height: 1.3;\n }\n\n .mj-left-nav__item--active .mj-left-nav__description {\n color: color-mix(in srgb, var(--mj-brand-primary) 70%, var(--mj-text-muted));\n }\n\n .mj-left-nav__badge {\n margin-left: auto;\n font-size: 11px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 999px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n align-self: center;\n }\n\n .mj-left-nav__item--active .mj-left-nav__badge {\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, transparent);\n color: var(--mj-brand-primary);\n }\n\n /* \u2500\u2500 Tree rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Used when MJLeftNavItem.children is defined (even as an empty array).\n The row wraps a chevron/placeholder + the item button so they sit on\n one line, and depth-based padding-left is applied to the row (not the\n item) so the chevron aligns with the depth column. */\n\n .mj-left-nav__row {\n display: flex;\n align-items: stretch;\n gap: 2px;\n }\n\n .mj-left-nav__row .mj-left-nav__item {\n flex: 1;\n min-width: 0;\n }\n\n .mj-left-nav__chevron {\n flex-shrink: 0;\n width: 20px;\n height: 32px;\n align-self: center;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n border-radius: 4px;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 10px;\n padding: 0;\n transition: background-color 0.12s ease, color 0.12s ease;\n font-family: inherit;\n }\n\n .mj-left-nav__chevron:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .mj-left-nav__chevron-placeholder {\n flex-shrink: 0;\n width: 20px;\n display: inline-block;\n }\n\n /* \u2500\u2500 Mobile drawer pattern (\u2264700px) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Desktop shows the rail inline. On mobile the rail would otherwise eat the\n top of the screen, so we hide it off-canvas and surface a compact section\n switcher in its place. Tapping the switcher slides the full rail in from\n the left over a scrim \u2014 preserving trees, header/footer slots and badges\n (item descriptions hide in the drawer for a tighter list).\n\n The switcher / scrim / drawer-header are display:none above the\n breakpoint; the rail keeps its desktop layout there. */\n .mj-left-nav__switcher,\n .mj-left-nav__scrim,\n .mj-left-nav__drawer-header {\n display: none;\n }\n\n @media (max-width: 700px) {\n /* Host collapses to the switcher's footprint; the rail goes out of flow. */\n :host {\n width: 100% !important;\n }\n\n /* Hide item descriptions in the drawer \u2014 the label + icon are enough on a\n narrow sheet; the secondary line just adds clutter. */\n .mj-left-nav__description {\n display: none;\n }\n\n /* Section switcher \u2014 reads as a picker for the current section. */\n .mj-left-nav__switcher {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 11px 14px;\n border: none;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-family: inherit;\n font-size: 14px;\n font-weight: 600;\n text-align: left;\n cursor: pointer;\n -webkit-tap-highlight-color: transparent;\n }\n .mj-left-nav__switcher:active {\n background: var(--mj-bg-surface-active);\n }\n .mj-left-nav__switcher-icon {\n width: 18px;\n text-align: center;\n font-size: 14px;\n flex-shrink: 0;\n color: var(--mj-brand-primary);\n }\n .mj-left-nav__switcher-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .mj-left-nav__switcher-hint {\n flex-shrink: 0;\n font-size: 15px;\n color: var(--mj-text-muted);\n }\n\n /* Scrim \u2014 fades in with the drawer. */\n .mj-left-nav__scrim {\n display: block;\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.24s ease;\n z-index: 9998;\n }\n :host(.mj-left-nav-host--open) .mj-left-nav__scrim {\n opacity: 1;\n pointer-events: auto;\n }\n\n /* Rail becomes a left off-canvas drawer. */\n .mj-left-nav {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n width: min(320px, 84vw) !important;\n height: 100%;\n max-height: none;\n border-right: 1px solid var(--mj-border-default);\n box-shadow: var(--mj-shadow-lg);\n transform: translateX(-100%);\n transition: transform 0.24s ease;\n z-index: 9999;\n padding-top: 0;\n }\n :host(.mj-left-nav-host--open) .mj-left-nav {\n transform: translateX(0);\n }\n\n /* Drawer header \u2014 sticky title + close button. */\n .mj-left-nav__drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n position: sticky;\n top: 0;\n z-index: 1;\n padding: 14px 12px 10px;\n margin: 0 -8px 4px;\n padding-left: 16px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n .mj-left-nav__drawer-title {\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n }\n .mj-left-nav__drawer-close {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 16px;\n font-family: inherit;\n }\n .mj-left-nav__drawer-close:active {\n background: var(--mj-bg-surface-active);\n }\n }\n\n @media (max-width: 700px) and (prefers-reduced-motion: reduce) {\n .mj-left-nav,\n .mj-left-nav__scrim {\n transition: none;\n }\n }\n "] }]
|
|
385
513
|
}], null, { Sections: [{
|
|
386
514
|
type: Input
|
|
387
515
|
}], ActiveId: [{
|
|
388
516
|
type: Input
|
|
389
517
|
}], Width: [{
|
|
390
518
|
type: Input
|
|
519
|
+
}], MobileTitle: [{
|
|
520
|
+
type: Input
|
|
391
521
|
}], ExpandedIds: [{
|
|
392
522
|
type: Input
|
|
393
523
|
}], ItemClicked: [{
|
|
394
524
|
type: Output
|
|
395
525
|
}], ItemToggled: [{
|
|
396
526
|
type: Output
|
|
527
|
+
}], isMobileNavOpen: [{
|
|
528
|
+
type: HostBinding,
|
|
529
|
+
args: ['class.mj-left-nav-host--open']
|
|
530
|
+
}], onEscape: [{
|
|
531
|
+
type: HostListener,
|
|
532
|
+
args: ['document:keydown.escape']
|
|
397
533
|
}] }); })();
|
|
398
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJLeftNavComponent, { className: "MJLeftNavComponent", filePath: "lib/left-nav/left-nav.component.ts", lineNumber:
|
|
534
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJLeftNavComponent, { className: "MJLeftNavComponent", filePath: "lib/left-nav/left-nav.component.ts", lineNumber: 538 }); })();
|
|
399
535
|
//# sourceMappingURL=left-nav.component.js.map
|