"use client" import { useEffect, useRef, useState } from "react" import type { EditorEngine, SelectionCoords } from "./engine" interface Props { engineRef: React.RefObject coords: SelectionCoords | null } const TOOLBAR_WIDTH = 492 const TOOLBAR_HEIGHT = 36 const GAP = 8 export default function FloatingToolbar({ engineRef, coords }: Props) { const ref = useRef(null) const [visible, setVisible] = useState(false) const [pos, setPos] = useState({ top: 0, left: 0 }) useEffect(() => { if (!coords) { setVisible(false) return } const vw = window.innerWidth // Prefer above selection — fallback below if too close to top const above = coords.top - TOOLBAR_HEIGHT - GAP const below = coords.bottom + GAP const top = above < 12 ? below : above // Horizontal: centered on selection midpoint, clamped to viewport const mid = (coords.left + coords.right) / 2 const left = Math.max(8, Math.min(vw - TOOLBAR_WIDTH - 8, mid - TOOLBAR_WIDTH / 2)) setPos({ top, left }) setVisible(true) }, [coords]) if (!visible) return null const wrap = (before: string, after: string) => { engineRef.current?.wrapSelection(before, after) } const prevent = (e: React.MouseEvent) => e.preventDefault() return (
wrap("**", "**")} title="Fett"> wrap("*", "*")} title="Kursiv"> wrap("~~", "~~")} title="Durchgestrichen"> wrap("\n# ", "")} title="H1"> H1 wrap("\n## ", "")} title="H2"> H2 wrap("\n### ", "")} title="H3"> H3 wrap("[", "](url)")} title="Link"> wrap("![", "](url)")} title="Bild"> wrap("`", "`")} title="Code"> wrap("$", "$")} title="Formel"> wrap("[[", "]]")} title="Wikilink"> wrap("\n> ", "")} title="Zitat"> wrap("\n- ", "")} title="Liste"> wrap("\n1. ", "")} title="Nummerierte Liste">
) } /* ── Subcomponents ──────────────────────────────────── */ function FBtn({ children, onClick, title, }: { children: React.ReactNode onClick: () => void title?: string }) { return ( ) } function FSep() { return
} /* ── Icons (mini) ───────────────────────────────────── */ function BoldIcon() { return ( ) } function ItalicIcon() { return ( ) } function StrikeIcon() { return ( ) } function LinkIcon() { return ( ) } function CodeIcon() { return ( ) } function MathIcon() { return ( ) } function WikiIcon() { return ( ) } function ImageIcon() { return ( ) } function QuoteIcon() { return ( ) } function BulletIcon() { return ( ) } function NumberedIcon() { return ( ) }