Frontend Enhancements: - Complete React TypeScript frontend with modern UI components - Distributed workflows management interface with real-time updates - Socket.IO integration for live agent status monitoring - Agent management dashboard with cluster visualization - Project management interface with metrics and task tracking - Responsive design with proper error handling and loading states Backend Infrastructure: - Distributed coordinator for multi-agent workflow orchestration - Cluster management API with comprehensive agent operations - Enhanced database models for agents and projects - Project service for filesystem-based project discovery - Performance monitoring and metrics collection - Comprehensive API documentation and error handling Documentation: - Complete distributed development guide (README_DISTRIBUTED.md) - Comprehensive development report with architecture insights - System configuration templates and deployment guides The platform now provides a complete web interface for managing the distributed AI cluster with real-time monitoring, workflow orchestration, and agent coordination capabilities. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
63 lines
2.2 KiB
JavaScript
63 lines
2.2 KiB
JavaScript
import { transformProps } from '../../render/html/utils/transform.mjs';
|
|
import { appearAnimationStore } from './store.mjs';
|
|
import { appearStoreId } from './store-id.mjs';
|
|
|
|
let handoffFrameTime;
|
|
function handoffOptimizedAppearAnimation(elementId, valueName,
|
|
/**
|
|
* Legacy arguments. This function is inlined as part of SSG so it can be there's
|
|
* a version mismatch between the main included Motion and the inlined script.
|
|
*
|
|
* Remove in early 2024.
|
|
*/
|
|
_value, _frame) {
|
|
const optimisedValueName = transformProps.has(valueName)
|
|
? "transform"
|
|
: valueName;
|
|
const storeId = appearStoreId(elementId, optimisedValueName);
|
|
const optimisedAnimation = appearAnimationStore.get(storeId);
|
|
if (!optimisedAnimation) {
|
|
return null;
|
|
}
|
|
const { animation, startTime } = optimisedAnimation;
|
|
const cancelAnimation = () => {
|
|
appearAnimationStore.delete(storeId);
|
|
try {
|
|
animation.cancel();
|
|
}
|
|
catch (error) { }
|
|
};
|
|
/**
|
|
* If the startTime is null, this animation is the Paint Ready detection animation
|
|
* and we can cancel it immediately without handoff.
|
|
*
|
|
* Or if we've already handed off the animation then we're now interrupting it.
|
|
* In which case we need to cancel it.
|
|
*/
|
|
if (startTime === null || window.HandoffComplete) {
|
|
cancelAnimation();
|
|
return null;
|
|
}
|
|
else {
|
|
/**
|
|
* Otherwise we're handing off this animation to the main thread.
|
|
*
|
|
* Record the time of the first handoff. We call performance.now() once
|
|
* here and once in startOptimisedAnimation to ensure we're getting
|
|
* close to a frame-locked time. This keeps all animations in sync.
|
|
*/
|
|
if (handoffFrameTime === undefined) {
|
|
handoffFrameTime = performance.now();
|
|
}
|
|
/**
|
|
* We use main thread timings vs those returned by Animation.currentTime as it
|
|
* can be the case, particularly in Firefox, that currentTime doesn't return
|
|
* an updated value for several frames, even as the animation plays smoothly via
|
|
* the GPU.
|
|
*/
|
|
return handoffFrameTime - startTime || 0;
|
|
}
|
|
}
|
|
|
|
export { handoffOptimizedAppearAnimation };
|