{"version":3,"file":"OriginResolver.ChHXmAna.mjs","names":[],"sources":["https:/framerusercontent.com/modules/LzqwhCMBskA39jhufps6/Eym8plGkUbSZzVef26dO/OriginResolver.js"],"sourcesContent":["/**\n * @file OriginResolver.ts\n * @description Stagger origin point resolution utilities\n *\n * @version 1.0.0 - Production Implementation\n * @since 1.0.0\n *\n * @example\n * ```typescript\n * import { OriginResolver } from './OriginResolver.ts';\n *\n * const resolver = new OriginResolver();\n * const originPoint = resolver.resolveOrigin(gridResult, 'center');\n *\n * console.log(`Origin resolved to: (${originPoint.x}, ${originPoint.y})`);\n * ```\n */// Module name for logging\nconst MODULE_NAME=\"OriginResolver\";/**\n * Origin point resolution utilities for stagger calculations\n *\n * @description\n * Calculates precise origin coordinates for grid-based staggering.\n * Supports multiple origin types with proper grid bounds handling.\n *\n * **Key Features:**\n * - Multiple origin types: center, corners, edges\n * - Precise grid coordinate calculation\n * - Automatic grid bounds detection\n * - Edge case handling for irregular grids\n * - Mouse/pointer origin support (future)\n *\n * **Supported Origin Types:**\n * - **center**: Grid center point (most common)\n * - **top-left**: Top-left corner\n * - **top-right**: Top-right corner\n * - **bottom-left**: Bottom-left corner\n * - **bottom-right**: Bottom-right corner\n * - **first**: First element position\n * - **last**: Last element position\n * - **random**: Random element position\n */export class OriginResolver{/**\n     * Resolve origin coordinates for stagger calculations\n     *\n     * @description\n     * Main entry point for origin resolution. Converts origin type string\n     * to precise grid coordinates for distance calculations.\n     *\n     * **Algorithm Steps:**\n     * 1. Validate input parameters and grid result\n     * 2. Handle special cases (empty grid, single element)\n     * 3. Calculate grid bounds and dimensions\n     * 4. Resolve origin type to grid coordinates\n     * 5. Validate and return final origin point\n     *\n     * @param gridResult - Grid detection result with positioned elements\n     * @param originType - Type of origin point to resolve\n     * @returns Precise origin coordinates in grid space\n     */resolveOrigin(gridResult,originType){console.log(`🔍 [${MODULE_NAME}] Resolving origin \"${originType}\" for grid ${gridResult.rows}x${gridResult.columns}`);// Validate input\nif(!gridResult||gridResult.elements.length===0){console.warn(`🔍 [${MODULE_NAME}] Empty grid result, using default origin (0, 0)`);return{x:0,y:0};}const{rows,columns,elements}=gridResult;// Handle single element case\nif(elements.length===1){console.log(`🔍 [${MODULE_NAME}] Single element grid, using element position`);return{x:0,y:0};}// Normalize origin string\nconst normalizedOrigin=this.normalizeOriginString(originType);console.log(`🔍 [${MODULE_NAME}] Normalized origin: \"${normalizedOrigin}\"`);// Resolve origin based on type\nlet result;switch(normalizedOrigin){case\"center\":result=this.calculateCenterOrigin(rows,columns);console.log(`🔍 [${MODULE_NAME}] CENTER origin resolved to (${result.x.toFixed(2)}, ${result.y.toFixed(2)})`);break;case\"top-left\":result={x:0,y:0};console.log(`🔍 [${MODULE_NAME}] TOP_LEFT origin resolved to (${result.x}, ${result.y})`);break;case\"top-center\":result={x:(columns-1)/2,y:0};console.log(`🔍 [${MODULE_NAME}] TOP_CENTER origin resolved to (${result.x.toFixed(2)}, ${result.y})`);break;case\"top-right\":result={x:columns-1,y:0};console.log(`🔍 [${MODULE_NAME}] TOP_RIGHT origin resolved to (${result.x}, ${result.y})`);break;case\"center-left\":result={x:0,y:(rows-1)/2};console.log(`🔍 [${MODULE_NAME}] CENTER_LEFT origin resolved to (${result.x}, ${result.y.toFixed(2)})`);break;case\"center-right\":result={x:columns-1,y:(rows-1)/2};console.log(`🔍 [${MODULE_NAME}] CENTER_RIGHT origin resolved to (${result.x}, ${result.y.toFixed(2)})`);break;case\"bottom-left\":result={x:0,y:rows-1};console.log(`🔍 [${MODULE_NAME}] BOTTOM_LEFT origin resolved to (${result.x}, ${result.y})`);break;case\"bottom-center\":result={x:(columns-1)/2,y:rows-1};console.log(`🔍 [${MODULE_NAME}] BOTTOM_CENTER origin resolved to (${result.x.toFixed(2)}, ${result.y})`);break;case\"bottom-right\":result={x:columns-1,y:rows-1};console.log(`🔍 [${MODULE_NAME}] BOTTOM_RIGHT origin resolved to (${result.x}, ${result.y})`);break;case\"first\":result=this.calculateFirstElementOrigin(elements);console.log(`🔍 [${MODULE_NAME}] FIRST origin resolved to element at (${result.x}, ${result.y})`);break;case\"last\":result=this.calculateLastElementOrigin(elements,rows,columns);console.log(`🔍 [${MODULE_NAME}] LAST origin resolved to element at (${result.x}, ${result.y})`);break;case\"random\":result=this.calculateRandomOrigin(elements,rows,columns);console.log(`🔍 [${MODULE_NAME}] RANDOM origin resolved to (${result.x}, ${result.y})`);break;default:console.warn(`🔍 [${MODULE_NAME}] Unknown origin type: \"${normalizedOrigin}\", falling back to center`);result=this.calculateCenterOrigin(rows,columns);break;}// Validate and return result\nreturn this.validateOrigin(result,rows,columns);}/**\n     * Normalize origin string to handle case variations\n     *\n     * @description\n     * Converts various origin string formats to standardized lowercase format\n     * for consistent processing.\n     *\n     * @param originType - Origin type string (any case)\n     * @returns Normalized origin string\n     */normalizeOriginString(originType){if(typeof originType!==\"string\"){return\"center\"// Safe fallback\n;}return originType.toLowerCase().trim();}/**\n     * Calculate center origin point\n     *\n     * @description\n     * Calculates the geometric center of the grid for natural radial staggering.\n     * Handles both even and odd grid dimensions properly.\n     *\n     * @param rows - Number of grid rows\n     * @param columns - Number of grid columns\n     * @returns Center coordinates\n     */calculateCenterOrigin(rows,columns){const centerX=(columns-1)/2;const centerY=(rows-1)/2;return{x:centerX,y:centerY};}/**\n     * Calculate first element origin point\n     *\n     * @description\n     * Uses the position of the first element in the grid as origin.\n     * Provides consistent starting point for element-based staggering.\n     *\n     * @param elements - Grid elements array\n     * @returns First element coordinates\n     */calculateFirstElementOrigin(elements){if(elements.length===0){return{x:0,y:0};}const firstElement=elements[0];return{x:firstElement.position.x,y:firstElement.position.y};}/**\n     * Calculate last element origin point\n     *\n     * @description\n     * Uses the position of the last element in the grid as origin.\n     * Falls back to bottom-right corner if no elements available.\n     *\n     * @param elements - Grid elements array\n     * @param rows - Number of grid rows\n     * @param columns - Number of grid columns\n     * @returns Last element coordinates\n     */calculateLastElementOrigin(elements,rows,columns){if(elements.length===0){return{x:columns-1,y:rows-1};}const lastElement=elements[elements.length-1];return{x:lastElement.position.x,y:lastElement.position.y};}/**\n     * Calculate random element origin point\n     *\n     * @description\n     * Selects a random element position as origin for unpredictable stagger patterns.\n     * Falls back to random coordinates if no elements available.\n     *\n     * @param elements - Grid elements array\n     * @param rows - Number of grid rows\n     * @param columns - Number of grid columns\n     * @returns Random element coordinates\n     */calculateRandomOrigin(elements,rows,columns){if(elements.length===0){return{x:Math.floor(Math.random()*columns),y:Math.floor(Math.random()*rows)};}const randomIndex=Math.floor(Math.random()*elements.length);const randomElement=elements[randomIndex];console.log(`🔍 [${MODULE_NAME}] Selected random element ${randomIndex} from ${elements.length} elements`);return{x:randomElement.position.x,y:randomElement.position.y};}/**\n     * Calculate edge midpoint origins\n     *\n     * @description\n     * Calculates midpoint coordinates for grid edges, useful for\n     * linear stagger effects from edge centers.\n     *\n     * @param edge - Edge type (top, right, bottom, left)\n     * @param rows - Number of grid rows\n     * @param columns - Number of grid columns\n     * @returns Edge midpoint coordinates\n     */calculateEdgeOrigin(edge,rows,columns){switch(edge.toLowerCase()){case\"top\":return{x:(columns-1)/2,y:0};case\"right\":return{x:columns-1,y:(rows-1)/2};case\"bottom\":return{x:(columns-1)/2,y:rows-1};case\"left\":return{x:0,y:(rows-1)/2};default:console.warn(`🔍 [${MODULE_NAME}] Unknown edge type: \"${edge}\", falling back to center`);return this.calculateCenterOrigin(rows,columns);}}/**\n     * Validate origin coordinates\n     *\n     * @description\n     * Ensures origin coordinates are within valid grid bounds.\n     * Clamps values to grid boundaries and provides fallback handling.\n     *\n     * @param origin - Calculated origin coordinates\n     * @param rows - Number of grid rows\n     * @param columns - Number of grid columns\n     * @returns Validated origin coordinates\n     */validateOrigin(origin,rows,columns){// Clamp coordinates to valid grid bounds\nconst clampedX=Math.max(0,Math.min(columns-1,origin.x));const clampedY=Math.max(0,Math.min(rows-1,origin.y));// Check if clamping was necessary\nif(clampedX!==origin.x||clampedY!==origin.y){console.warn(`🔍 [${MODULE_NAME}] Origin coordinates (${origin.x}, ${origin.y}) clamped to (${clampedX}, ${clampedY}) to fit grid bounds`);}return{x:clampedX,y:clampedY};}/**\n     * Find closest grid element to target element\n     *\n     * @description\n     * Future feature: Finds the grid element closest to a target element\n     * for pointer-based or element-relative origin calculations.\n     *\n     * @param targetElement - Target element to find closest grid element to\n     * @param gridResult - Grid detection result\n     * @returns Position of closest grid element\n     */findClosestGridElementToTarget(targetElement,gridResult){const{elements,rows,columns}=gridResult;if(!elements||elements.length===0){console.warn(`🔍 [${MODULE_NAME}] No grid elements found, using default position`);return{x:0,y:0};}if(!targetElement||!targetElement.getBoundingClientRect){console.warn(`🔍 [${MODULE_NAME}] Invalid target element, using center position`);return{x:(columns-1)/2,y:(rows-1)/2};}try{const targetRect=targetElement.getBoundingClientRect();const targetCenterX=targetRect.left+targetRect.width/2;const targetCenterY=targetRect.top+targetRect.height/2;// Find closest grid element by Euclidean distance\nlet closestElement=null;let closestDistance=Infinity;for(const element of elements){const rect=element.pixelPosition;const centerX=rect.left+rect.width/2;const centerY=rect.top+rect.height/2;const dx=centerX-targetCenterX;const dy=centerY-targetCenterY;const distance=Math.sqrt(dx*dx+dy*dy);if(distance<closestDistance){closestDistance=distance;closestElement=element;}}if(closestElement){console.log(`🔍 [${MODULE_NAME}] Found closest grid element at (${closestElement.position.x}, ${closestElement.position.y}), distance=${closestDistance.toFixed(1)}px`);return{x:closestElement.position.x,y:closestElement.position.y};}}catch(error){console.error(`🔍 [${MODULE_NAME}] Error finding closest grid element: ${error}`);}// Fallback to center if no closest element found\nconsole.warn(`🔍 [${MODULE_NAME}] Could not find closest grid element, using center position`);return{x:(columns-1)/2,y:(rows-1)/2};}/**\n     * Convert mouse position to grid coordinates\n     *\n     * @description\n     * Future feature: Converts mouse/pointer coordinates to grid space\n     * for interactive origin selection.\n     *\n     * @param mouseEvent - Mouse event with position data\n     * @param gridResult - Grid detection result\n     * @returns Grid coordinates from mouse position\n     */convertMousePositionToGridCoordinates(mouseEvent,gridResult){const{elements,rows,columns}=gridResult;if(!elements||elements.length===0||!mouseEvent){console.warn(`🔍 [${MODULE_NAME}] No grid elements or mouse event, using center position`);return{x:(columns-1)/2,y:(rows-1)/2};}try{const mouseX=mouseEvent.clientX;const mouseY=mouseEvent.clientY;if(mouseX===undefined||mouseY===undefined){console.warn(`🔍 [${MODULE_NAME}] Invalid mouse position, using center position`);return{x:(columns-1)/2,y:(rows-1)/2};}console.log(`🔍 [${MODULE_NAME}] Mouse position: (${mouseX}, ${mouseY})`);// Calculate grid bounds in screen coordinates\nconst gridBounds=this.calculateGridBounds(elements);// Map mouse position to grid coordinates\nconst relativeX=(mouseX-gridBounds.left)/gridBounds.width;const relativeY=(mouseY-gridBounds.top)/gridBounds.height;const gridX=Math.max(0,Math.min(columns-1,relativeX*(columns-1)));const gridY=Math.max(0,Math.min(rows-1,relativeY*(rows-1)));console.log(`🔍 [${MODULE_NAME}] Mouse mapped to grid coordinates: (${gridX.toFixed(2)}, ${gridY.toFixed(2)})`);return{x:gridX,y:gridY};}catch(error){console.error(`🔍 [${MODULE_NAME}] Error converting mouse position: ${error}`);return{x:(columns-1)/2,y:(rows-1)/2};}}/**\n     * Calculate grid bounds from elements\n     *\n     * @description\n     * Helper method to determine the bounding rectangle of all grid elements\n     * for coordinate mapping calculations.\n     *\n     * @param elements - Grid elements to analyze\n     * @returns Grid boundary information\n     */calculateGridBounds(elements){if(elements.length===0){return{left:0,right:0,top:0,bottom:0,width:0,height:0};}let minX=Infinity;let maxX=-Infinity;let minY=Infinity;let maxY=-Infinity;elements.forEach(element=>{const rect=element.pixelPosition;minX=Math.min(minX,rect.left);maxX=Math.max(maxX,rect.left+rect.width);minY=Math.min(minY,rect.top);maxY=Math.max(maxY,rect.top+rect.height);});return{left:minX,right:maxX,top:minY,bottom:maxY,width:maxX-minX,height:maxY-minY};}}\nexport const __FramerMetadata__ = {\"exports\":{\"OriginResolver\":{\"type\":\"class\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./OriginResolver.map"],"mappings":"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"}