62 lines
2.0 KiB
Plaintext
62 lines
2.0 KiB
Plaintext
@using NexusReader.Application.DTOs.AI
|
|
@using NexusReader.UI.Shared.Components.Atoms
|
|
@namespace NexusReader.UI.Shared.Components.Organisms
|
|
|
|
<div class="global-intelligence-panel">
|
|
<div class="panel-header">
|
|
<h3><i class="bi bi-cpu"></i> Global Intelligence</h3>
|
|
<p>Semantic search across your library</p>
|
|
</div>
|
|
|
|
<NexusSearchBox Placeholder="Ask a question about your books..." OnSearch="HandleSearch" />
|
|
|
|
<div class="results-container">
|
|
@if (IsLoading)
|
|
{
|
|
<div class="loading-state">
|
|
<div class="nexus-spinner"></div>
|
|
<span>Analyzing your library...</span>
|
|
</div>
|
|
}
|
|
else if (Results != null && Results.Any())
|
|
{
|
|
@foreach (var result in Results)
|
|
{
|
|
<div class="search-result-item">
|
|
<div class="result-meta">
|
|
<span class="relevance">@(Math.Round(result.RelevanceScore * 100))% Relevant</span>
|
|
@if (!string.IsNullOrEmpty(result.SourceBookTitle))
|
|
{
|
|
<span class="source">in <strong>@result.SourceBookTitle</strong></span>
|
|
}
|
|
</div>
|
|
<div class="result-snippet">
|
|
@result.Snippet
|
|
</div>
|
|
</div>
|
|
}
|
|
}
|
|
else if (HasSearched)
|
|
{
|
|
<div class="empty-state">
|
|
<i class="bi bi-search"></i>
|
|
<p>No semantic matches found.</p>
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
|
|
@code {
|
|
[Parameter] public List<SemanticSearchResultDto>? Results { get; set; }
|
|
[Parameter] public bool IsLoading { get; set; }
|
|
[Parameter] public EventCallback<string> OnPerformSearch { get; set; }
|
|
|
|
private bool HasSearched { get; set; }
|
|
|
|
private async Task HandleSearch(string query)
|
|
{
|
|
HasSearched = true;
|
|
await OnPerformSearch.InvokeAsync(query);
|
|
}
|
|
}
|