diff --git a/mcp-server/src/tools/hotspot-tools.js b/mcp-server/src/tools/hotspot-tools.js index 4269be1..e37b08b 100644 --- a/mcp-server/src/tools/hotspot-tools.js +++ b/mcp-server/src/tools/hotspot-tools.js @@ -23,7 +23,7 @@ const accessibilitySchema = { export const hotspotTools = [ { name: "create_hotspot", - description: "Add a hotspot (tap area) to a screen. Coordinates are percentages (0-100) of the screen image dimensions. If action is 'navigate' or 'modal' and targetScreenId is provided, a connection is automatically created.", + description: "Add a hotspot (tap area) to a screen. Coordinates are percentages (0-100) of the screen image dimensions. If action is 'navigate' or 'modal' and targetScreenId is provided, a connection is automatically created. Hotspots on a canonical component apply to every placement; hotspots on an instance are placement-specific additive interactions that do not modify or hide the canonical's hotspots.", inputSchema: { type: "object", properties: { @@ -120,7 +120,7 @@ export const hotspotTools = [ }, { name: "list_hotspots", - description: "List all hotspots on a specific screen.", + description: "List all hotspots on a specific screen. On a canonical component, this returns the hotspots that apply to every placement. On an instance, this returns only the placement-specific (additive) hotspots — to see the canonical's hotspots, call this against the canonical screen.", inputSchema: { type: "object", properties: { diff --git a/src/components/CanvasArea.jsx b/src/components/CanvasArea.jsx index b88d933..d3b0de5 100644 --- a/src/components/CanvasArea.jsx +++ b/src/components/CanvasArea.jsx @@ -3,7 +3,7 @@ import { DEFAULT_SCREEN_WIDTH, DEFAULT_SCREEN_HEIGHT } from "../constants"; import { copyScreenForFigma, copyScreensForFigma, copyScreensForFigmaEditable, downloadScreenSvg } from "../utils/copyToFigma"; import { copyScreensAsImage } from "../utils/copyAsImage"; import { ScreenNode } from "./ScreenNode"; -import { resolveInstanceVisuals, isResolvedInstance } from "../utils/resolveInstanceVisuals"; +import { resolveInstanceVisuals } from "../utils/resolveInstanceVisuals"; import { ConnectionLines } from "./ConnectionLines"; import { ConditionalPrompt } from "./ConditionalPrompt"; import { ConnectionTypePrompt } from "./ConnectionTypePrompt"; @@ -163,12 +163,10 @@ export function CanvasArea({ ))} {screens.map((screen) => { const visualScreen = resolveInstanceVisuals(screen, screens); - const instanceVisual = isResolvedInstance(screen) && visualScreen !== screen; return ( { clearSelection(); setSelectedScreen(id); setSelectedStickyNote(null); }} onDragStart={onDragStart} diff --git a/src/components/ScreenNode.jsx b/src/components/ScreenNode.jsx index 941a9ee..4d5aac2 100644 --- a/src/components/ScreenNode.jsx +++ b/src/components/ScreenNode.jsx @@ -21,10 +21,6 @@ export function ScreenNode({ selectedCommentId, onCommentPinClick, onDeselectComment, - // True when this is an instance whose image/hotspots are inherited from - // its canonical at render time. Hotspot edits are read-only here — users - // must edit the canonical instead. - isInstanceVisual, }) { const [imgLoaded, setImgLoaded] = useState(false); const [isEditingDesc, setIsEditingDesc] = useState(false); @@ -370,7 +366,7 @@ export function ScreenNode({ > S+ - {!isInstanceVisual && } +