/** * Interactive overlay for GraphQL identifiers */ import type { React } from '#dep/react/index' import type { DOMPosition } from '../positioning-simple.js' import type { SchemaResolution } from '../schema-integration.js' import type { Identifier } from '../types.js' import { GraphQLIdentifierPopover } from './GraphQLIdentifierPopover.js' export interface IdentifierLinkProps { /** The GraphQL identifier */ identifier: Identifier /** Schema resolution information */ resolution: SchemaResolution /** DOM position for overlay placement */ position: DOMPosition /** Navigation handler */ onNavigate: (url: string) => void /** Whether to show debug visuals */ debug?: boolean /** Whether this tooltip is open */ isOpen: boolean /** Whether this tooltip is pinned */ isPinned: boolean /** Handle hover start */ onHoverStart: () => void /** Handle hover end */ onHoverEnd: () => void /** Toggle pin state */ onTogglePin: () => void /** Handle tooltip hover */ onTooltipHover: () => void } /** * Interactive overlay for a GraphQL identifier * * Renders an invisible clickable area over the identifier text * with hover popovers and navigation to schema reference pages. */ export const IdentifierLink: React.FC = ({ identifier, resolution, position, onNavigate, debug = false, isOpen, isPinned, onHoverStart, onHoverEnd, onTogglePin, onTooltipHover, }) => { // Determine visual state const isClickable = resolution.exists const hasError = !resolution.exists && (identifier.kind === `Type` || identifier.kind === `Field`) const isDeprecated = !!resolution.deprecated // Build class names const classNames = [ `graphql-identifier-overlay`, `graphql-${identifier.kind.toLowerCase()}`, isClickable && `graphql-clickable`, hasError && `graphql-error`, isDeprecated && `graphql-deprecated`, isOpen && `graphql-hovered`, isOpen && `graphql-tooltip-open`, debug && `graphql-debug`, ].filter(Boolean).join(` `) const handleClick = (e: React.MouseEvent) => { e.preventDefault() e.stopPropagation() onTogglePin() } // Create trigger element const triggerElement = isClickable ? ( ) : (
) return ( { if (!open && isPinned) { onTogglePin() // Unpin when closing } }} onNavigate={isClickable ? onNavigate : undefined} > {triggerElement} ) }