"use client"; import { Kbd } from "@mdxui/primitives/kbd"; import { cn } from "@mdxui/primitives/lib/utils"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@mdxui/primitives/tooltip"; import { GripVertical, Pencil } from "lucide-react"; import { useCallback, useEffect, useRef, useState } from "react"; import type { EditorTriggerProps } from "./types"; const STORAGE_KEY = "editor-trigger-position"; const DEFAULT_POSITION = 33; // percentage from top export function EditorTrigger({ isOpen, onToggle }: EditorTriggerProps) { const [showOnboarding, setShowOnboarding] = useState(false); const [isPressed, setIsPressed] = useState(false); const [isDragging, setIsDragging] = useState(false); const [positionPercent, setPositionPercent] = useState(DEFAULT_POSITION); const triggerRef = useRef(null); const dragStartY = useRef(0); const dragStartPercent = useRef(0); // Load saved position useEffect(() => { if (typeof window === "undefined") return; const saved = localStorage.getItem(STORAGE_KEY); if (saved) { const parsed = parseFloat(saved); if (!isNaN(parsed) && parsed >= 10 && parsed <= 90) { setPositionPercent(parsed); } } }, []); // Onboarding tooltip useEffect(() => { const onboarded = localStorage.getItem("editor-onboarded") === "true"; if (!onboarded) { const timer = setTimeout(() => setShowOnboarding(true), 2000); return () => clearTimeout(timer); } }, []); const handleDismissOnboarding = () => { setShowOnboarding(false); localStorage.setItem("editor-onboarded", "true"); }; const handleClick = () => { // Don't trigger click if we were dragging if (isDragging) return; if (showOnboarding) { handleDismissOnboarding(); } onToggle(); }; // Drag handling const handleDragStart = useCallback( (e: React.MouseEvent | React.TouchEvent) => { e.preventDefault(); e.stopPropagation(); setIsDragging(true); dragStartY.current = "touches" in e ? e.touches[0].clientY : e.clientY; dragStartPercent.current = positionPercent; }, [positionPercent], ); useEffect(() => { if (!isDragging) return; let rafId: number | null = null; const handleMove = (e: MouseEvent | TouchEvent) => { const clientY = "touches" in e ? e.touches[0].clientY : e.clientY; const deltaY = clientY - dragStartY.current; const deltaPercent = (deltaY / window.innerHeight) * 100; if (rafId) return; rafId = requestAnimationFrame(() => { const newPercent = Math.max( 10, Math.min(90, dragStartPercent.current + deltaPercent), ); setPositionPercent(newPercent); rafId = null; }); }; const handleEnd = () => { setIsDragging(false); // Save position localStorage.setItem(STORAGE_KEY, positionPercent.toString()); }; document.addEventListener("mousemove", handleMove, { passive: true }); document.addEventListener("mouseup", handleEnd); document.addEventListener("touchmove", handleMove, { passive: true }); document.addEventListener("touchend", handleEnd); document.body.style.cursor = "grabbing"; document.body.style.userSelect = "none"; return () => { document.removeEventListener("mousemove", handleMove); document.removeEventListener("mouseup", handleEnd); document.removeEventListener("touchmove", handleMove); document.removeEventListener("touchend", handleEnd); document.body.style.cursor = ""; document.body.style.userSelect = ""; if (rafId) cancelAnimationFrame(rafId); }; }, [isDragging, positionPercent]); // Hide trigger when drawer is open (drawer has its own close button) if (isOpen) return null; return ( {showOnboarding ? (

Edit Mode

Edit this page directly. Click here or press ⌘ I to open.

) : (

Edit page ⌘I

)}
); }