Rebuilt the visual site builder from scratch using Craft.js, React 18, and TypeScript. The new editor renders directly in the DOM (no iframe), supports 40+ components, multi-page with shared header/footer, 16 templates, full-spectrum color/gradient controls, custom head code injection, save/publish workflow, and auto-save. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
28 lines
599 B
TypeScript
28 lines
599 B
TypeScript
import { useState, useCallback } from 'react';
|
|
|
|
interface ContextMenuState {
|
|
visible: boolean;
|
|
x: number;
|
|
y: number;
|
|
nodeId: string | null;
|
|
}
|
|
|
|
export function useContextMenu() {
|
|
const [menuState, setMenuState] = useState<ContextMenuState>({
|
|
visible: false,
|
|
x: 0,
|
|
y: 0,
|
|
nodeId: null,
|
|
});
|
|
|
|
const show = useCallback((x: number, y: number, nodeId: string | null) => {
|
|
setMenuState({ visible: true, x, y, nodeId });
|
|
}, []);
|
|
|
|
const hide = useCallback(() => {
|
|
setMenuState((prev) => ({ ...prev, visible: false }));
|
|
}, []);
|
|
|
|
return { menuState, show, hide };
|
|
}
|