UNPKG

element-prompt-builder-dev

Version:

React component library for inspecting DOM elements and generating AI prompts

226 lines (173 loc) 6.76 kB
# Element Prompt Builder A React component library for inspecting DOM elements and generating structured prompts for AI models based on selected elements. ## Features - **Element Selection**: Select DOM elements by clicking on them - **Element Highlighting**: Highlight selected elements with visible borders - **Element Context**: Generate detailed context information about selected elements - **AI Prompt Generation**: Create structured prompts for AI models with element context - **Event System**: Cross-frame communication and DOM events for integration ## Installation ```bash npm install element-prompt-builder # or yarn add element-prompt-builder ``` ## Usage ### Basic Example ```tsx import { ElementInspector } from 'element-prompt-builder'; function App() { return ( <div> <h1>My Web App</h1> <ElementInspector initialIsActive={false} excludeSelector=".no-inspect" /> </div> ); } ``` ### Individual Components You can also use the individual components for more control: ```tsx import { useState } from 'react'; import { ElementSelector, ElementHighlighter } from 'element-prompt-builder'; function CustomInspector() { const [hoveredElement, setHoveredElement] = useState<HTMLElement | null>(null); return ( <> <ElementSelector onElementHovered={setHoveredElement} onElementUnhovered={() => setHoveredElement(null)} onElementSelected={(element) => console.log('Selected:', element)} /> {hoveredElement && ( <ElementHighlighter element={hoveredElement} borderColor="rgba(255, 0, 0, 0.8)" backgroundColor="rgba(255, 0, 0, 0.2)" /> )} </> ); } ``` ### Using Utility Functions ```tsx import { getXPathForElement, getElementAttributes, generateElementContext, getMostSpecificElementAtPoint, isElementAtPoint, getOffsetsFromPointToElement, createElementsPrompt } from 'element-prompt-builder'; // Get XPath for an element const xpath = getXPathForElement(document.getElementById('myElement')); // Get relevant attributes from an element const attributes = getElementAttributes(document.getElementById('myElement')); // Generate detailed context for an element const context = generateElementContext(document.getElementById('myElement'), 0); // Find the most specific element at a point const element = getMostSpecificElementAtPoint(100, 200, '.exclude-me'); // Check if a point is within an element const isInElement = isElementAtPoint(document.getElementById('myElement'), 100, 200); // Get percentage offsets from a point to an element const offsets = getOffsetsFromPointToElement(document.getElementById('myElement'), 100, 200); ``` ### AI Prompt Generation The package includes utilities for generating AI prompts from selected elements: ```tsx import { createElementsPrompt } from 'element-prompt-builder'; // Generate a prompt for an AI model const elementPrompt = createElementsPrompt( [document.getElementById('myButton')], // Array of selected elements "Please change this button's background color to blue and make the text bold" // User's question or prompt ); // Use this prompt with your preferred AI model console.log(elementPrompt); ``` ## API Reference ### ElementInspector Main component that provides a UI for selecting and highlighting elements. ```tsx <ElementInspector initialIsActive={boolean} // Whether the inspector is active initially excludeSelector={string} // CSS selector for elements to exclude from selection maxElements={number} // Maximum number of elements that can be selected elementLabel={(element: HTMLElement) => ReactNode} // Custom label for selected elements selectorStyle={React.CSSProperties} // Custom styles for the selector highlighterStyle={React.CSSProperties} // Custom styles for the highlighter /> ``` ### ElementSelector Component that creates an overlay to select DOM elements. ```tsx <ElementSelector onElementHovered={(element: HTMLElement) => void} // Callback when an element is hovered onElementUnhovered={() => void} // Callback when an element is no longer hovered onElementSelected={(element: HTMLElement) => void} // Callback when an element is selected ignoreList={HTMLElement[]} // List of elements to ignore during selection excludeSelector={string} // CSS selector for elements to exclude className={string} // CSS class for the selector overlay style={React.CSSProperties} // Custom styles for the selector overlay /> ``` ### ElementHighlighter Component that highlights a DOM element with a border. ```tsx <ElementHighlighter element={HTMLElement} // The element to highlight className={string} // CSS class for the highlighter style={React.CSSProperties} // Custom styles for the highlighter updateRate={number} // Update rate in frames per second (0 to disable updates) borderColor={string} // Border color for the highlighter backgroundColor={string} // Background color for the highlighter > {/* Optional content to render inside the highlighter */} </ElementHighlighter> ``` ## Event System The Element Inspector component provides an event system to handle generated prompts in your application. ### Browser Events When a prompt is generated, the component dispatches a custom DOM event that you can listen for: ```javascript // Listen for prompt generation events document.addEventListener('promptGenerated', (event) => { const { prompt, elements } = event.detail; console.log('Generated prompt:', prompt); console.log('Selected elements:', elements); // Handle the prompt in your application // For example, send it to an AI model API }); ``` ### Cross-Frame Communication When the Element Inspector is used inside an iframe, it communicates with the parent window using the `postMessage` API: ```javascript // In the parent window window.addEventListener('message', (event) => { // Check if the message is from the Element Inspector if (event.data.type === 'ELEMENT_INSPECTOR_PROMPT') { const { prompt, elements } = event.data.payload; console.log('Generated prompt:', prompt); console.log('Selected elements:', elements); // Handle the prompt in your parent application } }); ``` The `elements` array in the message payload contains serialized information about each selected DOM element, including: - `tagName`: The HTML tag name - `id`: The element's ID attribute - `className`: The element's class names - `textContent`: The text content of the element - `attributes`: An array of the element's attributes (name-value pairs) This allows you to process the prompt and element information even across different browsing contexts. ## License MIT