Adding vibe hover effect
This commit is contained in:
@@ -7,8 +7,9 @@ namespace Shared.Services;
|
||||
public class CardRenderingService
|
||||
{
|
||||
private readonly Dictionary<string, CardData> _cardLookup;
|
||||
private readonly List<string> _cardNames;
|
||||
private readonly Regex _nameRegex;
|
||||
private readonly Dictionary<string, DocData> _docLookup;
|
||||
private readonly List<string> _allTerms;
|
||||
private readonly Regex _termRegex;
|
||||
|
||||
public CardRenderingService()
|
||||
{
|
||||
@@ -20,16 +21,25 @@ public class CardRenderingService
|
||||
.GroupBy(c => c.Name, StringComparer.OrdinalIgnoreCase)
|
||||
.ToDictionary(g => g.Key, g => g.First(), StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
_cardNames = allCards
|
||||
.Select(c => c.Name)
|
||||
var allDocs = DocDatabase.Docs
|
||||
.Where(d => !string.IsNullOrWhiteSpace(d.Title))
|
||||
.ToList();
|
||||
|
||||
_docLookup = allDocs
|
||||
.GroupBy(d => d.Title, StringComparer.OrdinalIgnoreCase)
|
||||
.ToDictionary(g => g.Key, g => g.First(), StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
_allTerms = _cardLookup.Keys
|
||||
.Concat(_docLookup.Keys)
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.OrderByDescending(n => n.Length)
|
||||
.ToList();
|
||||
|
||||
var pattern = string.Join("|", _cardNames.Select(n => $@"\b{Regex.Escape(n)}\b"));
|
||||
_nameRegex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
var pattern = string.Join("|", _allTerms.Select(n => $@"\b{Regex.Escape(n)}\b"));
|
||||
_termRegex = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
}
|
||||
|
||||
public RenderFragment RenderDescription(string description, Action<CardData?> onCardClick)
|
||||
public RenderFragment RenderDescription(string description, Action<CardData?> onCardClick, Action<DocData?>? onDocClick = null, CardPreviewService? previewService = null)
|
||||
{
|
||||
return builder =>
|
||||
{
|
||||
@@ -40,7 +50,7 @@ public class CardRenderingService
|
||||
{
|
||||
builder.OpenElement(sequence++, "p");
|
||||
|
||||
var matches = _nameRegex.Matches(paragraph);
|
||||
var matches = _termRegex.Matches(paragraph);
|
||||
var lastIndex = 0;
|
||||
|
||||
foreach (Match match in matches)
|
||||
@@ -48,14 +58,33 @@ public class CardRenderingService
|
||||
if (match.Index > lastIndex)
|
||||
builder.AddContent(sequence++, paragraph.Substring(lastIndex, match.Index - lastIndex));
|
||||
|
||||
var cardName = match.Value;
|
||||
var card = LookupCard(cardName);
|
||||
var term = match.Value;
|
||||
var card = LookupCard(term);
|
||||
var doc = LookupDoc(term);
|
||||
|
||||
builder.OpenElement(sequence++, "button");
|
||||
builder.AddAttribute(sequence++, "class", "inline-card-btn");
|
||||
builder.AddAttribute(sequence++, "onclick",
|
||||
EventCallback.Factory.Create(this, () => onCardClick(card)));
|
||||
builder.AddContent(sequence++, cardName);
|
||||
|
||||
if (card != null)
|
||||
{
|
||||
builder.AddAttribute(sequence++, "onclick",
|
||||
EventCallback.Factory.Create(this, () => onCardClick(card)));
|
||||
|
||||
if (previewService != null)
|
||||
{
|
||||
builder.AddAttribute(sequence++, "onmouseenter",
|
||||
EventCallback.Factory.Create<Microsoft.AspNetCore.Components.Web.MouseEventArgs>(this, e => previewService.Show(card, e.ClientX, e.ClientY)));
|
||||
builder.AddAttribute(sequence++, "onmouseleave",
|
||||
EventCallback.Factory.Create(this, () => previewService.Hide()));
|
||||
}
|
||||
}
|
||||
else if (doc != null && onDocClick != null)
|
||||
{
|
||||
builder.AddAttribute(sequence++, "onclick",
|
||||
EventCallback.Factory.Create(this, () => onDocClick(doc)));
|
||||
}
|
||||
|
||||
builder.AddContent(sequence++, term);
|
||||
builder.CloseElement();
|
||||
|
||||
lastIndex = match.Index + match.Length;
|
||||
@@ -68,8 +97,13 @@ public class CardRenderingService
|
||||
};
|
||||
}
|
||||
|
||||
private CardData? LookupCard(string cardName)
|
||||
private CardData? LookupCard(string name)
|
||||
{
|
||||
return _cardLookup.GetValueOrDefault(cardName);
|
||||
return _cardLookup.GetValueOrDefault(name);
|
||||
}
|
||||
|
||||
private DocData? LookupDoc(string name)
|
||||
{
|
||||
return _docLookup.GetValueOrDefault(name);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user