Loading...
Loading...
Add visual animations (cursor, typing, click effects) to AgentPulse-enabled React apps. Use when: showing users what AI is doing, adding visual feedback for agent actions, configuring element targeting for animations.
npx skill4agent add dang-hai/agentpulse visual-overlayVisualOverlayAgentPulseProviderimport { AgentPulseProvider, VisualOverlay } from 'agentpulse';
function App() {
return (
<AgentPulseProvider endpoint="ws://localhost:3100/ws">
<VisualOverlay />
<MyApp />
</AgentPulseProvider>
);
}expose_setexpose_call<VisualOverlay
enabled={true} // Master toggle (default: true)
cursor={true} // Show AI cursor (default: true)
clickRipple={true} // Show click effects (default: true)
typingAnimation={true} // Character-by-character typing (default: true)
typingSpeed={12} // Characters per second (default: 12)
/>data-agentpulse-iddata-agentpulse-id="componentId-normalizedKey"normalizedKeyset| Binding | Normalized Key | Attribute |
|---|---|---|
| | |
| | |
| | |
| | |
function ContactForm() {
const [name, setName] = useState('');
const [email, setEmail] = useState('');
useExpose('contact-form', {
setName: (v) => setName(v),
setEmail: (v) => setEmail(v),
submitForm: () => handleSubmit(),
});
return (
<form>
<input data-agentpulse-id="contact-form-name" value={name} />
<input data-agentpulse-id="contact-form-email" value={email} />
<button data-agentpulse-id="contact-form-submitform">Submit</button>
</form>
);
}data-agentpulse-id[data-agentpulse-id="componentId-normalizedKey"][data-agentpulse-id="componentId"]input[name="key"]textarea[name="key"]getElementById(key)getElementById("componentId-key")input[placeholder*="key"][aria-label*="key"]submitForm<VisualOverlay
targets={{
'contact-form': {
name: 'input[name="fullName"]',
email: 'input[type="email"]',
submit: 'button[type="submit"]',
},
'sidebar': {
toggle: '#sidebar-toggle',
},
}}
/>import { setAnimationConfig, clearAnimationConfig } from 'agentpulse';
setAnimationConfig({
'my-form': {
username: '#username-input',
password: '#password-input',
},
});
// Clear when done
clearAnimationConfig();useExpose('signup-form', {
setEmail: (v) => setEmail(v),
setPassword: (v) => setPassword(v),
submit: () => handleSubmit(),
});
// Add data attributes to each input
<input data-agentpulse-id="signup-form-email" />
<input data-agentpulse-id="signup-form-password" />
<button data-agentpulse-id="signup-form-submit">Sign Up</button>// MUI TextField
<TextField
inputProps={{ 'data-agentpulse-id': 'form-email' }}
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
// Or use CSS selector config
<VisualOverlay
targets={{
'form': {
email: '.MuiTextField-root input',
},
}}
/>useExpose('search', {
query,
setQuery,
search: () => performSearch(),
});
<input data-agentpulse-id="search-query" />
<button data-agentpulse-id="search-search">Search</button>| Issue | Cause | Solution |
|---|---|---|
| Cursor goes to wrong element | Key mismatch | Check normalized key matches attribute |
| No animation on action | Missing attribute | Add |
| Animation on wrong form field | Duplicate attributes | Make each attribute unique per component |
| Third-party input not found | Nested DOM structure | Use CSS selector config |
[TargetResolver] Found element for contact-form.name using selector: ...
[TargetResolver] Auto-discovered element for contact-form.email
[TargetResolver] No element found for contact-form.phonedata-agentpulse-id="componentId-normalizedKey"expose_setexpose_callreferences/TARGETING_PATTERNS.md