'use client'; import { createPortal } from 'react-dom'; import { useLayoutEffect, useRef, useState } from 'react'; import { BringToFront, PencilLine, SendToBack, Trash2 } from 'lucide-react'; import type { MouseEvent } from 'react'; import type { PPTLatexElement } from '@openmaic/dsl'; import { computeToolbarPosition } from '../text/TextToolbarOverlay'; import { useToolbarAnchor } from '../text/useToolbarAnchor'; interface ToolbarSize { readonly width: number; readonly height: number; } export interface LatexToolbarOverlayProps { readonly element: PPTLatexElement; readonly elementIdPrefix?: string; readonly toolbarLabel: string; readonly editLabel: string; readonly bringToFrontLabel: string; readonly sendToBackLabel: string; readonly deleteLabel: string; readonly onEdit: () => void; readonly onBringToFront?: () => void; readonly onSendToBack?: () => void; readonly onDelete?: () => void; } export function LatexToolbarOverlay({ element, elementIdPrefix = 'slide-element-', toolbarLabel, editLabel, bringToFrontLabel, sendToBackLabel, deleteLabel, onEdit, onBringToFront, onSendToBack, onDelete, }: LatexToolbarOverlayProps) { const anchor = useToolbarAnchor(element.id, elementIdPrefix); const overlayRef = useRef(null); const [toolbarSize, setToolbarSize] = useState(null); const preventFocusLoss = (event: MouseEvent) => event.preventDefault(); useLayoutEffect(() => { const overlay = overlayRef.current; if (!anchor || !overlay) return; const measure = () => { const rect = overlay.getBoundingClientRect(); if (rect.width > 0 && rect.height > 0) { setToolbarSize((current) => current?.width === rect.width && current.height === rect.height ? current : { width: rect.width, height: rect.height }, ); } }; measure(); const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(measure); observer?.observe(overlay); return () => observer?.disconnect(); }, [anchor]); if (!anchor || typeof document === 'undefined') return null; const position = toolbarSize ? computeToolbarPosition( anchor, toolbarSize, { width: window.innerWidth, height: window.innerHeight }, 'top', ) : null; return createPortal(
{onBringToFront || onSendToBack || onDelete ? (
, document.body, ); }