MarkdownEditor.razor 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <div class="border border-zinc-800 rounded p-4 bg-zinc-900"
  2. data-testid="@BaseTestId">
  3. @if (ShowActionButtons)
  4. {
  5. <div class="flex justify-end gap-3 mb-2 text-xs"
  6. data-testid="@($"{BaseTestId}-actions")">
  7. <button class="text-emerald-400 hover:text-emerald-300 transition"
  8. data-testid="@($"{BaseTestId}-save")"
  9. @onclick="HandleSave">
  10. Save
  11. </button>
  12. <button class="text-zinc-500 hover:text-zinc-300 transition"
  13. data-testid="@($"{BaseTestId}-cancel")"
  14. @onclick="HandleCancel">
  15. Cancel
  16. </button>
  17. </div>
  18. }
  19. <textarea
  20. class="w-full h-64 bg-zinc-950 text-zinc-200 border border-zinc-700 rounded p-3 text-sm font-mono focus:outline-none focus:ring-2 focus:ring-emerald-500"
  21. data-testid="@($"{BaseTestId}-textarea")"
  22. value="@Value"
  23. @oninput="HandleInput">
  24. </textarea>
  25. </div>
  26. @code {
  27. [Parameter] public string? Value { get; set; }
  28. [Parameter] public EventCallback<string?> ValueChanged { get; set; }
  29. [Parameter] public bool ShowActionButtons { get; set; } = true;
  30. [Parameter] public EventCallback OnSave { get; set; }
  31. [Parameter] public EventCallback OnCancel { get; set; }
  32. [Parameter] public string? TestIdPrefix { get; set; }
  33. private string BaseTestId =>
  34. string.IsNullOrWhiteSpace(TestIdPrefix)
  35. ? "markdown-editor"
  36. : $"{TestIdPrefix}-markdown-editor";
  37. async Task HandleInput(ChangeEventArgs e)
  38. {
  39. Value = e.Value?.ToString();
  40. await ValueChanged.InvokeAsync(Value);
  41. }
  42. async Task HandleSave()
  43. {
  44. if (OnSave.HasDelegate)
  45. await OnSave.InvokeAsync();
  46. }
  47. async Task HandleCancel()
  48. {
  49. if (OnCancel.HasDelegate)
  50. await OnCancel.InvokeAsync();
  51. }
  52. }