MarkdownEditor.razor 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. @bind="_text"
  23. @bind:event="oninput"
  24. @bind:after="NotifyChanged">
  25. </textarea>
  26. </div>
  27. @code {
  28. [Parameter] public string? Value { get; set; }
  29. [Parameter] public EventCallback<string?> ValueChanged { get; set; }
  30. [Parameter] public bool ShowActionButtons { get; set; } = true;
  31. [Parameter] public EventCallback OnSave { get; set; }
  32. [Parameter] public EventCallback OnCancel { get; set; }
  33. [Parameter] public string? TestIdPrefix { get; set; }
  34. private string BaseTestId =>
  35. string.IsNullOrWhiteSpace(TestIdPrefix)
  36. ? "markdown-editor"
  37. : $"{TestIdPrefix}-markdown-editor";
  38. private string? _text;
  39. protected override void OnParametersSet()
  40. {
  41. _text = Value;
  42. }
  43. Task NotifyChanged()
  44. {
  45. return ValueChanged.InvokeAsync(_text);
  46. }
  47. async Task HandleSave()
  48. {
  49. if (OnSave.HasDelegate)
  50. await OnSave.InvokeAsync();
  51. }
  52. async Task HandleCancel()
  53. {
  54. if (OnCancel.HasDelegate)
  55. await OnCancel.InvokeAsync();
  56. }
  57. }