@memberjunction/ng-search 5.46.0 → 5.48.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/search-composite.component.d.ts +19 -2
- package/dist/lib/search-composite.component.d.ts.map +1 -1
- package/dist/lib/search-composite.component.js +79 -4
- package/dist/lib/search-composite.component.js.map +1 -1
- package/dist/lib/search-input.component.d.ts +9 -1
- package/dist/lib/search-input.component.d.ts.map +1 -1
- package/dist/lib/search-input.component.js +13 -2
- package/dist/lib/search-input.component.js.map +1 -1
- package/dist/lib/search-overlay.component.d.ts +65 -2
- package/dist/lib/search-overlay.component.d.ts.map +1 -1
- package/dist/lib/search-overlay.component.js +344 -135
- package/dist/lib/search-overlay.component.js.map +1 -1
- package/dist/lib/search-suggest.component.d.ts +43 -3
- package/dist/lib/search-suggest.component.d.ts.map +1 -1
- package/dist/lib/search-suggest.component.js +216 -75
- package/dist/lib/search-suggest.component.js.map +1 -1
- package/dist/lib/search-types.d.ts +9 -0
- package/dist/lib/search-types.d.ts.map +1 -1
- package/dist/lib/search-types.js.map +1 -1
- package/dist/lib/search.service.d.ts +20 -1
- package/dist/lib/search.service.d.ts.map +1 -1
- package/dist/lib/search.service.js +58 -1
- package/dist/lib/search.service.js.map +1 -1
- package/package.json +9 -9
|
@@ -23,27 +23,27 @@ const _forTrack4 = ($index, $item) => $item.SourceType;
|
|
|
23
23
|
const _forTrack5 = ($index, $item) => $item.ID;
|
|
24
24
|
function SearchOverlayComponent_Conditional_0_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
25
25
|
i0.ɵɵelementStart(0, "div", 6);
|
|
26
|
-
i0.ɵɵelement(1, "i",
|
|
26
|
+
i0.ɵɵelement(1, "i", 16);
|
|
27
27
|
i0.ɵɵelementEnd();
|
|
28
28
|
} }
|
|
29
|
-
function
|
|
30
|
-
i0.ɵɵelementStart(0, "span",
|
|
31
|
-
i0.ɵɵelement(1, "i",
|
|
29
|
+
function SearchOverlayComponent_Conditional_0_Conditional_13_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
30
|
+
i0.ɵɵelementStart(0, "span", 17);
|
|
31
|
+
i0.ɵɵelement(1, "i", 19);
|
|
32
32
|
i0.ɵɵelementStart(2, "span");
|
|
33
33
|
i0.ɵɵtext(3, "Searching\u2026");
|
|
34
34
|
i0.ɵɵelementEnd()();
|
|
35
35
|
} }
|
|
36
|
-
function
|
|
37
|
-
i0.ɵɵelement(0, "i",
|
|
36
|
+
function SearchOverlayComponent_Conditional_0_Conditional_13_For_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
37
|
+
i0.ɵɵelement(0, "i", 21);
|
|
38
38
|
} }
|
|
39
|
-
function
|
|
40
|
-
i0.ɵɵelement(0, "i",
|
|
39
|
+
function SearchOverlayComponent_Conditional_0_Conditional_13_For_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
40
|
+
i0.ɵɵelement(0, "i", 22);
|
|
41
41
|
} }
|
|
42
|
-
function
|
|
43
|
-
i0.ɵɵelementStart(0, "span",
|
|
42
|
+
function SearchOverlayComponent_Conditional_0_Conditional_13_For_3_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
43
|
+
i0.ɵɵelementStart(0, "span", 25);
|
|
44
44
|
i0.ɵɵtext(1);
|
|
45
45
|
i0.ɵɵelementEnd();
|
|
46
|
-
i0.ɵɵelementStart(2, "span",
|
|
46
|
+
i0.ɵɵelementStart(2, "span", 24);
|
|
47
47
|
i0.ɵɵtext(3);
|
|
48
48
|
i0.ɵɵelementEnd();
|
|
49
49
|
} if (rf & 2) {
|
|
@@ -54,8 +54,8 @@ function SearchOverlayComponent_Conditional_0_Conditional_11_For_3_Conditional_5
|
|
|
54
54
|
i0.ɵɵadvance(2);
|
|
55
55
|
i0.ɵɵtextInterpolate(ctx_r1.FormatElapsedTime(p_r3.ElapsedMs));
|
|
56
56
|
} }
|
|
57
|
-
function
|
|
58
|
-
i0.ɵɵelementStart(0, "span",
|
|
57
|
+
function SearchOverlayComponent_Conditional_0_Conditional_13_For_3_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
58
|
+
i0.ɵɵelementStart(0, "span", 24);
|
|
59
59
|
i0.ɵɵtext(1);
|
|
60
60
|
i0.ɵɵelementEnd();
|
|
61
61
|
} if (rf & 2) {
|
|
@@ -63,13 +63,13 @@ function SearchOverlayComponent_Conditional_0_Conditional_11_For_3_Conditional_6
|
|
|
63
63
|
i0.ɵɵadvance();
|
|
64
64
|
i0.ɵɵtextInterpolate(p_r3.ErrorMessage);
|
|
65
65
|
} }
|
|
66
|
-
function
|
|
67
|
-
i0.ɵɵelementStart(0, "span",
|
|
68
|
-
i0.ɵɵconditionalCreate(1,
|
|
69
|
-
i0.ɵɵelementStart(3, "span",
|
|
66
|
+
function SearchOverlayComponent_Conditional_0_Conditional_13_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
67
|
+
i0.ɵɵelementStart(0, "span", 20);
|
|
68
|
+
i0.ɵɵconditionalCreate(1, SearchOverlayComponent_Conditional_0_Conditional_13_For_3_Conditional_1_Template, 1, 0, "i", 21)(2, SearchOverlayComponent_Conditional_0_Conditional_13_For_3_Conditional_2_Template, 1, 0, "i", 22);
|
|
69
|
+
i0.ɵɵelementStart(3, "span", 23);
|
|
70
70
|
i0.ɵɵtext(4);
|
|
71
71
|
i0.ɵɵelementEnd();
|
|
72
|
-
i0.ɵɵconditionalCreate(5,
|
|
72
|
+
i0.ɵɵconditionalCreate(5, SearchOverlayComponent_Conditional_0_Conditional_13_For_3_Conditional_5_Template, 4, 2)(6, SearchOverlayComponent_Conditional_0_Conditional_13_For_3_Conditional_6_Template, 2, 1, "span", 24);
|
|
73
73
|
i0.ɵɵelementEnd();
|
|
74
74
|
} if (rf & 2) {
|
|
75
75
|
const p_r3 = ctx.$implicit;
|
|
@@ -81,10 +81,10 @@ function SearchOverlayComponent_Conditional_0_Conditional_11_For_3_Template(rf,
|
|
|
81
81
|
i0.ɵɵadvance();
|
|
82
82
|
i0.ɵɵconditional(p_r3.State === "Completed" ? 5 : p_r3.ErrorMessage ? 6 : -1);
|
|
83
83
|
} }
|
|
84
|
-
function
|
|
85
|
-
i0.ɵɵelementStart(0, "div",
|
|
86
|
-
i0.ɵɵconditionalCreate(1,
|
|
87
|
-
i0.ɵɵrepeaterCreate(2,
|
|
84
|
+
function SearchOverlayComponent_Conditional_0_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
85
|
+
i0.ɵɵelementStart(0, "div", 11);
|
|
86
|
+
i0.ɵɵconditionalCreate(1, SearchOverlayComponent_Conditional_0_Conditional_13_Conditional_1_Template, 4, 0, "span", 17);
|
|
87
|
+
i0.ɵɵrepeaterCreate(2, SearchOverlayComponent_Conditional_0_Conditional_13_For_3_Template, 7, 7, "span", 18, _forTrack0);
|
|
88
88
|
i0.ɵɵelementEnd();
|
|
89
89
|
} if (rf & 2) {
|
|
90
90
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -93,21 +93,21 @@ function SearchOverlayComponent_Conditional_0_Conditional_11_Template(rf, ctx) {
|
|
|
93
93
|
i0.ɵɵadvance();
|
|
94
94
|
i0.ɵɵrepeater(ctx_r1.StreamingProviders);
|
|
95
95
|
} }
|
|
96
|
-
function
|
|
96
|
+
function SearchOverlayComponent_Conditional_0_Conditional_14_For_2_For_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
97
97
|
i0.ɵɵelement(0, "i");
|
|
98
98
|
} if (rf & 2) {
|
|
99
99
|
const option_r5 = i0.ɵɵnextContext().$implicit;
|
|
100
100
|
i0.ɵɵclassMap(option_r5.Icon);
|
|
101
101
|
} }
|
|
102
|
-
function
|
|
102
|
+
function SearchOverlayComponent_Conditional_0_Conditional_14_For_2_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
103
103
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
104
|
-
i0.ɵɵelementStart(0, "button",
|
|
105
|
-
i0.ɵɵlistener("click", function
|
|
106
|
-
i0.ɵɵconditionalCreate(1,
|
|
104
|
+
i0.ɵɵelementStart(0, "button", 28);
|
|
105
|
+
i0.ɵɵlistener("click", function SearchOverlayComponent_Conditional_0_Conditional_14_For_2_For_1_Template_button_click_0_listener() { const option_r5 = i0.ɵɵrestoreView(_r4).$implicit; const filter_r6 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnFilterToggle(filter_r6.Category, option_r5.Value)); });
|
|
106
|
+
i0.ɵɵconditionalCreate(1, SearchOverlayComponent_Conditional_0_Conditional_14_For_2_For_1_Conditional_1_Template, 1, 2, "i", 29);
|
|
107
107
|
i0.ɵɵelementStart(2, "span");
|
|
108
108
|
i0.ɵɵtext(3);
|
|
109
109
|
i0.ɵɵelementEnd();
|
|
110
|
-
i0.ɵɵelementStart(4, "span",
|
|
110
|
+
i0.ɵɵelementStart(4, "span", 30);
|
|
111
111
|
i0.ɵɵtext(5);
|
|
112
112
|
i0.ɵɵelementEnd()();
|
|
113
113
|
} if (rf & 2) {
|
|
@@ -122,24 +122,24 @@ function SearchOverlayComponent_Conditional_0_Conditional_12_For_2_For_1_Templat
|
|
|
122
122
|
i0.ɵɵadvance(2);
|
|
123
123
|
i0.ɵɵtextInterpolate(option_r5.Count);
|
|
124
124
|
} }
|
|
125
|
-
function
|
|
126
|
-
i0.ɵɵrepeaterCreate(0,
|
|
125
|
+
function SearchOverlayComponent_Conditional_0_Conditional_14_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
126
|
+
i0.ɵɵrepeaterCreate(0, SearchOverlayComponent_Conditional_0_Conditional_14_For_2_For_1_Template, 6, 5, "button", 27, _forTrack2);
|
|
127
127
|
} if (rf & 2) {
|
|
128
128
|
const filter_r6 = ctx.$implicit;
|
|
129
129
|
i0.ɵɵrepeater(filter_r6.Options);
|
|
130
130
|
} }
|
|
131
|
-
function
|
|
131
|
+
function SearchOverlayComponent_Conditional_0_Conditional_14_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
132
132
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
133
|
-
i0.ɵɵelementStart(0, "button",
|
|
134
|
-
i0.ɵɵlistener("click", function
|
|
135
|
-
i0.ɵɵelement(1, "i",
|
|
133
|
+
i0.ɵɵelementStart(0, "button", 31);
|
|
134
|
+
i0.ɵɵlistener("click", function SearchOverlayComponent_Conditional_0_Conditional_14_Conditional_3_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.ClearAllFilters()); });
|
|
135
|
+
i0.ɵɵelement(1, "i", 32);
|
|
136
136
|
i0.ɵɵtext(2, " Clear ");
|
|
137
137
|
i0.ɵɵelementEnd();
|
|
138
138
|
} }
|
|
139
|
-
function
|
|
140
|
-
i0.ɵɵelementStart(0, "div",
|
|
141
|
-
i0.ɵɵrepeaterCreate(1,
|
|
142
|
-
i0.ɵɵconditionalCreate(3,
|
|
139
|
+
function SearchOverlayComponent_Conditional_0_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
140
|
+
i0.ɵɵelementStart(0, "div", 12);
|
|
141
|
+
i0.ɵɵrepeaterCreate(1, SearchOverlayComponent_Conditional_0_Conditional_14_For_2_Template, 2, 0, null, null, _forTrack1);
|
|
142
|
+
i0.ɵɵconditionalCreate(3, SearchOverlayComponent_Conditional_0_Conditional_14_Conditional_3_Template, 3, 0, "button", 26);
|
|
143
143
|
i0.ɵɵelementEnd();
|
|
144
144
|
} if (rf & 2) {
|
|
145
145
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -148,11 +148,11 @@ function SearchOverlayComponent_Conditional_0_Conditional_12_Template(rf, ctx) {
|
|
|
148
148
|
i0.ɵɵadvance(2);
|
|
149
149
|
i0.ɵɵconditional(ctx_r1.hasActiveFilters() ? 3 : -1);
|
|
150
150
|
} }
|
|
151
|
-
function
|
|
151
|
+
function SearchOverlayComponent_Conditional_0_Conditional_15_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
152
152
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
153
|
-
i0.ɵɵelementStart(0, "button",
|
|
154
|
-
i0.ɵɵlistener("click", function
|
|
155
|
-
i0.ɵɵelement(1, "i",
|
|
153
|
+
i0.ɵɵelementStart(0, "button", 34);
|
|
154
|
+
i0.ɵɵlistener("click", function SearchOverlayComponent_Conditional_0_Conditional_15_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnAgentCtaClick()); });
|
|
155
|
+
i0.ɵɵelement(1, "i", 35);
|
|
156
156
|
i0.ɵɵtext(2);
|
|
157
157
|
i0.ɵɵelementEnd();
|
|
158
158
|
} if (rf & 2) {
|
|
@@ -160,24 +160,24 @@ function SearchOverlayComponent_Conditional_0_Conditional_13_Conditional_1_Templ
|
|
|
160
160
|
i0.ɵɵadvance(2);
|
|
161
161
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.AgentCtaText, " ");
|
|
162
162
|
} }
|
|
163
|
-
function
|
|
164
|
-
i0.ɵɵelementStart(0, "mj-empty-state",
|
|
165
|
-
i0.ɵɵconditionalCreate(1,
|
|
163
|
+
function SearchOverlayComponent_Conditional_0_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
164
|
+
i0.ɵɵelementStart(0, "mj-empty-state", 13);
|
|
165
|
+
i0.ɵɵconditionalCreate(1, SearchOverlayComponent_Conditional_0_Conditional_15_Conditional_1_Template, 3, 1, "button", 33);
|
|
166
166
|
i0.ɵɵelementEnd();
|
|
167
167
|
} if (rf & 2) {
|
|
168
168
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
169
169
|
i0.ɵɵadvance();
|
|
170
170
|
i0.ɵɵconditional(ctx_r1.ShowAgentCta ? 1 : -1);
|
|
171
171
|
} }
|
|
172
|
-
function
|
|
172
|
+
function SearchOverlayComponent_Conditional_0_Conditional_16_Conditional_1_For_4_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
173
173
|
const _r9 = i0.ɵɵgetCurrentView();
|
|
174
|
-
i0.ɵɵelementStart(0, "div",
|
|
175
|
-
i0.ɵɵlistener("click", function
|
|
176
|
-
i0.ɵɵelement(1, "i",
|
|
174
|
+
i0.ɵɵelementStart(0, "div", 40);
|
|
175
|
+
i0.ɵɵlistener("click", function SearchOverlayComponent_Conditional_0_Conditional_16_Conditional_1_For_4_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r9); const recent_r10 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnRecentSelect(recent_r10.Query)); })("keydown", function SearchOverlayComponent_Conditional_0_Conditional_16_Conditional_1_For_4_Conditional_0_Template_div_keydown_0_listener($event) { i0.ɵɵrestoreView(_r9); const recent_r10 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnRecentKeydown($event, recent_r10.Query)); });
|
|
176
|
+
i0.ɵɵelement(1, "i", 41);
|
|
177
177
|
i0.ɵɵelementStart(2, "span");
|
|
178
178
|
i0.ɵɵtext(3);
|
|
179
179
|
i0.ɵɵelementEnd();
|
|
180
|
-
i0.ɵɵelementStart(4, "span",
|
|
180
|
+
i0.ɵɵelementStart(4, "span", 42);
|
|
181
181
|
i0.ɵɵtext(5);
|
|
182
182
|
i0.ɵɵelementEnd()();
|
|
183
183
|
} if (rf & 2) {
|
|
@@ -187,118 +187,119 @@ function SearchOverlayComponent_Conditional_0_Conditional_14_Conditional_1_For_4
|
|
|
187
187
|
i0.ɵɵadvance(2);
|
|
188
188
|
i0.ɵɵtextInterpolate1("", recent_r10.ResultCount, " results");
|
|
189
189
|
} }
|
|
190
|
-
function
|
|
191
|
-
i0.ɵɵconditionalCreate(0,
|
|
190
|
+
function SearchOverlayComponent_Conditional_0_Conditional_16_Conditional_1_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
191
|
+
i0.ɵɵconditionalCreate(0, SearchOverlayComponent_Conditional_0_Conditional_16_Conditional_1_For_4_Conditional_0_Template, 6, 2, "div", 39);
|
|
192
192
|
} if (rf & 2) {
|
|
193
|
-
const ɵ$
|
|
194
|
-
i0.ɵɵconditional(ɵ$
|
|
193
|
+
const ɵ$index_102_r11 = ctx.$index;
|
|
194
|
+
i0.ɵɵconditional(ɵ$index_102_r11 < 5 ? 0 : -1);
|
|
195
195
|
} }
|
|
196
|
-
function
|
|
197
|
-
i0.ɵɵelementStart(0, "div",
|
|
196
|
+
function SearchOverlayComponent_Conditional_0_Conditional_16_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
197
|
+
i0.ɵɵelementStart(0, "div", 37)(1, "span", 38);
|
|
198
198
|
i0.ɵɵtext(2, "Recent Searches");
|
|
199
199
|
i0.ɵɵelementEnd()();
|
|
200
|
-
i0.ɵɵrepeaterCreate(3,
|
|
200
|
+
i0.ɵɵrepeaterCreate(3, SearchOverlayComponent_Conditional_0_Conditional_16_Conditional_1_For_4_Template, 1, 1, null, null, _forTrack3);
|
|
201
201
|
} if (rf & 2) {
|
|
202
202
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
203
203
|
i0.ɵɵadvance(3);
|
|
204
204
|
i0.ɵɵrepeater(ctx_r1.searchService.RecentSearches$.value);
|
|
205
205
|
} }
|
|
206
|
-
function
|
|
207
|
-
i0.ɵɵelement(0, "mj-empty-state",
|
|
206
|
+
function SearchOverlayComponent_Conditional_0_Conditional_16_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
207
|
+
i0.ɵɵelement(0, "mj-empty-state", 36);
|
|
208
208
|
} }
|
|
209
|
-
function
|
|
210
|
-
i0.ɵɵelementStart(0, "div",
|
|
211
|
-
i0.ɵɵconditionalCreate(1,
|
|
209
|
+
function SearchOverlayComponent_Conditional_0_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
210
|
+
i0.ɵɵelementStart(0, "div", 14);
|
|
211
|
+
i0.ɵɵconditionalCreate(1, SearchOverlayComponent_Conditional_0_Conditional_16_Conditional_1_Template, 5, 0)(2, SearchOverlayComponent_Conditional_0_Conditional_16_Conditional_2_Template, 1, 0, "mj-empty-state", 36);
|
|
212
212
|
i0.ɵɵelementEnd();
|
|
213
213
|
} if (rf & 2) {
|
|
214
214
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
215
215
|
i0.ɵɵadvance();
|
|
216
216
|
i0.ɵɵconditional(ctx_r1.searchService.RecentSearches$.value.length > 0 ? 1 : 2);
|
|
217
217
|
} }
|
|
218
|
-
function
|
|
219
|
-
i0.ɵɵelementStart(0, "span",
|
|
218
|
+
function SearchOverlayComponent_Conditional_0_Conditional_17_For_2_For_8_Conditional_8_For_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
219
|
+
i0.ɵɵelementStart(0, "span", 63);
|
|
220
220
|
i0.ɵɵtext(1);
|
|
221
221
|
i0.ɵɵelementEnd();
|
|
222
222
|
} if (rf & 2) {
|
|
223
|
-
const
|
|
223
|
+
const tag_r15 = i0.ɵɵnextContext().$implicit;
|
|
224
224
|
i0.ɵɵadvance();
|
|
225
|
-
i0.ɵɵtextInterpolate(
|
|
225
|
+
i0.ɵɵtextInterpolate(tag_r15);
|
|
226
226
|
} }
|
|
227
|
-
function
|
|
228
|
-
i0.ɵɵconditionalCreate(0,
|
|
227
|
+
function SearchOverlayComponent_Conditional_0_Conditional_17_For_2_For_8_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
228
|
+
i0.ɵɵconditionalCreate(0, SearchOverlayComponent_Conditional_0_Conditional_17_For_2_For_8_Conditional_8_For_2_Conditional_0_Template, 2, 1, "span", 63);
|
|
229
229
|
} if (rf & 2) {
|
|
230
|
-
const ɵ$
|
|
231
|
-
i0.ɵɵconditional(ɵ$
|
|
230
|
+
const ɵ$index_151_r16 = ctx.$index;
|
|
231
|
+
i0.ɵɵconditional(ɵ$index_151_r16 < 3 ? 0 : -1);
|
|
232
232
|
} }
|
|
233
|
-
function
|
|
234
|
-
i0.ɵɵelementStart(0, "div",
|
|
235
|
-
i0.ɵɵrepeaterCreate(1,
|
|
233
|
+
function SearchOverlayComponent_Conditional_0_Conditional_17_For_2_For_8_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
234
|
+
i0.ɵɵelementStart(0, "div", 60);
|
|
235
|
+
i0.ɵɵrepeaterCreate(1, SearchOverlayComponent_Conditional_0_Conditional_17_For_2_For_8_Conditional_8_For_2_Template, 1, 1, null, null, i0.ɵɵrepeaterTrackByIdentity);
|
|
236
236
|
i0.ɵɵelementEnd();
|
|
237
237
|
} if (rf & 2) {
|
|
238
|
-
const
|
|
238
|
+
const result_r14 = i0.ɵɵnextContext().$implicit;
|
|
239
239
|
i0.ɵɵadvance();
|
|
240
|
-
i0.ɵɵrepeater(
|
|
240
|
+
i0.ɵɵrepeater(result_r14.Tags);
|
|
241
241
|
} }
|
|
242
|
-
function
|
|
243
|
-
const
|
|
244
|
-
i0.ɵɵelementStart(0, "div",
|
|
245
|
-
i0.ɵɵlistener("click", function
|
|
246
|
-
i0.ɵɵelementStart(1, "div",
|
|
242
|
+
function SearchOverlayComponent_Conditional_0_Conditional_17_For_2_For_8_Template(rf, ctx) { if (rf & 1) {
|
|
243
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
244
|
+
i0.ɵɵelementStart(0, "div", 55);
|
|
245
|
+
i0.ɵɵlistener("click", function SearchOverlayComponent_Conditional_0_Conditional_17_For_2_For_8_Template_div_click_0_listener($event) { const result_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.OnResultClick(result_r14, $event)); })("focus", function SearchOverlayComponent_Conditional_0_Conditional_17_For_2_For_8_Template_div_focus_0_listener() { const result_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.HighlightedIndex = ctx_r1.getFlatIndex(result_r14)); })("mouseenter", function SearchOverlayComponent_Conditional_0_Conditional_17_For_2_For_8_Template_div_mouseenter_0_listener() { const result_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.HighlightedIndex = ctx_r1.getFlatIndex(result_r14)); });
|
|
246
|
+
i0.ɵɵelementStart(1, "div", 56);
|
|
247
247
|
i0.ɵɵelement(2, "i");
|
|
248
248
|
i0.ɵɵelementEnd();
|
|
249
|
-
i0.ɵɵelementStart(3, "div",
|
|
249
|
+
i0.ɵɵelementStart(3, "div", 57)(4, "div", 58);
|
|
250
250
|
i0.ɵɵtext(5);
|
|
251
251
|
i0.ɵɵelementEnd();
|
|
252
|
-
i0.ɵɵelementStart(6, "div",
|
|
252
|
+
i0.ɵɵelementStart(6, "div", 59);
|
|
253
253
|
i0.ɵɵtext(7);
|
|
254
254
|
i0.ɵɵelementEnd();
|
|
255
|
-
i0.ɵɵconditionalCreate(8,
|
|
255
|
+
i0.ɵɵconditionalCreate(8, SearchOverlayComponent_Conditional_0_Conditional_17_For_2_For_8_Conditional_8_Template, 3, 0, "div", 60);
|
|
256
256
|
i0.ɵɵelementEnd();
|
|
257
|
-
i0.ɵɵelementStart(9, "div",
|
|
257
|
+
i0.ɵɵelementStart(9, "div", 61)(10, "span", 62);
|
|
258
258
|
i0.ɵɵtext(11);
|
|
259
259
|
i0.ɵɵelementEnd()()();
|
|
260
260
|
} if (rf & 2) {
|
|
261
|
-
const
|
|
261
|
+
const result_r14 = ctx.$implicit;
|
|
262
262
|
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
263
|
-
i0.ɵɵclassProp("result-item-highlighted", ctx_r1.isResultHighlighted(
|
|
263
|
+
i0.ɵɵclassProp("result-item-highlighted", ctx_r1.isResultHighlighted(result_r14));
|
|
264
|
+
i0.ɵɵattribute("id", "so-opt-" + ctx_r1.getFlatIndex(result_r14))("tabindex", ctx_r1.isResultHighlighted(result_r14) ? 0 : -1)("aria-selected", ctx_r1.isResultHighlighted(result_r14));
|
|
264
265
|
i0.ɵɵadvance(2);
|
|
265
|
-
i0.ɵɵclassMap(
|
|
266
|
+
i0.ɵɵclassMap(result_r14.SourceIcon);
|
|
266
267
|
i0.ɵɵadvance(3);
|
|
267
|
-
i0.ɵɵtextInterpolate(
|
|
268
|
+
i0.ɵɵtextInterpolate(result_r14.Title);
|
|
268
269
|
i0.ɵɵadvance(2);
|
|
269
|
-
i0.ɵɵtextInterpolate(
|
|
270
|
+
i0.ɵɵtextInterpolate(result_r14.Snippet);
|
|
270
271
|
i0.ɵɵadvance();
|
|
271
|
-
i0.ɵɵconditional(
|
|
272
|
+
i0.ɵɵconditional(result_r14.Tags.length > 0 ? 8 : -1);
|
|
272
273
|
i0.ɵɵadvance(3);
|
|
273
|
-
i0.ɵɵtextInterpolate(ctx_r1.FormatScore(
|
|
274
|
+
i0.ɵɵtextInterpolate(ctx_r1.FormatScore(result_r14.Score));
|
|
274
275
|
} }
|
|
275
|
-
function
|
|
276
|
-
i0.ɵɵelementStart(0, "div",
|
|
276
|
+
function SearchOverlayComponent_Conditional_0_Conditional_17_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
277
|
+
i0.ɵɵelementStart(0, "div", 44)(1, "div", 51);
|
|
277
278
|
i0.ɵɵelement(2, "i");
|
|
278
|
-
i0.ɵɵelementStart(3, "span",
|
|
279
|
+
i0.ɵɵelementStart(3, "span", 52);
|
|
279
280
|
i0.ɵɵtext(4);
|
|
280
281
|
i0.ɵɵelementEnd();
|
|
281
|
-
i0.ɵɵelementStart(5, "span",
|
|
282
|
+
i0.ɵɵelementStart(5, "span", 53);
|
|
282
283
|
i0.ɵɵtext(6);
|
|
283
284
|
i0.ɵɵelementEnd()();
|
|
284
|
-
i0.ɵɵrepeaterCreate(7,
|
|
285
|
+
i0.ɵɵrepeaterCreate(7, SearchOverlayComponent_Conditional_0_Conditional_17_For_2_For_8_Template, 12, 11, "div", 54, _forTrack5);
|
|
285
286
|
i0.ɵɵelementEnd();
|
|
286
287
|
} if (rf & 2) {
|
|
287
|
-
const
|
|
288
|
+
const group_r17 = ctx.$implicit;
|
|
288
289
|
i0.ɵɵadvance(2);
|
|
289
|
-
i0.ɵɵclassMap(
|
|
290
|
+
i0.ɵɵclassMap(group_r17.Icon);
|
|
290
291
|
i0.ɵɵadvance(2);
|
|
291
|
-
i0.ɵɵtextInterpolate(
|
|
292
|
+
i0.ɵɵtextInterpolate(group_r17.Label);
|
|
292
293
|
i0.ɵɵadvance(2);
|
|
293
|
-
i0.ɵɵtextInterpolate(
|
|
294
|
+
i0.ɵɵtextInterpolate(group_r17.TotalCount);
|
|
294
295
|
i0.ɵɵadvance();
|
|
295
|
-
i0.ɵɵrepeater(
|
|
296
|
+
i0.ɵɵrepeater(group_r17.Results);
|
|
296
297
|
} }
|
|
297
|
-
function
|
|
298
|
-
const
|
|
299
|
-
i0.ɵɵelementStart(0, "button",
|
|
300
|
-
i0.ɵɵlistener("click", function
|
|
301
|
-
i0.ɵɵelement(1, "i",
|
|
298
|
+
function SearchOverlayComponent_Conditional_0_Conditional_17_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
299
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
300
|
+
i0.ɵɵelementStart(0, "button", 64);
|
|
301
|
+
i0.ɵɵlistener("click", function SearchOverlayComponent_Conditional_0_Conditional_17_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnAgentCtaClick()); });
|
|
302
|
+
i0.ɵɵelement(1, "i", 35);
|
|
302
303
|
i0.ɵɵtext(2);
|
|
303
304
|
i0.ɵɵelementEnd();
|
|
304
305
|
} if (rf & 2) {
|
|
@@ -306,20 +307,51 @@ function SearchOverlayComponent_Conditional_0_Conditional_15_Conditional_5_Templ
|
|
|
306
307
|
i0.ɵɵadvance(2);
|
|
307
308
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.AgentCtaText, " ");
|
|
308
309
|
} }
|
|
309
|
-
function
|
|
310
|
-
i0.ɵɵ
|
|
311
|
-
i0.ɵɵelementStart(
|
|
312
|
-
i0.ɵɵ
|
|
310
|
+
function SearchOverlayComponent_Conditional_0_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
311
|
+
const _r12 = i0.ɵɵgetCurrentView();
|
|
312
|
+
i0.ɵɵelementStart(0, "div", 43);
|
|
313
|
+
i0.ɵɵrepeaterCreate(1, SearchOverlayComponent_Conditional_0_Conditional_17_For_2_Template, 9, 4, "div", 44, _forTrack4);
|
|
313
314
|
i0.ɵɵelementEnd();
|
|
314
|
-
i0.ɵɵ
|
|
315
|
+
i0.ɵɵelementStart(3, "div", 45)(4, "span", 46);
|
|
316
|
+
i0.ɵɵtext(5);
|
|
317
|
+
i0.ɵɵelementEnd();
|
|
318
|
+
i0.ɵɵelementStart(6, "div", 47)(7, "button", 48);
|
|
319
|
+
i0.ɵɵlistener("click", function SearchOverlayComponent_Conditional_0_Conditional_17_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnSeeAllClick()); });
|
|
320
|
+
i0.ɵɵtext(8, " See all results ");
|
|
321
|
+
i0.ɵɵelement(9, "i", 49);
|
|
315
322
|
i0.ɵɵelementEnd();
|
|
323
|
+
i0.ɵɵconditionalCreate(10, SearchOverlayComponent_Conditional_0_Conditional_17_Conditional_10_Template, 3, 1, "button", 50);
|
|
324
|
+
i0.ɵɵelementEnd()();
|
|
316
325
|
} if (rf & 2) {
|
|
317
326
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
327
|
+
i0.ɵɵadvance();
|
|
318
328
|
i0.ɵɵrepeater(ctx_r1.ResultGroups);
|
|
319
329
|
i0.ɵɵadvance(4);
|
|
320
330
|
i0.ɵɵtextInterpolate2(" ", ctx_r1.TotalCount, " results in ", ctx_r1.FormatElapsedTime(ctx_r1.ElapsedMs), " ");
|
|
321
|
-
i0.ɵɵadvance();
|
|
322
|
-
i0.ɵɵconditional(ctx_r1.ShowAgentCta ?
|
|
331
|
+
i0.ɵɵadvance(5);
|
|
332
|
+
i0.ɵɵconditional(ctx_r1.ShowAgentCta ? 10 : -1);
|
|
333
|
+
} }
|
|
334
|
+
function SearchOverlayComponent_Conditional_0_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
335
|
+
const _r19 = i0.ɵɵgetCurrentView();
|
|
336
|
+
i0.ɵɵelementStart(0, "div", 15);
|
|
337
|
+
i0.ɵɵelement(1, "i", 65);
|
|
338
|
+
i0.ɵɵelementStart(2, "span", 66);
|
|
339
|
+
i0.ɵɵtext(3);
|
|
340
|
+
i0.ɵɵelementEnd();
|
|
341
|
+
i0.ɵɵelementStart(4, "button", 67);
|
|
342
|
+
i0.ɵɵlistener("click", function SearchOverlayComponent_Conditional_0_Conditional_18_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnPromoAccept()); });
|
|
343
|
+
i0.ɵɵtext(5);
|
|
344
|
+
i0.ɵɵelementEnd();
|
|
345
|
+
i0.ɵɵelementStart(6, "button", 68);
|
|
346
|
+
i0.ɵɵlistener("click", function SearchOverlayComponent_Conditional_0_Conditional_18_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnPromoDismiss()); });
|
|
347
|
+
i0.ɵɵelement(7, "i", 9);
|
|
348
|
+
i0.ɵɵelementEnd()();
|
|
349
|
+
} if (rf & 2) {
|
|
350
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
351
|
+
i0.ɵɵadvance(3);
|
|
352
|
+
i0.ɵɵtextInterpolate(ctx_r1.PromoText);
|
|
353
|
+
i0.ɵɵadvance(2);
|
|
354
|
+
i0.ɵɵtextInterpolate(ctx_r1.PromoActionLabel);
|
|
323
355
|
} }
|
|
324
356
|
function SearchOverlayComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
325
357
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
@@ -327,7 +359,7 @@ function SearchOverlayComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
|
327
359
|
i0.ɵɵlistener("click", function SearchOverlayComponent_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnBackdropClick()); });
|
|
328
360
|
i0.ɵɵelementEnd();
|
|
329
361
|
i0.ɵɵelementStart(1, "div", 2);
|
|
330
|
-
i0.ɵɵlistener("click", function SearchOverlayComponent_Conditional_0_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
362
|
+
i0.ɵɵlistener("click", function SearchOverlayComponent_Conditional_0_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView($event.stopPropagation()); })("keydown", function SearchOverlayComponent_Conditional_0_Template_div_keydown_1_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnSpotlightKeydown($event)); });
|
|
331
363
|
i0.ɵɵelementStart(2, "div", 3);
|
|
332
364
|
i0.ɵɵelement(3, "i", 4);
|
|
333
365
|
i0.ɵɵelementStart(4, "input", 5, 0);
|
|
@@ -336,30 +368,39 @@ function SearchOverlayComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
|
336
368
|
i0.ɵɵconditionalCreate(6, SearchOverlayComponent_Conditional_0_Conditional_6_Template, 2, 0, "div", 6);
|
|
337
369
|
i0.ɵɵelementStart(7, "div", 7)(8, "kbd");
|
|
338
370
|
i0.ɵɵtext(9, "ESC");
|
|
339
|
-
i0.ɵɵelementEnd()()();
|
|
340
|
-
i0.ɵɵelementStart(10, "div", 8);
|
|
341
|
-
i0.ɵɵconditionalCreate(11, SearchOverlayComponent_Conditional_0_Conditional_11_Template, 4, 1, "div", 9);
|
|
342
|
-
i0.ɵɵconditionalCreate(12, SearchOverlayComponent_Conditional_0_Conditional_12_Template, 4, 1, "div", 10);
|
|
343
|
-
i0.ɵɵconditionalCreate(13, SearchOverlayComponent_Conditional_0_Conditional_13_Template, 2, 1, "mj-empty-state", 11);
|
|
344
|
-
i0.ɵɵconditionalCreate(14, SearchOverlayComponent_Conditional_0_Conditional_14_Template, 3, 1, "div", 12);
|
|
345
|
-
i0.ɵɵconditionalCreate(15, SearchOverlayComponent_Conditional_0_Conditional_15_Template, 6, 3);
|
|
346
371
|
i0.ɵɵelementEnd()();
|
|
372
|
+
i0.ɵɵelementStart(10, "button", 8);
|
|
373
|
+
i0.ɵɵlistener("click", function SearchOverlayComponent_Conditional_0_Template_button_click_10_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Close()); });
|
|
374
|
+
i0.ɵɵelement(11, "i", 9);
|
|
375
|
+
i0.ɵɵelementEnd()();
|
|
376
|
+
i0.ɵɵelementStart(12, "div", 10);
|
|
377
|
+
i0.ɵɵconditionalCreate(13, SearchOverlayComponent_Conditional_0_Conditional_13_Template, 4, 1, "div", 11);
|
|
378
|
+
i0.ɵɵconditionalCreate(14, SearchOverlayComponent_Conditional_0_Conditional_14_Template, 4, 1, "div", 12);
|
|
379
|
+
i0.ɵɵconditionalCreate(15, SearchOverlayComponent_Conditional_0_Conditional_15_Template, 2, 1, "mj-empty-state", 13);
|
|
380
|
+
i0.ɵɵconditionalCreate(16, SearchOverlayComponent_Conditional_0_Conditional_16_Template, 3, 1, "div", 14);
|
|
381
|
+
i0.ɵɵconditionalCreate(17, SearchOverlayComponent_Conditional_0_Conditional_17_Template, 11, 3);
|
|
382
|
+
i0.ɵɵelementEnd();
|
|
383
|
+
i0.ɵɵconditionalCreate(18, SearchOverlayComponent_Conditional_0_Conditional_18_Template, 8, 2, "div", 15);
|
|
384
|
+
i0.ɵɵelementEnd();
|
|
347
385
|
} if (rf & 2) {
|
|
348
386
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
349
387
|
i0.ɵɵadvance(4);
|
|
350
388
|
i0.ɵɵproperty("placeholder", ctx_r1.Placeholder)("value", ctx_r1.Query);
|
|
389
|
+
i0.ɵɵattribute("aria-expanded", ctx_r1.AllResults.length > 0)("aria-activedescendant", ctx_r1.ActiveDescendantId);
|
|
351
390
|
i0.ɵɵadvance(2);
|
|
352
391
|
i0.ɵɵconditional(ctx_r1.IsSearching ? 6 : -1);
|
|
353
|
-
i0.ɵɵadvance(
|
|
354
|
-
i0.ɵɵconditional(ctx_r1.EnableStreaming && (ctx_r1.IsSearching || ctx_r1.StreamingProviders.length > 0) ?
|
|
392
|
+
i0.ɵɵadvance(7);
|
|
393
|
+
i0.ɵɵconditional(ctx_r1.EnableStreaming && (ctx_r1.IsSearching || ctx_r1.StreamingProviders.length > 0) ? 13 : -1);
|
|
355
394
|
i0.ɵɵadvance();
|
|
356
|
-
i0.ɵɵconditional(ctx_r1.ShowFilters && ctx_r1.Filters.length > 0 ?
|
|
395
|
+
i0.ɵɵconditional(ctx_r1.ShowFilters && ctx_r1.Filters.length > 0 ? 14 : -1);
|
|
357
396
|
i0.ɵɵadvance();
|
|
358
|
-
i0.ɵɵconditional(ctx_r1.HasSearched && ctx_r1.AllResults.length === 0 && !ctx_r1.IsSearching ?
|
|
397
|
+
i0.ɵɵconditional(ctx_r1.HasSearched && ctx_r1.AllResults.length === 0 && !ctx_r1.IsSearching ? 15 : -1);
|
|
359
398
|
i0.ɵɵadvance();
|
|
360
|
-
i0.ɵɵconditional(!ctx_r1.HasSearched && !ctx_r1.IsSearching ?
|
|
399
|
+
i0.ɵɵconditional(!ctx_r1.HasSearched && !ctx_r1.IsSearching ? 16 : -1);
|
|
361
400
|
i0.ɵɵadvance();
|
|
362
|
-
i0.ɵɵconditional(ctx_r1.AllResults.length > 0 ?
|
|
401
|
+
i0.ɵɵconditional(ctx_r1.AllResults.length > 0 ? 17 : -1);
|
|
402
|
+
i0.ɵɵadvance();
|
|
403
|
+
i0.ɵɵconditional(ctx_r1.ShowPromo && ctx_r1.PromoText ? 18 : -1);
|
|
363
404
|
} }
|
|
364
405
|
export class SearchOverlayComponent {
|
|
365
406
|
cdr = inject(ChangeDetectorRef);
|
|
@@ -370,8 +411,14 @@ export class SearchOverlayComponent {
|
|
|
370
411
|
// --- Configuration Inputs ---
|
|
371
412
|
/** Placeholder text for the search input */
|
|
372
413
|
Placeholder = 'Search across all your knowledge...';
|
|
373
|
-
/**
|
|
374
|
-
|
|
414
|
+
/**
|
|
415
|
+
* Maximum number of results to fetch and display. Deliberately small — the
|
|
416
|
+
* overlay is a quick-jump surface; "See all results" hands off to the full
|
|
417
|
+
* Search Results workspace for anything deeper. 8 matches the omnibar
|
|
418
|
+
* palette's RESULT count (it fetches 9 rows = 8 results + its see-all row;
|
|
419
|
+
* this overlay's see-all is a footer button, not a row).
|
|
420
|
+
*/
|
|
421
|
+
MaxResults = 8;
|
|
375
422
|
/** Whether the overlay is currently visible */
|
|
376
423
|
_IsOpen = false;
|
|
377
424
|
set IsOpen(value) {
|
|
@@ -404,12 +451,41 @@ export class SearchOverlayComponent {
|
|
|
404
451
|
* Defaults to false to preserve the request-response UX that shipped in Phase 1.
|
|
405
452
|
*/
|
|
406
453
|
EnableStreaming = false;
|
|
454
|
+
/**
|
|
455
|
+
* When false, the overlay does NOT claim the global Ctrl/Cmd+K chord. For hosts
|
|
456
|
+
* (e.g. the Explorer shell) that own that shortcut themselves and open the
|
|
457
|
+
* overlay programmatically — two listeners on the same chord would double-toggle.
|
|
458
|
+
* Escape/arrow handling while open is unaffected.
|
|
459
|
+
*/
|
|
460
|
+
EnableGlobalShortcut = true;
|
|
461
|
+
/**
|
|
462
|
+
* Optional promo strip pinned to the overlay's bottom edge — a host-supplied
|
|
463
|
+
* nudge (e.g. Explorer advertising its command palette). The component is
|
|
464
|
+
* deliberately ignorant of WHAT is being promoted; the host provides the
|
|
465
|
+
* copy and handles both outcomes.
|
|
466
|
+
*/
|
|
467
|
+
ShowPromo = false;
|
|
468
|
+
/** Promo copy (one sentence). Required when ShowPromo is true. */
|
|
469
|
+
PromoText = '';
|
|
470
|
+
/** Label for the promo's accept action. */
|
|
471
|
+
PromoActionLabel = 'Turn on';
|
|
407
472
|
// --- Outputs ---
|
|
408
473
|
IsOpenChange = new EventEmitter();
|
|
409
474
|
ResultSelected = new EventEmitter();
|
|
410
475
|
FilterChanged = new EventEmitter();
|
|
411
476
|
SearchExecuted = new EventEmitter();
|
|
412
477
|
AgentCtaClicked = new EventEmitter();
|
|
478
|
+
/**
|
|
479
|
+
* Emitted when the user clicks "See all results" — carries the current query.
|
|
480
|
+
* Hosts (e.g. the Explorer shell) open the full Search Results workspace,
|
|
481
|
+
* which has scopes, relevance controls, and richer result actions than this
|
|
482
|
+
* capped quick-jump overlay. The overlay closes itself after emitting.
|
|
483
|
+
*/
|
|
484
|
+
SeeAllRequested = new EventEmitter();
|
|
485
|
+
/** Promo accept — carries the current query so the host can hand it off. */
|
|
486
|
+
PromoAccepted = new EventEmitter();
|
|
487
|
+
/** Promo dismissed — the host should persist this and stop showing it. */
|
|
488
|
+
PromoDismissed = new EventEmitter();
|
|
413
489
|
// --- Component State ---
|
|
414
490
|
Query = '';
|
|
415
491
|
IsSearching = false;
|
|
@@ -430,10 +506,18 @@ export class SearchOverlayComponent {
|
|
|
430
506
|
StreamingProviders = [];
|
|
431
507
|
/** Active stream subscription so we can cancel on a new search or destroy. */
|
|
432
508
|
currentStream = null;
|
|
509
|
+
/** Element focused before the overlay opened — restored on close (a11y). */
|
|
510
|
+
previousFocus = null;
|
|
433
511
|
/** All results flattened for keyboard navigation */
|
|
434
512
|
get FlatResults() {
|
|
435
513
|
return this.AllResults;
|
|
436
514
|
}
|
|
515
|
+
/** id of the highlighted option, announced via aria-activedescendant. */
|
|
516
|
+
get ActiveDescendantId() {
|
|
517
|
+
return this.HighlightedIndex >= 0 && this.HighlightedIndex < this.FlatResults.length
|
|
518
|
+
? `so-opt-${this.HighlightedIndex}`
|
|
519
|
+
: null;
|
|
520
|
+
}
|
|
437
521
|
ngOnInit() {
|
|
438
522
|
this.setupSearchDebounce();
|
|
439
523
|
this.subscribeToSearchState();
|
|
@@ -446,7 +530,7 @@ export class SearchOverlayComponent {
|
|
|
446
530
|
}
|
|
447
531
|
// --- Keyboard shortcuts ---
|
|
448
532
|
HandleGlobalKeydown(event) {
|
|
449
|
-
if (this.isToggleShortcut(event)) {
|
|
533
|
+
if (this.EnableGlobalShortcut && this.isToggleShortcut(event)) {
|
|
450
534
|
event.preventDefault();
|
|
451
535
|
this.ToggleOverlay();
|
|
452
536
|
return;
|
|
@@ -521,6 +605,24 @@ export class SearchOverlayComponent {
|
|
|
521
605
|
this.AgentCtaClicked.emit(this.Query);
|
|
522
606
|
this.Close();
|
|
523
607
|
}
|
|
608
|
+
/** Promo accept: emit the current query and close — the host takes over. */
|
|
609
|
+
OnPromoAccept() {
|
|
610
|
+
this.PromoAccepted.emit(this.Query.trim());
|
|
611
|
+
this.Close();
|
|
612
|
+
}
|
|
613
|
+
/** Promo dismiss: the host persists the dismissal; hide it immediately. */
|
|
614
|
+
OnPromoDismiss() {
|
|
615
|
+
this.ShowPromo = false;
|
|
616
|
+
this.PromoDismissed.emit();
|
|
617
|
+
}
|
|
618
|
+
/** Handle clicking "See all results" — hand off to the full Search workspace */
|
|
619
|
+
OnSeeAllClick() {
|
|
620
|
+
const query = this.Query.trim();
|
|
621
|
+
if (query.length > 0) {
|
|
622
|
+
this.SeeAllRequested.emit(query);
|
|
623
|
+
}
|
|
624
|
+
this.Close();
|
|
625
|
+
}
|
|
524
626
|
/** Handle clicking the backdrop to close */
|
|
525
627
|
OnBackdropClick() {
|
|
526
628
|
this.Close();
|
|
@@ -558,16 +660,32 @@ export class SearchOverlayComponent {
|
|
|
558
660
|
event.preventDefault();
|
|
559
661
|
this.moveHighlight(-1);
|
|
560
662
|
break;
|
|
561
|
-
case 'Enter':
|
|
663
|
+
case 'Enter': {
|
|
664
|
+
// Only claim Enter when it belongs to the combobox model (typing in
|
|
665
|
+
// the input / a focused result row). A focused BUTTON (close,
|
|
666
|
+
// see-all, filter chip, promo) must keep its native Enter
|
|
667
|
+
// activation — preventDefault here at document level would
|
|
668
|
+
// silently swallow it, or worse, open the highlighted result.
|
|
669
|
+
const active = document.activeElement;
|
|
670
|
+
const inCombobox = active === this.searchInputRef?.nativeElement
|
|
671
|
+
|| (active?.classList.contains('result-item') ?? false);
|
|
672
|
+
if (!inCombobox) {
|
|
673
|
+
return;
|
|
674
|
+
}
|
|
562
675
|
event.preventDefault();
|
|
563
676
|
this.SelectHighlighted();
|
|
564
677
|
break;
|
|
678
|
+
}
|
|
565
679
|
}
|
|
566
680
|
}
|
|
567
681
|
moveHighlight(direction) {
|
|
568
682
|
const maxIndex = this.FlatResults.length - 1;
|
|
569
683
|
if (maxIndex < 0)
|
|
570
684
|
return;
|
|
685
|
+
// If a result row currently holds DOM focus (roving tabindex), keep focus
|
|
686
|
+
// travelling with the highlight; from the input, only the highlight moves.
|
|
687
|
+
const rowHadFocus = document.activeElement instanceof HTMLElement
|
|
688
|
+
&& document.activeElement.classList.contains('result-item');
|
|
571
689
|
this.HighlightedIndex += direction;
|
|
572
690
|
if (this.HighlightedIndex < 0) {
|
|
573
691
|
this.HighlightedIndex = maxIndex;
|
|
@@ -576,6 +694,76 @@ export class SearchOverlayComponent {
|
|
|
576
694
|
this.HighlightedIndex = 0;
|
|
577
695
|
}
|
|
578
696
|
this.cdr.detectChanges();
|
|
697
|
+
// Keyboard-driven moves keep the highlighted row visible. Mouse hover sets
|
|
698
|
+
// HighlightedIndex directly in the template and deliberately does NOT
|
|
699
|
+
// scroll — auto-scrolling under the pointer fights the user's hand.
|
|
700
|
+
const row = document.getElementById(`so-opt-${this.HighlightedIndex}`);
|
|
701
|
+
row?.scrollIntoView({ block: 'nearest' });
|
|
702
|
+
if (rowHadFocus) {
|
|
703
|
+
row?.focus();
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
/**
|
|
707
|
+
* Tab behavior inside the dialog:
|
|
708
|
+
* - On a result row, Tab / Shift+Tab step through the RESULTS themselves
|
|
709
|
+
* (mirrors ArrowDown/Up) until walking off either end of the list — then
|
|
710
|
+
* focus continues to the footer actions / back to the earlier controls.
|
|
711
|
+
* - Everywhere else, Tab wraps within the dialog (focus trap): input → close
|
|
712
|
+
* → filter chips → results → footer actions → back to the input.
|
|
713
|
+
* Escape is handled by the document-level keydown.
|
|
714
|
+
*/
|
|
715
|
+
OnSpotlightKeydown(event) {
|
|
716
|
+
if (event.key !== 'Tab') {
|
|
717
|
+
return;
|
|
718
|
+
}
|
|
719
|
+
const activeEl = document.activeElement;
|
|
720
|
+
if (activeEl?.classList.contains('result-item')) {
|
|
721
|
+
const last = this.FlatResults.length - 1;
|
|
722
|
+
if (!event.shiftKey && this.HighlightedIndex < last) {
|
|
723
|
+
event.preventDefault();
|
|
724
|
+
this.moveHighlight(1); // row has focus, so focus travels with it
|
|
725
|
+
return;
|
|
726
|
+
}
|
|
727
|
+
if (event.shiftKey && this.HighlightedIndex > 0) {
|
|
728
|
+
event.preventDefault();
|
|
729
|
+
this.moveHighlight(-1);
|
|
730
|
+
return;
|
|
731
|
+
}
|
|
732
|
+
// At either end: fall through so Tab leaves the list naturally.
|
|
733
|
+
}
|
|
734
|
+
const root = event.currentTarget ?? null;
|
|
735
|
+
if (!root) {
|
|
736
|
+
return;
|
|
737
|
+
}
|
|
738
|
+
const focusables = Array.from(root.querySelectorAll('input, button, .result-item[tabindex="0"], .search-recent-item[tabindex="0"]')).filter((el) => el.offsetParent !== null);
|
|
739
|
+
if (focusables.length === 0) {
|
|
740
|
+
return;
|
|
741
|
+
}
|
|
742
|
+
const active = document.activeElement;
|
|
743
|
+
if (!event.shiftKey && active === focusables[focusables.length - 1]) {
|
|
744
|
+
event.preventDefault();
|
|
745
|
+
focusables[0].focus();
|
|
746
|
+
}
|
|
747
|
+
else if (event.shiftKey && active === focusables[0]) {
|
|
748
|
+
event.preventDefault();
|
|
749
|
+
focusables[focusables.length - 1].focus();
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
/**
|
|
753
|
+
* Recent-search row activated (click or Enter/Space). Re-runs the search AND
|
|
754
|
+
* refocuses the input — the activated row leaves the DOM when recents are
|
|
755
|
+
* replaced by results, which would otherwise drop focus to <body>.
|
|
756
|
+
*/
|
|
757
|
+
OnRecentSelect(query) {
|
|
758
|
+
this.OnQueryInput(query);
|
|
759
|
+
this.searchInputRef?.nativeElement?.focus();
|
|
760
|
+
}
|
|
761
|
+
/** Recent-search rows are keyboard-activatable (Enter/Space = click). */
|
|
762
|
+
OnRecentKeydown(event, query) {
|
|
763
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
|
764
|
+
event.preventDefault();
|
|
765
|
+
this.OnRecentSelect(query);
|
|
766
|
+
}
|
|
579
767
|
}
|
|
580
768
|
setupSearchDebounce() {
|
|
581
769
|
this.searchInput$
|
|
@@ -717,6 +905,9 @@ export class SearchOverlayComponent {
|
|
|
717
905
|
this.cdr.detectChanges();
|
|
718
906
|
}
|
|
719
907
|
onOverlayOpened() {
|
|
908
|
+
// Remember what had focus so Close() can hand it back (a11y: the overlay
|
|
909
|
+
// is a modal dialog — focus must return to the summoning control).
|
|
910
|
+
this.previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
720
911
|
// Focus input after view updates
|
|
721
912
|
Promise.resolve().then(() => {
|
|
722
913
|
this.searchInputRef?.nativeElement?.focus();
|
|
@@ -725,6 +916,10 @@ export class SearchOverlayComponent {
|
|
|
725
916
|
}
|
|
726
917
|
onOverlayClosed() {
|
|
727
918
|
this.HighlightedIndex = -1;
|
|
919
|
+
if (this.previousFocus?.isConnected) {
|
|
920
|
+
this.previousFocus.focus();
|
|
921
|
+
}
|
|
922
|
+
this.previousFocus = null;
|
|
728
923
|
}
|
|
729
924
|
/** Check if any filters are active (used by template) */
|
|
730
925
|
hasActiveFilters() {
|
|
@@ -747,15 +942,15 @@ export class SearchOverlayComponent {
|
|
|
747
942
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.searchInputRef = _t.first);
|
|
748
943
|
} }, hostBindings: function SearchOverlayComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
749
944
|
i0.ɵɵlistener("keydown", function SearchOverlayComponent_keydown_HostBindingHandler($event) { return ctx.HandleGlobalKeydown($event); }, i0.ɵɵresolveDocument);
|
|
750
|
-
} }, inputs: { Placeholder: "Placeholder", MaxResults: "MaxResults", IsOpen: "IsOpen", DebounceMs: "DebounceMs", IncludeSources: "IncludeSources", ShowFilters: "ShowFilters", AgentCtaText: "AgentCtaText", ShowAgentCta: "ShowAgentCta", EnableStreaming: "EnableStreaming" }, outputs: { IsOpenChange: "IsOpenChange", ResultSelected: "ResultSelected", FilterChanged: "FilterChanged", SearchExecuted: "SearchExecuted", AgentCtaClicked: "AgentCtaClicked" }, standalone: false, decls: 1, vars: 1, consts: [["searchInput", ""], [1, "search-backdrop", 3, "click"], [1, "search-spotlight", 3, "click"], [1, "search-input-wrap"], [1, "fa-solid", "fa-magnifying-glass", "search-icon"], ["type", "text", "autocomplete", "off", "spellcheck", "false", 1, "search-input", 3, "input", "placeholder", "value"], [1, "search-spinner"], [1, "search-shortcut-hint"], [1, "search-results-area"], ["aria-live", "polite", 1, "streaming-status-strip"], [1, "search-filter-bar"], ["Variant", "no-results", "Title", "No results found", "Message", "Try different keywords or remove some filters"], [1, "search-recent"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "streaming-chip", "streaming-chip-pending"], [1, "streaming-chip", 3, "streaming-chip-error", "streaming-chip-completed"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [1, "streaming-chip"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "streaming-chip-name"], [1, "streaming-chip-time"], [1, "streaming-chip-count"], [1, "filter-clear-btn"], [1, "filter-chip", 3, "filter-chip-active"], [1, "filter-chip", 3, "click"], [3, "class"], [1, "filter-chip-count"], [1, "filter-clear-btn", 3, "click"], [1, "fa-solid", "fa-times"], ["ngProjectAs", "[actions]", 5, ["", "actions", ""], 1, "agent-cta-btn"], ["ngProjectAs", "[actions]", 5, ["", "actions", ""], 1, "agent-cta-btn", 3, "click"], [1, "fa-solid", "fa-robot"], ["Variant", "no-results", "Title", "Start typing to search across all your knowledge", "Size", "compact"], [1, "search-recent-header"], [1, "search-recent-title"], [1, "search-recent-item"], [1, "search-recent-item", 3, "click"], [1, "fa-solid", "fa-clock", "search-recent-icon"], [1, "search-recent-count"], [1, "result-group"], [1, "search-footer"], [1, "search-footer-count"], [1, "agent-cta-btn", "agent-cta-btn-small"], [1, "result-group-header"], [1, "result-group-label"], [1, "result-group-count"], [1, "result-item", 3, "result-item-highlighted"], [1, "result-item", 3, "click", "mouseenter"], [1, "result-item-icon"], [1, "result-item-content"], [1, "result-item-title"], [1, "result-item-snippet"], [1, "result-item-tags"], [1, "result-item-score"], [1, "score-badge"], [1, "result-tag"], [1, "agent-cta-btn", "agent-cta-btn-small", 3, "click"]], template: function SearchOverlayComponent_Template(rf, ctx) { if (rf & 1) {
|
|
751
|
-
i0.ɵɵconditionalCreate(0, SearchOverlayComponent_Conditional_0_Template,
|
|
945
|
+
} }, inputs: { Placeholder: "Placeholder", MaxResults: "MaxResults", IsOpen: "IsOpen", DebounceMs: "DebounceMs", IncludeSources: "IncludeSources", ShowFilters: "ShowFilters", AgentCtaText: "AgentCtaText", ShowAgentCta: "ShowAgentCta", EnableStreaming: "EnableStreaming", EnableGlobalShortcut: "EnableGlobalShortcut", ShowPromo: "ShowPromo", PromoText: "PromoText", PromoActionLabel: "PromoActionLabel" }, outputs: { IsOpenChange: "IsOpenChange", ResultSelected: "ResultSelected", FilterChanged: "FilterChanged", SearchExecuted: "SearchExecuted", AgentCtaClicked: "AgentCtaClicked", SeeAllRequested: "SeeAllRequested", PromoAccepted: "PromoAccepted", PromoDismissed: "PromoDismissed" }, standalone: false, decls: 1, vars: 1, consts: [["searchInput", ""], [1, "search-backdrop", 3, "click"], ["role", "dialog", "aria-modal", "true", "aria-label", "Search", 1, "search-spotlight", 3, "click", "keydown"], [1, "search-input-wrap"], [1, "fa-solid", "fa-magnifying-glass", "search-icon"], ["type", "text", "role", "combobox", "aria-controls", "search-overlay-listbox", "aria-autocomplete", "list", "autocomplete", "off", "spellcheck", "false", 1, "search-input", 3, "input", "placeholder", "value"], [1, "search-spinner"], [1, "search-shortcut-hint"], ["type", "button", "aria-label", "Close", "title", "Close", 1, "search-close-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "search-results-area"], ["aria-live", "polite", 1, "streaming-status-strip"], [1, "search-filter-bar"], ["Variant", "no-results", "Title", "No results found", "Message", "Try different keywords or remove some filters"], [1, "search-recent"], [1, "search-promo"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "streaming-chip", "streaming-chip-pending"], [1, "streaming-chip", 3, "streaming-chip-error", "streaming-chip-completed"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [1, "streaming-chip"], [1, "fa-solid", "fa-check"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "streaming-chip-name"], [1, "streaming-chip-time"], [1, "streaming-chip-count"], [1, "filter-clear-btn"], [1, "filter-chip", 3, "filter-chip-active"], [1, "filter-chip", 3, "click"], [3, "class"], [1, "filter-chip-count"], [1, "filter-clear-btn", 3, "click"], [1, "fa-solid", "fa-times"], ["ngProjectAs", "[actions]", 5, ["", "actions", ""], 1, "agent-cta-btn"], ["ngProjectAs", "[actions]", 5, ["", "actions", ""], 1, "agent-cta-btn", 3, "click"], [1, "fa-solid", "fa-robot"], ["Variant", "no-results", "Title", "Start typing to search across all your knowledge", "Size", "compact"], [1, "search-recent-header"], [1, "search-recent-title"], ["role", "button", "tabindex", "0", 1, "search-recent-item"], ["role", "button", "tabindex", "0", 1, "search-recent-item", 3, "click", "keydown"], [1, "fa-solid", "fa-clock", "search-recent-icon"], [1, "search-recent-count"], ["id", "search-overlay-listbox", "role", "listbox", "aria-label", "Search results"], ["role", "presentation", 1, "result-group"], [1, "search-footer"], [1, "search-footer-count"], [1, "search-footer-actions"], ["type", "button", 1, "see-all-btn", 3, "click"], [1, "fa-solid", "fa-arrow-right"], [1, "agent-cta-btn", "agent-cta-btn-small"], ["role", "presentation", 1, "result-group-header"], [1, "result-group-label"], [1, "result-group-count"], ["role", "option", 1, "result-item", 3, "result-item-highlighted"], ["role", "option", 1, "result-item", 3, "click", "focus", "mouseenter"], [1, "result-item-icon"], [1, "result-item-content"], [1, "result-item-title"], [1, "result-item-snippet"], [1, "result-item-tags"], [1, "result-item-score"], [1, "score-badge"], [1, "result-tag"], [1, "agent-cta-btn", "agent-cta-btn-small", 3, "click"], [1, "fa-solid", "fa-wand-magic-sparkles", "search-promo-icon"], [1, "search-promo-text"], ["type", "button", 1, "search-promo-action", 3, "click"], ["type", "button", "aria-label", "Dismiss", "title", "Dismiss", 1, "search-promo-dismiss", 3, "click"]], template: function SearchOverlayComponent_Template(rf, ctx) { if (rf & 1) {
|
|
946
|
+
i0.ɵɵconditionalCreate(0, SearchOverlayComponent_Conditional_0_Template, 19, 11);
|
|
752
947
|
} if (rf & 2) {
|
|
753
948
|
i0.ɵɵconditional(ctx.IsOpen ? 0 : -1);
|
|
754
|
-
} }, dependencies: [i1.MJEmptyStateComponent], styles: ["\n\n\n.search-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n backdrop-filter: blur(8px);\n z-index: 99998;\n animation: _ngcontent-%COMP%_backdropFadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_backdropFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.search-spotlight[_ngcontent-%COMP%] {\n position: fixed;\n top: 12%;\n left: 50%;\n transform: translateX(-50%);\n width: 680px;\n max-width: calc(100vw - 2rem);\n max-height: 70vh;\n z-index: 99999;\n display: flex;\n flex-direction: column;\n border-radius: 14px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n box-shadow: 0 25px 60px rgba(0, 0, 0, 0.3);\n overflow: hidden;\n animation: _ngcontent-%COMP%_spotlightIn 0.25s ease;\n}\n\n@keyframes _ngcontent-%COMP%_spotlightIn {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-10px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0) scale(1);\n }\n}\n\n\n\n.search-input-wrap[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid var(--mj-border-default);\n gap: 0.75rem;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 1.1rem;\n flex-shrink: 0;\n}\n\n.search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 1.1rem;\n color: var(--mj-text-primary);\n outline: none;\n font-family: inherit;\n}\n\n.search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n}\n\n.search-spinner[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 1rem;\n}\n\n.search-shortcut-hint[_ngcontent-%COMP%] kbd[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.15rem 0.5rem;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-family: inherit;\n}\n\n\n\n.search-results-area[_ngcontent-%COMP%] {\n overflow-y: auto;\n max-height: calc(70vh - 56px);\n}\n\n\n\n.search-filter-bar[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n padding: 0.6rem 1rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.streaming-status-strip[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.streaming-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.2rem 0.55rem;\n border-radius: 9999px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.74rem;\n}\n\n.streaming-chip-pending[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.streaming-chip-completed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n}\n\n.streaming-chip-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n}\n\n.streaming-chip-name[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.streaming-chip-count[_ngcontent-%COMP%] {\n opacity: 0.7;\n}\n\n.streaming-chip-time[_ngcontent-%COMP%] {\n opacity: 0.6;\n font-size: 0.7rem;\n}\n\n.filter-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.25rem 0.6rem;\n border-radius: 9999px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.78rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.filter-chip[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-primary);\n}\n\n.filter-chip-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.filter-chip-count[_ngcontent-%COMP%] {\n opacity: 0.6;\n font-size: 0.72rem;\n}\n\n.filter-clear-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.6rem;\n border-radius: 9999px;\n border: none;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n cursor: pointer;\n}\n\n.filter-clear-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-error);\n}\n\n\n\n.search-recent[_ngcontent-%COMP%] {\n padding: 0.5rem 0;\n}\n\n.search-recent-header[_ngcontent-%COMP%] {\n padding: 0.5rem 1rem;\n}\n\n.search-recent-title[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-weight: 600;\n}\n\n.search-recent-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n transition: background 0.1s ease;\n}\n\n.search-recent-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.search-recent-icon[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n}\n\n.search-recent-count[_ngcontent-%COMP%] {\n margin-left: auto;\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n\n\n.result-group[_ngcontent-%COMP%] {\n padding: 0.25rem 0;\n}\n\n.result-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-weight: 600;\n}\n\n.result-group-label[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.result-group-count[_ngcontent-%COMP%] {\n font-size: 0.72rem;\n color: var(--mj-text-disabled);\n}\n\n\n\n.result-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n padding: 0.6rem 1rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.result-item[_ngcontent-%COMP%]:hover, \n.result-item-highlighted[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-hover);\n}\n\n.result-item-icon[_ngcontent-%COMP%] {\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n flex-shrink: 0;\n margin-top: 0.1rem;\n}\n\n.result-item-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.result-item-title[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 500;\n font-size: 0.9rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.result-item-snippet[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.8rem;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n margin-top: 0.15rem;\n}\n\n.result-item-tags[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.3rem;\n margin-top: 0.3rem;\n}\n\n.result-tag[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.1rem 0.4rem;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n}\n\n.result-item-score[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-top: 0.2rem;\n}\n\n.score-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.15rem 0.45rem;\n border-radius: 9999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.72rem;\n font-weight: 600;\n}\n\n\n\n.search-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.search-footer-count[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n\n\n.agent-cta-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.6rem 1.2rem;\n border-radius: 8px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.agent-cta-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.agent-cta-btn-small[_ngcontent-%COMP%] {\n padding: 0.35rem 0.8rem;\n font-size: 0.78rem;\n}\n\n\n\n@media (max-width: 640px) {\n .search-spotlight[_ngcontent-%COMP%] {\n top: 0;\n left: 0;\n right: 0;\n transform: none;\n width: 100%;\n max-width: 100%;\n max-height: 100vh;\n border-radius: 0;\n }\n\n .search-results-area[_ngcontent-%COMP%] {\n max-height: calc(100vh - 56px);\n }\n\n .search-filter-bar[_ngcontent-%COMP%] {\n overflow-x: auto;\n flex-wrap: nowrap;\n -webkit-overflow-scrolling: touch;\n }\n}"] });
|
|
949
|
+
} }, dependencies: [i1.MJEmptyStateComponent], styles: ["\n\n\n.search-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n backdrop-filter: blur(8px);\n z-index: 99998;\n animation: _ngcontent-%COMP%_backdropFadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_backdropFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.search-spotlight[_ngcontent-%COMP%] {\n position: fixed;\n top: 12%;\n left: 50%;\n transform: translateX(-50%);\n width: 680px;\n max-width: calc(100vw - 2rem);\n max-height: 70vh;\n z-index: 99999;\n display: flex;\n flex-direction: column;\n border-radius: var(--mj-radius-xl);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n box-shadow: 0 25px 60px rgba(0, 0, 0, 0.3);\n overflow: hidden;\n animation: _ngcontent-%COMP%_spotlightIn 0.25s ease;\n}\n\n@keyframes _ngcontent-%COMP%_spotlightIn {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-10px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0) scale(1);\n }\n}\n\n\n\n.search-input-wrap[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid var(--mj-border-default);\n gap: 0.75rem;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 1.1rem;\n flex-shrink: 0;\n}\n\n.search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 1.1rem;\n color: var(--mj-text-primary);\n outline: none;\n font-family: inherit;\n}\n\n.search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n}\n\n.search-spinner[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 1rem;\n}\n\n.search-shortcut-hint[_ngcontent-%COMP%] kbd[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.15rem 0.5rem;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-family: inherit;\n}\n\n.search-close-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: var(--mj-radius-full);\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n transition: var(--mj-transition-colors);\n flex-shrink: 0;\n}\n\n.search-close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n\n\n.search-results-area[_ngcontent-%COMP%] {\n overflow-y: auto;\n max-height: calc(70vh - 56px);\n}\n\n\n\n.search-filter-bar[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n padding: 0.6rem 1rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.streaming-status-strip[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.streaming-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.2rem 0.55rem;\n border-radius: 9999px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.74rem;\n}\n\n.streaming-chip-pending[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.streaming-chip-completed[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n}\n\n.streaming-chip-error[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n}\n\n.streaming-chip-name[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.streaming-chip-count[_ngcontent-%COMP%] {\n opacity: 0.7;\n}\n\n.streaming-chip-time[_ngcontent-%COMP%] {\n opacity: 0.6;\n font-size: 0.7rem;\n}\n\n.filter-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.25rem 0.6rem;\n border-radius: 9999px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.78rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.filter-chip[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-primary);\n}\n\n.filter-chip-active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.filter-chip-count[_ngcontent-%COMP%] {\n opacity: 0.6;\n font-size: 0.72rem;\n}\n\n.filter-clear-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.6rem;\n border-radius: 9999px;\n border: none;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n cursor: pointer;\n}\n\n.filter-clear-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-error);\n}\n\n\n\n.search-recent[_ngcontent-%COMP%] {\n padding: 0.5rem 0;\n}\n\n.search-recent-header[_ngcontent-%COMP%] {\n padding: 0.5rem 1rem;\n}\n\n.search-recent-title[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-weight: 600;\n}\n\n.search-recent-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n transition: background 0.1s ease;\n}\n\n.search-recent-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.search-recent-icon[_ngcontent-%COMP%] {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n}\n\n.search-recent-count[_ngcontent-%COMP%] {\n margin-left: auto;\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n\n\n.result-group[_ngcontent-%COMP%] {\n padding: 0.25rem 0;\n}\n\n.result-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-weight: 600;\n}\n\n.result-group-label[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.result-group-count[_ngcontent-%COMP%] {\n font-size: 0.72rem;\n color: var(--mj-text-disabled);\n}\n\n\n\n.result-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n padding: 0.6rem 1rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.result-item[_ngcontent-%COMP%]:hover, \n.result-item-highlighted[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n\n.result-item[_ngcontent-%COMP%]:focus {\n outline: none;\n}\n.result-item[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: -2px;\n}\n.search-recent-item[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: -2px;\n}\n\n.result-item-icon[_ngcontent-%COMP%] {\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n flex-shrink: 0;\n margin-top: 0.1rem;\n}\n\n.result-item-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.result-item-title[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 500;\n font-size: 0.9rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.result-item-snippet[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.8rem;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n margin-top: 0.15rem;\n}\n\n.result-item-tags[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.3rem;\n margin-top: 0.3rem;\n}\n\n.result-tag[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.1rem 0.4rem;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n}\n\n.result-item-score[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-top: 0.2rem;\n}\n\n.score-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.15rem 0.45rem;\n border-radius: 9999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.72rem;\n font-weight: 600;\n}\n\n\n\n.search-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.search-footer-count[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n.search-footer-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n}\n\n\n\n\n\n.see-all-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-1-5);\n padding: 0.35rem 0.8rem;\n border-radius: var(--mj-radius-md);\n border: 1px solid var(--mj-border-default);\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: var(--mj-font-medium);\n cursor: pointer;\n transition: var(--mj-transition-colors);\n}\n\n.see-all-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n}\n\n\n\n.agent-cta-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.6rem 1.2rem;\n border-radius: 8px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.agent-cta-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.agent-cta-btn-small[_ngcontent-%COMP%] {\n padding: 0.35rem 0.8rem;\n font-size: 0.78rem;\n}\n\n\n\n@media (max-width: 640px) {\n .search-spotlight[_ngcontent-%COMP%] {\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n transform: none;\n width: 100%;\n max-width: 100%;\n height: 100dvh;\n max-height: 100dvh;\n border-radius: 0;\n animation: none; \n\n }\n\n \n\n .search-results-area[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n max-height: none;\n }\n\n \n\n\n .search-filter-bar[_ngcontent-%COMP%] {\n overflow-x: auto;\n flex-wrap: nowrap;\n -webkit-overflow-scrolling: touch;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n align-items: center;\n }\n\n .search-filter-bar[_ngcontent-%COMP%] .filter-chip[_ngcontent-%COMP%], \n .search-filter-bar[_ngcontent-%COMP%] .filter-clear-btn[_ngcontent-%COMP%] {\n flex-shrink: 0; \n\n padding: 0.25rem 0.7rem;\n line-height: 1.2;\n font-size: 0.75rem;\n }\n\n \n\n .search-shortcut-hint[_ngcontent-%COMP%] {\n display: none;\n }\n\n \n\n\n\n .search-close-btn[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n font-size: var(--mj-text-base);\n }\n .search-promo[_ngcontent-%COMP%] {\n gap: var(--mj-space-3);\n }\n .search-promo-action[_ngcontent-%COMP%] {\n padding: 0.6rem 1rem;\n }\n .search-promo-dismiss[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n font-size: var(--mj-text-sm);\n }\n}\n\n\n\n\n.search-promo[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2) var(--mj-space-4);\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.search-promo-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.search-promo-text[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.search-promo-action[_ngcontent-%COMP%] {\n flex-shrink: 0;\n padding: 0.2rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.75rem;\n font-weight: var(--mj-font-medium);\n cursor: pointer;\n transition: var(--mj-transition-colors);\n}\n\n.search-promo-action[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n}\n\n.search-promo-dismiss[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n padding: 0;\n border: none;\n border-radius: var(--mj-radius-full);\n background: transparent;\n color: var(--mj-text-disabled);\n font-size: 0.75rem;\n cursor: pointer;\n transition: var(--mj-transition-colors);\n flex-shrink: 0;\n}\n\n.search-promo-dismiss[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}"] });
|
|
755
950
|
}
|
|
756
951
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SearchOverlayComponent, [{
|
|
757
952
|
type: Component,
|
|
758
|
-
args: [{ standalone: false, selector: 'mj-search-overlay', template: "@if (IsOpen) {\n <!-- Backdrop -->\n <div class=\"search-backdrop\" (click)=\"OnBackdropClick()\"></div>\n\n <!-- Spotlight container -->\n <div class=\"search-spotlight\" (click)=\"$event.stopPropagation()\">\n <!-- Search input area -->\n <div class=\"search-input-wrap\">\n <i class=\"fa-solid fa-magnifying-glass search-icon\"></i>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n [placeholder]=\"Placeholder\"\n [value]=\"Query\"\n (input)=\"OnQueryInput($any($event.target).value)\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n @if (IsSearching) {\n <div class=\"search-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n }\n <div class=\"search-shortcut-hint\">\n <kbd>ESC</kbd>\n </div>\n </div>\n\n <!-- Results area -->\n <div class=\"search-results-area\">\n @if (EnableStreaming && (IsSearching || StreamingProviders.length > 0)) {\n <!-- Streaming status strip \u2014 one chip per provider that has reported -->\n <div class=\"streaming-status-strip\" aria-live=\"polite\">\n @if (StreamingProviders.length === 0 && IsSearching) {\n <span class=\"streaming-chip streaming-chip-pending\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span>Searching\u2026</span>\n </span>\n }\n @for (p of StreamingProviders; track p.Name) {\n <span class=\"streaming-chip\"\n [class.streaming-chip-error]=\"p.State === 'Error'\"\n [class.streaming-chip-completed]=\"p.State === 'Completed'\">\n @if (p.State === 'Completed') {\n <i class=\"fa-solid fa-check\"></i>\n } @else {\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n }\n <span class=\"streaming-chip-name\">{{ p.Name }}</span>\n @if (p.State === 'Completed') {\n <span class=\"streaming-chip-count\">{{ p.Count }}</span>\n <span class=\"streaming-chip-time\">{{ FormatElapsedTime(p.ElapsedMs) }}</span>\n } @else if (p.ErrorMessage) {\n <span class=\"streaming-chip-time\">{{ p.ErrorMessage }}</span>\n }\n </span>\n }\n </div>\n }\n @if (ShowFilters && Filters.length > 0) {\n <!-- Filter chips -->\n <div class=\"search-filter-bar\">\n @for (filter of Filters; track filter.Category) {\n @for (option of filter.Options; track option.Value) {\n <button\n class=\"filter-chip\"\n [class.filter-chip-active]=\"IsFilterActive(filter.Category, option.Value)\"\n (click)=\"OnFilterToggle(filter.Category, option.Value)\"\n >\n @if (option.Icon) {\n <i [class]=\"option.Icon\"></i>\n }\n <span>{{ option.Label }}</span>\n <span class=\"filter-chip-count\">{{ option.Count }}</span>\n </button>\n }\n }\n @if (hasActiveFilters()) {\n <button class=\"filter-clear-btn\" (click)=\"ClearAllFilters()\">\n <i class=\"fa-solid fa-times\"></i> Clear\n </button>\n }\n </div>\n }\n\n @if (HasSearched && AllResults.length === 0 && !IsSearching) {\n <!-- No results -->\n <mj-empty-state\n Variant=\"no-results\"\n Title=\"No results found\"\n Message=\"Try different keywords or remove some filters\">\n @if (ShowAgentCta) {\n <button ngProjectAs=\"[actions]\" class=\"agent-cta-btn\" (click)=\"OnAgentCtaClick()\">\n <i class=\"fa-solid fa-robot\"></i>\n {{ AgentCtaText }}\n </button>\n }\n </mj-empty-state>\n }\n\n @if (!HasSearched && !IsSearching) {\n <!-- Recent searches -->\n <div class=\"search-recent\">\n @if (searchService.RecentSearches$.value.length > 0) {\n <div class=\"search-recent-header\">\n <span class=\"search-recent-title\">Recent Searches</span>\n </div>\n @for (recent of searchService.RecentSearches$.value; track recent.Query; let i = $index) {\n @if (i < 5) {\n <div class=\"search-recent-item\" (click)=\"OnQueryInput(recent.Query)\">\n <i class=\"fa-solid fa-clock search-recent-icon\"></i>\n <span>{{ recent.Query }}</span>\n <span class=\"search-recent-count\">{{ recent.ResultCount }} results</span>\n </div>\n }\n }\n } @else {\n <mj-empty-state\n Variant=\"no-results\"\n Title=\"Start typing to search across all your knowledge\"\n Size=\"compact\" />\n }\n </div>\n }\n\n @if (AllResults.length > 0) {\n <!-- Grouped results -->\n @for (group of ResultGroups; track group.SourceType) {\n <div class=\"result-group\">\n <div class=\"result-group-header\">\n <i [class]=\"group.Icon\"></i>\n <span class=\"result-group-label\">{{ group.Label }}</span>\n <span class=\"result-group-count\">{{ group.TotalCount }}</span>\n </div>\n @for (result of group.Results; track result.ID; let ri = $index) {\n <div\n class=\"result-item\"\n [class.result-item-highlighted]=\"isResultHighlighted(result)\"\n (click)=\"OnResultClick(result, $event)\"\n (mouseenter)=\"HighlightedIndex = getFlatIndex(result)\"\n >\n <div class=\"result-item-icon\">\n <i [class]=\"result.SourceIcon\"></i>\n </div>\n <div class=\"result-item-content\">\n <div class=\"result-item-title\">{{ result.Title }}</div>\n <div class=\"result-item-snippet\">{{ result.Snippet }}</div>\n @if (result.Tags.length > 0) {\n <div class=\"result-item-tags\">\n @for (tag of result.Tags; track tag; let ti = $index) {\n @if (ti < 3) {\n <span class=\"result-tag\">{{ tag }}</span>\n }\n }\n </div>\n }\n </div>\n <div class=\"result-item-score\">\n <span class=\"score-badge\">{{ FormatScore(result.Score) }}</span>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Footer -->\n <div class=\"search-footer\">\n <span class=\"search-footer-count\">\n {{ TotalCount }} results in {{ FormatElapsedTime(ElapsedMs) }}\n </span>\n @if (ShowAgentCta) {\n <button class=\"agent-cta-btn agent-cta-btn-small\" (click)=\"OnAgentCtaClick()\">\n <i class=\"fa-solid fa-robot\"></i>\n {{ AgentCtaText }}\n </button>\n }\n </div>\n }\n </div>\n </div>\n}\n", styles: ["/* Search Overlay - Command Palette / Spotlight Style */\n\n.search-backdrop {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n backdrop-filter: blur(8px);\n z-index: 99998;\n animation: backdropFadeIn 0.2s ease;\n}\n\n@keyframes backdropFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.search-spotlight {\n position: fixed;\n top: 12%;\n left: 50%;\n transform: translateX(-50%);\n width: 680px;\n max-width: calc(100vw - 2rem);\n max-height: 70vh;\n z-index: 99999;\n display: flex;\n flex-direction: column;\n border-radius: 14px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n box-shadow: 0 25px 60px rgba(0, 0, 0, 0.3);\n overflow: hidden;\n animation: spotlightIn 0.25s ease;\n}\n\n@keyframes spotlightIn {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-10px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0) scale(1);\n }\n}\n\n/* Search Input */\n.search-input-wrap {\n display: flex;\n align-items: center;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid var(--mj-border-default);\n gap: 0.75rem;\n}\n\n.search-icon {\n color: var(--mj-brand-primary);\n font-size: 1.1rem;\n flex-shrink: 0;\n}\n\n.search-input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 1.1rem;\n color: var(--mj-text-primary);\n outline: none;\n font-family: inherit;\n}\n\n.search-input::placeholder {\n color: var(--mj-text-muted);\n}\n\n.search-spinner {\n color: var(--mj-brand-primary);\n font-size: 1rem;\n}\n\n.search-shortcut-hint kbd {\n display: inline-block;\n padding: 0.15rem 0.5rem;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-family: inherit;\n}\n\n/* Results Area */\n.search-results-area {\n overflow-y: auto;\n max-height: calc(70vh - 56px);\n}\n\n/* Filter Bar */\n.search-filter-bar {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n padding: 0.6rem 1rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.streaming-status-strip {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.streaming-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.2rem 0.55rem;\n border-radius: 9999px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.74rem;\n}\n\n.streaming-chip-pending {\n color: var(--mj-text-muted);\n}\n\n.streaming-chip-completed {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n}\n\n.streaming-chip-error {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n}\n\n.streaming-chip-name {\n font-weight: 500;\n}\n\n.streaming-chip-count {\n opacity: 0.7;\n}\n\n.streaming-chip-time {\n opacity: 0.6;\n font-size: 0.7rem;\n}\n\n.filter-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.25rem 0.6rem;\n border-radius: 9999px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.78rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.filter-chip:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-primary);\n}\n\n.filter-chip-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.filter-chip-count {\n opacity: 0.6;\n font-size: 0.72rem;\n}\n\n.filter-clear-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.6rem;\n border-radius: 9999px;\n border: none;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n cursor: pointer;\n}\n\n.filter-clear-btn:hover {\n color: var(--mj-status-error);\n}\n\n/* Recent Searches */\n.search-recent {\n padding: 0.5rem 0;\n}\n\n.search-recent-header {\n padding: 0.5rem 1rem;\n}\n\n.search-recent-title {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-weight: 600;\n}\n\n.search-recent-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n transition: background 0.1s ease;\n}\n\n.search-recent-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.search-recent-icon {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n}\n\n.search-recent-count {\n margin-left: auto;\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n/* Result Groups */\n.result-group {\n padding: 0.25rem 0;\n}\n\n.result-group-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-weight: 600;\n}\n\n.result-group-label {\n flex: 1;\n}\n\n.result-group-count {\n font-size: 0.72rem;\n color: var(--mj-text-disabled);\n}\n\n/* Result Items */\n.result-item {\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n padding: 0.6rem 1rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.result-item:hover,\n.result-item-highlighted {\n background: var(--mj-bg-surface-hover);\n}\n\n.result-item-icon {\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n flex-shrink: 0;\n margin-top: 0.1rem;\n}\n\n.result-item-content {\n flex: 1;\n min-width: 0;\n}\n\n.result-item-title {\n color: var(--mj-text-primary);\n font-weight: 500;\n font-size: 0.9rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.result-item-snippet {\n color: var(--mj-text-muted);\n font-size: 0.8rem;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n margin-top: 0.15rem;\n}\n\n.result-item-tags {\n display: flex;\n gap: 0.3rem;\n margin-top: 0.3rem;\n}\n\n.result-tag {\n display: inline-block;\n padding: 0.1rem 0.4rem;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n}\n\n.result-item-score {\n flex-shrink: 0;\n margin-top: 0.2rem;\n}\n\n.score-badge {\n display: inline-block;\n padding: 0.15rem 0.45rem;\n border-radius: 9999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.72rem;\n font-weight: 600;\n}\n\n/* Footer */\n.search-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.search-footer-count {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n/* Agent CTA Button */\n.agent-cta-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.6rem 1.2rem;\n border-radius: 8px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.agent-cta-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.agent-cta-btn-small {\n padding: 0.35rem 0.8rem;\n font-size: 0.78rem;\n}\n\n/* Mobile responsive */\n@media (max-width: 640px) {\n .search-spotlight {\n top: 0;\n left: 0;\n right: 0;\n transform: none;\n width: 100%;\n max-width: 100%;\n max-height: 100vh;\n border-radius: 0;\n }\n\n .search-results-area {\n max-height: calc(100vh - 56px);\n }\n\n .search-filter-bar {\n overflow-x: auto;\n flex-wrap: nowrap;\n -webkit-overflow-scrolling: touch;\n }\n}\n"] }]
|
|
953
|
+
args: [{ standalone: false, selector: 'mj-search-overlay', template: "@if (IsOpen) {\n <!-- Backdrop -->\n <div class=\"search-backdrop\" (click)=\"OnBackdropClick()\"></div>\n\n <!-- Spotlight container -->\n <div class=\"search-spotlight\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Search\"\n (click)=\"$event.stopPropagation()\" (keydown)=\"OnSpotlightKeydown($event)\">\n <!-- Search input area -->\n <div class=\"search-input-wrap\">\n <i class=\"fa-solid fa-magnifying-glass search-icon\"></i>\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n role=\"combobox\"\n aria-controls=\"search-overlay-listbox\"\n aria-autocomplete=\"list\"\n [attr.aria-expanded]=\"AllResults.length > 0\"\n [attr.aria-activedescendant]=\"ActiveDescendantId\"\n [placeholder]=\"Placeholder\"\n [value]=\"Query\"\n (input)=\"OnQueryInput($any($event.target).value)\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n />\n @if (IsSearching) {\n <div class=\"search-spinner\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n </div>\n }\n <div class=\"search-shortcut-hint\">\n <kbd>ESC</kbd>\n </div>\n <button type=\"button\" class=\"search-close-btn\" aria-label=\"Close\" title=\"Close\" (click)=\"Close()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Results area -->\n <div class=\"search-results-area\">\n @if (EnableStreaming && (IsSearching || StreamingProviders.length > 0)) {\n <!-- Streaming status strip \u2014 one chip per provider that has reported -->\n <div class=\"streaming-status-strip\" aria-live=\"polite\">\n @if (StreamingProviders.length === 0 && IsSearching) {\n <span class=\"streaming-chip streaming-chip-pending\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span>Searching\u2026</span>\n </span>\n }\n @for (p of StreamingProviders; track p.Name) {\n <span class=\"streaming-chip\"\n [class.streaming-chip-error]=\"p.State === 'Error'\"\n [class.streaming-chip-completed]=\"p.State === 'Completed'\">\n @if (p.State === 'Completed') {\n <i class=\"fa-solid fa-check\"></i>\n } @else {\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n }\n <span class=\"streaming-chip-name\">{{ p.Name }}</span>\n @if (p.State === 'Completed') {\n <span class=\"streaming-chip-count\">{{ p.Count }}</span>\n <span class=\"streaming-chip-time\">{{ FormatElapsedTime(p.ElapsedMs) }}</span>\n } @else if (p.ErrorMessage) {\n <span class=\"streaming-chip-time\">{{ p.ErrorMessage }}</span>\n }\n </span>\n }\n </div>\n }\n @if (ShowFilters && Filters.length > 0) {\n <!-- Filter chips -->\n <div class=\"search-filter-bar\">\n @for (filter of Filters; track filter.Category) {\n @for (option of filter.Options; track option.Value) {\n <button\n class=\"filter-chip\"\n [class.filter-chip-active]=\"IsFilterActive(filter.Category, option.Value)\"\n (click)=\"OnFilterToggle(filter.Category, option.Value)\"\n >\n @if (option.Icon) {\n <i [class]=\"option.Icon\"></i>\n }\n <span>{{ option.Label }}</span>\n <span class=\"filter-chip-count\">{{ option.Count }}</span>\n </button>\n }\n }\n @if (hasActiveFilters()) {\n <button class=\"filter-clear-btn\" (click)=\"ClearAllFilters()\">\n <i class=\"fa-solid fa-times\"></i> Clear\n </button>\n }\n </div>\n }\n\n @if (HasSearched && AllResults.length === 0 && !IsSearching) {\n <!-- No results -->\n <mj-empty-state\n Variant=\"no-results\"\n Title=\"No results found\"\n Message=\"Try different keywords or remove some filters\">\n @if (ShowAgentCta) {\n <button ngProjectAs=\"[actions]\" class=\"agent-cta-btn\" (click)=\"OnAgentCtaClick()\">\n <i class=\"fa-solid fa-robot\"></i>\n {{ AgentCtaText }}\n </button>\n }\n </mj-empty-state>\n }\n\n @if (!HasSearched && !IsSearching) {\n <!-- Recent searches -->\n <div class=\"search-recent\">\n @if (searchService.RecentSearches$.value.length > 0) {\n <div class=\"search-recent-header\">\n <span class=\"search-recent-title\">Recent Searches</span>\n </div>\n @for (recent of searchService.RecentSearches$.value; track recent.Query; let i = $index) {\n @if (i < 5) {\n <div class=\"search-recent-item\" role=\"button\" tabindex=\"0\"\n (click)=\"OnRecentSelect(recent.Query)\"\n (keydown)=\"OnRecentKeydown($event, recent.Query)\">\n <i class=\"fa-solid fa-clock search-recent-icon\"></i>\n <span>{{ recent.Query }}</span>\n <span class=\"search-recent-count\">{{ recent.ResultCount }} results</span>\n </div>\n }\n }\n } @else {\n <mj-empty-state\n Variant=\"no-results\"\n Title=\"Start typing to search across all your knowledge\"\n Size=\"compact\" />\n }\n </div>\n }\n\n @if (AllResults.length > 0) {\n <!-- Grouped results -->\n <div id=\"search-overlay-listbox\" role=\"listbox\" aria-label=\"Search results\">\n @for (group of ResultGroups; track group.SourceType) {\n <div class=\"result-group\" role=\"presentation\">\n <div class=\"result-group-header\" role=\"presentation\">\n <i [class]=\"group.Icon\"></i>\n <span class=\"result-group-label\">{{ group.Label }}</span>\n <span class=\"result-group-count\">{{ group.TotalCount }}</span>\n </div>\n @for (result of group.Results; track result.ID; let ri = $index) {\n <div\n class=\"result-item\"\n role=\"option\"\n [attr.id]=\"'so-opt-' + getFlatIndex(result)\"\n [attr.tabindex]=\"isResultHighlighted(result) ? 0 : -1\"\n [attr.aria-selected]=\"isResultHighlighted(result)\"\n [class.result-item-highlighted]=\"isResultHighlighted(result)\"\n (click)=\"OnResultClick(result, $event)\"\n (focus)=\"HighlightedIndex = getFlatIndex(result)\"\n (mouseenter)=\"HighlightedIndex = getFlatIndex(result)\"\n >\n <div class=\"result-item-icon\">\n <i [class]=\"result.SourceIcon\"></i>\n </div>\n <div class=\"result-item-content\">\n <div class=\"result-item-title\">{{ result.Title }}</div>\n <div class=\"result-item-snippet\">{{ result.Snippet }}</div>\n @if (result.Tags.length > 0) {\n <div class=\"result-item-tags\">\n @for (tag of result.Tags; track tag; let ti = $index) {\n @if (ti < 3) {\n <span class=\"result-tag\">{{ tag }}</span>\n }\n }\n </div>\n }\n </div>\n <div class=\"result-item-score\">\n <span class=\"score-badge\">{{ FormatScore(result.Score) }}</span>\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Footer -->\n <div class=\"search-footer\">\n <span class=\"search-footer-count\">\n {{ TotalCount }} results in {{ FormatElapsedTime(ElapsedMs) }}\n </span>\n <div class=\"search-footer-actions\">\n <button type=\"button\" class=\"see-all-btn\" (click)=\"OnSeeAllClick()\">\n See all results\n <i class=\"fa-solid fa-arrow-right\"></i>\n </button>\n @if (ShowAgentCta) {\n <button class=\"agent-cta-btn agent-cta-btn-small\" (click)=\"OnAgentCtaClick()\">\n <i class=\"fa-solid fa-robot\"></i>\n {{ AgentCtaText }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Host-supplied promo strip (e.g. command palette nudge) -->\n @if (ShowPromo && PromoText) {\n <div class=\"search-promo\">\n <i class=\"fa-solid fa-wand-magic-sparkles search-promo-icon\"></i>\n <span class=\"search-promo-text\">{{ PromoText }}</span>\n <button type=\"button\" class=\"search-promo-action\" (click)=\"OnPromoAccept()\">{{ PromoActionLabel }}</button>\n <button type=\"button\" class=\"search-promo-dismiss\" aria-label=\"Dismiss\" title=\"Dismiss\" (click)=\"OnPromoDismiss()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n }\n </div>\n}\n", styles: ["/* Search Overlay - Command Palette / Spotlight Style */\n\n.search-backdrop {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n backdrop-filter: blur(8px);\n z-index: 99998;\n animation: backdropFadeIn 0.2s ease;\n}\n\n@keyframes backdropFadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.search-spotlight {\n position: fixed;\n top: 12%;\n left: 50%;\n transform: translateX(-50%);\n width: 680px;\n max-width: calc(100vw - 2rem);\n max-height: 70vh;\n z-index: 99999;\n display: flex;\n flex-direction: column;\n border-radius: var(--mj-radius-xl);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n box-shadow: 0 25px 60px rgba(0, 0, 0, 0.3);\n overflow: hidden;\n animation: spotlightIn 0.25s ease;\n}\n\n@keyframes spotlightIn {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-10px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0) scale(1);\n }\n}\n\n/* Search Input */\n.search-input-wrap {\n display: flex;\n align-items: center;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid var(--mj-border-default);\n gap: 0.75rem;\n}\n\n.search-icon {\n color: var(--mj-brand-primary);\n font-size: 1.1rem;\n flex-shrink: 0;\n}\n\n.search-input {\n flex: 1;\n border: none;\n background: transparent;\n font-size: 1.1rem;\n color: var(--mj-text-primary);\n outline: none;\n font-family: inherit;\n}\n\n.search-input::placeholder {\n color: var(--mj-text-muted);\n}\n\n.search-spinner {\n color: var(--mj-brand-primary);\n font-size: 1rem;\n}\n\n.search-shortcut-hint kbd {\n display: inline-block;\n padding: 0.15rem 0.5rem;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n font-family: inherit;\n}\n\n.search-close-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: var(--mj-radius-full);\n background: transparent;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n cursor: pointer;\n transition: var(--mj-transition-colors);\n flex-shrink: 0;\n}\n\n.search-close-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n/* Results Area */\n.search-results-area {\n overflow-y: auto;\n max-height: calc(70vh - 56px);\n}\n\n/* Filter Bar */\n.search-filter-bar {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n padding: 0.6rem 1rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.streaming-status-strip {\n display: flex;\n flex-wrap: wrap;\n gap: 0.4rem;\n padding: 0.5rem 1rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.streaming-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.2rem 0.55rem;\n border-radius: 9999px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.74rem;\n}\n\n.streaming-chip-pending {\n color: var(--mj-text-muted);\n}\n\n.streaming-chip-completed {\n background: color-mix(in srgb, var(--mj-status-success) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n}\n\n.streaming-chip-error {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n}\n\n.streaming-chip-name {\n font-weight: 500;\n}\n\n.streaming-chip-count {\n opacity: 0.7;\n}\n\n.streaming-chip-time {\n opacity: 0.6;\n font-size: 0.7rem;\n}\n\n.filter-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.25rem 0.6rem;\n border-radius: 9999px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.78rem;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.filter-chip:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-primary);\n}\n\n.filter-chip-active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.filter-chip-count {\n opacity: 0.6;\n font-size: 0.72rem;\n}\n\n.filter-clear-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.6rem;\n border-radius: 9999px;\n border: none;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n cursor: pointer;\n}\n\n.filter-clear-btn:hover {\n color: var(--mj-status-error);\n}\n\n/* Recent Searches */\n.search-recent {\n padding: 0.5rem 0;\n}\n\n.search-recent-header {\n padding: 0.5rem 1rem;\n}\n\n.search-recent-title {\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-weight: 600;\n}\n\n.search-recent-item {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 1rem;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 0.9rem;\n transition: background 0.1s ease;\n}\n\n.search-recent-item:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.search-recent-icon {\n font-size: 0.8rem;\n color: var(--mj-text-muted);\n}\n\n.search-recent-count {\n margin-left: auto;\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n/* Result Groups */\n.result-group {\n padding: 0.25rem 0;\n}\n\n.result-group-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n color: var(--mj-text-muted);\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-weight: 600;\n}\n\n.result-group-label {\n flex: 1;\n}\n\n.result-group-count {\n font-size: 0.72rem;\n color: var(--mj-text-disabled);\n}\n\n/* Result Items */\n.result-item {\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n padding: 0.6rem 1rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.result-item:hover,\n.result-item-highlighted {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Rows are focus stops (roving tabindex): the highlight background tracks focus,\n so suppress the default outline but keep a ring for keyboard :focus-visible. */\n.result-item:focus {\n outline: none;\n}\n.result-item:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: -2px;\n}\n.search-recent-item:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: -2px;\n}\n\n.result-item-icon {\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n flex-shrink: 0;\n margin-top: 0.1rem;\n}\n\n.result-item-content {\n flex: 1;\n min-width: 0;\n}\n\n.result-item-title {\n color: var(--mj-text-primary);\n font-weight: 500;\n font-size: 0.9rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.result-item-snippet {\n color: var(--mj-text-muted);\n font-size: 0.8rem;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n margin-top: 0.15rem;\n}\n\n.result-item-tags {\n display: flex;\n gap: 0.3rem;\n margin-top: 0.3rem;\n}\n\n.result-tag {\n display: inline-block;\n padding: 0.1rem 0.4rem;\n border-radius: 4px;\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n}\n\n.result-item-score {\n flex-shrink: 0;\n margin-top: 0.2rem;\n}\n\n.score-badge {\n display: inline-block;\n padding: 0.15rem 0.45rem;\n border-radius: 9999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 0.72rem;\n font-weight: 600;\n}\n\n/* Footer */\n.search-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.search-footer-count {\n color: var(--mj-text-muted);\n font-size: 0.78rem;\n}\n\n.search-footer-actions {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n}\n\n/* \"See all results\" \u2014 hand-off to the full Search Results workspace.\n Padding/font-size mirror the sibling .agent-cta-btn-small so the footer\n buttons read as one row. */\n.see-all-btn {\n display: inline-flex;\n align-items: center;\n gap: var(--mj-space-1-5);\n padding: 0.35rem 0.8rem;\n border-radius: var(--mj-radius-md);\n border: 1px solid var(--mj-border-default);\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: var(--mj-font-medium);\n cursor: pointer;\n transition: var(--mj-transition-colors);\n}\n\n.see-all-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n}\n\n/* Agent CTA Button */\n.agent-cta-btn {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.6rem 1.2rem;\n border-radius: 8px;\n border: none;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 0.85rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.agent-cta-btn:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.agent-cta-btn-small {\n padding: 0.35rem 0.8rem;\n font-size: 0.78rem;\n}\n\n/* Mobile responsive */\n@media (max-width: 640px) {\n .search-spotlight {\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n transform: none;\n width: 100%;\n max-width: 100%;\n height: 100dvh;\n max-height: 100dvh;\n border-radius: 0;\n animation: none; /* spotlightIn animates a translateX(-50%) that no longer applies */\n }\n\n /* Full-height sheet: results absorb all remaining space (container is flex-column). */\n .search-results-area {\n flex: 1;\n min-height: 0;\n max-height: none;\n }\n\n /* Filter chips: single scrollable row with breathing room \u2014 desktop spacing\n reads cramped and tall at phone widths. */\n .search-filter-bar {\n overflow-x: auto;\n flex-wrap: nowrap;\n -webkit-overflow-scrolling: touch;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n align-items: center;\n }\n\n .search-filter-bar .filter-chip,\n .search-filter-bar .filter-clear-btn {\n flex-shrink: 0; /* no squishing inside the scroll row */\n padding: 0.25rem 0.7rem;\n line-height: 1.2;\n font-size: 0.75rem;\n }\n\n /* Keyboard hint is meaningless on touch (parity with the palette). */\n .search-shortcut-hint {\n display: none;\n }\n\n /* Touch-friendly hit areas: the \u2715 close and the promo controls are primary\n interactive elements on a full-height touch sheet \u2014 a mis-hit on a tiny\n dismiss that lands on \"Turn on\" is the worst failure mode. */\n .search-close-btn {\n width: 40px;\n height: 40px;\n font-size: var(--mj-text-base);\n }\n .search-promo {\n gap: var(--mj-space-3);\n }\n .search-promo-action {\n padding: 0.6rem 1rem;\n }\n .search-promo-dismiss {\n width: 40px;\n height: 40px;\n font-size: var(--mj-text-sm);\n }\n}\n\n/* Host-supplied promo strip \u2014 a quiet whisper pinned to the overlay's bottom\n edge, never a banner. */\n.search-promo {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-2) var(--mj-space-4);\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.search-promo-icon {\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.search-promo-text {\n flex: 1;\n min-width: 0;\n}\n\n.search-promo-action {\n flex-shrink: 0;\n padding: 0.2rem 0.6rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.75rem;\n font-weight: var(--mj-font-medium);\n cursor: pointer;\n transition: var(--mj-transition-colors);\n}\n\n.search-promo-action:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n}\n\n.search-promo-dismiss {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n padding: 0;\n border: none;\n border-radius: var(--mj-radius-full);\n background: transparent;\n color: var(--mj-text-disabled);\n font-size: 0.75rem;\n cursor: pointer;\n transition: var(--mj-transition-colors);\n flex-shrink: 0;\n}\n\n.search-promo-dismiss:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n"] }]
|
|
759
954
|
}], null, { searchInputRef: [{
|
|
760
955
|
type: ViewChild,
|
|
761
956
|
args: ['searchInput']
|
|
@@ -777,6 +972,14 @@ export class SearchOverlayComponent {
|
|
|
777
972
|
type: Input
|
|
778
973
|
}], EnableStreaming: [{
|
|
779
974
|
type: Input
|
|
975
|
+
}], EnableGlobalShortcut: [{
|
|
976
|
+
type: Input
|
|
977
|
+
}], ShowPromo: [{
|
|
978
|
+
type: Input
|
|
979
|
+
}], PromoText: [{
|
|
980
|
+
type: Input
|
|
981
|
+
}], PromoActionLabel: [{
|
|
982
|
+
type: Input
|
|
780
983
|
}], IsOpenChange: [{
|
|
781
984
|
type: Output
|
|
782
985
|
}], ResultSelected: [{
|
|
@@ -787,6 +990,12 @@ export class SearchOverlayComponent {
|
|
|
787
990
|
type: Output
|
|
788
991
|
}], AgentCtaClicked: [{
|
|
789
992
|
type: Output
|
|
993
|
+
}], SeeAllRequested: [{
|
|
994
|
+
type: Output
|
|
995
|
+
}], PromoAccepted: [{
|
|
996
|
+
type: Output
|
|
997
|
+
}], PromoDismissed: [{
|
|
998
|
+
type: Output
|
|
790
999
|
}], HandleGlobalKeydown: [{
|
|
791
1000
|
type: HostListener,
|
|
792
1001
|
args: ['document:keydown', ['$event']]
|