@leozodiac/swarm66 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/math.ts","../src/core/Agent.ts","../src/core/BoidsPhysics.ts","../src/dom/OverlayManager.ts","../src/dom/BuilderEffects.ts","../src/dom/DomScanner.ts","../src/core/SwarmEngine.ts","../src/index.ts"],"names":["vec","x","y","add","v1","v2","sub","mult","v","n","div","magSq","mag","distSq","dx","dy","dist","normalize","m","setMag","limit","maxVal","mSq","heading","headingDeg","lerp","start","end","amt","clamp","val","min","max","randomRange","randomChoice","items","index","dot","Agent","id","color","teamId","initialPos","overlayManager","maxSpeed","maxForce","dom","force","dt","rect","t","scaledAcc","scaledVel","d","progress","newType","targetPos","element","taskId","borderRole","toolType","userPos","pos","BoidsPhysics","agent","allAgents","mousePos","config","viewport","sep","ali","coh","bounds","totalForce","mouseForce","agents","desiredSeparation","steer","count","sepSq","i","other","dSq","diff","neighborDist","sum","neighborDistSq","radius","forceStrength","seekForce","toMouse","tangent","orbitMag","orbitForce","combined","target","slowingRadius","desired","speed","desiredVel","margin","OverlayManager","container","host","shadow","styleEl","wrapper","guides","overlays","agentEl","iconContainer","el","angleDeg","scale","type","showDimensions","showGuides","initialGeometry","box","geo","handle","badge","clone","c","cloneEl","width","height","opacity","boxEl","dimBadge","guidesGroup","guidesH","guidesV","guidesContainer","hTop","hBottom","vLeft","vRight","ripple","BuilderEffects","_BuilderEffects","tagName","text","originalOpacity","originalVisibility","originalTransform","originalTransition","originalPointerEvents","isText","enableTypewriter","durationMs","onComplete","cancelled","timerId","originalText","charDelay","charIndex","typeNextChar","cancel","restore","DomScanner","options","candidates","validElements","scrollY","a","b","topA","topB","entries","entry","mutations","shouldRescan","mutation","j","node","style","DEFAULT_CONFIG","SwarmEngine","userConfig","timestamp","rawDt","activeMouse","task","elapsed","p","ease","src","curX","curY","curW","curH","agentId","idx","editTool","cancelReveal","curLeft","curTop","curOpacity","tool","elements","teamIndices","nextElement","currentEl","template","widthDiff","heightDiff","liveRect","category","boxType","elementCenter","assigned","borderRoles","matchingTemplate","isCopyPaste","sourceRect","initialTool","startPos","role","agentTool","onRouteEvent","originalPushState","originalReplaceState","self","args","result","newUrl","idleAgents","teamMap","list","teamList","distA","distB","resolve","existingHandler","onDone","newConfig","idle","constructing","converging","vanished","Swarm66","DomSwarm","swarm66","enableSwarm","index_default"],"mappings":"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","file":"index.js","sourcesContent":["import { Vector2D } from '../types';\n\n/**\n * Creates a 2D vector.\n */\nexport function vec(x = 0, y = 0): Vector2D {\n return { x, y };\n}\n\n/**\n * Adds two vectors.\n */\nexport function add(v1: Vector2D, v2: Vector2D): Vector2D {\n return { x: v1.x + v2.x, y: v1.y + v2.y };\n}\n\n/**\n * Subtracts v2 from v1.\n */\nexport function sub(v1: Vector2D, v2: Vector2D): Vector2D {\n return { x: v1.x - v2.x, y: v1.y - v2.y };\n}\n\n/**\n * Multiplies vector by scalar.\n */\nexport function mult(v: Vector2D, n: number): Vector2D {\n return { x: v.x * n, y: v.y * n };\n}\n\n/**\n * Divides vector by scalar.\n */\nexport function div(v: Vector2D, n: number): Vector2D {\n if (n === 0) return { x: 0, y: 0 };\n return { x: v.x / n, y: v.y / n };\n}\n\n/**\n * Squared magnitude of a vector.\n */\nexport function magSq(v: Vector2D): number {\n return v.x * v.x + v.y * v.y;\n}\n\n/**\n * Magnitude (length) of a vector.\n */\nexport function mag(v: Vector2D): number {\n return Math.sqrt(magSq(v));\n}\n\n/**\n * Squared Euclidean distance between two points.\n */\nexport function distSq(v1: Vector2D, v2: Vector2D): number {\n const dx = v1.x - v2.x;\n const dy = v1.y - v2.y;\n return dx * dx + dy * dy;\n}\n\n/**\n * Euclidean distance between two points.\n */\nexport function dist(v1: Vector2D, v2: Vector2D): number {\n return Math.sqrt(distSq(v1, v2));\n}\n\n/**\n * Normalizes vector to unit length (length = 1).\n */\nexport function normalize(v: Vector2D): Vector2D {\n const m = mag(v);\n if (m === 0) return { x: 0, y: 0 };\n return { x: v.x / m, y: v.y / m };\n}\n\n/**\n * Sets magnitude of a vector to specified length.\n */\nexport function setMag(v: Vector2D, n: number): Vector2D {\n return mult(normalize(v), n);\n}\n\n/**\n * Limits magnitude of vector to max value.\n */\nexport function limit(v: Vector2D, maxVal: number): Vector2D {\n const mSq = magSq(v);\n if (mSq > maxVal * maxVal) {\n return mult(div(v, Math.sqrt(mSq)), maxVal);\n }\n return { x: v.x, y: v.y };\n}\n\n/**\n * Calculates heading angle in radians (-PI to PI).\n */\nexport function heading(v: Vector2D): number {\n return Math.atan2(v.y, v.x);\n}\n\n/**\n * Calculates heading angle in degrees (0 to 360 or -180 to 180).\n */\nexport function headingDeg(v: Vector2D): number {\n return (Math.atan2(v.y, v.x) * 180) / Math.PI;\n}\n\n/**\n * Linear interpolation between two values.\n */\nexport function lerp(start: number, end: number, amt: number): number {\n return start + (end - start) * amt;\n}\n\n/**\n * Clamps a number between min and max bounds.\n */\nexport function clamp(val: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, val));\n}\n\n/**\n * Generates random float between min and max.\n */\nexport function randomRange(min: number, max: number): number {\n return Math.random() * (max - min) + min;\n}\n\n/**\n * Selects a random element from an array.\n */\nexport function randomChoice<T>(items: T[]): T {\n const index = Math.floor(Math.random() * items.length);\n return items[index] as T;\n}\n\n/**\n * Computes dot product of two vectors.\n */\nexport function dot(v1: Vector2D, v2: Vector2D): number {\n return v1.x * v2.x + v1.y * v2.y;\n}\n\n","import { AgentState, AgentType, BorderRole, Vector2D } from '../types';\nimport { OverlayManager } from '../dom/OverlayManager';\nimport {\n vec,\n add,\n mult,\n limit,\n dist,\n randomRange,\n} from '../utils/math';\n\n/**\n * Individual cursor agent entity with autonomous Boids state machine,\n * collaborative 4-team border construction, and convergence/vanishing finale.\n */\nexport class Agent {\n public id: number;\n public color: string;\n public teamId = 0;\n public state: AgentState = 'IDLE_FLOCKING';\n public type: AgentType = 'pointer';\n\n public position: Vector2D;\n public velocity: Vector2D;\n public acceleration: Vector2D;\n\n public maxSpeed: number;\n public maxForce: number;\n\n public targetPosition: Vector2D | null = null;\n public targetElement: HTMLElement | null = null;\n public assignedTaskId: string | null = null;\n public borderRole: BorderRole | null = null;\n public targetRect: DOMRect | null = null;\n private borderProgress = 0;\n\n public element: HTMLElement;\n public iconContainer: HTMLElement;\n\n private headingAngle = 0;\n private targetScale = 1;\n private currentScale = 1;\n private currentOpacity = 1;\n\n constructor(\n id: number,\n color: string,\n teamId: number,\n initialPos: Vector2D,\n overlayManager: OverlayManager,\n maxSpeed = 9.5,\n maxForce = 0.4\n ) {\n this.id = id;\n this.color = color;\n this.teamId = teamId;\n this.position = { ...initialPos };\n this.velocity = vec(randomRange(-2, 2), randomRange(-2, 2));\n this.acceleration = vec(0, 0);\n this.maxSpeed = maxSpeed;\n this.maxForce = maxForce;\n this.borderProgress = randomRange(0, 1);\n\n // Create DOM cursor inside Shadow root\n const dom = overlayManager.createAgentElement(id, color);\n this.element = dom.element;\n this.iconContainer = dom.iconContainer;\n\n overlayManager.updateAgentTransform(this.element, this.position.x, this.position.y, 0, 1);\n }\n\n /**\n * Applies an external steering or acceleration force to the agent.\n */\n public applyForce(force: Vector2D): void {\n this.acceleration = add(this.acceleration, force);\n }\n\n /**\n * Advances the agent's physics simulation and visual presentation by delta time.\n */\n public update(dt: number, overlayManager: OverlayManager): void {\n if (this.state === 'VANISHED') {\n this.element.style.display = 'none';\n return;\n }\n\n if (this.state === 'CONSTRUCTING_ELEMENT' && this.borderRole && this.targetRect) {\n // Smooth sinusoidal movement along the border without rotation\n const rect = this.targetRect;\n this.borderProgress = (this.borderProgress + dt * 0.016) % 1.0;\n const t = (Math.sin(this.borderProgress * Math.PI * 2) + 1) * 0.5;\n\n if (this.borderRole === 'top') {\n this.position.x = rect.left + rect.width * t;\n this.position.y = rect.top;\n } else if (this.borderRole === 'right') {\n this.position.x = rect.right;\n this.position.y = rect.top + rect.height * t;\n } else if (this.borderRole === 'bottom') {\n this.position.x = rect.right - rect.width * t;\n this.position.y = rect.bottom;\n } else if (this.borderRole === 'left') {\n this.position.x = rect.left;\n this.position.y = rect.bottom - rect.height * t;\n } else {\n // Center text typewriter\n this.position.x = rect.left + rect.width * 0.5;\n this.position.y = rect.top + rect.height * 0.5;\n }\n\n // No rotation while working: keep cursor clean and naturally upright\n this.headingAngle = 0;\n this.targetScale = 1.05;\n this.currentOpacity = 1;\n } else {\n // Standard physics integration\n const scaledAcc = mult(this.acceleration, dt);\n this.velocity = limit(add(this.velocity, scaledAcc), this.maxSpeed);\n\n const scaledVel = mult(this.velocity, dt);\n this.position = add(this.position, scaledVel);\n\n this.acceleration = vec(0, 0);\n\n if (this.state === 'CONVERGING_TO_USER') {\n if (this.targetPosition) {\n const d = dist(this.position, this.targetPosition);\n const progress = Math.min(Math.max(d / 70, 0), 1);\n this.targetScale = progress * 1.05;\n this.currentOpacity = progress;\n\n if (d < 14) {\n this.state = 'VANISHED';\n this.element.style.opacity = '0';\n this.element.style.display = 'none';\n overlayManager.createVanishRipple(this.position.x, this.position.y, this.color);\n return;\n }\n\n // Keep clean upright orientation as agents converge\n this.headingAngle = 0;\n }\n } else {\n // Naturally upright with zero or subtle movement\n this.headingAngle = 0;\n this.targetScale = 1.0;\n this.currentOpacity = 1;\n }\n }\n\n // Smooth scale interpolation\n this.currentScale += (this.targetScale - this.currentScale) * 0.2;\n\n this.element.style.opacity = this.currentOpacity.toFixed(3);\n\n // Update Shadow DOM transform\n overlayManager.updateAgentTransform(\n this.element,\n this.position.x,\n this.position.y,\n this.headingAngle,\n this.currentScale\n );\n }\n\n /**\n * Switches cursor avatar between arrow pointer and I-beam text tool.\n */\n public morphIcon(newType: AgentType, overlayManager: OverlayManager): void {\n if (this.type === newType) return;\n this.type = newType;\n overlayManager.setAgentIcon(this.iconContainer, newType, this.color);\n }\n\n /**\n * Dispatches agent to navigate to a target DOM element coordinate on its border,\n * switching to the element's contextual tool icon (e.g. pencil/pen for text, frame for boxes).\n */\n public assignTarget(\n targetPos: Vector2D,\n element: HTMLElement,\n taskId: string,\n borderRole: BorderRole,\n rect: DOMRect,\n toolType: AgentType,\n overlayManager: OverlayManager\n ): void {\n this.targetPosition = { ...targetPos };\n this.targetElement = element;\n this.assignedTaskId = taskId;\n this.borderRole = borderRole;\n this.targetRect = rect;\n this.state = 'MOVING_TO_TARGET';\n\n this.morphIcon(toolType, overlayManager);\n }\n\n /**\n * Puts agent into element construction mode along its assigned border.\n */\n public setConstructing(): void {\n this.state = 'CONSTRUCTING_ELEMENT';\n this.velocity = mult(this.velocity, 0.2);\n }\n\n /**\n * Marks construction complete and initiates return to swarm flock.\n */\n public returnToSwarm(overlayManager: OverlayManager): void {\n this.state = 'RETURNING_TO_SWARM';\n this.targetPosition = null;\n this.targetElement = null;\n this.assignedTaskId = null;\n this.borderRole = null;\n this.targetRect = null;\n this.morphIcon('pointer', overlayManager);\n\n this.velocity = vec(randomRange(-4, 4), randomRange(-4, 4));\n }\n\n /**\n * Directs the agent to accelerate and converge into the user's cursor, then vanish.\n */\n public convergeTo(userPos: Vector2D, overlayManager: OverlayManager): void {\n this.state = 'CONVERGING_TO_USER';\n this.targetPosition = { ...userPos };\n this.targetElement = null;\n this.assignedTaskId = null;\n this.borderRole = null;\n this.targetRect = null;\n this.morphIcon('pointer', overlayManager);\n this.maxSpeed = 15.0;\n }\n\n /**\n * Restores agent to idle Boids flocking state.\n */\n public setIdle(): void {\n this.state = 'IDLE_FLOCKING';\n this.targetPosition = null;\n this.targetElement = null;\n this.assignedTaskId = null;\n this.borderRole = null;\n this.targetRect = null;\n }\n\n /**\n * Resets agent position, visibility, and state for replaying.\n */\n public reset(pos: Vector2D, overlayManager: OverlayManager): void {\n this.position = { ...pos };\n this.velocity = vec(randomRange(-3, 3), randomRange(-3, 3));\n this.acceleration = vec(0, 0);\n this.state = 'IDLE_FLOCKING';\n this.type = 'pointer';\n this.targetPosition = null;\n this.targetElement = null;\n this.assignedTaskId = null;\n this.borderRole = null;\n this.targetRect = null;\n this.targetScale = 1;\n this.currentScale = 1;\n this.currentOpacity = 1;\n this.element.style.display = 'block';\n this.element.style.opacity = '1';\n overlayManager.setAgentIcon(this.iconContainer, 'pointer', this.color);\n overlayManager.updateAgentTransform(this.element, this.position.x, this.position.y, 0, 1);\n }\n\n /**\n * Removes agent element from DOM.\n */\n public destroy(): void {\n if (this.element && this.element.parentNode) {\n this.element.parentNode.removeChild(this.element);\n }\n }\n}\n","import { Agent } from './Agent';\nimport { ResolvedSwarmConfig, Vector2D } from '../types';\nimport {\n vec,\n add,\n sub,\n mult,\n div,\n dist,\n distSq,\n normalize,\n setMag,\n limit,\n} from '../utils/math';\n\n/**\n * Reynolds Boids algorithm implementation with dynamic mouse attraction\n * and viewport boundary repulsion.\n */\nexport class BoidsPhysics {\n /**\n * Computes the combined flocking force for an agent in IDLE_FLOCKING or RETURNING_TO_SWARM state.\n */\n public static calculateFlockingForces(\n agent: Agent,\n allAgents: Agent[],\n mousePos: Vector2D | null,\n config: ResolvedSwarmConfig,\n viewport: { width: number; height: number }\n ): Vector2D {\n const sep = this.separate(agent, allAgents, config.separateDistance);\n const ali = this.align(agent, allAgents, config.flockRadius);\n const coh = this.cohere(agent, allAgents, config.flockRadius);\n const bounds = this.boundEdges(agent, viewport, 60);\n\n // Default force weights\n let totalForce = vec(0, 0);\n totalForce = add(totalForce, mult(sep, 1.6));\n totalForce = add(totalForce, mult(ali, 1.0));\n totalForce = add(totalForce, mult(coh, 0.9));\n totalForce = add(totalForce, mult(bounds, 2.2));\n\n // Mouse attraction / Orbiting\n if (config.followMouse && mousePos) {\n const mouseForce = this.attractToMouse(\n agent,\n mousePos,\n config.mouseAttractRadius,\n config.mouseAttractForce\n );\n totalForce = add(totalForce, mouseForce);\n }\n\n return limit(totalForce, agent.maxForce * 2.0);\n }\n\n /**\n * Separation: steer to avoid colliding with nearby flockmates.\n */\n public static separate(agent: Agent, agents: Agent[], desiredSeparation: number): Vector2D {\n let steer = vec(0, 0);\n let count = 0;\n const sepSq = desiredSeparation * desiredSeparation;\n\n for (let i = 0; i < agents.length; i++) {\n const other = agents[i];\n if (!other || other.id === agent.id) continue;\n\n const dSq = distSq(agent.position, other.position);\n if (dSq > 0 && dSq < sepSq) {\n const d = Math.sqrt(dSq);\n // Vector pointing away from neighbor, inversely proportional to distance\n let diff = sub(agent.position, other.position);\n diff = normalize(diff);\n diff = div(diff, Math.max(d, 1));\n steer = add(steer, diff);\n count++;\n }\n }\n\n if (count > 0) {\n steer = div(steer, count);\n if (distSq(steer, vec(0, 0)) > 0) {\n steer = normalize(steer);\n steer = mult(steer, agent.maxSpeed);\n steer = sub(steer, agent.velocity);\n steer = limit(steer, agent.maxForce * 1.5);\n }\n }\n\n return steer;\n }\n\n /**\n * Alignment: steer towards the average velocity of nearby flockmates.\n */\n public static align(agent: Agent, agents: Agent[], neighborDist: number): Vector2D {\n let sum = vec(0, 0);\n let count = 0;\n const neighborDistSq = neighborDist * neighborDist;\n\n for (let i = 0; i < agents.length; i++) {\n const other = agents[i];\n if (!other || other.id === agent.id || other.state === 'CONSTRUCTING_ELEMENT') continue;\n\n const dSq = distSq(agent.position, other.position);\n if (dSq > 0 && dSq < neighborDistSq) {\n sum = add(sum, other.velocity);\n count++;\n }\n }\n\n if (count > 0) {\n sum = div(sum, count);\n sum = normalize(sum);\n sum = mult(sum, agent.maxSpeed);\n let steer = sub(sum, agent.velocity);\n steer = limit(steer, agent.maxForce);\n return steer;\n }\n\n return vec(0, 0);\n }\n\n /**\n * Cohesion: steer to move toward the average position of nearby flockmates.\n */\n public static cohere(agent: Agent, agents: Agent[], neighborDist: number): Vector2D {\n let sum = vec(0, 0);\n let count = 0;\n const neighborDistSq = neighborDist * neighborDist;\n\n for (let i = 0; i < agents.length; i++) {\n const other = agents[i];\n if (!other || other.id === agent.id || other.state === 'CONSTRUCTING_ELEMENT') continue;\n\n const dSq = distSq(agent.position, other.position);\n if (dSq > 0 && dSq < neighborDistSq) {\n sum = add(sum, other.position);\n count++;\n }\n }\n\n if (count > 0) {\n sum = div(sum, count);\n return this.seek(agent, sum);\n }\n\n return vec(0, 0);\n }\n\n /**\n * Mouse Attraction: draws agents toward live cursor coordinates with dynamic swirling orbit.\n */\n public static attractToMouse(\n agent: Agent,\n mousePos: Vector2D,\n radius: number,\n forceStrength: number\n ): Vector2D {\n const d = dist(agent.position, mousePos);\n if (d > radius * 2.5) return vec(0, 0);\n\n // Seek towards mouse with arrival\n const seekForce = this.seek(agent, mousePos, radius * 0.8);\n\n // Add gentle swirling tangential vector around cursor for dynamic flock cloud\n const toMouse = sub(mousePos, agent.position);\n const tangent = normalize({ x: -toMouse.y, y: toMouse.x });\n const orbitMag = (1 - Math.min(d / radius, 1)) * 0.8;\n const orbitForce = mult(tangent, orbitMag);\n\n const combined = add(mult(seekForce, forceStrength), orbitForce);\n return limit(combined, agent.maxForce * 1.8);\n }\n\n /**\n * Steer toward a specific target coordinate with arrival slowing.\n */\n public static seek(agent: Agent, target: Vector2D, slowingRadius = 120): Vector2D {\n const desired = sub(target, agent.position);\n const d = dist(target, agent.position);\n\n if (d === 0) return vec(0, 0);\n\n let speed = agent.maxSpeed;\n if (d < slowingRadius) {\n speed = agent.maxSpeed * (d / slowingRadius);\n }\n\n const desiredVel = setMag(desired, speed);\n const steer = sub(desiredVel, agent.velocity);\n return limit(steer, agent.maxForce);\n }\n\n /**\n * Smooth boundary repulsion from viewport edges so agents stay visible.\n */\n public static boundEdges(\n agent: Agent,\n viewport: { width: number; height: number },\n margin = 60\n ): Vector2D {\n let steer = vec(0, 0);\n\n if (agent.position.x < margin) {\n steer.x = (margin - agent.position.x) / margin;\n } else if (agent.position.x > viewport.width - margin) {\n steer.x = (viewport.width - margin - agent.position.x) / margin;\n }\n\n if (agent.position.y < margin) {\n steer.y = (margin - agent.position.y) / margin;\n } else if (agent.position.y > viewport.height - margin) {\n steer.y = (viewport.height - margin - agent.position.y) / margin;\n }\n\n if (distSq(steer, vec(0, 0)) > 0) {\n steer = setMag(steer, agent.maxSpeed);\n steer = sub(steer, agent.velocity);\n steer = limit(steer, agent.maxForce * 2.0);\n }\n\n return steer;\n }\n}\n\n","import { AgentType, BoundingBoxType } from '../types';\n\n/**\n * Manages the open Shadow DOM overlay container, scoped CSS styles,\n * SVG cursor rendering, Figma selection boxes, and alignment guides.\n */\nexport class OverlayManager {\n private hostElement: HTMLElement | null = null;\n private shadowRoot: ShadowRoot | null = null;\n private agentsLayer: HTMLElement | null = null;\n private overlaysLayer: HTMLElement | null = null;\n private guidesLayer: HTMLElement | null = null;\n private mounted = false;\n\n constructor(private container: HTMLElement = typeof document !== 'undefined' ? document.body : (null as any)) {}\n\n /**\n * Mounts the full-screen Shadow DOM overlay.\n */\n public mount(): boolean {\n if (this.mounted || typeof document === 'undefined') return false;\n\n // Create root host element\n const host = document.createElement('dom-swarm-overlay');\n host.setAttribute('aria-hidden', 'true');\n host.style.position = 'fixed';\n host.style.inset = '0';\n host.style.width = '100vw';\n host.style.height = '100vh';\n host.style.pointerEvents = 'none';\n host.style.zIndex = '2147483647';\n host.style.overflow = 'hidden';\n\n // Attach open Shadow DOM\n const shadow = host.attachShadow({ mode: 'open' });\n\n // Inject scoped styles\n const styleEl = document.createElement('style');\n styleEl.textContent = this.getScopedStyles();\n shadow.appendChild(styleEl);\n\n // Root wrapper inside shadow\n const wrapper = document.createElement('div');\n wrapper.className = 'swarm-root';\n\n // Alignment guides layer (bottom)\n const guides = document.createElement('div');\n guides.className = 'swarm-guides-layer';\n wrapper.appendChild(guides);\n\n // Bounding boxes layer (middle)\n const overlays = document.createElement('div');\n overlays.className = 'swarm-overlays-layer';\n wrapper.appendChild(overlays);\n\n // Agents cursor layer (top)\n const agents = document.createElement('div');\n agents.className = 'swarm-agents-layer';\n wrapper.appendChild(agents);\n\n shadow.appendChild(wrapper);\n\n // Mount to host container\n const targetParent = this.container || document.body;\n targetParent.appendChild(host);\n\n this.hostElement = host;\n this.shadowRoot = shadow;\n this.guidesLayer = guides;\n this.overlaysLayer = overlays;\n this.agentsLayer = agents;\n this.mounted = true;\n\n return true;\n }\n\n /**\n * Creates an agent cursor element with crisp SVG icon (no text badges).\n */\n public createAgentElement(id: number, color: string): {\n element: HTMLElement;\n iconContainer: HTMLElement;\n } {\n if (!this.agentsLayer) {\n throw new Error('[dom-swarm] OverlayManager is not mounted.');\n }\n\n const agentEl = document.createElement('div');\n agentEl.className = 'swarm-agent';\n agentEl.dataset.agentId = id.toString();\n\n // Inner icon container\n const iconContainer = document.createElement('div');\n iconContainer.className = 'swarm-agent-icon';\n iconContainer.innerHTML = this.getPointerSvg(color);\n\n agentEl.appendChild(iconContainer);\n this.agentsLayer.appendChild(agentEl);\n\n return { element: agentEl, iconContainer };\n }\n\n /**\n * Updates hardware-accelerated transform of an agent cursor.\n */\n public updateAgentTransform(\n el: HTMLElement,\n x: number,\n y: number,\n angleDeg: number,\n scale = 1\n ): void {\n el.style.transform = `translate3d(${x}px, ${y}px, 0) rotate(${angleDeg}deg) scale(${scale})`;\n }\n\n /**\n * Morphs/switches an agent icon to match the contextual tool category\n * (e.g. pen for text, frame for containers, media for images, button for clicks, duplicate for clones).\n */\n public setAgentIcon(iconContainer: HTMLElement, type: AgentType, color: string): void {\n iconContainer.className = 'swarm-agent-icon';\n\n switch (type) {\n case 'pen':\n iconContainer.innerHTML = this.getPenSvg(color);\n iconContainer.classList.add('is-pen');\n break;\n case 'frame':\n iconContainer.innerHTML = this.getFrameSvg(color);\n iconContainer.classList.add('is-frame');\n break;\n case 'media':\n iconContainer.innerHTML = this.getMediaSvg(color);\n iconContainer.classList.add('is-media');\n break;\n case 'button':\n iconContainer.innerHTML = this.getButtonSvg(color);\n iconContainer.classList.add('is-button');\n break;\n case 'code':\n iconContainer.innerHTML = this.getCodeSvg(color);\n iconContainer.classList.add('is-code');\n break;\n case 'ibeam':\n iconContainer.innerHTML = this.getIBeamSvg(color);\n iconContainer.classList.add('is-ibeam');\n break;\n case 'hand':\n case 'duplicate':\n iconContainer.innerHTML = this.getHandSvg(color);\n iconContainer.classList.add('is-hand');\n break;\n case 'pointer':\n default:\n iconContainer.innerHTML = this.getPointerSvg(color);\n break;\n }\n }\n\n /**\n * Creates an animated selection bounding box overlay drawn by the swarm.\n */\n public createBoundingBox(\n id: string,\n rect: DOMRect,\n type: BoundingBoxType,\n showDimensions = true,\n showGuides = true,\n initialGeometry?: { left: number; top: number; width: number; height: number; opacity?: number }\n ): HTMLElement {\n if (!this.overlaysLayer) {\n throw new Error('[dom-swarm] OverlayManager is not mounted.');\n }\n\n const box = document.createElement('div');\n box.className = `swarm-bounding-box box-${type}`;\n box.id = `swarm-box-${id}`;\n\n const geo = initialGeometry || {\n left: rect.left,\n top: rect.top,\n width: Math.max(4, rect.width),\n height: Math.max(4, rect.height),\n opacity: 1,\n };\n\n box.style.transform = `translate3d(${geo.left}px, ${geo.top}px, 0)`;\n box.style.width = `${Math.max(0, geo.width)}px`;\n box.style.height = `${Math.max(0, geo.height)}px`;\n box.style.opacity = (geo.opacity ?? 1).toString();\n\n // 4 corner handles for Figma-style shape creation and editing\n const corners = ['tl', 'tr', 'bl', 'br'];\n corners.forEach((c) => {\n const handle = document.createElement('div');\n handle.className = `swarm-corner-handle handle-${c}`;\n box.appendChild(handle);\n });\n\n if (showDimensions) {\n const badge = document.createElement('div');\n badge.className = 'swarm-dimension-badge';\n badge.textContent = `${Math.round(geo.width)} × ${Math.round(geo.height)}`;\n box.appendChild(badge);\n }\n\n if (type === 'red' && showGuides && this.guidesLayer) {\n this.createAlignmentGuides(id, rect);\n }\n\n this.overlaysLayer.appendChild(box);\n return box;\n }\n\n /**\n * Creates a ghost wireframe clone for Figma-style copy/paste duplicate animations.\n */\n public createGhostClone(id: string, rect: DOMRect): HTMLElement {\n if (!this.overlaysLayer) {\n throw new Error('[dom-swarm] OverlayManager is not mounted.');\n }\n\n const clone = document.createElement('div');\n clone.className = 'swarm-ghost-clone';\n clone.id = `swarm-clone-${id}`;\n clone.style.transform = `translate3d(${rect.left}px, ${rect.top}px, 0)`;\n clone.style.width = `${Math.max(4, rect.width)}px`;\n clone.style.height = `${Math.max(4, rect.height)}px`;\n\n const badge = document.createElement('div');\n badge.className = 'swarm-clone-badge';\n badge.textContent = 'Duplicate ⌥Drag';\n clone.appendChild(badge);\n\n const corners = ['tl', 'tr', 'bl', 'br'];\n corners.forEach((c) => {\n const handle = document.createElement('div');\n handle.className = `swarm-corner-handle handle-${c}`;\n clone.appendChild(handle);\n });\n\n this.overlaysLayer.appendChild(clone);\n return clone;\n }\n\n /**\n * Updates coordinates of the ghost clone as it glides from source to destination.\n */\n public updateGhostClone(\n cloneEl: HTMLElement,\n x: number,\n y: number,\n width: number,\n height: number,\n opacity = 1\n ): void {\n cloneEl.style.transform = `translate3d(${x}px, ${y}px, 0)`;\n cloneEl.style.width = `${Math.max(4, width)}px`;\n cloneEl.style.height = `${Math.max(4, height)}px`;\n cloneEl.style.opacity = opacity.toString();\n }\n\n /**\n * Removes a ghost clone element.\n */\n public removeGhostClone(cloneEl: HTMLElement): void {\n if (cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n }\n\n /**\n * Smoothly updates bounding box geometry as the swarm cursors drag/expand it.\n */\n public updateBoxGeometry(\n boxEl: HTMLElement,\n rect: { left: number; top: number; width: number; height: number },\n opacity = 1,\n id?: string\n ): void {\n boxEl.style.transform = `translate3d(${rect.left}px, ${rect.top}px, 0)`;\n boxEl.style.width = `${Math.max(0, rect.width)}px`;\n boxEl.style.height = `${Math.max(0, rect.height)}px`;\n boxEl.style.opacity = opacity.toString();\n\n const dimBadge = boxEl.querySelector('.swarm-dimension-badge');\n if (dimBadge) {\n dimBadge.textContent = `${Math.round(rect.width)} × ${Math.round(rect.height)}`;\n }\n\n if (id && this.guidesLayer) {\n const guidesGroup = this.shadowRoot?.getElementById(`swarm-guides-${id}`);\n if (guidesGroup) {\n const guidesH = guidesGroup.querySelectorAll<HTMLElement>('.swarm-guide-h');\n if (guidesH[0]) guidesH[0].style.top = `${rect.top}px`;\n if (guidesH[1]) guidesH[1].style.top = `${rect.top + rect.height}px`;\n\n const guidesV = guidesGroup.querySelectorAll<HTMLElement>('.swarm-guide-v');\n if (guidesV[0]) guidesV[0].style.left = `${rect.left}px`;\n if (guidesV[1]) guidesV[1].style.left = `${rect.left + rect.width}px`;\n }\n }\n }\n\n /**\n * Creates full-screen red alignment guide lines.\n */\n private createAlignmentGuides(id: string, rect: DOMRect): void {\n if (!this.guidesLayer) return;\n\n const guidesContainer = document.createElement('div');\n guidesContainer.className = 'swarm-guides-group';\n guidesContainer.id = `swarm-guides-${id}`;\n\n // Horizontal top guide\n const hTop = document.createElement('div');\n hTop.className = 'swarm-guide swarm-guide-h';\n hTop.style.top = `${rect.top}px`;\n\n // Horizontal bottom guide\n const hBottom = document.createElement('div');\n hBottom.className = 'swarm-guide swarm-guide-h';\n hBottom.style.top = `${rect.bottom}px`;\n\n // Vertical left guide\n const vLeft = document.createElement('div');\n vLeft.className = 'swarm-guide swarm-guide-v';\n vLeft.style.left = `${rect.left}px`;\n\n // Vertical right guide\n const vRight = document.createElement('div');\n vRight.className = 'swarm-guide swarm-guide-v';\n vRight.style.left = `${rect.right}px`;\n\n guidesContainer.appendChild(hTop);\n guidesContainer.appendChild(hBottom);\n guidesContainer.appendChild(vLeft);\n guidesContainer.appendChild(vRight);\n\n this.guidesLayer.appendChild(guidesContainer);\n }\n\n /**\n * Updates coordinates of an existing bounding box and its alignment guides during scrolling/resizing.\n */\n public updateBoundingBox(boxEl: HTMLElement, rect: DOMRect, id?: string): void {\n boxEl.style.transform = `translate3d(${rect.left}px, ${rect.top}px, 0)`;\n boxEl.style.width = `${Math.max(4, rect.width)}px`;\n boxEl.style.height = `${Math.max(4, rect.height)}px`;\n\n const dimBadge = boxEl.querySelector('.swarm-dimension-badge');\n if (dimBadge) {\n dimBadge.textContent = `${Math.round(rect.width)} × ${Math.round(rect.height)}`;\n }\n\n if (id && this.guidesLayer) {\n const guidesGroup = this.shadowRoot?.getElementById(`swarm-guides-${id}`);\n if (guidesGroup) {\n const guidesH = guidesGroup.querySelectorAll<HTMLElement>('.swarm-guide-h');\n if (guidesH[0]) guidesH[0].style.top = `${rect.top}px`;\n if (guidesH[1]) guidesH[1].style.top = `${rect.bottom}px`;\n\n const guidesV = guidesGroup.querySelectorAll<HTMLElement>('.swarm-guide-v');\n if (guidesV[0]) guidesV[0].style.left = `${rect.left}px`;\n if (guidesV[1]) guidesV[1].style.left = `${rect.right}px`;\n }\n }\n }\n\n /**\n * Removes a bounding box overlay and any attached guide lines.\n */\n public removeBoundingBox(boxEl: HTMLElement, id?: string): void {\n if (boxEl.parentNode) {\n boxEl.parentNode.removeChild(boxEl);\n }\n if (id && this.shadowRoot) {\n const guides = this.shadowRoot.getElementById(`swarm-guides-${id}`);\n if (guides && guides.parentNode) {\n guides.parentNode.removeChild(guides);\n }\n }\n }\n\n /**\n * Standard Pointer SVG icon string.\n */\n private getPointerSvg(color: string): string {\n return `<svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 2L10 21L13.5 13.5L21 10L3 2Z\" fill=\"${color}\" stroke=\"#FFFFFF\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\n </svg>`;\n }\n\n /**\n * Pencil / Pen tool SVG for text drafting and editing.\n * Sharp tip aligned at (2, 2) matching cursor transform-origin.\n */\n private getPenSvg(color: string): string {\n return `<svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 2L3.5 9L9 3.5L2 2Z\" fill=\"#FFFFFF\" stroke=\"#FFFFFF\" stroke-width=\"1.2\" stroke-linejoin=\"round\"/>\n <path d=\"M3.5 9L9 3.5L17.5 12L12 17.5L3.5 9Z\" fill=\"${color}\" stroke=\"#FFFFFF\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\n <path d=\"M12 17.5L17.5 12L20 14.5C21 15.5 21 17 20 18L18 20C17 21 15.5 21 14.5 20L12 17.5Z\" fill=\"${color}\" stroke=\"#FFFFFF\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\n <path d=\"M6.5 6.5L15 15\" stroke=\"#FFFFFF\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n <circle cx=\"2\" cy=\"2\" r=\"1.2\" fill=\"#111827\"/>\n </svg>`;\n }\n\n /**\n * Figma Frame / Container tool SVG with \"#\" layout badge.\n */\n private getFrameSvg(color: string): string {\n return `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 2L8.5 19L11.5 12.5L18 9.5L2 2Z\" fill=\"${color}\" stroke=\"#FFFFFF\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\n <path d=\"M14 12V21M18 12V21M11 15H21M11 18.5H21\" stroke=\"#FFFFFF\" stroke-width=\"2.6\" stroke-linecap=\"round\"/>\n <path d=\"M14 12V21M18 12V21M11 15H21M11 18.5H21\" stroke=\"${color}\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n </svg>`;\n }\n\n /**\n * Media / Image tool SVG with landscape photo placement badge.\n */\n private getMediaSvg(color: string): string {\n return `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 2L8.5 19L11.5 12.5L18 9.5L2 2Z\" fill=\"${color}\" stroke=\"#FFFFFF\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\n <rect x=\"12\" y=\"12\" width=\"10\" height=\"9\" rx=\"1.5\" fill=\"#0F172A\" stroke=\"#FFFFFF\" stroke-width=\"1.5\"/>\n <circle cx=\"15\" cy=\"15\" r=\"1.2\" fill=\"#FBBF24\"/>\n <path d=\"M13 19L16 15.5L18 17.5L20 15L21 16.5V19H13Z\" fill=\"${color}\"/>\n </svg>`;\n }\n\n /**\n * Button / Interactive tool SVG with rounded button pill badge.\n */\n private getButtonSvg(color: string): string {\n return `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 2L8.5 19L11.5 12.5L18 9.5L2 2Z\" fill=\"${color}\" stroke=\"#FFFFFF\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\n <rect x=\"11.5\" y=\"12.5\" width=\"10.5\" height=\"7.5\" rx=\"3.75\" fill=\"${color}\" stroke=\"#FFFFFF\" stroke-width=\"1.5\"/>\n <path d=\"M15 14.5L18.5 16.25L15 18V14.5Z\" fill=\"#FFFFFF\"/>\n </svg>`;\n }\n\n /**\n * Code / Terminal tool SVG with code brackets badge.\n */\n private getCodeSvg(color: string): string {\n return `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 2L8.5 19L11.5 12.5L18 9.5L2 2Z\" fill=\"${color}\" stroke=\"#FFFFFF\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\n <rect x=\"11\" y=\"12\" width=\"12\" height=\"9\" rx=\"2\" fill=\"#0F172A\" stroke=\"#FFFFFF\" stroke-width=\"1.5\"/>\n <path d=\"M14 15L12.5 16.5L14 18M18 15L19.5 16.5L18 18\" stroke=\"#38BDF8\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>`;\n }\n\n /**\n * I-Beam text insertion SVG icon string.\n */\n private getIBeamSvg(color: string): string {\n return `<svg width=\"20\" height=\"24\" viewBox=\"0 0 20 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 3H16M10 3V21M4 21H16\" stroke=\"#FFFFFF\" stroke-width=\"3\" stroke-linecap=\"round\"/>\n <path d=\"M4 3H16M10 3V21M4 21H16\" stroke=\"${color}\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n </svg>`;\n }\n\n /**\n * Hand dragging tool SVG for copy-pasting elements.\n * Classic Figma / OS open dragging hand anchored at top fingertip.\n */\n private getHandSvg(color: string): string {\n return `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 3V11M8 11L6 9C5.2 8.2 3.8 8.2 3 9C2.2 9.8 2.2 11.2 3 12L8 17C9.3 18.3 11.1 19 13 19H16C18.8 19 21 16.8 21 14V10C21 8.9 20.1 8 19 8C18.7 8 18.4 8.1 18.2 8.2C17.9 7.2 17 6.5 16 6.5C15.6 6.5 15.3 6.6 15 6.8C14.6 6 13.8 5.5 13 5.5C12.6 5.5 12.3 5.6 12 5.8V3C12 1.9 11.1 1 10 1C8.9 1 8 1.9 8 3V11\" fill=\"${color}\" stroke=\"#FFFFFF\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\n </svg>`;\n }\n\n /**\n * Spawns a glowing expanding ripple when a cursor converges and vanishes into the user pointer.\n */\n public createVanishRipple(x: number, y: number, color: string): void {\n if (!this.overlaysLayer) return;\n\n const ripple = document.createElement('div');\n ripple.className = 'swarm-vanish-ripple';\n ripple.style.left = `${x}px`;\n ripple.style.top = `${y}px`;\n ripple.style.border = `2px solid ${color}`;\n ripple.style.boxShadow = `0 0 12px ${color}`;\n\n this.overlaysLayer.appendChild(ripple);\n\n setTimeout(() => {\n if (ripple.parentNode) {\n ripple.parentNode.removeChild(ripple);\n }\n }, 600);\n }\n\n /**\n * Scoped CSS styles injected directly into Shadow DOM.\n */\n private getScopedStyles(): string {\n return `\n :host {\n all: initial;\n pointer-events: none;\n }\n .swarm-root {\n position: fixed;\n inset: 0;\n width: 100vw;\n height: 100vh;\n pointer-events: none;\n overflow: hidden;\n user-select: none;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n }\n .swarm-agents-layer,\n .swarm-overlays-layer,\n .swarm-guides-layer {\n position: absolute;\n inset: 0;\n pointer-events: none;\n }\n .swarm-agent {\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n will-change: transform;\n transform-origin: 3px 2px;\n filter: drop-shadow(0 2px 5px rgba(0, 0, 0, 0.28));\n transition: opacity 0.2s ease;\n }\n .swarm-agent-icon {\n display: inline-block;\n pointer-events: none;\n transform-origin: 0 0;\n transition: transform 0.15s ease;\n }\n .swarm-agent-icon.is-pen {\n animation: swarm-pen-draw 0.35s infinite alternate ease-in-out;\n }\n @keyframes swarm-pen-draw {\n 0% { transform: translate(0, 0); }\n 100% { transform: translate(1.5px, -1.5px); }\n }\n .swarm-agent-icon.is-ibeam {\n animation: swarm-ibeam-pulse 0.7s infinite alternate ease-in-out;\n }\n @keyframes swarm-ibeam-pulse {\n 0% { opacity: 0.6; transform: scale(0.95); }\n 100% { opacity: 1; transform: scale(1.05); }\n }\n .swarm-agent-icon.is-button {\n animation: swarm-button-press 0.45s infinite alternate ease-in-out;\n }\n @keyframes swarm-button-press {\n 0% { transform: scale(1); }\n 100% { transform: scale(0.92); }\n }\n .swarm-agent-icon.is-hand,\n .swarm-agent-icon.is-duplicate {\n animation: swarm-dup-float 0.45s infinite alternate ease-in-out;\n }\n @keyframes swarm-dup-float {\n 0% { transform: translateY(0); }\n 100% { transform: translateY(-1.5px); }\n }\n .swarm-bounding-box {\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n will-change: transform, width, height;\n box-sizing: border-box;\n border-radius: 2px;\n transition: opacity 0.2s ease;\n }\n .box-blue {\n border: 1.5px solid #0d99ff;\n background: rgba(13, 153, 255, 0.08);\n box-shadow: 0 0 0 1px rgba(13, 153, 255, 0.2);\n }\n .box-red {\n border: 1.5px solid #f24822;\n background: rgba(242, 72, 34, 0.07);\n box-shadow: 0 0 0 1px rgba(242, 72, 34, 0.2);\n }\n .swarm-ghost-clone {\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n will-change: transform;\n box-sizing: border-box;\n border: 1.5px dashed #0d99ff;\n background: rgba(13, 153, 255, 0.12);\n box-shadow: 0 4px 14px rgba(13, 153, 255, 0.22);\n border-radius: 2px;\n }\n .swarm-clone-badge {\n position: absolute;\n top: -22px;\n left: 0;\n background: #0d99ff;\n color: #ffffff;\n font-size: 9px;\n font-weight: 700;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;\n padding: 2px 6px;\n border-radius: 4px;\n white-space: nowrap;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.25);\n letter-spacing: 0.3px;\n }\n .swarm-corner-handle {\n position: absolute;\n width: 6px;\n height: 6px;\n background: #ffffff;\n border: 1.5px solid #0d99ff;\n border-radius: 1px;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n }\n .box-red .swarm-corner-handle {\n border-color: #f24822;\n }\n .handle-tl { top: -4px; left: -4px; }\n .handle-tr { top: -4px; right: -4px; }\n .handle-bl { bottom: -4px; left: -4px; }\n .handle-br { bottom: -4px; right: -4px; }\n\n .swarm-dimension-badge {\n position: absolute;\n left: 50%;\n bottom: -22px;\n transform: translateX(-50%);\n background: #0d99ff;\n color: #ffffff;\n font-size: 10px;\n font-weight: 600;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n padding: 2px 6px;\n border-radius: 4px;\n white-space: nowrap;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\n letter-spacing: 0.2px;\n }\n .box-red .swarm-dimension-badge {\n background: #f24822;\n }\n .swarm-distance-badge {\n position: absolute;\n top: -18px;\n left: 4px;\n background: #f24822;\n color: #ffffff;\n font-size: 9px;\n font-weight: 700;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n padding: 1px 5px;\n border-radius: 3px;\n white-space: nowrap;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n }\n .swarm-vanish-ripple {\n position: absolute;\n border-radius: 50%;\n pointer-events: none;\n transform: translate(-50%, -50%);\n animation: swarm-ripple 0.55s cubic-bezier(0.1, 0.8, 0.2, 1) forwards;\n }\n @keyframes swarm-ripple {\n 0% {\n width: 6px;\n height: 6px;\n opacity: 0.9;\n transform: translate(-50%, -50%) scale(0.6);\n }\n 100% {\n width: 70px;\n height: 70px;\n opacity: 0;\n transform: translate(-50%, -50%) scale(1.4);\n }\n }\n .swarm-guide {\n position: absolute;\n pointer-events: none;\n }\n .swarm-guide-h {\n left: 0;\n right: 0;\n width: 100vw;\n height: 1px;\n background: rgba(242, 72, 34, 0.45);\n border-top: 1px dashed rgba(242, 72, 34, 0.6);\n }\n .swarm-guide-v {\n top: 0;\n bottom: 0;\n height: 100vh;\n width: 1px;\n background: rgba(242, 72, 34, 0.45);\n border-left: 1px dashed rgba(242, 72, 34, 0.6);\n }\n `;\n }\n\n /**\n * Destroys and cleans up the overlay.\n */\n public destroy(): void {\n if (this.hostElement && this.hostElement.parentNode) {\n this.hostElement.parentNode.removeChild(this.hostElement);\n }\n this.hostElement = null;\n this.shadowRoot = null;\n this.agentsLayer = null;\n this.overlaysLayer = null;\n this.guidesLayer = null;\n this.mounted = false;\n }\n}\n\n","import { ElementCategory } from '../types';\n\n/**\n * Non-destructive DOM construction visual effects:\n * initial blank canvas hiding, typewriter text reveals, block scale-ins,\n * and safe style restoration failsafes.\n */\nexport class BuilderEffects {\n private activeRestorations = new Map<HTMLElement, () => void>();\n private modifiedElements = new Set<HTMLElement>();\n\n /**\n * Identifies the design/semantic category of an element to pick the appropriate cursor tool\n * (e.g. pencil/pen for text, frame for containers, image tool for media, button tool for clicks).\n */\n public static getElementCategory(element: HTMLElement): ElementCategory {\n const tagName = element.tagName.toLowerCase();\n\n // 1. Code blocks and terminal elements\n if (tagName === 'pre' || tagName === 'code' || tagName === 'kbd' || tagName === 'samp') {\n return 'code';\n }\n\n // 2. Form input controls\n if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {\n return 'input';\n }\n\n // 3. Buttons & Clickable actions\n if (\n tagName === 'button' ||\n element.getAttribute('role') === 'button' ||\n element.classList.contains('btn') ||\n element.classList.contains('button') ||\n (tagName === 'a' &&\n (element.classList.contains('btn') ||\n element.classList.contains('btn-primary') ||\n element.classList.contains('btn-secondary')))\n ) {\n return 'button';\n }\n\n // 4. Media & Graphics\n if (\n tagName === 'img' ||\n tagName === 'svg' ||\n tagName === 'video' ||\n tagName === 'canvas' ||\n tagName === 'picture' ||\n tagName === 'figure' ||\n element.classList.contains('avatar') ||\n element.classList.contains('icon')\n ) {\n return 'media';\n }\n\n // 5. Text elements (headers, paragraphs, labels, spans, inline text)\n const textTags = [\n 'p',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'span',\n 'label',\n 'blockquote',\n 'strong',\n 'em',\n 'small',\n 'b',\n 'i',\n 'li',\n 'a',\n ];\n if (textTags.includes(tagName)) {\n return 'text';\n }\n\n // 6. Default: Layout containers, sections, cards, wrappers\n return 'container';\n }\n\n /**\n * Checks whether an element is suitable for a typewriter text reveal.\n */\n public static isTextElement(element: HTMLElement): boolean {\n const tagName = element.tagName.toLowerCase();\n const textTags = [\n 'p',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'code',\n 'pre',\n 'span',\n 'strong',\n 'em',\n 'blockquote',\n 'li',\n ];\n if (!textTags.includes(tagName)) return false;\n\n // Only typewrite if it has direct text content and not complex nested element trees\n const text = element.textContent?.trim() || '';\n return text.length > 0 && text.length < 350 && element.childElementCount <= 1;\n }\n\n /**\n * Immediately hides an element while preserving its native document layout and background.\n */\n public hideElement(element: HTMLElement): void {\n if (this.modifiedElements.has(element)) return;\n\n const originalOpacity = element.style.opacity;\n const originalVisibility = element.style.visibility;\n const originalTransform = element.style.transform;\n const originalTransition = element.style.transition;\n const originalPointerEvents = element.style.pointerEvents;\n\n element.style.opacity = '0';\n element.style.transform = 'scale(0.96)';\n element.style.transition = 'none';\n element.style.pointerEvents = 'none';\n\n this.modifiedElements.add(element);\n\n this.activeRestorations.set(element, () => {\n element.style.opacity = originalOpacity;\n element.style.visibility = originalVisibility;\n element.style.transform = originalTransform;\n element.style.transition = originalTransition;\n element.style.pointerEvents = originalPointerEvents;\n this.modifiedElements.delete(element);\n });\n }\n\n /**\n * Executes element construction reveal (typewriter for text, scale/opacity for blocks).\n */\n public executeReveal(\n element: HTMLElement,\n isText: boolean,\n enableTypewriter: boolean,\n durationMs: number,\n onComplete: () => void\n ): () => void {\n let cancelled = false;\n let timerId: any = null;\n\n if (isText && enableTypewriter && BuilderEffects.isTextElement(element)) {\n // Typewriter Effect\n const originalText = element.textContent || '';\n element.textContent = '';\n element.style.opacity = '1';\n element.style.transform = 'scale(1)';\n element.style.pointerEvents = '';\n\n const charDelay = Math.max(\n 10,\n Math.floor((durationMs * 0.75) / Math.max(originalText.length, 1))\n );\n let charIndex = 0;\n\n const typeNextChar = () => {\n if (cancelled) return;\n\n if (charIndex < originalText.length) {\n element.textContent = originalText.slice(0, charIndex + 1);\n charIndex++;\n timerId = setTimeout(typeNextChar, charDelay);\n } else {\n element.textContent = originalText;\n this.cleanupElement(element);\n onComplete();\n }\n };\n\n timerId = setTimeout(typeNextChar, 50);\n\n const cancel = () => {\n cancelled = true;\n if (timerId) clearTimeout(timerId);\n element.textContent = originalText;\n this.cleanupElement(element);\n };\n\n this.activeRestorations.set(element, cancel);\n return cancel;\n } else {\n // Smooth Scale & Opacity Reveal for Blocks/Images/Buttons/Cards\n element.style.transition = `opacity ${durationMs * 0.75}ms cubic-bezier(0.16, 1, 0.3, 1), transform ${durationMs * 0.75}ms cubic-bezier(0.16, 1, 0.3, 1)`;\n\n // Force style recalculation before transition\n void element.offsetHeight;\n\n element.style.opacity = '1';\n element.style.transform = 'scale(1)';\n element.style.pointerEvents = '';\n\n timerId = setTimeout(() => {\n if (cancelled) return;\n this.cleanupElement(element);\n onComplete();\n }, durationMs);\n\n const cancel = () => {\n cancelled = true;\n if (timerId) clearTimeout(timerId);\n this.cleanupElement(element);\n };\n\n this.activeRestorations.set(element, cancel);\n return cancel;\n }\n }\n\n /**\n * Cleans up temporary inline styles applied during animation.\n */\n private cleanupElement(element: HTMLElement): void {\n element.style.transition = '';\n element.style.transform = '';\n element.style.opacity = '';\n element.style.pointerEvents = '';\n this.activeRestorations.delete(element);\n this.modifiedElements.delete(element);\n }\n\n /**\n * Failsafe cleanup restoring all modified host DOM elements back to pristine native state.\n */\n public restoreAll(): void {\n this.activeRestorations.forEach((restore) => {\n try {\n restore();\n } catch {\n // Silently tolerate if element is already detached\n }\n });\n this.activeRestorations.clear();\n this.modifiedElements.clear();\n }\n}\n","import { BuilderEffects } from './BuilderEffects';\nimport { BuildOrder } from '../types';\n\nexport interface DomScannerOptions {\n selector: string;\n ignoreSelector: string;\n hideOnStart: boolean;\n buildOrder: BuildOrder;\n builderEffects: BuilderEffects;\n onElementDiscovered?: (element: HTMLElement) => void;\n}\n\n/**\n * Scans, indexes, and prepares host DOM elements for live swarm construction,\n * sorting elements in natural visual sequence (top-to-bottom).\n */\nexport class DomScanner {\n private intersectionObserver: IntersectionObserver | null = null;\n private mutationObserver: MutationObserver | null = null;\n private indexedElements: HTMLElement[] = [];\n private observedElements = new WeakSet<HTMLElement>();\n private mutationTimeout: any = null;\n\n constructor(private options: DomScannerOptions) {}\n\n /**\n * Initializes DOM scanning, initial element hiding, and observers.\n */\n public init(): HTMLElement[] {\n if (typeof window === 'undefined' || typeof document === 'undefined') return [];\n\n this.scanAndIndex();\n this.setupIntersectionObserver();\n this.setupMutationObserver();\n\n return this.indexedElements;\n }\n\n /**\n * Scans document for eligible elements, applies initial blank state if enabled,\n * and returns elements sorted by buildOrder.\n */\n public scanAndIndex(): HTMLElement[] {\n if (typeof document === 'undefined') return [];\n\n try {\n const candidates = Array.from(\n document.querySelectorAll<HTMLElement>(this.options.selector)\n );\n\n const validElements: HTMLElement[] = [];\n\n for (let i = 0; i < candidates.length; i++) {\n const el = candidates[i];\n if (!el || this.shouldIgnoreElement(el)) continue;\n\n const rect = el.getBoundingClientRect();\n // Ignore zero-size or invisible elements\n if (rect.width < 8 || rect.height < 8) continue;\n\n validElements.push(el);\n }\n\n // Sort by build order (default: top-to-bottom)\n if (this.options.buildOrder === 'top-to-bottom') {\n const scrollY = window.scrollY || window.pageYOffset || 0;\n validElements.sort((a, b) => {\n // Ancestors must always construct before their children\n if (a.contains(b)) return -1;\n if (b.contains(a)) return 1;\n\n const topA = a.getBoundingClientRect().top + scrollY;\n const topB = b.getBoundingClientRect().top + scrollY;\n if (Math.abs(topA - topB) < 15) {\n // If roughly on the same vertical line, order left-to-right\n return a.getBoundingClientRect().left - b.getBoundingClientRect().left;\n }\n return topA - topB;\n });\n } else if (this.options.buildOrder === 'random') {\n validElements.sort(() => Math.random() - 0.5);\n }\n\n // Apply initial blank state (hide elements while preserving native page background)\n if (this.options.hideOnStart) {\n validElements.forEach((el) => {\n this.options.builderEffects.hideElement(el);\n });\n }\n\n this.indexedElements = validElements;\n return validElements;\n } catch (e) {\n console.warn('[dom-swarm] Selector query warning:', e);\n return [];\n }\n }\n\n /**\n * Intersection observer to trigger scroll-based builds if configured.\n */\n private setupIntersectionObserver(): void {\n if (typeof IntersectionObserver === 'undefined') return;\n\n this.intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n const target = entry.target as HTMLElement;\n if (!this.observedElements.has(target)) {\n this.observedElements.add(target);\n this.options.onElementDiscovered?.(target);\n }\n }\n });\n },\n {\n root: null,\n rootMargin: '0px 0px 50px 0px',\n threshold: 0.05,\n }\n );\n\n this.indexedElements.forEach((el) => {\n this.intersectionObserver?.observe(el);\n });\n }\n\n /**\n * Monitors dynamic component mounting for SPA client-side route changes.\n */\n private setupMutationObserver(): void {\n if (typeof MutationObserver === 'undefined' || typeof document === 'undefined') return;\n\n this.mutationObserver = new MutationObserver((mutations) => {\n let shouldRescan = false;\n for (let i = 0; i < mutations.length; i++) {\n const mutation = mutations[i];\n if (mutation && mutation.addedNodes.length > 0) {\n for (let j = 0; j < mutation.addedNodes.length; j++) {\n const node = mutation.addedNodes[j];\n if (node instanceof HTMLElement && node.tagName.toLowerCase() !== 'dom-swarm-overlay') {\n shouldRescan = true;\n break;\n }\n }\n }\n if (shouldRescan) break;\n }\n\n if (shouldRescan) {\n if (this.mutationTimeout) clearTimeout(this.mutationTimeout);\n this.mutationTimeout = setTimeout(() => {\n const fresh = this.scanAndIndex();\n fresh.forEach((el) => {\n this.intersectionObserver?.observe(el);\n });\n }, 120);\n }\n });\n\n const target = document.body || document.documentElement;\n if (target) {\n this.mutationObserver.observe(target, { childList: true, subtree: true });\n }\n }\n\n /**\n * Evaluates if element matches ignore selectors or is structurally hidden.\n */\n private shouldIgnoreElement(el: HTMLElement): boolean {\n if (el.closest('dom-swarm-overlay') || el.closest('.swarm-hud')) return true;\n if (this.options.ignoreSelector && el.matches(this.options.ignoreSelector)) return true;\n\n const style = window.getComputedStyle(el);\n if (style.display === 'none' || style.visibility === 'hidden') return true;\n\n return false;\n }\n\n /**\n * Destroys observers.\n */\n public destroy(): void {\n if (this.mutationTimeout) {\n clearTimeout(this.mutationTimeout);\n this.mutationTimeout = null;\n }\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n this.intersectionObserver = null;\n }\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n this.indexedElements = [];\n }\n}\n","import {\n AgentType,\n BorderRole,\n ConstructionTask,\n DomSwarmInstance,\n ResolvedSwarmConfig,\n SwarmConfig,\n SwarmMetrics,\n Vector2D,\n} from '../types';\nimport { Agent } from './Agent';\nimport { BoidsPhysics } from './BoidsPhysics';\nimport { OverlayManager } from '../dom/OverlayManager';\nimport { BuilderEffects } from '../dom/BuilderEffects';\nimport { DomScanner } from '../dom/DomScanner';\nimport { vec, dist, randomRange, sub, normalize, mult } from '../utils/math';\n\nconst DEFAULT_CONFIG: ResolvedSwarmConfig = {\n agentCount: 18,\n teamSize: 4,\n copyPasteDuplicates: true,\n colors: ['#FF5722', '#00BCD4', '#8BC34A', '#9C27B0', '#FFC107', '#E91E63', '#2196F3'],\n selector: 'nav, header, h1, h2, h3, h4, h5, h6, p, button, a, img, pre, code, .swarm-item, .price-card, .interactive-card, .metric-card',\n ignoreSelector: '[data-no-swarm], script, style, noscript, dom-swarm-overlay, .swarm-hud',\n hideOnStart: true,\n concurrency: 4,\n buildOrder: 'top-to-bottom',\n vanishAtCursor: true,\n rebuildOnRouteChange: true,\n buildOnScroll: true,\n typewriterEffect: true,\n showGuides: true,\n showDimensions: true,\n followMouse: true,\n maxSpeed: 9.5,\n maxForce: 0.4,\n buildDuration: 550,\n flockRadius: 85,\n separateDistance: 32,\n mouseAttractRadius: 220,\n mouseAttractForce: 0.45,\n typewriterSpeed: 16,\n debug: false,\n};\n\n/**\n * Main orchestrator of dom-swarm:\n * divides 18 agents into 4-agent teams, dispatches them to the 4 borders of elements,\n * and converges all agents to the user's cursor to vanish upon completion.\n */\nexport class SwarmEngine implements DomSwarmInstance {\n private config: ResolvedSwarmConfig;\n private overlayManager: OverlayManager;\n private builderEffects: BuilderEffects;\n private domScanner: DomScanner;\n\n private agents: Agent[] = [];\n private tasks = new Map<string, ConstructionTask>();\n private buildQueue: HTMLElement[] = [];\n private activeBoxTypeToggle = false;\n\n private mousePos: Vector2D | null = null;\n private lastMouseMoveTime = 0;\n private isMouseActive = false;\n\n private animFrameId: number | null = null;\n private lastTime = 0;\n private paused = false;\n private destroyed = false;\n private isFinishedState = false;\n private isConverging = false;\n\n // Performance telemetry\n private frameCount = 0;\n private lastFpsUpdate = 0;\n private currentFps = 60;\n private constructedCount = 0;\n\n // History of recently constructed element templates for Figma-style copy/paste duplicate animations\n private constructedTemplates: Array<{ element: HTMLElement; rect: DOMRect }> = [];\n\n // Multi-page & client-side SPA route tracking\n private lastUrl = typeof window !== 'undefined' ? window.location.href : '';\n private unbindRouteListeners: (() => void) | null = null;\n private routeChangeDebounce: any = null;\n\n constructor(userConfig?: SwarmConfig) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...userConfig,\n container: userConfig?.container,\n onAgentStateChange: userConfig?.onAgentStateChange,\n onElementConstructed: userConfig?.onElementConstructed,\n onAllElementsConstructed: userConfig?.onAllElementsConstructed,\n onSwarmVanished: userConfig?.onSwarmVanished,\n };\n\n this.overlayManager = new OverlayManager(this.config.container);\n this.builderEffects = new BuilderEffects();\n this.domScanner = new DomScanner({\n selector: this.config.selector,\n ignoreSelector: this.config.ignoreSelector,\n hideOnStart: this.config.hideOnStart,\n buildOrder: this.config.buildOrder,\n builderEffects: this.builderEffects,\n onElementDiscovered: (el) => this.enqueueElement(el),\n });\n\n this.init();\n }\n\n /**\n * Initializes overlay, agents, input listeners, and starts the construction sequence.\n */\n private init(): void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n\n this.overlayManager.mount();\n this.spawnAgents();\n this.bindEvents();\n\n const elements = this.domScanner.init();\n this.buildQueue = [...elements];\n\n this.lastTime = performance.now();\n this.lastFpsUpdate = this.lastTime;\n this.animFrameId = requestAnimationFrame(this.renderLoop);\n\n setTimeout(() => {\n this.processBuildQueue();\n }, 150);\n }\n\n /**\n * Spawns 18 agents divided randomly into 4-agent teams.\n */\n private spawnAgents(): void {\n const width = window.innerWidth || 1024;\n const height = window.innerHeight || 768;\n\n // Create random team assignments (0, 1, 2, 3)\n const teamIndices: number[] = [];\n for (let i = 0; i < this.config.agentCount; i++) {\n teamIndices.push(Math.floor(i / this.config.teamSize));\n }\n // Shuffle team assignments for random distribution\n teamIndices.sort(() => Math.random() - 0.5);\n\n for (let i = 0; i < this.config.agentCount; i++) {\n const color = this.config.colors[i % this.config.colors.length] || '#FF5722';\n const teamId = teamIndices[i] ?? 0;\n\n const pos = vec(\n randomRange(width * 0.1, width * 0.9),\n randomRange(height * 0.1, height * 0.9)\n );\n\n const agent = new Agent(\n i + 1,\n color,\n teamId,\n pos,\n this.overlayManager,\n this.config.maxSpeed,\n this.config.maxForce\n );\n\n this.agents.push(agent);\n }\n }\n\n /**\n * Binds pointer and touch listeners for interactive flocking and convergence target.\n */\n private bindEvents(): void {\n window.addEventListener('mousemove', this.onMouseMove, { passive: true });\n window.addEventListener('touchstart', this.onTouchMove, { passive: true });\n window.addEventListener('touchmove', this.onTouchMove, { passive: true });\n window.addEventListener('scroll', this.onScroll, { passive: true });\n window.addEventListener('resize', this.onResize, { passive: true });\n this.setupRouteListeners();\n }\n\n private onMouseMove = (e: MouseEvent): void => {\n this.mousePos = { x: e.clientX, y: e.clientY };\n this.lastMouseMoveTime = performance.now();\n this.isMouseActive = true;\n };\n\n private onTouchMove = (e: TouchEvent): void => {\n if (e.touches && e.touches[0]) {\n this.mousePos = { x: e.touches[0].clientX, y: e.touches[0].clientY };\n this.lastMouseMoveTime = performance.now();\n this.isMouseActive = true;\n }\n };\n\n private onScroll = (): void => {\n this.syncActiveBoundingBoxes();\n };\n\n private onResize = (): void => {\n this.syncActiveBoundingBoxes();\n };\n\n /**\n * Main simulation and animation loop running on requestAnimationFrame.\n */\n private renderLoop = (timestamp: number): void => {\n if (this.destroyed) return;\n\n if (!this.paused) {\n const rawDt = (timestamp - this.lastTime) / 16.666;\n const dt = Math.min(Math.max(rawDt, 0.1), 3.0);\n this.lastTime = timestamp;\n\n this.frameCount++;\n if (timestamp - this.lastFpsUpdate >= 1000) {\n this.currentFps = Math.round((this.frameCount * 1000) / (timestamp - this.lastFpsUpdate));\n this.frameCount = 0;\n this.lastFpsUpdate = timestamp;\n }\n\n if (this.isMouseActive && timestamp - this.lastMouseMoveTime > 2500) {\n this.isMouseActive = false;\n }\n\n const activeMouse = this.mousePos || vec(\n (window.innerWidth || 1024) / 2,\n (window.innerHeight || 768) / 2\n );\n\n const viewport = {\n width: window.innerWidth || 1024,\n height: window.innerHeight || 768,\n };\n\n if (this.isConverging && !this.isFinishedState) {\n const remainingAgents = this.agents.filter((a) => a.state !== 'VANISHED');\n if (remainingAgents.length === 0) {\n this.isFinishedState = true;\n this.isConverging = false;\n this.config.onSwarmVanished?.();\n }\n }\n\n // Update unassigned agents (flocking, converging, or idle)\n for (let i = 0; i < this.agents.length; i++) {\n const agent = this.agents[i];\n if (!agent || agent.state === 'VANISHED' || agent.assignedTaskId) continue;\n\n if (agent.state === 'CONVERGING_TO_USER') {\n const seekForce = BoidsPhysics.seek(agent, activeMouse, 50);\n agent.applyForce(seekForce);\n\n const toMouse = sub(activeMouse, agent.position);\n const tangent = normalize({ x: -toMouse.y, y: toMouse.x });\n agent.applyForce(mult(tangent, 1.4));\n } else if (agent.state === 'IDLE_FLOCKING' || agent.state === 'RETURNING_TO_SWARM') {\n const force = BoidsPhysics.calculateFlockingForces(\n agent,\n this.agents,\n this.isMouseActive ? this.mousePos : null,\n this.config,\n viewport\n );\n agent.applyForce(force);\n\n if (agent.state === 'RETURNING_TO_SWARM') {\n const vSq = agent.velocity.x * agent.velocity.x + agent.velocity.y * agent.velocity.y;\n if (vSq < 3.0) {\n agent.setIdle();\n this.config.onAgentStateChange?.(agent.id, 'IDLE_FLOCKING');\n }\n }\n }\n\n agent.update(dt, this.overlayManager);\n }\n\n // Update active construction tasks: agents stay locked directly to the box borders\n this.tasks.forEach((task) => {\n if (task.completed) return;\n const rect = task.element.getBoundingClientRect();\n task.rect = rect;\n\n if (task.phase === 'CLONING') {\n const elapsed = timestamp - task.expandStartTime;\n const p = Math.min(elapsed / task.expandDuration, 1.0);\n const ease = 1 - Math.pow(1 - p, 3); // Smooth cubic ease-out\n\n const src = task.sourceRect || rect;\n const curX = src.left + (rect.left - src.left) * ease;\n const curY = src.top + (rect.top - src.top) * ease;\n const curW = src.width + (rect.width - src.width) * ease;\n const curH = src.height + (rect.height - src.height) * ease;\n\n if (task.cloneElement) {\n this.overlayManager.updateGhostClone(task.cloneElement, curX, curY, curW, curH, 0.95);\n }\n\n // Only keep the first cursor for copy-pasting (1 hand cursor dragging the clone)\n // Remove the other cursors during the drag\n task.assignedAgents.forEach((agentId, idx) => {\n const agent = this.agents.find((a) => a.id === agentId);\n if (!agent) return;\n\n if (idx === 0) {\n // Lead cursor holds the top-left of the duplicate wireframe\n agent.position.x = curX + 16;\n agent.position.y = curY;\n agent.velocity = vec(0, 0);\n agent.element.style.opacity = '1';\n agent.morphIcon('hand', this.overlayManager);\n this.overlayManager.updateAgentTransform(\n agent.element,\n agent.position.x,\n agent.position.y,\n 0,\n 1.05\n );\n } else {\n // Hide the other cursors during the drag\n agent.element.style.opacity = '0';\n agent.position.x = rect.left + rect.width / 2;\n agent.position.y = rect.top + rect.height / 2;\n agent.velocity = vec(0, 0);\n }\n });\n\n // When clone arrives at target, transition to building & editing\n if (p >= 1.0) {\n if (task.cloneElement) {\n this.overlayManager.removeGhostClone(task.cloneElement);\n task.cloneElement = undefined;\n }\n\n task.boxElement = this.overlayManager.createBoundingBox(\n task.id,\n rect,\n task.boxType,\n this.config.showDimensions,\n this.config.showGuides\n );\n\n task.phase = 'BUILDING';\n task.assignedAgents.forEach((agentId, idx) => {\n const agent = this.agents.find((a) => a.id === agentId);\n if (agent) {\n agent.element.style.opacity = '1';\n agent.setConstructing();\n agent.targetRect = rect;\n // First cursor uses pencil for text editing; others use standard pointer\n const editTool: AgentType = idx === 0 ? 'pen' : 'pointer';\n agent.morphIcon(editTool, this.overlayManager);\n this.config.onAgentStateChange?.(agent.id, 'CONSTRUCTING_ELEMENT');\n }\n });\n\n // Trigger typewriter / content editing reveal\n const cancelReveal = this.builderEffects.executeReveal(\n task.element,\n task.isText,\n this.config.typewriterEffect,\n task.duration,\n () => {\n this.completeTask(task.id);\n }\n );\n task.cancelEffect = cancelReveal;\n }\n } else if (task.phase === 'EXPANDING') {\n const elapsed = timestamp - task.expandStartTime;\n const p = Math.min(elapsed / task.expandDuration, 1.0);\n const ease = 1 - Math.pow(1 - p, 3); // Smooth cubic ease out\n\n // Anchor at top-left origin: rect.left, rect.top\n const curLeft = rect.left;\n const curTop = rect.top;\n const curW = Math.max(4, rect.width * ease);\n const curH = Math.max(4, rect.height * ease);\n const curOpacity = Math.min(p * 2.5, 1);\n\n if (task.boxElement) {\n this.overlayManager.updateBoxGeometry(\n task.boxElement,\n { left: curLeft, top: curTop, width: curW, height: curH },\n curOpacity,\n task.id\n );\n }\n\n // Single agent selects top-left edge and drags opposite bottom-right corner\n // until the shape reaches the desired size. Other agents remain hidden during the drag.\n task.assignedAgents.forEach((agentId, idx) => {\n const agent = this.agents.find((a) => a.id === agentId);\n if (!agent) return;\n\n if (idx === 0) {\n // Lead agent is directly locked to the corner/edge being dragged\n agent.position.x = curLeft + curW;\n agent.position.y = curTop + curH;\n agent.velocity = vec(0, 0);\n agent.element.style.opacity = '1';\n // Naturally upright cursor (0deg) - no rotation\n this.overlayManager.updateAgentTransform(\n agent.element,\n agent.position.x,\n agent.position.y,\n 0,\n 1.05\n );\n } else {\n // Hide the other agents during the drag\n agent.element.style.opacity = '0';\n agent.position.x = rect.left + rect.width / 2;\n agent.position.y = rect.top + rect.height / 2;\n agent.velocity = vec(0, 0);\n }\n });\n\n // When box reaches full size, transition to content building\n if (p >= 1.0) {\n task.phase = 'BUILDING';\n task.assignedAgents.forEach((agentId, idx) => {\n const agent = this.agents.find((a) => a.id === agentId);\n if (agent) {\n agent.element.style.opacity = '1';\n agent.setConstructing();\n agent.targetRect = rect;\n // Only the first cursor uses pencil for text; other border cursors use the standard pointer\n const tool: AgentType = (idx === 0 && task.isText) ? 'pen' : 'pointer';\n agent.morphIcon(tool, this.overlayManager);\n this.config.onAgentStateChange?.(agent.id, 'CONSTRUCTING_ELEMENT');\n }\n });\n\n // Trigger typewriter or scale reveal\n const cancelReveal = this.builderEffects.executeReveal(\n task.element,\n task.isText,\n this.config.typewriterEffect,\n task.duration,\n () => {\n this.completeTask(task.id);\n }\n );\n task.cancelEffect = cancelReveal;\n }\n } else if (task.phase === 'BUILDING') {\n if (task.boxElement) {\n this.overlayManager.updateBoundingBox(task.boxElement, rect, task.id);\n }\n // The 4 agents patrol along the 4 borders of the full-size box\n task.assignedAgents.forEach((agentId) => {\n const agent = this.agents.find((a) => a.id === agentId);\n if (agent && agent.assignedTaskId === task.id) {\n agent.targetRect = rect;\n agent.update(dt, this.overlayManager);\n }\n });\n }\n });\n }\n\n this.animFrameId = requestAnimationFrame(this.renderLoop);\n };\n\n /**\n * Continuously processes elements from the queue using parallel 4-agent teams.\n */\n private processBuildQueue(): void {\n if (this.destroyed || this.paused || this.isConverging) return;\n\n // Dispatch next elements up to concurrency limit\n while (this.tasks.size < this.config.concurrency && this.buildQueue.length > 0) {\n const nextElement = this.buildQueue.shift();\n if (nextElement) {\n this.constructElement(nextElement);\n }\n }\n\n if (this.buildQueue.length === 0 && this.tasks.size === 0 && !this.isFinishedState) {\n this.config.onAllElementsConstructed?.();\n\n if (this.config.vanishAtCursor && !this.isConverging) {\n this.triggerConvergenceFinale();\n }\n }\n }\n\n /**\n * Checks if an element has matching dimensions to an already constructed element\n * to enable Figma-style copy/paste duplicate animation.\n */\n private findMatchingTemplate(\n rect: DOMRect,\n currentEl: HTMLElement\n ): { element: HTMLElement; rect: DOMRect } | null {\n if (!this.config.copyPasteDuplicates) return null;\n if (rect.width < 30 || rect.height < 20) return null;\n\n for (let i = this.constructedTemplates.length - 1; i >= 0; i--) {\n const template = this.constructedTemplates[i];\n if (!template || template.element === currentEl) continue;\n\n const widthDiff = Math.abs(template.rect.width - rect.width);\n const heightDiff = Math.abs(template.rect.height - rect.height);\n\n if (widthDiff <= 16 && heightDiff <= 16) {\n if (typeof document !== 'undefined' && document.body.contains(template.element)) {\n const liveRect = template.element.getBoundingClientRect();\n if (liveRect.width >= 10 && liveRect.height >= 10) {\n return { element: template.element, rect: liveRect };\n }\n }\n }\n }\n return null;\n }\n\n /**\n * Initiates live construction of an element by dispatching a team of 4 agents\n * to the 4 borders of the bounding box.\n */\n private constructElement(element: HTMLElement): void {\n const taskId = `task-${Date.now()}-${Math.random().toString(36).substring(2, 6)}`;\n const rect = element.getBoundingClientRect();\n\n if (rect.width < 5 || rect.height < 5) {\n this.builderEffects.executeReveal(element, false, false, 50, () => {\n this.constructedCount++;\n this.processBuildQueue();\n });\n return;\n }\n\n const category = BuilderEffects.getElementCategory(element);\n const isText = category === 'text' || BuilderEffects.isTextElement(element);\n const boxType = this.activeBoxTypeToggle ? 'red' : 'blue';\n this.activeBoxTypeToggle = !this.activeBoxTypeToggle;\n\n const elementCenter = vec(rect.left + rect.width / 2, rect.top + rect.height / 2);\n\n // Pick a team of 4 idle agents (preferring same teamId if available)\n const assigned = this.pickTeamAgents(elementCenter, this.config.teamSize);\n\n if (assigned.length === 0) {\n this.builderEffects.executeReveal(\n element,\n isText,\n this.config.typewriterEffect,\n this.config.buildDuration,\n () => {\n this.constructedCount++;\n this.config.onElementConstructed?.(element);\n this.processBuildQueue();\n }\n );\n return;\n }\n\n // 4 Border roles: Top, Right, Bottom, Left\n const borderRoles: BorderRole[] = ['top', 'right', 'bottom', 'left'];\n\n const matchingTemplate = this.findMatchingTemplate(rect, element);\n const isCopyPaste = matchingTemplate !== null;\n const sourceRect = matchingTemplate ? matchingTemplate.rect : undefined;\n\n // For text: 'pen' (Pencil / Pen tool for drafting)\n // For copy-paste: 'hand' (Hand tool for grabbing and dragging)\n // For all other categories: remove other cursors and only keep the first one ('pointer')\n const categoryTool: AgentType = isText ? 'pen' : 'pointer';\n const initialTool: AgentType = isCopyPaste ? 'hand' : categoryTool;\n\n let boxEl: HTMLElement | undefined;\n let cloneEl: HTMLElement | undefined;\n\n if (isCopyPaste && sourceRect) {\n // Create ghost wireframe clone at source coordinates for Figma-style copy-paste glide\n cloneEl = this.overlayManager.createGhostClone(taskId, sourceRect);\n } else {\n // The box starts at size 0 anchored at the top-left edge (dragged open live by single agent)\n boxEl = this.overlayManager.createBoundingBox(\n taskId,\n rect,\n boxType,\n this.config.showDimensions,\n this.config.showGuides,\n { left: rect.left, top: rect.top, width: 0, height: 0, opacity: 0 }\n );\n }\n\n const task: ConstructionTask = {\n id: taskId,\n element,\n rect,\n boxType,\n assignedAgents: assigned.map((a) => a.id),\n borderRoles,\n phase: isCopyPaste ? 'CLONING' : 'EXPANDING',\n isCopyPaste,\n category,\n cursorType: initialTool,\n sourceRect,\n startTime: performance.now(),\n expandStartTime: performance.now(),\n expandDuration: isCopyPaste ? 320 : 280,\n duration: this.config.buildDuration,\n isText,\n boxElement: boxEl,\n cloneElement: cloneEl,\n completed: false,\n };\n\n this.tasks.set(taskId, task);\n\n // Save template for future same-size element matching\n this.constructedTemplates.push({ element, rect });\n if (this.constructedTemplates.length > 50) {\n this.constructedTemplates.shift();\n }\n\n const startPos =\n isCopyPaste && sourceRect\n ? vec(sourceRect.left + sourceRect.width / 2, sourceRect.top + sourceRect.height / 2)\n : vec(rect.left, rect.top);\n\n // Dispatch agents: lead agent uses the specialized tool (pen or hand or pointer), others use the primary pointer\n assigned.forEach((agent, idx) => {\n const role = borderRoles[idx % borderRoles.length] || 'top';\n const agentTool: AgentType = idx === 0 ? initialTool : 'pointer';\n agent.assignTarget(startPos, element, taskId, role, rect, agentTool, this.overlayManager);\n\n // When starting a new shape drag (not copy-paste), only the single lead agent is visible dragging the shape\n if (!isCopyPaste) {\n if (idx === 0) {\n agent.position.x = rect.left;\n agent.position.y = rect.top;\n agent.element.style.opacity = '1';\n } else {\n agent.element.style.opacity = '0';\n agent.position.x = rect.left + rect.width / 2;\n agent.position.y = rect.top + rect.height / 2;\n }\n }\n\n this.config.onAgentStateChange?.(agent.id, 'MOVING_TO_TARGET');\n });\n }\n\n /**\n * Completes a task, removes overlays, releases agents, and triggers the next queue item.\n */\n private completeTask(taskId: string): void {\n const task = this.tasks.get(taskId);\n if (!task || task.completed) return;\n\n task.completed = true;\n\n if (task.boxElement) {\n this.overlayManager.removeBoundingBox(task.boxElement, task.id);\n task.boxElement = undefined;\n }\n\n if (task.cloneElement) {\n this.overlayManager.removeGhostClone(task.cloneElement);\n task.cloneElement = undefined;\n }\n\n task.assignedAgents.forEach((agentId) => {\n const agent = this.agents.find((a) => a.id === agentId);\n if (agent && agent.assignedTaskId === taskId) {\n agent.returnToSwarm(this.overlayManager);\n this.config.onAgentStateChange?.(agent.id, 'RETURNING_TO_SWARM');\n }\n });\n\n this.tasks.delete(taskId);\n this.constructedCount++;\n this.config.onElementConstructed?.(task.element);\n\n this.processBuildQueue();\n }\n\n /**\n * Triggers the grand finale: all 18 cursors accelerate towards the user's cursor, swirl, and vanish.\n */\n private triggerConvergenceFinale(): void {\n this.isConverging = true;\n\n const targetPos = this.mousePos || vec(\n (window.innerWidth || 1024) / 2,\n (window.innerHeight || 768) / 2\n );\n\n this.agents.forEach((agent) => {\n agent.convergeTo(targetPos, this.overlayManager);\n this.config.onAgentStateChange?.(agent.id, 'CONVERGING_TO_USER');\n });\n\n setTimeout(() => {\n if (this.isConverging) {\n this.agents.forEach((agent) => {\n agent.state = 'VANISHED';\n agent.element.style.display = 'none';\n });\n this.isFinishedState = true;\n this.isConverging = false;\n this.config.onSwarmVanished?.();\n }\n }, 2500);\n }\n\n /**\n * Binds SPA client-side route change listeners for Next.js, React Router, Vue, Nuxt, SvelteKit, Turbo, etc.\n */\n private setupRouteListeners(): void {\n if (typeof window === 'undefined' || !this.config.rebuildOnRouteChange) return;\n\n this.lastUrl = window.location.href;\n\n const onRouteEvent = () => this.handleRouteChange();\n\n window.addEventListener('popstate', onRouteEvent);\n window.addEventListener('hashchange', onRouteEvent);\n\n // Framework-specific SPA view transition events\n window.addEventListener('turbo:load', onRouteEvent);\n window.addEventListener('turbolinks:load', onRouteEvent);\n window.addEventListener('astro:page-load', onRouteEvent);\n window.addEventListener('pjax:end', onRouteEvent);\n\n // Intercept pushState & replaceState for Next.js, React Router, Vue Router, Nuxt, SvelteKit\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n const self = this;\n\n history.pushState = function (...args) {\n const result = originalPushState.apply(this, args);\n self.handleRouteChange();\n return result;\n };\n\n history.replaceState = function (...args) {\n const result = originalReplaceState.apply(this, args);\n self.handleRouteChange();\n return result;\n };\n\n this.unbindRouteListeners = () => {\n window.removeEventListener('popstate', onRouteEvent);\n window.removeEventListener('hashchange', onRouteEvent);\n window.removeEventListener('turbo:load', onRouteEvent);\n window.removeEventListener('turbolinks:load', onRouteEvent);\n window.removeEventListener('astro:page-load', onRouteEvent);\n window.removeEventListener('pjax:end', onRouteEvent);\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n };\n }\n\n private handleRouteChange(): void {\n if (this.destroyed || !this.config.rebuildOnRouteChange) return;\n if (typeof window === 'undefined') return;\n\n if (this.routeChangeDebounce) {\n clearTimeout(this.routeChangeDebounce);\n }\n\n this.routeChangeDebounce = setTimeout(() => {\n const newUrl = window.location.href;\n if (newUrl === this.lastUrl && this.isFinishedState) return;\n this.lastUrl = newUrl;\n this.handlePageNavigation();\n }, 60);\n }\n\n /**\n * Public API: Reinitializes and launches the swarm construction sequence for a newly navigated page.\n * Cancels in-flight tasks, clears templates, scans the new page's DOM,\n * applies initial blank canvas hiding, respawns the 18 agents, and begins live construction.\n */\n public handlePageNavigation(): void {\n if (this.destroyed) return;\n\n // 1. Cancel in-flight tasks and clear existing overlays\n this.tasks.forEach((task) => {\n task.cancelEffect?.();\n if (task.boxElement) {\n this.overlayManager.removeBoundingBox(task.boxElement, task.id);\n }\n if (task.cloneElement) {\n this.overlayManager.removeGhostClone(task.cloneElement);\n }\n });\n this.tasks.clear();\n this.constructedTemplates = [];\n this.buildQueue = [];\n this.constructedCount = 0;\n this.isFinishedState = false;\n this.isConverging = false;\n\n // 2. Allow a brief tick for SPA frameworks (Next.js / React / Vue) to mount the new route components\n setTimeout(() => {\n if (this.destroyed) return;\n\n // 3. Scan and hide new page elements\n const elements = this.domScanner.scanAndIndex();\n this.buildQueue = [...elements];\n\n // 4. Respawn and reposition all 18 agents from the screen edges\n const width = window.innerWidth || 1024;\n const height = window.innerHeight || 768;\n\n this.agents.forEach((agent) => {\n const pos = vec(\n randomRange(width * 0.1, width * 0.9),\n randomRange(height * 0.1, height * 0.9)\n );\n agent.reset(pos, this.overlayManager);\n });\n\n // 5. Begin processing build queue for the new page\n setTimeout(() => {\n if (!this.destroyed) {\n this.processBuildQueue();\n }\n }, 150);\n }, 80);\n }\n\n /**\n * Adds an element to the queue dynamically.\n */\n private enqueueElement(element: HTMLElement): void {\n if (!this.buildQueue.includes(element)) {\n this.buildQueue.push(element);\n\n // If swarm has finished/vanished, wake up agents to build the newly added element!\n if (this.isFinishedState) {\n this.isFinishedState = false;\n this.isConverging = false;\n const width = window.innerWidth || 1024;\n const height = window.innerHeight || 768;\n\n this.agents.forEach((agent) => {\n if (agent.state === 'VANISHED') {\n const pos = vec(\n randomRange(width * 0.1, width * 0.9),\n randomRange(height * 0.1, height * 0.9)\n );\n agent.reset(pos, this.overlayManager);\n }\n });\n }\n\n this.processBuildQueue();\n }\n }\n\n /**\n * Synchronizes active bounding boxes, alignment guides, and agent border targets\n * during live scrolling or resizing.\n */\n private syncActiveBoundingBoxes(): void {\n if (this.tasks.size === 0) return;\n\n this.tasks.forEach((task) => {\n if (!task.boxElement || task.completed) return;\n const rect = task.element.getBoundingClientRect();\n task.rect = rect;\n\n if (task.phase === 'BUILDING') {\n this.overlayManager.updateBoundingBox(task.boxElement, rect, task.id);\n }\n\n // Keep border agents synchronized to the moving element boundaries\n task.assignedAgents.forEach((agentId) => {\n const agent = this.agents.find((a) => a.id === agentId);\n if (agent && agent.assignedTaskId === task.id) {\n agent.targetRect = rect;\n }\n });\n });\n }\n\n /**\n * Selects a team of 4 available agents closest to the element.\n */\n private pickTeamAgents(target: Vector2D, count: number): Agent[] {\n const idleAgents = this.agents.filter(\n (a) => a.state === 'IDLE_FLOCKING' || a.state === 'RETURNING_TO_SWARM'\n );\n\n // Group by teamId first if a complete team of 4 is idle\n const teamMap = new Map<number, Agent[]>();\n idleAgents.forEach((a) => {\n const list = teamMap.get(a.teamId) || [];\n list.push(a);\n teamMap.set(a.teamId, list);\n });\n\n // Check for an intact team of 4\n for (const [, teamList] of teamMap.entries()) {\n if (teamList.length >= count) {\n return teamList.slice(0, count);\n }\n }\n\n // Otherwise, pick the closest available agents\n idleAgents.sort((a, b) => {\n const distA = dist(a.position, target);\n const distB = dist(b.position, target);\n return distA - distB;\n });\n\n return idleAgents.slice(0, count);\n }\n\n /**\n * Public API: Replays the whole swarm construction from the beginning.\n */\n public replay(): void {\n if (this.destroyed) return;\n\n this.tasks.forEach((task) => {\n task.cancelEffect?.();\n if (task.boxElement) {\n this.overlayManager.removeBoundingBox(task.boxElement, task.id);\n }\n if (task.cloneElement) {\n this.overlayManager.removeGhostClone(task.cloneElement);\n }\n });\n this.tasks.clear();\n this.constructedTemplates = [];\n\n const elements = this.domScanner.scanAndIndex();\n this.buildQueue = [...elements];\n this.constructedCount = 0;\n this.isFinishedState = false;\n this.isConverging = false;\n\n const width = window.innerWidth || 1024;\n const height = window.innerHeight || 768;\n\n this.agents.forEach((agent) => {\n const pos = vec(\n randomRange(width * 0.1, width * 0.9),\n randomRange(height * 0.1, height * 0.9)\n );\n agent.reset(pos, this.overlayManager);\n });\n\n setTimeout(() => {\n this.processBuildQueue();\n }, 150);\n }\n\n /**\n * Public API: Manually trigger construction on an element immediately.\n */\n public async buildElement(element: HTMLElement): Promise<void> {\n if (this.destroyed) return;\n return new Promise<void>((resolve) => {\n const existingHandler = this.config.onElementConstructed;\n const onDone = (el: HTMLElement) => {\n if (el === element) resolve();\n };\n this.config.onElementConstructed = (el) => {\n existingHandler?.(el);\n onDone(el);\n };\n this.constructElement(element);\n });\n }\n\n public pause(): void {\n this.paused = true;\n }\n\n public resume(): void {\n if (this.paused) {\n this.paused = false;\n this.lastTime = performance.now();\n this.processBuildQueue();\n }\n }\n\n public isPaused(): boolean {\n return this.paused;\n }\n\n public isFinished(): boolean {\n return this.isFinishedState;\n }\n\n public getConfig(): Readonly<ResolvedSwarmConfig> {\n return { ...this.config };\n }\n\n public updateConfig(newConfig: Partial<SwarmConfig>): void {\n this.config = {\n ...this.config,\n ...newConfig,\n };\n\n if (newConfig.maxSpeed !== undefined || newConfig.maxForce !== undefined) {\n this.agents.forEach((a) => {\n if (newConfig.maxSpeed !== undefined) a.maxSpeed = newConfig.maxSpeed;\n if (newConfig.maxForce !== undefined) a.maxForce = newConfig.maxForce;\n });\n }\n }\n\n public getActiveAgentCount(): number {\n return this.agents.filter((a) => a.state !== 'VANISHED').length;\n }\n\n public getMetrics(): SwarmMetrics {\n let idle = 0;\n let constructing = 0;\n let converging = 0;\n let vanished = 0;\n\n for (let i = 0; i < this.agents.length; i++) {\n const a = this.agents[i];\n if (!a) continue;\n if (a.state === 'VANISHED') {\n vanished++;\n } else if (a.state === 'CONVERGING_TO_USER') {\n converging++;\n } else if (a.state === 'IDLE_FLOCKING' || a.state === 'RETURNING_TO_SWARM') {\n idle++;\n } else if (a.state === 'CONSTRUCTING_ELEMENT' || a.state === 'MOVING_TO_TARGET') {\n constructing++;\n }\n }\n\n return {\n fps: this.currentFps,\n totalAgents: this.agents.length,\n idleAgents: idle,\n constructingAgents: constructing,\n convergingAgents: converging,\n vanishedAgents: vanished,\n elementsConstructed: this.constructedCount,\n elementsPending: this.buildQueue.length + this.tasks.size,\n isFinished: this.isFinishedState,\n };\n }\n\n public destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n\n if (this.animFrameId !== null) {\n cancelAnimationFrame(this.animFrameId);\n this.animFrameId = null;\n }\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('mousemove', this.onMouseMove);\n window.removeEventListener('touchstart', this.onTouchMove);\n window.removeEventListener('touchmove', this.onTouchMove);\n window.removeEventListener('scroll', this.onScroll);\n window.removeEventListener('resize', this.onResize);\n }\n\n if (this.unbindRouteListeners) {\n this.unbindRouteListeners();\n this.unbindRouteListeners = null;\n }\n\n if (this.routeChangeDebounce) {\n clearTimeout(this.routeChangeDebounce);\n this.routeChangeDebounce = null;\n }\n\n this.domScanner.destroy();\n\n this.tasks.forEach((task) => {\n task.cancelEffect?.();\n if (task.boxElement) {\n this.overlayManager.removeBoundingBox(task.boxElement, task.id);\n }\n if (task.cloneElement) {\n this.overlayManager.removeGhostClone(task.cloneElement);\n }\n });\n this.tasks.clear();\n this.constructedTemplates = [];\n this.buildQueue = [];\n\n this.agents.forEach((agent) => agent.destroy());\n this.agents = [];\n\n this.builderEffects.restoreAll();\n this.overlayManager.destroy();\n }\n}\n","import { SwarmConfig, DomSwarmInstance, ResolvedSwarmConfig, SwarmMetrics } from './types';\nimport { SwarmEngine } from './core/SwarmEngine';\n\n/**\n * Public class implementation of Swarm66 / DomSwarm.\n */\nexport class Swarm66 extends SwarmEngine {\n constructor(config?: SwarmConfig) {\n super(config);\n }\n}\n\nexport class DomSwarm extends Swarm66 {}\n\n/**\n * Convenience alias for swarm66 initialization.\n */\nexport const swarm66 = enableSwarm;\n\n/**\n * Convenience factory to mount and enable the DomSwarm visual engine on any page.\n * Safe for Server-Side Rendering (SSR) environments.\n *\n * @param config Optional configuration options to customize swarm behaviors and visuals.\n * @returns An active DomSwarmInstance controlling the swarm.\n *\n * @example\n * ```ts\n * import { enableSwarm } from 'dom-swarm';\n *\n * const swarm = enableSwarm({\n * agentCount: 20,\n * hideOnStart: true,\n * vanishAtCursor: true,\n * typewriterEffect: true,\n * });\n * ```\n */\nexport function enableSwarm(config?: SwarmConfig): DomSwarmInstance {\n // SSR Guard for Next.js, Nuxt, Astro, SvelteKit, etc.\n if (typeof window === 'undefined') {\n return {\n destroy: () => {},\n pause: () => {},\n resume: () => {},\n replay: () => {},\n handlePageNavigation: () => {},\n buildElement: async () => {},\n getConfig: () => ({} as Readonly<ResolvedSwarmConfig>),\n updateConfig: () => {},\n isPaused: () => true,\n isFinished: () => true,\n getActiveAgentCount: () => 0,\n getMetrics: (): SwarmMetrics => ({\n fps: 0,\n totalAgents: 0,\n idleAgents: 0,\n constructingAgents: 0,\n convergingAgents: 0,\n vanishedAgents: 0,\n elementsConstructed: 0,\n elementsPending: 0,\n isFinished: true,\n }),\n };\n }\n\n return new DomSwarm(config);\n}\n\n// Auto-bind to window global for vanilla HTML, PHP, Laravel, WordPress, and Django templates\nif (typeof window !== 'undefined') {\n (window as any).enableSwarm = enableSwarm;\n (window as any).swarm66 = enableSwarm;\n (window as any).Swarm66 = Swarm66;\n (window as any).DomSwarm = DomSwarm;\n}\n\n// Re-export all TypeScript types and interfaces\nexport * from './types';\nexport { SwarmEngine } from './core/SwarmEngine';\nexport { Agent } from './core/Agent';\nexport { BoidsPhysics } from './core/BoidsPhysics';\nexport { OverlayManager } from './dom/OverlayManager';\nexport { DomScanner } from './dom/DomScanner';\nexport { BuilderEffects } from './dom/BuilderEffects';\nexport * from './utils/math';\n\n// Default export\nexport default enableSwarm;\n"]}
package/package.json CHANGED
@@ -1,6 +1,71 @@
1
1
  {
2
2
  "name": "@leozodiac/swarm66",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "Universal plug-and-play autonomous cursor swarm that reverse-engineers and constructs DOM elements live using Boids physics.",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "main": "./dist/index.cjs",
9
+ "module": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "unpkg": "./dist/index.global.js",
12
+ "jsdelivr": "./dist/index.global.js",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js",
17
+ "require": "./dist/index.cjs",
18
+ "default": "./dist/index.js"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist",
23
+ "README.md",
24
+ "ARCHITECTURE.md",
25
+ "TASKS.md",
26
+ "LICENSE"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsup",
30
+ "prepublishOnly": "npm run build && npm test",
31
+ "dev": "tsup --watch",
32
+ "typecheck": "tsc --noEmit",
33
+ "test": "vitest run",
34
+ "test:watch": "vitest",
35
+ "serve": "node scripts/serve.js",
36
+ "demo": "npm run build && node scripts/serve.js",
37
+ "clean": "rimraf dist"
38
+ },
39
+ "keywords": [
40
+ "cursor",
41
+ "swarm",
42
+ "boids",
43
+ "figma",
44
+ "animation",
45
+ "dom",
46
+ "visual-effects",
47
+ "particles",
48
+ "simulation",
49
+ "typescript",
50
+ "zero-dependency",
51
+ "creative-coding",
52
+ "page-builder"
53
+ ],
54
+ "author": "leozodiac (https://www.npmjs.com/~leozodiac)",
55
+ "license": "MIT",
56
+ "repository": {
57
+ "type": "git",
58
+ "url": "git+https://github.com/leozodiac/swarm66.git"
59
+ },
60
+ "bugs": {
61
+ "url": "https://github.com/leozodiac/swarm66/issues"
62
+ },
63
+ "homepage": "https://github.com/leozodiac/swarm66#readme",
64
+ "sideEffects": false,
65
+ "devDependencies": {
66
+ "@types/node": "^22.13.1",
67
+ "tsup": "^8.3.6",
68
+ "typescript": "^5.7.3",
69
+ "vitest": "^3.0.5"
70
+ }
71
+ }