namespace Htmx.ApiDemo.Templates.Components; /// /// CSS-only Tooltip using group-hover. Wraps a trigger element. /// Position: "top" | "bottom" | "left" | "right" (default: top) /// public sealed class Tooltip : TooltipBase { private static readonly Dictionary PositionClasses = new() { ["top"] = "bottom-full left-1/2 -translate-x-1/2 mb-2", ["bottom"] = "top-full left-1/2 -translate-x-1/2 mt-2", ["left"] = "right-full top-1/2 -translate-y-1/2 mr-2", ["right"] = "left-full top-1/2 -translate-y-1/2 ml-2", }; private readonly byte[] _triggerData; private readonly byte[] _textData; private readonly byte[] _positionData; public Tooltip(string text, IHtmxComponent trigger, string position = "top") { _textData = text.ToUtf8Bytes(); _positionData = PositionClasses.GetValueOrDefault(position, PositionClasses["top"]).ToUtf8Bytes(); var bufferWriter = new System.IO.Pipelines.Pipe().Writer; // Render trigger to bytes via a simple ArrayBufferWriter var writer = new System.Buffers.ArrayBufferWriter(); trigger.Render(new HtmxRenderContext(writer)); _triggerData = writer.WrittenSpan.ToArray(); } protected override void RenderTrigger(HtmxRenderContext ctx) => ctx.Writer.WriteUtf8(_triggerData); protected override void RenderText(HtmxRenderContext ctx) => ctx.Writer.WriteUtf8(_textData); protected override void RenderPosition(HtmxRenderContext ctx) => ctx.Writer.WriteUtf8(_positionData); }