@memberjunction/ng-search 5.24.0 → 5.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/__tests__/search-types.test.js +6 -2
  2. package/dist/__tests__/search-types.test.js.map +1 -1
  3. package/dist/__tests__/search.service.test.js +25 -18
  4. package/dist/__tests__/search.service.test.js.map +1 -1
  5. package/dist/lib/module.d.ts +7 -4
  6. package/dist/lib/module.d.ts.map +1 -1
  7. package/dist/lib/module.js +19 -4
  8. package/dist/lib/module.js.map +1 -1
  9. package/dist/lib/search-composite.component.d.ts +79 -0
  10. package/dist/lib/search-composite.component.d.ts.map +1 -0
  11. package/dist/lib/search-composite.component.js +258 -0
  12. package/dist/lib/search-composite.component.js.map +1 -0
  13. package/dist/lib/search-filter.component.d.ts +14 -1
  14. package/dist/lib/search-filter.component.d.ts.map +1 -1
  15. package/dist/lib/search-filter.component.js +128 -26
  16. package/dist/lib/search-filter.component.js.map +1 -1
  17. package/dist/lib/search-input.component.d.ts +61 -0
  18. package/dist/lib/search-input.component.d.ts.map +1 -0
  19. package/dist/lib/search-input.component.js +192 -0
  20. package/dist/lib/search-input.component.js.map +1 -0
  21. package/dist/lib/search-overlay.component.js +2 -2
  22. package/dist/lib/search-results.component.d.ts +9 -5
  23. package/dist/lib/search-results.component.d.ts.map +1 -1
  24. package/dist/lib/search-results.component.js +117 -98
  25. package/dist/lib/search-results.component.js.map +1 -1
  26. package/dist/lib/search-suggest.component.d.ts +95 -0
  27. package/dist/lib/search-suggest.component.d.ts.map +1 -0
  28. package/dist/lib/search-suggest.component.js +491 -0
  29. package/dist/lib/search-suggest.component.js.map +1 -0
  30. package/dist/lib/search-types.d.ts +27 -1
  31. package/dist/lib/search-types.d.ts.map +1 -1
  32. package/dist/lib/search-types.js.map +1 -1
  33. package/dist/lib/search.service.d.ts +27 -5
  34. package/dist/lib/search.service.d.ts.map +1 -1
  35. package/dist/lib/search.service.js +221 -92
  36. package/dist/lib/search.service.js.map +1 -1
  37. package/dist/public-api.d.ts +3 -0
  38. package/dist/public-api.d.ts.map +1 -1
  39. package/dist/public-api.js +3 -0
  40. package/dist/public-api.js.map +1 -1
  41. package/package.json +6 -4
@@ -192,17 +192,15 @@ function SearchResultsComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
192
192
  i0.ɵɵadvance();
193
193
  i0.ɵɵconditional(ctx_r0.DisplayMode === "flat" ? 1 : 2);
194
194
  } }
