Files
Nexus.Reader/src/NexusReader.UI.Shared/Components/Organisms/GlobalIntelligencePanel.razor
T

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);
}
}