195
- function SearchResultsComponent_ng_template_3_Conditional_9_For_2_Template(rf, ctx) { if (rf & 1) {
196
- i0.ɵɵelementStart(0, "span", 41);
197
- i0.ɵɵtext(1);
198
- i0.ɵɵelementEnd();
195
+ function SearchResultsComponent_ng_template_3_Conditional_7_For_2_Template(rf, ctx) { if (rf & 1) {
196
+ i0.ɵɵelement(0, "span", 40);
199
197
  } if (rf & 2) {
200
198
  const tag_r13 = ctx.$implicit;
201
- i0.ɵɵadvance();
202
- i0.ɵɵtextInterpolate(tag_r13);
199
+ const ctx_r0 = i0.ɵɵnextContext(3);
200
+ i0.ɵɵproperty("innerHTML", ctx_r0.HighlightMatch(tag_r13), i0.ɵɵsanitizeHtml);
203
201
  } }
204
- function SearchResultsComponent_ng_template_3_Conditional_9_Conditional_3_Template(rf, ctx) { if (rf & 1) {
205
- i0.ɵɵelementStart(0, "span", 42);
202
+ function SearchResultsComponent_ng_template_3_Conditional_7_Conditional_3_Template(rf, ctx) { if (rf & 1) {
203
+ i0.ɵɵelementStart(0, "span", 41);
206
204
  i0.ɵɵtext(1);
207
205
  i0.ɵɵelementEnd();
208
206
  } if (rf & 2) {
@@ -210,10 +208,10 @@ function SearchResultsComponent_ng_template_3_Conditional_9_Conditional_3_Templa
210
208
  i0.ɵɵadvance();
211
209
  i0.ɵɵtextInterpolate1("+", result_r12.Tags.length - 5);
212
210
  } }
213
- function SearchResultsComponent_ng_template_3_Conditional_9_Template(rf, ctx) { if (rf & 1) {
211
+ function SearchResultsComponent_ng_template_3_Conditional_7_Template(rf, ctx) { if (rf & 1) {
214
212
  i0.ɵɵelementStart(0, "div", 33);
215
- i0.ɵɵrepeaterCreate(1, SearchResultsComponent_ng_template_3_Conditional_9_For_2_Template, 2, 1, "span", 41, i0.ɵɵrepeaterTrackByIdentity);
216
- i0.ɵɵconditionalCreate(3, SearchResultsComponent_ng_template_3_Conditional_9_Conditional_3_Template, 2, 1, "span", 42);
213
+ i0.ɵɵrepeaterCreate(1, SearchResultsComponent_ng_template_3_Conditional_7_For_2_Template, 1, 1, "span", 40, i0.ɵɵrepeaterTrackByIdentity);
214
+ i0.ɵɵconditionalCreate(3, SearchResultsComponent_ng_template_3_Conditional_7_Conditional_3_Template, 2, 1, "span", 41);
217
215
  i0.ɵɵelementEnd();
218
216
  } if (rf & 2) {
219
217
  const result_r12 = i0.ɵɵnextContext().$implicit;
@@ -222,48 +220,50 @@ function SearchResultsComponent_ng_template_3_Conditional_9_Template(rf, ctx) {
222
220
  i0.ɵɵadvance(2);
223
221
  i0.ɵɵconditional(result_r12.Tags.length > 5 ? 3 : -1);
224
222
  } }
225
- function SearchResultsComponent_ng_template_3_Conditional_10_Template(rf, ctx) { if (rf & 1) {
226
- i0.ɵɵelementStart(0, "div", 34)(1, "div", 43)(2, "span", 44);
223
+ function SearchResultsComponent_ng_template_3_Conditional_8_Template(rf, ctx) { if (rf & 1) {
224
+ i0.ɵɵelementStart(0, "div", 34)(1, "div", 42)(2, "span", 43);
227
225
  i0.ɵɵtext(3);
228
226
  i0.ɵɵelementEnd()()();
229
227
  } if (rf & 2) {
230
228
  const result_r12 = i0.ɵɵnextContext().$implicit;
231
229
  const ctx_r0 = i0.ɵɵnextContext();
232
- i0.ɵɵadvance(3);
230
+ i0.ɵɵadvance();
231
+ i0.ɵɵclassProp("score-high", result_r12.Score >= 0.4)("score-medium", result_r12.Score >= 0.15 && result_r12.Score < 0.4)("score-low", result_r12.Score < 0.15);
232
+ i0.ɵɵadvance(2);
233
233
  i0.ɵɵtextInterpolate(ctx_r0.FormatScore(result_r12.Score));
234
234
  } }
235
- function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_1_Template(rf, ctx) { if (rf & 1) {
236
- i0.ɵɵelementStart(0, "div", 45)(1, "span", 58);
235
+ function SearchResultsComponent_ng_template_3_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
236
+ i0.ɵɵelementStart(0, "div", 44)(1, "span", 57);
237
237
  i0.ɵɵtext(2, "Preview");
238
238
  i0.ɵɵelementEnd();
239
- i0.ɵɵelementStart(3, "p", 59);
240
- i0.ɵɵtext(4);
241
- i0.ɵɵelementEnd()();
239
+ i0.ɵɵelement(3, "p", 58);
240
+ i0.ɵɵelementEnd();
242
241
  } if (rf & 2) {
243
242
  const result_r12 = i0.ɵɵnextContext(2).$implicit;
244
- i0.ɵɵadvance(4);
245
- i0.ɵɵtextInterpolate(result_r12.Snippet);
243
+ const ctx_r0 = i0.ɵɵnextContext();
244
+ i0.ɵɵadvance(3);
245
+ i0.ɵɵproperty("innerHTML", ctx_r0.HighlightMatch(result_r12.Snippet), i0.ɵɵsanitizeHtml);
246
246
  } }
247
- function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_15_Conditional_3_Template(rf, ctx) { if (rf & 1) {
247
+ function SearchResultsComponent_ng_template_3_Conditional_14_Conditional_15_Conditional_3_Template(rf, ctx) { if (rf & 1) {
248
248
  i0.ɵɵtext(0);
249
249
  } if (rf & 2) {
250
250
  const result_r12 = i0.ɵɵnextContext(3).$implicit;
251
251
  const ctx_r0 = i0.ɵɵnextContext();
252
252
  i0.ɵɵtextInterpolate1(" Vector: ", ctx_r0.FormatScore(result_r12.ScoreBreakdown.Vector), " ");
253
253
  } }
254
- function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_15_Conditional_4_Template(rf, ctx) { if (rf & 1) {
254
+ function SearchResultsComponent_ng_template_3_Conditional_14_Conditional_15_Conditional_4_Template(rf, ctx) { if (rf & 1) {
255
255
  i0.ɵɵtext(0);
256
256
  } if (rf & 2) {
257
257
  const result_r12 = i0.ɵɵnextContext(3).$implicit;
258
258
  const ctx_r0 = i0.ɵɵnextContext();
259
259
  i0.ɵɵtextInterpolate1(" FTS: ", ctx_r0.FormatScore(result_r12.ScoreBreakdown.FullText), " ");
260
260
  } }
261
- function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_15_Template(rf, ctx) { if (rf & 1) {
262
- i0.ɵɵelementStart(0, "div", 47);
263
- i0.ɵɵelement(1, "i", 60);
261
+ function SearchResultsComponent_ng_template_3_Conditional_14_Conditional_15_Template(rf, ctx) { if (rf & 1) {
262
+ i0.ɵɵelementStart(0, "div", 46);
263
+ i0.ɵɵelement(1, "i", 59);
264
264
  i0.ɵɵelementStart(2, "span");
265
- i0.ɵɵconditionalCreate(3, SearchResultsComponent_ng_template_3_Conditional_16_Conditional_15_Conditional_3_Template, 1, 1);
266
- i0.ɵɵconditionalCreate(4, SearchResultsComponent_ng_template_3_Conditional_16_Conditional_15_Conditional_4_Template, 1, 1);
265
+ i0.ɵɵconditionalCreate(3, SearchResultsComponent_ng_template_3_Conditional_14_Conditional_15_Conditional_3_Template, 1, 1);
266
+ i0.ɵɵconditionalCreate(4, SearchResultsComponent_ng_template_3_Conditional_14_Conditional_15_Conditional_4_Template, 1, 1);
267
267
  i0.ɵɵelementEnd()();
268
268
  } if (rf & 2) {
269
269
  const result_r12 = i0.ɵɵnextContext(2).$implicit;
@@ -272,29 +272,27 @@ function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_15_Temp
272
272
  i0.ɵɵadvance();
273
273
  i0.ɵɵconditional(result_r12.ScoreBreakdown.FullText ? 4 : -1);
274
274
  } }
275
- function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_16_For_2_Template(rf, ctx) { if (rf & 1) {
276
- i0.ɵɵelementStart(0, "span", 61);
277
- i0.ɵɵtext(1);
278
- i0.ɵɵelementEnd();
275
+ function SearchResultsComponent_ng_template_3_Conditional_14_Conditional_16_For_2_Template(rf, ctx) { if (rf & 1) {
276
+ i0.ɵɵelement(0, "span", 60);
279
277
  } if (rf & 2) {
280
278
  const tag_r15 = ctx.$implicit;
281
- i0.ɵɵadvance();
282
- i0.ɵɵtextInterpolate(tag_r15);
279
+ const ctx_r0 = i0.ɵɵnextContext(4);
280
+ i0.ɵɵproperty("innerHTML", ctx_r0.HighlightMatch(tag_r15), i0.ɵɵsanitizeHtml);
283
281
  } }
284
- function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_16_Template(rf, ctx) { if (rf & 1) {
285
- i0.ɵɵelementStart(0, "div", 52);
286
- i0.ɵɵrepeaterCreate(1, SearchResultsComponent_ng_template_3_Conditional_16_Conditional_16_For_2_Template, 2, 1, "span", 61, i0.ɵɵrepeaterTrackByIdentity);
282
+ function SearchResultsComponent_ng_template_3_Conditional_14_Conditional_16_Template(rf, ctx) { if (rf & 1) {
283
+ i0.ɵɵelementStart(0, "div", 51);
284
+ i0.ɵɵrepeaterCreate(1, SearchResultsComponent_ng_template_3_Conditional_14_Conditional_16_For_2_Template, 1, 1, "span", 60, i0.ɵɵrepeaterTrackByIdentity);
287
285
  i0.ɵɵelementEnd();
288
286
  } if (rf & 2) {
289
287
  const result_r12 = i0.ɵɵnextContext(2).$implicit;
290
288
  i0.ɵɵadvance();
291
289
  i0.ɵɵrepeater(result_r12.Tags);
292
290
  } }
293
- function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_17_For_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
291
+ function SearchResultsComponent_ng_template_3_Conditional_14_Conditional_17_For_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
294
292
  const _r16 = i0.ɵɵgetCurrentView();
295
- i0.ɵɵelementStart(0, "a", 64);
296
- i0.ɵɵlistener("click", function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_17_For_2_Conditional_0_Template_a_click_0_listener($event) { i0.ɵɵrestoreView(_r16); return i0.ɵɵresetView($event.stopPropagation()); });
297
- i0.ɵɵelement(1, "i", 37);
293
+ i0.ɵɵelementStart(0, "a", 63);
294
+ i0.ɵɵlistener("click", function SearchResultsComponent_ng_template_3_Conditional_14_Conditional_17_For_2_Conditional_0_Template_a_click_0_listener($event) { i0.ɵɵrestoreView(_r16); return i0.ɵɵresetView($event.stopPropagation()); });
295
+ i0.ɵɵelement(1, "i", 64);
298
296
  i0.ɵɵtext(2);
299
297
  i0.ɵɵelementEnd();
300
298
  } if (rf & 2) {
@@ -304,10 +302,10 @@ function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_17_For_
304
302
  i0.ɵɵadvance(2);
305
303
  i0.ɵɵtextInterpolate1(" ", ctx_r0.TruncateUrl(link_r17.Value), " ");
306
304
  } }
307
- function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_17_For_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
305
+ function SearchResultsComponent_ng_template_3_Conditional_14_Conditional_17_For_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
308
306
  const _r18 = i0.ɵɵgetCurrentView();
309
307
  i0.ɵɵelementStart(0, "a", 65);
310
- i0.ɵɵlistener("click", function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_17_For_2_Conditional_1_Template_a_click_0_listener($event) { i0.ɵɵrestoreView(_r18); return i0.ɵɵresetView($event.stopPropagation()); });
308
+ i0.ɵɵlistener("click", function SearchResultsComponent_ng_template_3_Conditional_14_Conditional_17_For_2_Conditional_1_Template_a_click_0_listener($event) { i0.ɵɵrestoreView(_r18); return i0.ɵɵresetView($event.stopPropagation()); });
311
309
  i0.ɵɵelement(1, "i", 66);
312
310
  i0.ɵɵtext(2);
313
311
  i0.ɵɵelementEnd();
@@ -317,15 +315,15 @@ function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_17_For_
317
315
  i0.ɵɵadvance(2);
318
316
  i0.ɵɵtextInterpolate1(" ", link_r17.Value, " ");
319
317
  } }
320
- function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_17_For_2_Template(rf, ctx) { if (rf & 1) {
321
- i0.ɵɵconditionalCreate(0, SearchResultsComponent_ng_template_3_Conditional_16_Conditional_17_For_2_Conditional_0_Template, 3, 2, "a", 62)(1, SearchResultsComponent_ng_template_3_Conditional_16_Conditional_17_For_2_Conditional_1_Template, 3, 2, "a", 63);
318
+ function SearchResultsComponent_ng_template_3_Conditional_14_Conditional_17_For_2_Template(rf, ctx) { if (rf & 1) {
319
+ i0.ɵɵconditionalCreate(0, SearchResultsComponent_ng_template_3_Conditional_14_Conditional_17_For_2_Conditional_0_Template, 3, 2, "a", 61)(1, SearchResultsComponent_ng_template_3_Conditional_14_Conditional_17_For_2_Conditional_1_Template, 3, 2, "a", 62);
322
320
  } if (rf & 2) {
323
321
  const link_r17 = ctx.$implicit;
324
322
  i0.ɵɵconditional(link_r17.Type === "URL" ? 0 : link_r17.Type === "Email" ? 1 : -1);
325
323
  } }
326
- function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_17_Template(rf, ctx) { if (rf & 1) {
327
- i0.ɵɵelementStart(0, "div", 53);
328
- i0.ɵɵrepeaterCreate(1, SearchResultsComponent_ng_template_3_Conditional_16_Conditional_17_For_2_Template, 2, 1, null, null, _forTrack2);
324
+ function SearchResultsComponent_ng_template_3_Conditional_14_Conditional_17_Template(rf, ctx) { if (rf & 1) {
325
+ i0.ɵɵelementStart(0, "div", 52);
326
+ i0.ɵɵrepeaterCreate(1, SearchResultsComponent_ng_template_3_Conditional_14_Conditional_17_For_2_Template, 2, 1, null, null, _forTrack2);
329
327
  i0.ɵɵelementEnd();
330
328
  } if (rf & 2) {
331
329
  const result_r12 = i0.ɵɵnextContext(2).$implicit;
@@ -333,37 +331,44 @@ function SearchResultsComponent_ng_template_3_Conditional_16_Conditional_17_Temp
333
331
  i0.ɵɵadvance();
334
332
  i0.ɵɵrepeater(ctx_r0.GetResolvedLinks(result_r12));
335
333
  } }
336
- function SearchResultsComponent_ng_template_3_Conditional_16_Template(rf, ctx) { if (rf & 1) {
334
+ function SearchResultsComponent_ng_template_3_Conditional_14_Conditional_20_Template(rf, ctx) { if (rf & 1) {
335
+ i0.ɵɵelement(0, "i", 67);
336
+ i0.ɵɵtext(1, " Open File ");
337
+ } }
338
+ function SearchResultsComponent_ng_template_3_Conditional_14_Conditional_21_Template(rf, ctx) { if (rf & 1) {
339
+ i0.ɵɵelement(0, "i", 64);
340
+ i0.ɵɵtext(1, " Open Record ");
341
+ } }
342
+ function SearchResultsComponent_ng_template_3_Conditional_14_Template(rf, ctx) { if (rf & 1) {
337
343
  const _r14 = i0.ɵɵgetCurrentView();
338
- i0.ɵɵelementStart(0, "div", 40);
339
- i0.ɵɵconditionalCreate(1, SearchResultsComponent_ng_template_3_Conditional_16_Conditional_1_Template, 5, 1, "div", 45);
340
- i0.ɵɵelementStart(2, "div", 46)(3, "div", 47);
341
- i0.ɵɵelement(4, "i", 48);
344
+ i0.ɵɵelementStart(0, "div", 39);
345
+ i0.ɵɵconditionalCreate(1, SearchResultsComponent_ng_template_3_Conditional_14_Conditional_1_Template, 4, 1, "div", 44);
346
+ i0.ɵɵelementStart(2, "div", 45)(3, "div", 46);
347
+ i0.ɵɵelement(4, "i", 47);
342
348
  i0.ɵɵelementStart(5, "span");
343
349
  i0.ɵɵtext(6);
344
350
  i0.ɵɵelementEnd()();
345
- i0.ɵɵelementStart(7, "div", 47);
346
- i0.ɵɵelement(8, "i", 49);
347
- i0.ɵɵelementStart(9, "span", 50);
351
+ i0.ɵɵelementStart(7, "div", 46);
352
+ i0.ɵɵelement(8, "i", 48);
353
+ i0.ɵɵelementStart(9, "span", 49);
348
354
  i0.ɵɵtext(10);
349
355
  i0.ɵɵelementEnd()();
350
- i0.ɵɵelementStart(11, "div", 47);
351
- i0.ɵɵelement(12, "i", 51);
356
+ i0.ɵɵelementStart(11, "div", 46);
357
+ i0.ɵɵelement(12, "i", 50);
352
358
  i0.ɵɵelementStart(13, "span");
353
359
  i0.ɵɵtext(14);
354
360
  i0.ɵɵelementEnd()();
355
- i0.ɵɵconditionalCreate(15, SearchResultsComponent_ng_template_3_Conditional_16_Conditional_15_Template, 5, 2, "div", 47);
361
+ i0.ɵɵconditionalCreate(15, SearchResultsComponent_ng_template_3_Conditional_14_Conditional_15_Template, 5, 2, "div", 46);
356
362
  i0.ɵɵelementEnd();
357
- i0.ɵɵconditionalCreate(16, SearchResultsComponent_ng_template_3_Conditional_16_Conditional_16_Template, 3, 0, "div", 52);
358
- i0.ɵɵconditionalCreate(17, SearchResultsComponent_ng_template_3_Conditional_16_Conditional_17_Template, 3, 0, "div", 53);
359
- i0.ɵɵelementStart(18, "div", 54)(19, "button", 55);
360
- i0.ɵɵlistener("click", function SearchResultsComponent_ng_template_3_Conditional_16_Template_button_click_19_listener($event) { i0.ɵɵrestoreView(_r14); const result_r12 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnOpenRecord(result_r12, $event)); });
361
- i0.ɵɵelement(20, "i", 37);
362
- i0.ɵɵtext(21, " Open Record ");
363
+ i0.ɵɵconditionalCreate(16, SearchResultsComponent_ng_template_3_Conditional_14_Conditional_16_Template, 3, 0, "div", 51);
364
+ i0.ɵɵconditionalCreate(17, SearchResultsComponent_ng_template_3_Conditional_14_Conditional_17_Template, 3, 0, "div", 52);
365
+ i0.ɵɵelementStart(18, "div", 53)(19, "button", 54);
366
+ i0.ɵɵlistener("click", function SearchResultsComponent_ng_template_3_Conditional_14_Template_button_click_19_listener($event) { i0.ɵɵrestoreView(_r14); const result_r12 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnOpenRecord(result_r12, $event)); });
367
+ i0.ɵɵconditionalCreate(20, SearchResultsComponent_ng_template_3_Conditional_14_Conditional_20_Template, 2, 0)(21, SearchResultsComponent_ng_template_3_Conditional_14_Conditional_21_Template, 2, 0);
363
368
  i0.ɵɵelementEnd();
364
- i0.ɵɵelementStart(22, "button", 56);
365
- i0.ɵɵlistener("click", function SearchResultsComponent_ng_template_3_Conditional_16_Template_button_click_22_listener($event) { i0.ɵɵrestoreView(_r14); const result_r12 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnMoreLikeThis(result_r12, $event)); });
366
- i0.ɵɵelement(23, "i", 57);
369
+ i0.ɵɵelementStart(22, "button", 55);
370
+ i0.ɵɵlistener("click", function SearchResultsComponent_ng_template_3_Conditional_14_Template_button_click_22_listener($event) { i0.ɵɵrestoreView(_r14); const result_r12 = i0.ɵɵnextContext().$implicit; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnMoreLikeThis(result_r12, $event)); });
371
+ i0.ɵɵelement(23, "i", 56);
367
372
  i0.ɵɵtext(24, " See Similar Items ");
368
373
  i0.ɵɵelementEnd()()();
369
374
  } if (rf & 2) {
@@ -383,6 +388,8 @@ function SearchResultsComponent_ng_template_3_Conditional_16_Template(rf, ctx) {
383
388
  i0.ɵɵconditional(ctx_r0.ShowTags && result_r12.Tags.length > 0 ? 16 : -1);
384
389
  i0.ɵɵadvance();
385
390
  i0.ɵɵconditional(ctx_r0.GetResolvedLinks(result_r12).length > 0 ? 17 : -1);
391
+ i0.ɵɵadvance(3);
392
+ i0.ɵɵconditional(result_r12.ResultType === "storage-file" ? 20 : 21);
386
393
  } }
387
394
  function SearchResultsComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
388
395
  const _r11 = i0.ɵɵgetCurrentView();
@@ -391,24 +398,20 @@ function SearchResultsComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
391
398
  i0.ɵɵelementStart(2, "div", 29);
392
399
  i0.ɵɵelement(3, "i");
393
400
  i0.ɵɵelementEnd();
394
- i0.ɵɵelementStart(4, "div", 30)(5, "div", 31);
395
- i0.ɵɵtext(6);
396
- i0.ɵɵelementEnd();
397
- i0.ɵɵelementStart(7, "div", 32);
398
- i0.ɵɵtext(8);
399
- i0.ɵɵelementEnd();
400
- i0.ɵɵconditionalCreate(9, SearchResultsComponent_ng_template_3_Conditional_9_Template, 4, 1, "div", 33);
401
+ i0.ɵɵelementStart(4, "div", 30);
402
+ i0.ɵɵelement(5, "div", 31)(6, "div", 32);
403
+ i0.ɵɵconditionalCreate(7, SearchResultsComponent_ng_template_3_Conditional_7_Template, 4, 1, "div", 33);
401
404
  i0.ɵɵelementEnd();
402
- i0.ɵɵconditionalCreate(10, SearchResultsComponent_ng_template_3_Conditional_10_Template, 4, 1, "div", 34);
403
- i0.ɵɵelementStart(11, "div", 35)(12, "button", 36);
404
- i0.ɵɵlistener("click", function SearchResultsComponent_ng_template_3_Template_button_click_12_listener($event) { const result_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnOpenRecord(result_r12, $event)); });
405
- i0.ɵɵelement(13, "i", 37);
405
+ i0.ɵɵconditionalCreate(8, SearchResultsComponent_ng_template_3_Conditional_8_Template, 4, 7, "div", 34);
406
+ i0.ɵɵelementStart(9, "div", 35)(10, "button", 36);
407
+ i0.ɵɵlistener("click", function SearchResultsComponent_ng_template_3_Template_button_click_10_listener($event) { const result_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.OnOpenRecord(result_r12, $event)); });
408
+ i0.ɵɵelement(11, "i");
406
409
  i0.ɵɵelementEnd();
407
- i0.ɵɵelementStart(14, "button", 38);
408
- i0.ɵɵlistener("click", function SearchResultsComponent_ng_template_3_Template_button_click_14_listener($event) { const result_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.ToggleExpand(result_r12, $event)); });
409
- i0.ɵɵelement(15, "i", 39);
410
+ i0.ɵɵelementStart(12, "button", 37);
411
+ i0.ɵɵlistener("click", function SearchResultsComponent_ng_template_3_Template_button_click_12_listener($event) { const result_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.ToggleExpand(result_r12, $event)); });
412
+ i0.ɵɵelement(13, "i", 38);
410
413
  i0.ɵɵelementEnd()()();
411
- i0.ɵɵconditionalCreate(16, SearchResultsComponent_ng_template_3_Conditional_16_Template, 25, 7, "div", 40);
414
+ i0.ɵɵconditionalCreate(14, SearchResultsComponent_ng_template_3_Conditional_14_Template, 25, 8, "div", 39);
412
415
  i0.ɵɵelementEnd();
413
416
  } if (rf & 2) {
414
417
  const result_r12 = ctx.$implicit;
@@ -416,18 +419,22 @@ function SearchResultsComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
416
419
  i0.ɵɵclassProp("result-card-expanded", ctx_r0.IsExpanded(result_r12.ID));
417
420
  i0.ɵɵadvance(3);
418
421
  i0.ɵɵclassMap(result_r12.EntityIcon || result_r12.SourceIcon || "fa-solid fa-database");
419
- i0.ɵɵadvance(3);
420
- i0.ɵɵtextInterpolate(result_r12.RecordName || result_r12.Title);
421
422
  i0.ɵɵadvance(2);
422
- i0.ɵɵtextInterpolate(result_r12.EntityName);
423
+ i0.ɵɵproperty("innerHTML", ctx_r0.HighlightMatch(result_r12.RecordName || result_r12.Title), i0.ɵɵsanitizeHtml);
423
424
  i0.ɵɵadvance();
424
- i0.ɵɵconditional(result_r12.Tags && result_r12.Tags.length > 0 ? 9 : -1);
425
+ i0.ɵɵproperty("innerHTML", ctx_r0.HighlightMatch(result_r12.EntityName), i0.ɵɵsanitizeHtml);
425
426
  i0.ɵɵadvance();
426
- i0.ɵɵconditional(ctx_r0.ShowScores ? 10 : -1);
427
- i0.ɵɵadvance(5);
427
+ i0.ɵɵconditional(result_r12.Tags && result_r12.Tags.length > 0 ? 7 : -1);
428
+ i0.ɵɵadvance();
429
+ i0.ɵɵconditional(ctx_r0.ShowScores ? 8 : -1);
430
+ i0.ɵɵadvance(2);
431
+ i0.ɵɵproperty("title", result_r12.ResultType === "storage-file" ? "Open file" : "Open record");
432
+ i0.ɵɵadvance();
433
+ i0.ɵɵclassMap(result_r12.ResultType === "storage-file" ? "fa-solid fa-external-link" : "fa-solid fa-arrow-up-right-from-square");
434
+ i0.ɵɵadvance(2);
428
435
  i0.ɵɵclassProp("fa-chevron-down", !ctx_r0.IsExpanded(result_r12.ID))("fa-chevron-up", ctx_r0.IsExpanded(result_r12.ID));
429
436
  i0.ɵɵadvance();
430
- i0.ɵɵconditional(ctx_r0.IsExpanded(result_r12.ID) ? 16 : -1);
437
+ i0.ɵɵconditional(ctx_r0.IsExpanded(result_r12.ID) ? 14 : -1);
431
438
  } }
432
439
  export class SearchResultsComponent {
433
440
  cdr = inject(ChangeDetectorRef);
@@ -455,6 +462,8 @@ export class SearchResultsComponent {
455
462
  ShowTags = true;
456
463
  /** Whether to show source type icons */
457
464
  ShowSourceIcons = true;
465
+ /** Text to highlight within result cards (e.g. from a client-side filter) */
466
+ HighlightText = '';
458
467
  ResultSelected = new EventEmitter();
459
468
  /** Emitted when user clicks "Open Record" — parent handles navigation */
460
469
  OpenRecordRequested = new EventEmitter();
@@ -556,16 +565,24 @@ export class SearchResultsComponent {
556
565
  /** Handle "Open Record" button click */
557
566
  OnOpenRecord(result, event) {
558
567
  event.stopPropagation();
559
- this.OpenRecordRequested.emit({
560
- EntityName: result.EntityName,
561
- RecordID: result.RecordID
562
- });
568
+ this.OpenRecordRequested.emit(result);
563
569
  }
564
570
  /** Handle "See Similar Items" button click — emits the result for a "more like this" search */
565
571
  OnMoreLikeThis(result, event) {
566
572
  event.stopPropagation();
567
573
  this.MoreLikeThisRequested.emit(result);
568
574
  }
575
+ /**
576
+ * Wrap substrings matching HighlightText in <mark> tags for visual emphasis.
577
+ * The input is regex-escaped so user text is treated as a literal string.
578
+ */
579
+ HighlightMatch(text) {
580
+ if (!this.HighlightText || !text)
581
+ return text;
582
+ const escaped = this.HighlightText.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
583
+ const regex = new RegExp(`(${escaped})`, 'gi');
584
+ return text.replace(regex, '<mark class="search-highlight">$1</mark>');
585
+ }
569
586
  /** Format a score as a percentage */
570
587
  FormatScore(score) {
571
588
  return `${Math.round(score * 100)}%`;
@@ -668,16 +685,16 @@ export class SearchResultsComponent {
668
685
  }
669
686
  }
670
687
  static ɵfac = function SearchResultsComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SearchResultsComponent)(); };
671
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SearchResultsComponent, selectors: [["mj-search-results"]], inputs: { ResultGroups: "ResultGroups", FlatResults: "FlatResults", DisplayMode: "DisplayMode", IsLoading: "IsLoading", TotalCount: "TotalCount", ElapsedMs: "ElapsedMs", MaxPerGroup: "MaxPerGroup", PageSize: "PageSize", ShowSummary: "ShowSummary", ShowScores: "ShowScores", ShowTags: "ShowTags", ShowSourceIcons: "ShowSourceIcons" }, outputs: { ResultSelected: "ResultSelected", OpenRecordRequested: "OpenRecordRequested", MoreLikeThisRequested: "MoreLikeThisRequested" }, standalone: false, decls: 5, vars: 1, consts: [["resultCardTpl", ""], [1, "results-loading"], [1, "results-empty"], ["text", "Searching...", "size", "medium"], [1, "fa-solid", "fa-search", "results-empty-icon"], [1, "results-empty-text"], [1, "results-summary"], [1, "results-summary-time"], [1, "results-scroll-area"], [1, "results-pager"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "pager-btn", "pager-prev", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-left"], [1, "pager-btn", "pager-next", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-right"], [1, "pager-ellipsis"], [1, "pager-btn", "pager-num", 3, "pager-active"], [1, "pager-btn", "pager-num", 3, "click"], [1, "results-group"], [1, "results-group-header", 3, "click"], [3, "class"], [1, "results-group-label"], [1, "results-group-count"], [1, "fa-solid", "results-group-chevron"], [1, "results-show-more"], [1, "results-show-more", 3, "click"], [1, "fa-solid", "fa-chevron-down"], [1, "result-card"], [1, "result-card-main", 3, "click"], [1, "result-card-icon-wrap"], [1, "result-card-body"], [1, "result-card-title"], [1, "result-card-entity"], [1, "result-card-tags"], [1, "result-card-score"], [1, "result-card-actions"], ["title", "Open record", 1, "result-open-btn", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square"], ["title", "Expand details", 1, "result-expand-btn", 3, "click"], [1, "fa-solid"], [1, "result-card-detail"], [1, "result-tag-chip"], [1, "result-tag-more"], [1, "score-circle"], [1, "score-value"], [1, "detail-section"], [1, "detail-meta"], [1, "detail-meta-item"], [1, "fa-solid", "fa-layer-group"], [1, "fa-solid", "fa-fingerprint"], [1, "detail-record-id"], [1, "fa-solid", "fa-signal"], [1, "detail-tags"], [1, "detail-links"], [1, "detail-actions"], [1, "detail-open-btn", 3, "click"], [1, "detail-similar-btn", 3, "click"], [1, "fa-solid", "fa-shuffle"], [1, "detail-label"], [1, "detail-snippet"], [1, "fa-solid", "fa-chart-bar"], [1, "result-card-tag"], ["target", "_blank", 1, "detail-link", 3, "href"], [1, "detail-link", "detail-link-email", 3, "href"], ["target", "_blank", 1, "detail-link", 3, "click", "href"], [1, "detail-link", "detail-link-email", 3, "click", "href"], [1, "fa-solid", "fa-envelope"]], template: function SearchResultsComponent_Template(rf, ctx) { if (rf & 1) {
688
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SearchResultsComponent, selectors: [["mj-search-results"]], inputs: { ResultGroups: "ResultGroups", FlatResults: "FlatResults", DisplayMode: "DisplayMode", IsLoading: "IsLoading", TotalCount: "TotalCount", ElapsedMs: "ElapsedMs", MaxPerGroup: "MaxPerGroup", PageSize: "PageSize", ShowSummary: "ShowSummary", ShowScores: "ShowScores", ShowTags: "ShowTags", ShowSourceIcons: "ShowSourceIcons", HighlightText: "HighlightText" }, outputs: { ResultSelected: "ResultSelected", OpenRecordRequested: "OpenRecordRequested", MoreLikeThisRequested: "MoreLikeThisRequested" }, standalone: false, decls: 5, vars: 1, consts: [["resultCardTpl", ""], [1, "results-loading"], [1, "results-empty"], ["text", "Searching...", "size", "medium"], [1, "fa-solid", "fa-search", "results-empty-icon"], [1, "results-empty-text"], [1, "results-summary"], [1, "results-summary-time"], [1, "results-scroll-area"], [1, "results-pager"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "pager-btn", "pager-prev", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-left"], [1, "pager-btn", "pager-next", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-right"], [1, "pager-ellipsis"], [1, "pager-btn", "pager-num", 3, "pager-active"], [1, "pager-btn", "pager-num", 3, "click"], [1, "results-group"], [1, "results-group-header", 3, "click"], [3, "class"], [1, "results-group-label"], [1, "results-group-count"], [1, "fa-solid", "results-group-chevron"], [1, "results-show-more"], [1, "results-show-more", 3, "click"], [1, "fa-solid", "fa-chevron-down"], [1, "result-card"], [1, "result-card-main", 3, "click"], [1, "result-card-icon-wrap"], [1, "result-card-body"], [1, "result-card-title", 3, "innerHTML"], [1, "result-card-entity", 3, "innerHTML"], [1, "result-card-tags"], [1, "result-card-score"], [1, "result-card-actions"], [1, "result-open-btn", 3, "click", "title"], ["title", "Expand details", 1, "result-expand-btn", 3, "click"], [1, "fa-solid"], [1, "result-card-detail"], [1, "result-tag-chip", 3, "innerHTML"], [1, "result-tag-more"], [1, "score-circle"], [1, "score-value"], [1, "detail-section"], [1, "detail-meta"], [1, "detail-meta-item"], [1, "fa-solid", "fa-layer-group"], [1, "fa-solid", "fa-fingerprint"], [1, "detail-record-id"], [1, "fa-solid", "fa-signal"], [1, "detail-tags"], [1, "detail-links"], [1, "detail-actions"], [1, "detail-open-btn", 3, "click"], [1, "detail-similar-btn", 3, "click"], [1, "fa-solid", "fa-shuffle"], [1, "detail-label"], [1, "detail-snippet", 3, "innerHTML"], [1, "fa-solid", "fa-chart-bar"], [1, "result-card-tag", 3, "innerHTML"], ["target", "_blank", 1, "detail-link", 3, "href"], [1, "detail-link", "detail-link-email", 3, "href"], ["target", "_blank", 1, "detail-link", 3, "click", "href"], [1, "fa-solid", "fa-arrow-up-right-from-square"], [1, "detail-link", "detail-link-email", 3, "click", "href"], [1, "fa-solid", "fa-envelope"], [1, "fa-solid", "fa-external-link"]], template: function SearchResultsComponent_Template(rf, ctx) { if (rf & 1) {
672
689
  i0.ɵɵconditionalCreate(0, SearchResultsComponent_Conditional_0_Template, 2, 0, "div", 1)(1, SearchResultsComponent_Conditional_1_Template, 4, 0, "div", 2)(2, SearchResultsComponent_Conditional_2_Template, 3, 2);
673
- i0.ɵɵtemplate(3, SearchResultsComponent_ng_template_3_Template, 17, 13, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
690
+ i0.ɵɵtemplate(3, SearchResultsComponent_ng_template_3_Template, 15, 16, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
674
691
  } if (rf & 2) {
675
692
  i0.ɵɵconditional(ctx.IsLoading ? 0 : (ctx.DisplayMode === "flat" ? ctx.FlatResults.length : ctx.ResultGroups.length) === 0 && ctx.TotalCount === 0 ? 1 : 2);
676
- } }, dependencies: [i1.NgTemplateOutlet, i2.LoadingComponent], styles: ["\n\n\n[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n min-height: 0;\n flex: 1;\n}\n\n.results-scroll-area[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n}\n\n.results-loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n padding: 3rem 1rem;\n}\n\n.results-empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1rem;\n gap: 0.5rem;\n}\n\n.results-empty-icon[_ngcontent-%COMP%] {\n font-size: 2rem;\n color: var(--mj-text-muted);\n margin-bottom: 0.5rem;\n}\n\n.results-empty-text[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.9rem;\n}\n\n.results-summary[_ngcontent-%COMP%] {\n padding: 0.75rem 1rem;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.results-summary-time[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.results-group[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.results-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.results-group-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.results-group-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n.results-group-label[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n.results-group-count[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.results-group-chevron[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n transition: transform 0.2s ease;\n}\n\n\n\n.result-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n margin: 0 0 0.35rem 1.5rem;\n overflow: hidden;\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n\n.result-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-default);\n}\n\n.result-card-expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.result-card-main[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.65rem 0.85rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.result-card-main[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.result-card-icon-wrap[_ngcontent-%COMP%] {\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\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.8rem;\n flex-shrink: 0;\n}\n\n.result-card-body[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.result-card-title[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 600;\n font-size: 0.85rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.result-card-entity[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n}\n\n.result-card-tags[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-top: 4px;\n}\n\n.result-tag-chip[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 1px 7px;\n border-radius: 10px;\n font-size: 0.65rem;\n font-weight: 500;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-border-default));\n}\n\n.result-tag-more[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 1px 6px;\n font-size: 0.6rem;\n color: var(--mj-text-muted);\n}\n\n.result-card-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.result-open-btn[_ngcontent-%COMP%], \n.result-expand-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 11px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.result-open-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.result-expand-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n\n\n.result-card-detail[_ngcontent-%COMP%] {\n padding: 0.75rem 1rem 0.85rem 3.5rem;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n}\n\n.detail-section[_ngcontent-%COMP%] {\n margin-bottom: 0.65rem;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 0.25rem;\n display: block;\n}\n\n.detail-snippet[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.82rem;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.detail-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 0.75rem;\n margin-bottom: 0.65rem;\n}\n\n.detail-meta-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.detail-meta-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.65rem;\n}\n\n.detail-record-id[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 0.7rem;\n max-width: 180px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.detail-tags[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-bottom: 0.65rem;\n}\n\n.detail-links[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-bottom: 8px;\n}\n\n.detail-link[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border-radius: 6px;\n font-size: 0.72rem;\n color: var(--mj-text-link);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-border-default));\n text-decoration: none;\n transition: background 0.15s ease;\n}\n\n.detail-link[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n text-decoration: underline;\n}\n\n.detail-link[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.6rem;\n}\n\n.detail-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.detail-open-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.detail-open-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.detail-similar-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 0.78rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.detail-similar-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.result-card-snippet[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.result-card-tags[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n margin-top: 0.35rem;\n}\n\n.result-card-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-card-tag-more[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.result-card-score[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-top: 0.2rem;\n}\n\n.score-circle[_ngcontent-%COMP%] {\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n}\n\n.score-value[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n\n\n.results-show-more[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.5rem 1rem;\n border: none;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.82rem;\n cursor: pointer;\n justify-content: center;\n transition: background 0.1s ease;\n}\n\n.results-show-more[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.results-pager[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 0.75rem 0;\n flex-shrink: 0;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n}\n\n.pager-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n padding: 0 6px;\n}\n\n.pager-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.pager-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.35;\n cursor: default;\n}\n\n.pager-active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.pager-active[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n color: var(--mj-text-inverse);\n}\n\n.pager-ellipsis[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n color: var(--mj-text-muted);\n font-size: 0.8rem;\n}\n\n.pager-prev[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.pager-next[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n}"] });
693
+ } }, dependencies: [i1.NgTemplateOutlet, i2.LoadingComponent], styles: ["\n\n\n[_nghost-%COMP%] {\n display: flex;\n flex-direction: column;\n min-height: 0;\n flex: 1;\n}\n\n.results-scroll-area[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n}\n\n.results-loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n padding: 3rem 1rem;\n}\n\n.results-empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1rem;\n gap: 0.5rem;\n}\n\n.results-empty-icon[_ngcontent-%COMP%] {\n font-size: 2rem;\n color: var(--mj-text-muted);\n margin-bottom: 0.5rem;\n}\n\n.results-empty-text[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.9rem;\n}\n\n.results-summary[_ngcontent-%COMP%] {\n padding: 0.75rem 1rem;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.results-summary-time[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.results-group[_ngcontent-%COMP%] {\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.results-group-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.results-group-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.results-group-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n.results-group-label[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n.results-group-count[_ngcontent-%COMP%] {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.results-group-chevron[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n transition: transform 0.2s ease;\n}\n\n\n\n.result-card[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n margin: 0 0 0.35rem 1.5rem;\n overflow: hidden;\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n\n.result-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-default);\n}\n\n.result-card-expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.result-card-main[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.65rem 0.85rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.result-card-main[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.result-card-icon-wrap[_ngcontent-%COMP%] {\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\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.8rem;\n flex-shrink: 0;\n}\n\n.result-card-body[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.result-card-title[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 600;\n font-size: 0.85rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.result-card-entity[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n}\n\n.result-card-tags[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-top: 4px;\n}\n\n.result-tag-chip[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 1px 7px;\n border-radius: 10px;\n font-size: 0.65rem;\n font-weight: 500;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-border-default));\n}\n\n.result-tag-more[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 1px 6px;\n font-size: 0.6rem;\n color: var(--mj-text-muted);\n}\n\n.result-card-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.result-open-btn[_ngcontent-%COMP%], \n.result-expand-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 11px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.result-open-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.result-expand-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n\n\n.result-card-detail[_ngcontent-%COMP%] {\n padding: 0.75rem 1rem 0.85rem 3.5rem;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n}\n\n.detail-section[_ngcontent-%COMP%] {\n margin-bottom: 0.65rem;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 0.25rem;\n display: block;\n}\n\n.detail-snippet[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.82rem;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.detail-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 0.75rem;\n margin-bottom: 0.65rem;\n}\n\n.detail-meta-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.detail-meta-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.65rem;\n}\n\n.detail-record-id[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 0.7rem;\n max-width: 180px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.detail-tags[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-bottom: 0.65rem;\n}\n\n.detail-links[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-bottom: 8px;\n}\n\n.detail-link[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border-radius: 6px;\n font-size: 0.72rem;\n color: var(--mj-text-link);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-border-default));\n text-decoration: none;\n transition: background 0.15s ease;\n}\n\n.detail-link[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n text-decoration: underline;\n}\n\n.detail-link[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.6rem;\n}\n\n.detail-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.detail-open-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.detail-open-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.detail-similar-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 0.78rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.detail-similar-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.result-card-snippet[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.result-card-tags[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n margin-top: 0.35rem;\n}\n\n.result-card-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-card-tag-more[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.result-card-score[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-top: 0.2rem;\n}\n\n.score-circle[_ngcontent-%COMP%] {\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n \n\n background: color-mix(in srgb, var(--mj-text-muted) 10%, var(--mj-bg-surface));\n border: 2px solid color-mix(in srgb, var(--mj-text-muted) 25%, var(--mj-bg-surface));\n}\n.score-circle.score-high[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-success) 40%, var(--mj-bg-surface));\n}\n.score-circle.score-medium[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-warning) 40%, var(--mj-bg-surface));\n}\n.score-circle.score-low[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-text-muted) 10%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-text-muted) 25%, var(--mj-bg-surface));\n}\n\n.score-value[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-secondary);\n}\n.score-high[_ngcontent-%COMP%] .score-value[_ngcontent-%COMP%] {\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n.score-medium[_ngcontent-%COMP%] .score-value[_ngcontent-%COMP%] {\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n.score-low[_ngcontent-%COMP%] .score-value[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n\n\n.results-show-more[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.5rem 1rem;\n border: none;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.82rem;\n cursor: pointer;\n justify-content: center;\n transition: background 0.1s ease;\n}\n\n.results-show-more[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n\n\n.results-pager[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 0.75rem 0;\n flex-shrink: 0;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n}\n\n.pager-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n padding: 0 6px;\n}\n\n.pager-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.pager-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.35;\n cursor: default;\n}\n\n.pager-active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.pager-active[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n color: var(--mj-text-inverse);\n}\n\n.pager-ellipsis[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n color: var(--mj-text-muted);\n font-size: 0.8rem;\n}\n\n.pager-prev[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.pager-next[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.7rem;\n}\n\n\n\n[_nghost-%COMP%] .search-highlight, \n.search-highlight[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 35%, transparent);\n color: inherit;\n padding: 1px 2px;\n border-radius: 2px;\n}"] });
677
694
  }
678
695
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SearchResultsComponent, [{
679
696
  type: Component,
680
- args: [{ standalone: false, selector: 'mj-search-results', template: "@if (IsLoading) {\n <div class=\"results-loading\">\n <mj-loading text=\"Searching...\" size=\"medium\"></mj-loading>\n </div>\n} @else if ((DisplayMode === 'flat' ? FlatResults.length : ResultGroups.length) === 0 && TotalCount === 0) {\n <div class=\"results-empty\">\n <i class=\"fa-solid fa-search results-empty-icon\"></i>\n <p class=\"results-empty-text\">No results to display</p>\n </div>\n} @else {\n <!-- Results summary -->\n @if (ShowSummary) {\n <div class=\"results-summary\">\n <span>{{ TotalCount }} results</span>\n @if (ElapsedMs > 0) {\n <span class=\"results-summary-time\"> in {{ FormatTime(ElapsedMs) }}</span>\n }\n </div>\n }\n\n @if (DisplayMode === 'flat') {\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 FLAT BLENDED LIST (sorted by score) \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"results-scroll-area\">\n @for (result of PagedResults; track result.ID) {\n <ng-container *ngTemplateOutlet=\"resultCardTpl; context: { $implicit: result }\"></ng-container>\n }\n </div>\n\n <!-- Google-style pagination (sticky at bottom) -->\n @if (TotalPages > 1) {\n <div class=\"results-pager\">\n <button class=\"pager-btn pager-prev\" [disabled]=\"CurrentPage === 1\"\n (click)=\"GoToPage(CurrentPage - 1)\">\n <i class=\"fa-solid fa-chevron-left\"></i>\n </button>\n @for (p of PageNumbers; track $index) {\n @if (p === -1) {\n <span class=\"pager-ellipsis\">...</span>\n } @else {\n <button class=\"pager-btn pager-num\" [class.pager-active]=\"p === CurrentPage\"\n (click)=\"GoToPage(p)\">{{ p }}</button>\n }\n }\n <button class=\"pager-btn pager-next\" [disabled]=\"CurrentPage === TotalPages\"\n (click)=\"GoToPage(CurrentPage + 1)\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n }\n } @else {\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 GROUPED BY SOURCE TYPE \u2550\u2550\u2550\u2550\u2550\u2550 -->\n @for (group of ResultGroups; track group.SourceType) {\n <div class=\"results-group\">\n <div class=\"results-group-header\" (click)=\"ToggleGroup(group.SourceType)\">\n @if (ShowSourceIcons) {\n <i [class]=\"group.Icon + ' results-group-icon'\"></i>\n }\n <span class=\"results-group-label\">{{ group.Label }}</span>\n <span class=\"results-group-count\">({{ group.TotalCount }})</span>\n <i class=\"fa-solid results-group-chevron\"\n [class.fa-chevron-down]=\"!IsGroupExpanded(group.SourceType)\"\n [class.fa-chevron-up]=\"IsGroupExpanded(group.SourceType)\"></i>\n </div>\n\n @for (result of GetVisibleResults(group); track result.ID) {\n <ng-container *ngTemplateOutlet=\"resultCardTpl; context: { $implicit: result }\"></ng-container>\n }\n\n @if (HasMoreResults(group)) {\n <button class=\"results-show-more\" (click)=\"ToggleGroup(group.SourceType)\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n Show {{ GetHiddenCount(group) }} more results\n </button>\n }\n </div>\n }\n }\n}\n\n<!-- \u2550\u2550\u2550 Shared result card template \u2550\u2550\u2550 -->\n<ng-template #resultCardTpl let-result>\n <div class=\"result-card\" [class.result-card-expanded]=\"IsExpanded(result.ID)\">\n <!-- Main row -->\n <div class=\"result-card-main\" (click)=\"ToggleExpand(result)\">\n <div class=\"result-card-icon-wrap\">\n <i [class]=\"result.EntityIcon || result.SourceIcon || 'fa-solid fa-database'\"></i>\n </div>\n <div class=\"result-card-body\">\n <div class=\"result-card-title\">{{ result.RecordName || result.Title }}</div>\n <div class=\"result-card-entity\">{{ result.EntityName }}</div>\n @if (result.Tags && result.Tags.length > 0) {\n <div class=\"result-card-tags\">\n @for (tag of result.Tags.slice(0, 5); track tag) {\n <span class=\"result-tag-chip\">{{ tag }}</span>\n }\n @if (result.Tags.length > 5) {\n <span class=\"result-tag-more\">+{{ result.Tags.length - 5 }}</span>\n }\n </div>\n }\n </div>\n @if (ShowScores) {\n <div class=\"result-card-score\">\n <div class=\"score-circle\">\n <span class=\"score-value\">{{ FormatScore(result.Score) }}</span>\n </div>\n </div>\n }\n <div class=\"result-card-actions\">\n <button class=\"result-open-btn\" (click)=\"OnOpenRecord(result, $event)\" title=\"Open record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </button>\n <button class=\"result-expand-btn\" (click)=\"ToggleExpand(result, $event)\" title=\"Expand details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!IsExpanded(result.ID)\"\n [class.fa-chevron-up]=\"IsExpanded(result.ID)\"></i>\n </button>\n </div>\n </div>\n\n <!-- Expanded detail -->\n @if (IsExpanded(result.ID)) {\n <div class=\"result-card-detail\">\n @if (result.Snippet) {\n <div class=\"detail-section\">\n <span class=\"detail-label\">Preview</span>\n <p class=\"detail-snippet\">{{ result.Snippet }}</p>\n </div>\n }\n <div class=\"detail-meta\">\n <div class=\"detail-meta-item\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <span>{{ result.EntityName }}</span>\n </div>\n <div class=\"detail-meta-item\">\n <i class=\"fa-solid fa-fingerprint\"></i>\n <span class=\"detail-record-id\">{{ result.RecordID }}</span>\n </div>\n <!-- SR-1: Show overall score consistently -->\n <div class=\"detail-meta-item\">\n <i class=\"fa-solid fa-signal\"></i>\n <span>Relevance: {{ FormatScore(result.Score) }}</span>\n </div>\n @if (result.ScoreBreakdown) {\n <div class=\"detail-meta-item\">\n <i class=\"fa-solid fa-chart-bar\"></i>\n <span>\n @if (result.ScoreBreakdown.Vector) { Vector: {{ FormatScore(result.ScoreBreakdown.Vector) }} }\n @if (result.ScoreBreakdown.FullText) { FTS: {{ FormatScore(result.ScoreBreakdown.FullText) }} }\n </span>\n </div>\n }\n </div>\n @if (ShowTags && result.Tags.length > 0) {\n <div class=\"detail-tags\">\n @for (tag of result.Tags; track tag) {\n <span class=\"result-card-tag\">{{ tag }}</span>\n }\n </div>\n }\n @if (GetResolvedLinks(result).length > 0) {\n <div class=\"detail-links\">\n @for (link of GetResolvedLinks(result); track link.Value) {\n @if (link.Type === 'URL') {\n <a [href]=\"link.Value\" target=\"_blank\" class=\"detail-link\" (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n {{ TruncateUrl(link.Value) }}\n </a>\n } @else if (link.Type === 'Email') {\n <a [href]=\"'mailto:' + link.Value\" class=\"detail-link detail-link-email\" (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-envelope\"></i>\n {{ link.Value }}\n </a>\n }\n }\n </div>\n }\n <div class=\"detail-actions\">\n <button class=\"detail-open-btn\" (click)=\"OnOpenRecord(result, $event)\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open Record\n </button>\n <button class=\"detail-similar-btn\" (click)=\"OnMoreLikeThis(result, $event)\">\n <i class=\"fa-solid fa-shuffle\"></i> See Similar Items\n </button>\n </div>\n </div>\n }\n </div>\n</ng-template>\n", styles: ["/* Search Results Component */\n\n:host {\n display: flex;\n flex-direction: column;\n min-height: 0;\n flex: 1;\n}\n\n.results-scroll-area {\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n}\n\n.results-loading {\n display: flex;\n justify-content: center;\n padding: 3rem 1rem;\n}\n\n.results-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1rem;\n gap: 0.5rem;\n}\n\n.results-empty-icon {\n font-size: 2rem;\n color: var(--mj-text-muted);\n margin-bottom: 0.5rem;\n}\n\n.results-empty-text {\n color: var(--mj-text-muted);\n font-size: 0.9rem;\n}\n\n.results-summary {\n padding: 0.75rem 1rem;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.results-summary-time {\n color: var(--mj-text-muted);\n}\n\n/* Group Header */\n.results-group {\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.results-group-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.results-group-header:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.results-group-icon {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n.results-group-label {\n font-weight: 600;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n.results-group-count {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.results-group-chevron {\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n transition: transform 0.2s ease;\n}\n\n/* Result Card \u2014 expandable */\n.result-card {\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n margin: 0 0 0.35rem 1.5rem;\n overflow: hidden;\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n\n.result-card:hover {\n border-color: var(--mj-border-default);\n}\n\n.result-card-expanded {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.result-card-main {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.65rem 0.85rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.result-card-main:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.result-card-icon-wrap {\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\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.8rem;\n flex-shrink: 0;\n}\n\n.result-card-body {\n flex: 1;\n min-width: 0;\n}\n\n.result-card-title {\n color: var(--mj-text-primary);\n font-weight: 600;\n font-size: 0.85rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.result-card-entity {\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n}\n\n.result-card-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-top: 4px;\n}\n\n.result-tag-chip {\n display: inline-block;\n padding: 1px 7px;\n border-radius: 10px;\n font-size: 0.65rem;\n font-weight: 500;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-border-default));\n}\n\n.result-tag-more {\n display: inline-block;\n padding: 1px 6px;\n font-size: 0.6rem;\n color: var(--mj-text-muted);\n}\n\n.result-card-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.result-open-btn,\n.result-expand-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 11px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.result-open-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.result-expand-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n/* Expanded detail panel */\n.result-card-detail {\n padding: 0.75rem 1rem 0.85rem 3.5rem;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n}\n\n.detail-section {\n margin-bottom: 0.65rem;\n}\n\n.detail-label {\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 0.25rem;\n display: block;\n}\n\n.detail-snippet {\n margin: 0;\n font-size: 0.82rem;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.detail-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 0.75rem;\n margin-bottom: 0.65rem;\n}\n\n.detail-meta-item {\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.detail-meta-item i {\n font-size: 0.65rem;\n}\n\n.detail-record-id {\n font-family: monospace;\n font-size: 0.7rem;\n max-width: 180px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.detail-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-bottom: 0.65rem;\n}\n\n.detail-links {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-bottom: 8px;\n}\n\n.detail-link {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border-radius: 6px;\n font-size: 0.72rem;\n color: var(--mj-text-link);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-border-default));\n text-decoration: none;\n transition: background 0.15s ease;\n}\n\n.detail-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n text-decoration: underline;\n}\n\n.detail-link i {\n font-size: 0.6rem;\n}\n\n.detail-actions {\n display: flex;\n gap: 8px;\n}\n\n.detail-open-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.detail-open-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.detail-similar-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 0.78rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.detail-similar-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.result-card-snippet {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.result-card-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n margin-top: 0.35rem;\n}\n\n.result-card-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-card-tag-more {\n color: var(--mj-brand-primary);\n}\n\n.result-card-score {\n flex-shrink: 0;\n margin-top: 0.2rem;\n}\n\n.score-circle {\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 30%, var(--mj-bg-surface));\n}\n\n.score-value {\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-brand-primary);\n}\n\n/* Show More Button */\n.results-show-more {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.5rem 1rem;\n border: none;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.82rem;\n cursor: pointer;\n justify-content: center;\n transition: background 0.1s ease;\n}\n\n.results-show-more:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Google-style Pagination \u2014 pinned at bottom */\n.results-pager {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 0.75rem 0;\n flex-shrink: 0;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n}\n\n.pager-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n padding: 0 6px;\n}\n\n.pager-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.pager-btn:disabled {\n opacity: 0.35;\n cursor: default;\n}\n\n.pager-active {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.pager-active:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n color: var(--mj-text-inverse);\n}\n\n.pager-ellipsis {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n color: var(--mj-text-muted);\n font-size: 0.8rem;\n}\n\n.pager-prev i,\n.pager-next i {\n font-size: 0.7rem;\n}\n"] }]
697
+ args: [{ standalone: false, selector: 'mj-search-results', template: "@if (IsLoading) {\n <div class=\"results-loading\">\n <mj-loading text=\"Searching...\" size=\"medium\"></mj-loading>\n </div>\n} @else if ((DisplayMode === 'flat' ? FlatResults.length : ResultGroups.length) === 0 && TotalCount === 0) {\n <div class=\"results-empty\">\n <i class=\"fa-solid fa-search results-empty-icon\"></i>\n <p class=\"results-empty-text\">No results to display</p>\n </div>\n} @else {\n <!-- Results summary -->\n @if (ShowSummary) {\n <div class=\"results-summary\">\n <span>{{ TotalCount }} results</span>\n @if (ElapsedMs > 0) {\n <span class=\"results-summary-time\"> in {{ FormatTime(ElapsedMs) }}</span>\n }\n </div>\n }\n\n @if (DisplayMode === 'flat') {\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 FLAT BLENDED LIST (sorted by score) \u2550\u2550\u2550\u2550\u2550\u2550 -->\n <div class=\"results-scroll-area\">\n @for (result of PagedResults; track result.ID) {\n <ng-container *ngTemplateOutlet=\"resultCardTpl; context: { $implicit: result }\"></ng-container>\n }\n </div>\n\n <!-- Google-style pagination (sticky at bottom) -->\n @if (TotalPages > 1) {\n <div class=\"results-pager\">\n <button class=\"pager-btn pager-prev\" [disabled]=\"CurrentPage === 1\"\n (click)=\"GoToPage(CurrentPage - 1)\">\n <i class=\"fa-solid fa-chevron-left\"></i>\n </button>\n @for (p of PageNumbers; track $index) {\n @if (p === -1) {\n <span class=\"pager-ellipsis\">...</span>\n } @else {\n <button class=\"pager-btn pager-num\" [class.pager-active]=\"p === CurrentPage\"\n (click)=\"GoToPage(p)\">{{ p }}</button>\n }\n }\n <button class=\"pager-btn pager-next\" [disabled]=\"CurrentPage === TotalPages\"\n (click)=\"GoToPage(CurrentPage + 1)\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </button>\n </div>\n }\n } @else {\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550 GROUPED BY SOURCE TYPE \u2550\u2550\u2550\u2550\u2550\u2550 -->\n @for (group of ResultGroups; track group.SourceType) {\n <div class=\"results-group\">\n <div class=\"results-group-header\" (click)=\"ToggleGroup(group.SourceType)\">\n @if (ShowSourceIcons) {\n <i [class]=\"group.Icon + ' results-group-icon'\"></i>\n }\n <span class=\"results-group-label\">{{ group.Label }}</span>\n <span class=\"results-group-count\">({{ group.TotalCount }})</span>\n <i class=\"fa-solid results-group-chevron\"\n [class.fa-chevron-down]=\"!IsGroupExpanded(group.SourceType)\"\n [class.fa-chevron-up]=\"IsGroupExpanded(group.SourceType)\"></i>\n </div>\n\n @for (result of GetVisibleResults(group); track result.ID) {\n <ng-container *ngTemplateOutlet=\"resultCardTpl; context: { $implicit: result }\"></ng-container>\n }\n\n @if (HasMoreResults(group)) {\n <button class=\"results-show-more\" (click)=\"ToggleGroup(group.SourceType)\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n Show {{ GetHiddenCount(group) }} more results\n </button>\n }\n </div>\n }\n }\n}\n\n<!-- \u2550\u2550\u2550 Shared result card template \u2550\u2550\u2550 -->\n<ng-template #resultCardTpl let-result>\n <div class=\"result-card\" [class.result-card-expanded]=\"IsExpanded(result.ID)\">\n <!-- Main row -->\n <div class=\"result-card-main\" (click)=\"ToggleExpand(result)\">\n <div class=\"result-card-icon-wrap\">\n <i [class]=\"result.EntityIcon || result.SourceIcon || 'fa-solid fa-database'\"></i>\n </div>\n <div class=\"result-card-body\">\n <div class=\"result-card-title\" [innerHTML]=\"HighlightMatch(result.RecordName || result.Title)\"></div>\n <div class=\"result-card-entity\" [innerHTML]=\"HighlightMatch(result.EntityName)\"></div>\n @if (result.Tags && result.Tags.length > 0) {\n <div class=\"result-card-tags\">\n @for (tag of result.Tags.slice(0, 5); track tag) {\n <span class=\"result-tag-chip\" [innerHTML]=\"HighlightMatch(tag)\"></span>\n }\n @if (result.Tags.length > 5) {\n <span class=\"result-tag-more\">+{{ result.Tags.length - 5 }}</span>\n }\n </div>\n }\n </div>\n @if (ShowScores) {\n <div class=\"result-card-score\">\n <div class=\"score-circle\" [class.score-high]=\"result.Score >= 0.40\" [class.score-medium]=\"result.Score >= 0.15 && result.Score < 0.40\" [class.score-low]=\"result.Score < 0.15\">\n <span class=\"score-value\">{{ FormatScore(result.Score) }}</span>\n </div>\n </div>\n }\n <div class=\"result-card-actions\">\n <button class=\"result-open-btn\" (click)=\"OnOpenRecord(result, $event)\"\n [title]=\"result.ResultType === 'storage-file' ? 'Open file' : 'Open record'\">\n <i [class]=\"result.ResultType === 'storage-file' ? 'fa-solid fa-external-link' : 'fa-solid fa-arrow-up-right-from-square'\"></i>\n </button>\n <button class=\"result-expand-btn\" (click)=\"ToggleExpand(result, $event)\" title=\"Expand details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!IsExpanded(result.ID)\"\n [class.fa-chevron-up]=\"IsExpanded(result.ID)\"></i>\n </button>\n </div>\n </div>\n\n <!-- Expanded detail -->\n @if (IsExpanded(result.ID)) {\n <div class=\"result-card-detail\">\n @if (result.Snippet) {\n <div class=\"detail-section\">\n <span class=\"detail-label\">Preview</span>\n <p class=\"detail-snippet\" [innerHTML]=\"HighlightMatch(result.Snippet)\"></p>\n </div>\n }\n <div class=\"detail-meta\">\n <div class=\"detail-meta-item\">\n <i class=\"fa-solid fa-layer-group\"></i>\n <span>{{ result.EntityName }}</span>\n </div>\n <div class=\"detail-meta-item\">\n <i class=\"fa-solid fa-fingerprint\"></i>\n <span class=\"detail-record-id\">{{ result.RecordID }}</span>\n </div>\n <!-- SR-1: Show overall score consistently -->\n <div class=\"detail-meta-item\">\n <i class=\"fa-solid fa-signal\"></i>\n <span>Relevance: {{ FormatScore(result.Score) }}</span>\n </div>\n @if (result.ScoreBreakdown) {\n <div class=\"detail-meta-item\">\n <i class=\"fa-solid fa-chart-bar\"></i>\n <span>\n @if (result.ScoreBreakdown.Vector) { Vector: {{ FormatScore(result.ScoreBreakdown.Vector) }} }\n @if (result.ScoreBreakdown.FullText) { FTS: {{ FormatScore(result.ScoreBreakdown.FullText) }} }\n </span>\n </div>\n }\n </div>\n @if (ShowTags && result.Tags.length > 0) {\n <div class=\"detail-tags\">\n @for (tag of result.Tags; track tag) {\n <span class=\"result-card-tag\" [innerHTML]=\"HighlightMatch(tag)\"></span>\n }\n </div>\n }\n @if (GetResolvedLinks(result).length > 0) {\n <div class=\"detail-links\">\n @for (link of GetResolvedLinks(result); track link.Value) {\n @if (link.Type === 'URL') {\n <a [href]=\"link.Value\" target=\"_blank\" class=\"detail-link\" (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n {{ TruncateUrl(link.Value) }}\n </a>\n } @else if (link.Type === 'Email') {\n <a [href]=\"'mailto:' + link.Value\" class=\"detail-link detail-link-email\" (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-envelope\"></i>\n {{ link.Value }}\n </a>\n }\n }\n </div>\n }\n <div class=\"detail-actions\">\n <button class=\"detail-open-btn\" (click)=\"OnOpenRecord(result, $event)\">\n @if (result.ResultType === 'storage-file') {\n <i class=\"fa-solid fa-external-link\"></i> Open File\n } @else {\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i> Open Record\n }\n </button>\n <button class=\"detail-similar-btn\" (click)=\"OnMoreLikeThis(result, $event)\">\n <i class=\"fa-solid fa-shuffle\"></i> See Similar Items\n </button>\n </div>\n </div>\n }\n </div>\n</ng-template>\n", styles: ["/* Search Results Component */\n\n:host {\n display: flex;\n flex-direction: column;\n min-height: 0;\n flex: 1;\n}\n\n.results-scroll-area {\n flex: 1;\n overflow-y: auto;\n min-height: 0;\n}\n\n.results-loading {\n display: flex;\n justify-content: center;\n padding: 3rem 1rem;\n}\n\n.results-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem 1rem;\n gap: 0.5rem;\n}\n\n.results-empty-icon {\n font-size: 2rem;\n color: var(--mj-text-muted);\n margin-bottom: 0.5rem;\n}\n\n.results-empty-text {\n color: var(--mj-text-muted);\n font-size: 0.9rem;\n}\n\n.results-summary {\n padding: 0.75rem 1rem;\n color: var(--mj-text-secondary);\n font-size: 0.85rem;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.results-summary-time {\n color: var(--mj-text-muted);\n}\n\n/* Group Header */\n.results-group {\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n\n.results-group-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.75rem 1rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.results-group-header:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.results-group-icon {\n color: var(--mj-brand-primary);\n font-size: 0.85rem;\n}\n\n.results-group-label {\n font-weight: 600;\n font-size: 0.85rem;\n color: var(--mj-text-primary);\n flex: 1;\n}\n\n.results-group-count {\n font-size: 0.78rem;\n color: var(--mj-text-muted);\n}\n\n.results-group-chevron {\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n transition: transform 0.2s ease;\n}\n\n/* Result Card \u2014 expandable */\n.result-card {\n border: 1px solid var(--mj-border-subtle);\n border-radius: 8px;\n margin: 0 0 0.35rem 1.5rem;\n overflow: hidden;\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n\n.result-card:hover {\n border-color: var(--mj-border-default);\n}\n\n.result-card-expanded {\n border-color: var(--mj-brand-primary);\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.result-card-main {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.65rem 0.85rem;\n cursor: pointer;\n transition: background 0.1s ease;\n}\n\n.result-card-main:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.result-card-icon-wrap {\n width: 2rem;\n height: 2rem;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\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.8rem;\n flex-shrink: 0;\n}\n\n.result-card-body {\n flex: 1;\n min-width: 0;\n}\n\n.result-card-title {\n color: var(--mj-text-primary);\n font-weight: 600;\n font-size: 0.85rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.result-card-entity {\n color: var(--mj-text-muted);\n font-size: 0.7rem;\n}\n\n.result-card-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-top: 4px;\n}\n\n.result-tag-chip {\n display: inline-block;\n padding: 1px 7px;\n border-radius: 10px;\n font-size: 0.65rem;\n font-weight: 500;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-border-default));\n}\n\n.result-tag-more {\n display: inline-block;\n padding: 1px 6px;\n font-size: 0.6rem;\n color: var(--mj-text-muted);\n}\n\n.result-card-actions {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n\n.result-open-btn,\n.result-expand-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 11px;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.result-open-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.result-expand-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n/* Expanded detail panel */\n.result-card-detail {\n padding: 0.75rem 1rem 0.85rem 3.5rem;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface-card);\n}\n\n.detail-section {\n margin-bottom: 0.65rem;\n}\n\n.detail-label {\n font-size: 0.7rem;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 0.25rem;\n display: block;\n}\n\n.detail-snippet {\n margin: 0;\n font-size: 0.82rem;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.detail-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 0.75rem;\n margin-bottom: 0.65rem;\n}\n\n.detail-meta-item {\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 0.75rem;\n color: var(--mj-text-muted);\n}\n\n.detail-meta-item i {\n font-size: 0.65rem;\n}\n\n.detail-record-id {\n font-family: monospace;\n font-size: 0.7rem;\n max-width: 180px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.detail-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-bottom: 0.65rem;\n}\n\n.detail-links {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-bottom: 8px;\n}\n\n.detail-link {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 8px;\n border-radius: 6px;\n font-size: 0.72rem;\n color: var(--mj-text-link);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-border-default));\n text-decoration: none;\n transition: background 0.15s ease;\n}\n\n.detail-link:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n text-decoration: underline;\n}\n\n.detail-link i {\n font-size: 0.6rem;\n}\n\n.detail-actions {\n display: flex;\n gap: 8px;\n}\n\n.detail-open-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-brand-primary);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.78rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.detail-open-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n}\n\n.detail-similar-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: transparent;\n color: var(--mj-text-secondary);\n font-size: 0.78rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.detail-similar-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.result-card-snippet {\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.result-card-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n margin-top: 0.35rem;\n}\n\n.result-card-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-card-tag-more {\n color: var(--mj-brand-primary);\n}\n\n.result-card-score {\n flex-shrink: 0;\n margin-top: 0.2rem;\n}\n\n.score-circle {\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n /* Default: neutral gray */\n background: color-mix(in srgb, var(--mj-text-muted) 10%, var(--mj-bg-surface));\n border: 2px solid color-mix(in srgb, var(--mj-text-muted) 25%, var(--mj-bg-surface));\n}\n.score-circle.score-high {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-success) 40%, var(--mj-bg-surface));\n}\n.score-circle.score-medium {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-status-warning) 40%, var(--mj-bg-surface));\n}\n.score-circle.score-low {\n background: color-mix(in srgb, var(--mj-text-muted) 10%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-text-muted) 25%, var(--mj-bg-surface));\n}\n\n.score-value {\n font-size: 0.7rem;\n font-weight: 700;\n color: var(--mj-text-secondary);\n}\n.score-high .score-value {\n color: var(--mj-status-success-text, var(--mj-status-success));\n}\n.score-medium .score-value {\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n.score-low .score-value {\n color: var(--mj-text-muted);\n}\n\n/* Show More Button */\n.results-show-more {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.5rem 1rem;\n border: none;\n background: transparent;\n color: var(--mj-brand-primary);\n font-size: 0.82rem;\n cursor: pointer;\n justify-content: center;\n transition: background 0.1s ease;\n}\n\n.results-show-more:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n/* Google-style Pagination \u2014 pinned at bottom */\n.results-pager {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 0.75rem 0;\n flex-shrink: 0;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n}\n\n.pager-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 0.82rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n padding: 0 6px;\n}\n\n.pager-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.pager-btn:disabled {\n opacity: 0.35;\n cursor: default;\n}\n\n.pager-active {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.pager-active:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n color: var(--mj-text-inverse);\n}\n\n.pager-ellipsis {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n color: var(--mj-text-muted);\n font-size: 0.8rem;\n}\n\n.pager-prev i,\n.pager-next i {\n font-size: 0.7rem;\n}\n\n/* Search text highlighting */\n:host ::ng-deep .search-highlight,\n.search-highlight {\n background: color-mix(in srgb, var(--mj-status-warning) 35%, transparent);\n color: inherit;\n padding: 1px 2px;\n border-radius: 2px;\n}\n"] }]
681
698
  }], null, { ResultGroups: [{
682
699
  type: Input
683
700
  }], FlatResults: [{
@@ -702,6 +719,8 @@ export class SearchResultsComponent {
702
719
  type: Input
703
720
  }], ShowSourceIcons: [{
704
721
  type: Input
722
+ }], HighlightText: [{
723
+ type: Input
705
724
  }], ResultSelected: [{
706
725
  type: Output
707
726
  }], OpenRecordRequested: [{