@bokijonovm/cursorcrew 0.0.0-stage → 0.1.1

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/timeline.ts","../src/scan.ts","../src/text.ts","../src/overlay.ts","../src/assemble.ts"],"sourcesContent":["/**\n * A tiny requestAnimationFrame timeline engine.\n *\n * It covers exactly what cursorcrew needs (absolute-position set / to / fromTo,\n * play, pause, kill, progress, timeScale) so the library ships with zero\n * dependencies. Transforms are written as translate3d so moving cursors and\n * boxes stay on the compositor.\n */\n\nexport type Ease = (t: number) => number;\nexport type EaseName =\n | 'none'\n | 'power1.in'\n | 'power1.out'\n | 'power1.inOut'\n | 'power2.in'\n | 'power2.out'\n | 'power2.inOut'\n | 'back.out'\n | `back.out(${number})`;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type TweenTarget = Element | Record<string, any>;\n\nexport interface TweenVars {\n duration?: number;\n ease?: EaseName | Ease;\n immediateRender?: boolean;\n onUpdate?: () => void;\n attr?: Record<string, string>;\n [prop: string]: unknown;\n}\n\nexport interface TimelineOptions {\n paused?: boolean;\n onStart?: () => void;\n onUpdate?: () => void;\n onComplete?: () => void;\n}\n\nconst EASES: Record<string, Ease> = {\n none: (t) => t,\n 'power1.in': (t) => t * t,\n 'power1.out': (t) => 1 - (1 - t) * (1 - t),\n 'power1.inOut': (t) => (t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2),\n 'power2.in': (t) => t * t * t,\n 'power2.out': (t) => 1 - Math.pow(1 - t, 3),\n 'power2.inOut': (t) => (t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2),\n};\n\nfunction getEase(name: EaseName | Ease | undefined): Ease {\n if (typeof name === 'function') return name;\n if (!name) return EASES['power1.out'];\n if (EASES[name]) return EASES[name];\n const m = /^back\\.out(?:\\(([\\d.]+)\\))?$/.exec(name);\n if (m) {\n const c1 = m[1] ? +m[1] : 1.70158;\n const c3 = c1 + 1;\n return (EASES[name] = (t) => 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2));\n }\n return EASES['power1.out'];\n}\n\nconst RESERVED = new Set(['duration', 'ease', 'immediateRender', 'onUpdate', 'onComplete', 'onStart', 'overwrite']);\nconst TRANSFORM = new Set(['x', 'y', 'scale']);\n\ninterface TransformState {\n x: number;\n y: number;\n scale: number;\n}\nconst transforms = new WeakMap<Element, TransformState>();\nfunction transformOf(el: Element): TransformState {\n let t = transforms.get(el);\n if (!t) transforms.set(el, (t = { x: 0, y: 0, scale: 1 }));\n return t;\n}\n\nconst isElement = (o: unknown): o is Element & ElementCSSInlineStyle =>\n !!o && (o as Node).nodeType === 1;\n\nfunction read(target: TweenTarget, prop: string): unknown {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (!isElement(target)) return (target as Record<string, any>)[prop];\n if (TRANSFORM.has(prop)) return transformOf(target)[prop as keyof TransformState];\n const cs = getComputedStyle(target);\n if (prop === 'autoAlpha') return cs.visibility === 'hidden' ? 0 : parseFloat(cs.opacity);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = String((target.style as any)[prop] || (cs as any)[prop] || '');\n return /^-?[\\d.]+(px)?$/.test(v) ? parseFloat(v) : v;\n}\n\n/** Apply values to a target immediately (no animation). */\nexport function set(target: TweenTarget, values: object): void {\n const props = values as Record<string, unknown>;\n if (!isElement(target)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n for (const k in props) if (!RESERVED.has(k)) (target as Record<string, any>)[k] = props[k];\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const s = target.style as any;\n let t: TransformState | null = null;\n for (const p in props) {\n if (RESERVED.has(p)) continue;\n const v = props[p];\n if (p === 'attr') {\n for (const [k, val] of Object.entries(v as Record<string, string>)) target.setAttribute(k, val);\n } else if (TRANSFORM.has(p)) {\n (t ??= transformOf(target))[p as keyof TransformState] = v as number;\n } else if (p === 'autoAlpha') {\n s.opacity = String(v);\n s.visibility = (v as number) <= 0 ? 'hidden' : 'inherit';\n } else if (p === 'width' || p === 'height') {\n s[p] = typeof v === 'number' ? `${v}px` : v;\n } else {\n s[p] = typeof v === 'number' ? String(v) : v;\n }\n }\n if (t) s.transform = `translate3d(${t.x}px,${t.y}px,0)${t.scale !== 1 ? ` scale(${t.scale})` : ''}`;\n}\n\nconst NUMBER = /-?\\d*\\.?\\d+(?:e[-+]?\\d+)?/gi;\n\nfunction interpolator(from: unknown, to: unknown): (e: number) => unknown {\n if (typeof to === 'string' && /^[-+]=/.test(to)) {\n to = (Number(from) || 0) + (to[0] === '-' ? -1 : 1) * parseFloat(to.slice(2));\n }\n if (typeof to === 'number') {\n const a = Number(from) || 0;\n const b = to;\n return (e) => a + (b - a) * e;\n }\n if (typeof to === 'string' && typeof from === 'string') {\n const bn = to.match(NUMBER) ?? [];\n const an = from.match(NUMBER) ?? [];\n if (bn.length && an.length === bn.length) {\n const parts = to.split(NUMBER);\n return (e) => {\n let out = parts[0];\n for (let i = 0; i < bn.length; i++) out += +an[i] + (+bn[i] - +an[i]) * e + parts[i + 1];\n return out;\n };\n }\n }\n // Non-numeric values (visibility, attributes…) snap at the start.\n return () => to;\n}\n\ninterface Tween {\n target: TweenTarget;\n from: Record<string, unknown> | null;\n to: TweenVars;\n start: number;\n dur: number;\n ease: Ease;\n fns: Record<string, (e: number) => unknown> | null;\n done: boolean;\n}\n\nexport class Timeline {\n private kids: Tween[] = [];\n private t = 0;\n private end = 0;\n private ts = 1;\n private paused = true;\n private dead = false;\n private started = false;\n private completed = false;\n private raf = 0;\n private last = 0;\n\n constructor(private readonly opts: TimelineOptions = {}) {\n this.tick = this.tick.bind(this);\n if (!opts.paused) this.play();\n }\n\n /** Apply `vars` instantly at `position` seconds. */\n set(target: TweenTarget, vars: TweenVars, position?: number): this {\n return this.add(target, null, { ...vars, duration: 0 }, position);\n }\n\n /** Tween from the target's current values (read when the tween starts). */\n to(target: TweenTarget, vars: TweenVars, position?: number): this {\n return this.add(target, null, vars, position);\n }\n\n /** Tween between explicit values. Renders `from` right away unless `immediateRender: false`. */\n fromTo(target: TweenTarget, from: Record<string, unknown>, to: TweenVars, position?: number): this {\n if (to.immediateRender !== false) set(target, from);\n return this.add(target, from, to, position);\n }\n\n play(): this {\n if (this.dead || this.completed) return this;\n this.paused = false;\n if (!this.raf) {\n this.last = performance.now();\n this.raf = requestAnimationFrame(this.tick);\n }\n return this;\n }\n\n pause(): this {\n this.paused = true;\n if (this.raf) cancelAnimationFrame(this.raf);\n this.raf = 0;\n return this;\n }\n\n kill(): this {\n this.pause();\n this.dead = true;\n this.kids = [];\n return this;\n }\n\n /** Total length in seconds, before timeScale. */\n duration(): number {\n return this.end;\n }\n\n /** Current playhead in seconds. */\n time(): number {\n return this.t;\n }\n\n isActive(): boolean {\n return !this.paused && !this.dead && !this.completed;\n }\n\n timeScale(): number;\n timeScale(value: number): this;\n timeScale(value?: number): number | this {\n if (value === undefined) return this.ts;\n this.ts = value > 0 && Number.isFinite(value) ? value : 1;\n return this;\n }\n\n progress(): number;\n progress(value: number): this;\n progress(value?: number): number | this {\n if (value === undefined) return this.end ? this.t / this.end : 1;\n this.goto(value * this.end);\n return this;\n }\n\n private add(target: TweenTarget, from: Record<string, unknown> | null, to: TweenVars, position?: number): this {\n const tween: Tween = {\n target,\n from,\n to,\n start: position ?? this.end,\n dur: Math.max(0, to.duration ?? 0.5),\n ease: getEase(to.ease),\n fns: null,\n done: false,\n };\n // Keep children sorted by start time (stable), so later tweens win on overlap.\n let i = this.kids.length;\n while (i > 0 && this.kids[i - 1].start > tween.start) i--;\n this.kids.splice(i, 0, tween);\n this.end = Math.max(this.end, tween.start + tween.dur);\n return this;\n }\n\n private render(time: number): void {\n for (const c of this.kids) {\n if (c.start > time) break;\n if (c.done) continue;\n if (!c.fns) {\n c.fns = {};\n for (const k in c.to) {\n if (RESERVED.has(k)) continue;\n if (k === 'attr') {\n const attr = c.to.attr;\n c.fns.attr = () => attr;\n } else {\n c.fns[k] = interpolator(c.from && k in c.from ? c.from[k] : read(c.target, k), c.to[k]);\n }\n }\n }\n const p = c.dur ? Math.min(1, (time - c.start) / c.dur) : 1;\n const e = c.ease(p);\n const props: Record<string, unknown> = {};\n for (const f in c.fns) props[f] = c.fns[f](e);\n set(c.target, props);\n c.to.onUpdate?.();\n if (p >= 1) c.done = true;\n }\n }\n\n private goto(time: number): void {\n if (this.dead) return;\n time = Math.max(0, Math.min(time, this.end));\n if (!this.started) {\n this.started = true;\n this.opts.onStart?.();\n }\n this.t = time;\n this.render(time);\n this.opts.onUpdate?.();\n if (time >= this.end && !this.completed) {\n this.completed = true;\n this.pause();\n this.opts.onComplete?.();\n }\n }\n\n private tick(now: number): void {\n this.raf = 0;\n if (this.paused || this.dead) return;\n let dt = (now - this.last) / 1000;\n this.last = now;\n // Lag smoothing: a stalled or backgrounded tab resumes instead of jumping ahead.\n if (dt > 0.25) dt = 1 / 60;\n this.goto(this.t + dt * this.ts);\n if (!this.paused && !this.dead) this.raf = requestAnimationFrame(this.tick);\n }\n}\n","/** Walks a DOM subtree and turns it into an ordered list of build tasks. */\n\nexport type StyledElement = Element & ElementCSSInlineStyle;\nexport type TaskKind = 'box' | 'text' | 'media' | 'block';\n\nexport interface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface Task {\n id: number;\n el: StyledElement;\n kind: TaskKind;\n /** Whether the element paints a surface (fill, border, shadow) that gets drawn first. */\n hasBox: boolean;\n /** Position relative to the overlay layer. */\n rect: Rect;\n /** Index of the nearest ancestor task, or -1. Children wait for their parent. */\n parent: number;\n label: string;\n area: number;\n}\n\nconst SKIP_TAGS = new Set(['SCRIPT', 'STYLE', 'TEMPLATE', 'NOSCRIPT', 'LINK', 'META', 'HEAD', 'TITLE', 'BR', 'WBR', 'SOURCE', 'TRACK']);\nconst MEDIA_TAGS = new Set(['IMG', 'SVG', 'svg', 'VIDEO', 'CANVAS', 'PICTURE', 'IFRAME', 'OBJECT', 'EMBED']);\nconst CONTROL_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT', 'PROGRESS', 'METER']);\n\n/** Only a zero *alpha* counts: rgba(r, g, b, 0) or modern `… / 0` syntax. rgb(255, 0, 0) is red, not transparent. */\nconst isTransparent = (c: string | null | undefined): boolean =>\n !c ||\n c === 'transparent' ||\n /^rgba?\\([^,)]+,[^,)]+,[^,)]+,\\s*0*\\.?0*%?\\s*\\)$/.test(c) ||\n /\\/\\s*0*\\.?0*%?\\s*\\)$/.test(c);\n\nfunction paintsSurface(cs: CSSStyleDeclaration): boolean {\n if (!isTransparent(cs.backgroundColor)) return true;\n if (cs.backgroundImage && cs.backgroundImage !== 'none') return true;\n if (cs.boxShadow && cs.boxShadow !== 'none') return true;\n for (const side of ['Top', 'Right', 'Bottom', 'Left'] as const) {\n const width = parseFloat(cs[`border${side}Width`]);\n const style = cs[`border${side}Style`];\n if (width > 0 && style !== 'none' && style !== 'hidden' && !isTransparent(cs[`border${side}Color`])) return true;\n }\n return false;\n}\n\nfunction hasOwnText(el: Element): boolean {\n for (const node of Array.from(el.childNodes)) {\n if (node.nodeType === 3 && node.nodeValue && node.nodeValue.trim()) return true;\n }\n return false;\n}\n\n/** True when every descendant is inline, so the element can be typed as one text run. */\nfunction onlyInlineDescendants(el: Element): boolean {\n for (const child of Array.from(el.children)) {\n if (child.tagName === 'BR') continue;\n if (MEDIA_TAGS.has(child.tagName) || CONTROL_TAGS.has(child.tagName)) return false;\n if (getComputedStyle(child).display !== 'inline' || !onlyInlineDescendants(child)) return false;\n }\n return true;\n}\n\nfunction isInlineTextBlock(el: Element): boolean {\n if (!el.textContent || !el.textContent.trim()) return false;\n for (const child of Array.from(el.children)) {\n if (SKIP_TAGS.has(child.tagName)) continue;\n if (MEDIA_TAGS.has(child.tagName) || CONTROL_TAGS.has(child.tagName)) return false;\n const display = getComputedStyle(child).display;\n if ((display !== 'inline' && display !== 'contents') || !onlyInlineDescendants(child)) return false;\n }\n return true;\n}\n\nfunction labelFor(el: Element, kind: TaskKind): string {\n if (kind === 'text') {\n const text = (el.textContent || '').replace(/\\s+/g, ' ').trim();\n return `“${text.length > 18 ? text.slice(0, 17) + '…' : text}”`;\n }\n const tag = el.tagName.toLowerCase();\n if (kind === 'media') return tag === 'img' || tag === 'picture' ? 'image' : tag;\n const cls = (el.getAttribute('class') || '').trim().split(/\\s+/)[0];\n return cls ? `${tag}.${cls.slice(0, 16)}` : tag;\n}\n\nexport function collectTasks(root: Element, origin: DOMRect, maxTasks: number): Task[] {\n const tasks: Task[] = [];\n\n const add = (el: Element, kind: TaskKind, hasBox: boolean, parent: number): number => {\n const r = el.getBoundingClientRect();\n const rect = { x: r.left - origin.left, y: r.top - origin.top, w: r.width, h: r.height };\n tasks.push({ id: tasks.length, el: el as StyledElement, kind, hasBox, rect, parent, label: labelFor(el, kind), area: rect.w * rect.h });\n return tasks.length - 1;\n };\n\n const walk = (el: Element, parent: number, isRoot: boolean): void => {\n if (SKIP_TAGS.has(el.tagName)) return;\n const mode = el.getAttribute('data-assemble');\n if (mode === 'skip') return;\n const cs = getComputedStyle(el);\n if (cs.display === 'none') return;\n\n const r = el.getBoundingClientRect();\n const visible = r.width >= 2 && r.height >= 2;\n const tag = el.tagName;\n\n if (visible && !(isRoot && (tag === 'BODY' || tag === 'HTML'))) {\n if (mode === 'block') return void add(el, 'block', false, parent);\n if (MEDIA_TAGS.has(tag)) return void add(el, 'media', false, parent);\n if (CONTROL_TAGS.has(tag)) return void add(el, 'box', true, parent);\n const box = paintsSurface(cs);\n if (hasOwnText(el) || isInlineTextBlock(el)) return void add(el, 'text', box, parent);\n if (box) parent = add(el, 'box', true, parent);\n }\n for (const child of Array.from(el.children)) walk(child, parent, false);\n };\n\n walk(root, -1, true);\n if (tasks.length <= maxTasks) return tasks;\n\n // Too many tasks: drop the smallest nested ones and re-parent their children.\n const dropped = new Set<number>();\n for (const t of tasks.filter((t) => t.parent !== -1).sort((a, b) => a.area - b.area)) {\n if (tasks.length - dropped.size <= maxTasks) break;\n dropped.add(t.id);\n }\n const keptAncestor = (p: number): number => {\n while (p !== -1 && dropped.has(p)) p = tasks[p].parent;\n return p;\n };\n const kept = tasks.filter((t) => !dropped.has(t.id));\n const newIndex = new Map<number, number>();\n kept.forEach((t, i) => newIndex.set(t.id, i));\n for (const t of kept) {\n const p = keptAncestor(t.parent);\n t.parent = p === -1 ? -1 : newIndex.get(p)!;\n }\n kept.forEach((t, i) => (t.id = i));\n return kept;\n}\n","/** Splits an element's text into hidden spans that can be revealed one by one. */\n\nexport type TypingMode = 'auto' | 'char' | 'word';\n\nexport interface TextSplit {\n chunks: HTMLSpanElement[];\n /** Puts the original text nodes back. Safe to call more than once. */\n restore(): void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst Segmenter = typeof Intl !== 'undefined' ? (Intl as any).Segmenter : undefined;\nconst segmenter = Segmenter ? new Segmenter(undefined, { granularity: 'grapheme' }) : null;\nconst graphemes = (s: string): string[] =>\n segmenter ? Array.from(segmenter.segment(s) as Iterable<{ segment: string }>, (x) => x.segment) : Array.from(s);\n\n/** Text longer than this many characters is typed word by word in `auto` mode. */\nconst WORD_THRESHOLD = 160;\n\nexport function splitText(el: Element, mode: TypingMode): TextSplit {\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, {\n acceptNode(node) {\n const parent = node.parentElement;\n if (!parent || parent.closest('script,style,svg,textarea')) return NodeFilter.FILTER_REJECT;\n return node.nodeValue ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n });\n const nodes: Text[] = [];\n while (walker.nextNode()) nodes.push(walker.currentNode as Text);\n\n const length = nodes.reduce((n, t) => n + (t.nodeValue || '').trim().length, 0);\n const byWord = mode === 'word' || (mode === 'auto' && length > WORD_THRESHOLD);\n\n const chunks: HTMLSpanElement[] = [];\n const replaced: { original: Text; created: Node[] }[] = [];\n\n for (const node of nodes) {\n const value = node.nodeValue || '';\n if (!value.trim()) continue;\n const pieces = byWord ? value.match(/\\s+|\\S+/g) || [] : graphemes(value);\n const fragment = document.createDocumentFragment();\n const created: Node[] = [];\n for (const piece of pieces) {\n let out: Node;\n if (!piece.trim()) {\n out = document.createTextNode(piece);\n } else {\n const span = document.createElement('span');\n span.textContent = piece;\n span.style.visibility = 'hidden';\n span.setAttribute('data-cc-chunk', '');\n chunks.push(span);\n out = span;\n }\n fragment.appendChild(out);\n created.push(out);\n }\n // In a flex or grid container every child is its own item, which would drop the\n // spaces and shift the layout. One wrapper keeps the text a single item, as it was.\n if (/flex|grid/.test(getComputedStyle(node.parentElement!).display)) {\n const item = document.createElement('span');\n item.appendChild(fragment);\n fragment.appendChild(item);\n created.splice(0, created.length, item);\n }\n node.parentNode!.insertBefore(fragment, node);\n node.parentNode!.removeChild(node);\n replaced.push({ original: node, created });\n }\n\n let restored = false;\n return {\n chunks,\n restore() {\n if (restored) return;\n restored = true;\n for (const { original, created } of replaced) {\n const first = created[0];\n if (first && first.parentNode) first.parentNode.insertBefore(original, first);\n for (const n of created) n.parentNode?.removeChild(n);\n }\n },\n };\n}\n","/** The overlay layer: cursors, draw boxes and carets, plus their stylesheet. */\n\nexport interface AgentConfig {\n name: string;\n color: string;\n}\n\nexport interface Agent {\n el: HTMLDivElement;\n tag: HTMLDivElement;\n caret: HTMLDivElement;\n config: AgentConfig;\n}\n\nexport const DEFAULT_AGENTS: readonly AgentConfig[] = [\n { name: 'Atlas', color: '#6d5efc' },\n { name: 'Nova', color: '#f2547d' },\n { name: 'Echo', color: '#12a8a0' },\n { name: 'Pixel', color: '#f08a24' },\n { name: 'Orbit', color: '#2f80ed' },\n { name: 'Juno', color: '#9b51e0' },\n { name: 'Sol', color: '#d4a20b' },\n { name: 'Kai', color: '#27ae60' },\n];\n\nexport function resolveAgents(agents: number | readonly AgentConfig[] | undefined): AgentConfig[] {\n if (Array.isArray(agents) && agents.length) return agents.slice();\n const count = Math.min(24, Math.max(1, typeof agents === 'number' ? Math.round(agents) : 5));\n return Array.from({ length: count }, (_, i) => {\n const base = DEFAULT_AGENTS[i % DEFAULT_AGENTS.length];\n return i < DEFAULT_AGENTS.length ? { ...base } : { name: `${base.name} ${Math.floor(i / DEFAULT_AGENTS.length) + 1}`, color: base.color };\n });\n}\n\nconst STYLE_ID = 'cursorcrew-css';\n\nconst CSS = `\n[data-assemble-pending]{visibility:hidden}\n.cc-layer{position:absolute;left:0;top:0;overflow:hidden;pointer-events:none}\n.cc-layer *{box-sizing:border-box}\n.cc-agent{position:absolute;left:0;top:0;width:0;height:0;will-change:transform;z-index:3}\n.cc-ic{position:absolute;display:none;overflow:visible;filter:drop-shadow(0 1px 2px rgba(0,0,0,.25))}\n.cc-agent[data-mode=arrow] .cc-arrow,.cc-agent[data-mode=cross] .cc-cross,.cc-agent[data-mode=beam] .cc-beam{display:block}\n.cc-arrow{left:-1px;top:-1px;width:18px;height:22px}\n.cc-cross{left:-9px;top:-9px;width:18px;height:18px}\n.cc-beam{left:-5px;top:-10px;width:10px;height:20px}\n.cc-tag{position:absolute;left:14px;top:18px;display:flex;align-items:center;gap:6px;white-space:nowrap;\n font:600 11px/1 ui-sans-serif,system-ui,-apple-system,\"Segoe UI\",sans-serif;color:#fff;background:var(--c);\n padding:4px 7px;border-radius:2px 8px 8px 8px;box-shadow:0 2px 6px rgba(0,0,0,.18);letter-spacing:.01em}\n.cc-tag::after{content:attr(data-action);font-weight:500;opacity:.82;max-width:180px;overflow:hidden;text-overflow:ellipsis}\n.cc-tag[data-action=\"\"]::after{display:none}\n.cc-noactions .cc-tag::after{display:none}\n.cc-nolabels .cc-tag{display:none}\n.cc-draw{position:absolute;left:0;top:0;width:0;height:0;visibility:hidden;opacity:0;z-index:1;\n border:1.5px solid var(--c);background:color-mix(in srgb,var(--c) 7%,transparent)}\n.cc-draw[data-kind=text]{border-style:dashed;background:none}\n.cc-draw[data-kind=media],.cc-draw[data-kind=block]{background:repeating-linear-gradient(135deg,\n color-mix(in srgb,var(--c) 14%,transparent) 0 6px,color-mix(in srgb,var(--c) 4%,transparent) 6px 12px)}\n.cc-dim{position:absolute;left:50%;top:100%;transform:translate(-50%,5px);font:600 10px/1 ui-monospace,SFMono-Regular,Menlo,monospace;\n color:#fff;background:var(--c);padding:3px 5px;border-radius:3px;white-space:nowrap}\n.cc-caret{position:absolute;left:0;top:0;width:2px;visibility:hidden;opacity:0;z-index:2;background:var(--c)}\n`;\n\nexport function injectStyles(): void {\n if (document.getElementById(STYLE_ID)) return;\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = CSS;\n document.head.appendChild(style);\n}\n\n/** A full-document, click-through layer the crew draws on. */\nexport function createLayer(zIndex: number, labels: boolean, actions: boolean): HTMLDivElement {\n const layer = document.createElement('div');\n layer.className = 'cc-layer' + (labels ? '' : ' cc-nolabels') + (actions ? '' : ' cc-noactions');\n layer.setAttribute('aria-hidden', 'true');\n const doc = document.documentElement;\n layer.style.width = Math.max(doc.scrollWidth, document.body.scrollWidth) + 'px';\n layer.style.height = Math.max(doc.scrollHeight, document.body.scrollHeight) + 'px';\n layer.style.zIndex = String(zIndex);\n document.body.appendChild(layer);\n return layer;\n}\n\nconst ICONS =\n '<svg class=\"cc-ic cc-arrow\" viewBox=\"0 0 18 22\"><path d=\"M1.5 1.5v16.2l4.3-4.1 2.9 6.6 2.7-1.2-2.9-6.5h6z\" fill=\"var(--c)\" stroke=\"#fff\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/></svg>' +\n '<svg class=\"cc-ic cc-cross\" viewBox=\"0 0 18 18\"><path d=\"M9 1v16M1 9h16\" stroke=\"#fff\" stroke-width=\"3.5\" stroke-linecap=\"round\"/><path d=\"M9 1v16M1 9h16\" stroke=\"var(--c)\" stroke-width=\"1.6\" stroke-linecap=\"round\"/></svg>' +\n '<svg class=\"cc-ic cc-beam\" viewBox=\"0 0 10 20\"><path d=\"M2 1.5h6M5 1.5v17M2 18.5h6\" stroke=\"#fff\" stroke-width=\"3.5\" stroke-linecap=\"round\"/><path d=\"M2 1.5h6M5 1.5v17M2 18.5h6\" stroke=\"var(--c)\" stroke-width=\"1.6\" stroke-linecap=\"round\"/></svg>';\n\nexport function createAgent(layer: HTMLElement, config: AgentConfig): Agent {\n const el = document.createElement('div');\n el.className = 'cc-agent';\n el.dataset.mode = 'arrow';\n el.style.setProperty('--c', config.color);\n el.innerHTML = ICONS;\n\n const tag = document.createElement('div');\n tag.className = 'cc-tag';\n tag.textContent = config.name;\n tag.setAttribute('data-action', '');\n el.appendChild(tag);\n\n const caret = document.createElement('div');\n caret.className = 'cc-caret';\n caret.style.setProperty('--c', config.color);\n\n layer.appendChild(el);\n layer.appendChild(caret);\n return { el, tag, caret, config };\n}\n\nexport function createDrawBox(layer: HTMLElement, kind: string, color: string, withSize: boolean) {\n const box = document.createElement('div');\n box.className = 'cc-draw';\n box.dataset.kind = kind;\n box.style.setProperty('--c', color);\n let size: HTMLDivElement | null = null;\n if (withSize) {\n size = document.createElement('div');\n size.className = 'cc-dim';\n box.appendChild(size);\n }\n layer.appendChild(box);\n return { box, size };\n}\n","import { Timeline, set, type TweenVars } from './timeline';\nimport { collectTasks, type StyledElement, type Task, type TaskKind } from './scan';\nimport { splitText, type TextSplit, type TypingMode } from './text';\nimport { createAgent, createDrawBox, createLayer, injectStyles, resolveAgents, type AgentConfig } from './overlay';\n\nexport interface AssembleOptions {\n /** How many agents, or a list of names and colors. Default 5 (max 24). */\n agents?: number | readonly AgentConfig[];\n /** Fit the whole build into this many seconds. Omit or 0 for the natural length. */\n duration?: number;\n /** Playback speed when `duration` is not set. Default 1. */\n speed?: number;\n /** `immediate` plays right away; `viewport` waits until the target scrolls into view. */\n trigger?: 'immediate' | 'viewport';\n /** Start automatically. Default true. */\n autoplay?: boolean;\n /** How text is typed. `auto` types short text by letter and long text by word. */\n typing?: TypingMode;\n /** Upper bound on animated pieces; the smallest nested ones are merged into their parent. Default 250. */\n maxTasks?: number;\n /** Remove the overlay and restore inline styles when done. Default true. */\n cleanup?: boolean;\n /** z-index of the overlay layer. */\n zIndex?: number;\n /** Show agent name tags. Default true. */\n labels?: boolean;\n /** Show what each agent is doing next to its name. Default true. */\n actions?: boolean;\n /** `respect` skips the animation when the user prefers reduced motion. Default `respect`. */\n reducedMotion?: 'respect' | 'ignore';\n onStart?: () => void;\n /** Called every frame with progress from 0 to 1. */\n onProgress?: (progress: number) => void;\n onComplete?: () => void;\n}\n\nexport interface Crew {\n /** The underlying timeline (play, pause, progress, timeScale…). */\n readonly timeline: Timeline;\n /** Resolves when the build finishes or the crew is destroyed. */\n readonly finished: Promise<void>;\n play(): void;\n pause(): void;\n /** Jump to the end, revealing everything. */\n finish(): void;\n /** Reset the target and build it again. */\n replay(): void;\n /** Stop and restore the target as it was. */\n destroy(): void;\n}\n\ntype Resolved = Required<Omit<AssembleOptions, 'onStart' | 'onProgress' | 'onComplete' | 'duration'>> &\n Pick<AssembleOptions, 'onStart' | 'onProgress' | 'onComplete' | 'duration'>;\n\ninterface Point {\n x: number;\n y: number;\n}\ninterface LinePoint extends Point {\n h: number;\n}\n\nconst clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));\nconst distance = (a: Point, b: Point) => Math.hypot(a.x - b.x, a.y - b.y);\n\n/** Timing model, in seconds. */\nconst TIMING = {\n travel: (px: number) => clamp(0.22 + px / 1700, 0.28, 0.85),\n draw: (area: number) => clamp(0.32 + Math.sqrt(area) / 1500, 0.38, 0.95),\n frame: (area: number) => clamp(0.18 + Math.sqrt(area) / 2600, 0.2, 0.45),\n fade: 0.3,\n sweep: 0.6,\n perChar: 0.028,\n perWord: 0.075,\n typeMax: 1.7,\n gap: 0.06,\n};\n\nconst RESTORED_PROPS = ['visibility', 'opacity', 'clip-path', '-webkit-clip-path'];\nconst MOVE_EASE = 'power2.inOut';\nconst LATE = { immediateRender: false } as const;\n\ninterface Build {\n tl: Timeline;\n finished: Promise<void>;\n teardown(): void;\n}\n\nfunction build(root: StyledElement, o: Resolved): Build {\n injectStyles();\n\n // Remember inline styles we are about to touch so teardown restores them exactly.\n const saved = new Map<StyledElement, { hadStyle: boolean; props: Record<string, [string, string]> }>();\n const remember = (el: StyledElement) => {\n if (saved.has(el)) return;\n const props: Record<string, [string, string]> = {};\n for (const p of RESTORED_PROPS) props[p] = [el.style.getPropertyValue(p), el.style.getPropertyPriority(p)];\n saved.set(el, { hadStyle: el.hasAttribute('style'), props });\n };\n\n const layer = createLayer(o.zIndex, o.labels, o.actions);\n const origin = layer.getBoundingClientRect();\n const tasks = collectTasks(root, origin, o.maxTasks);\n const finalOpacity = tasks.map((t) => parseFloat(getComputedStyle(t.el).opacity) || 1);\n\n remember(root);\n root.style.visibility = 'hidden';\n root.removeAttribute('data-assemble-pending');\n const splits: (TextSplit | null)[] = tasks.map((t) => {\n remember(t.el);\n t.el.style.visibility = 'hidden';\n return t.kind === 'text' ? splitText(t.el, o.typing) : null;\n });\n\n const agents = resolveAgents(o.agents).map((cfg) => createAgent(layer, cfg));\n\n // Agents spawn near the top of the target's visible part.\n const r = root.getBoundingClientRect();\n const top = clamp(r.top, 0, innerHeight);\n const bottom = clamp(r.bottom, 0, innerHeight);\n const left = clamp(r.left, 0, innerWidth);\n const right = clamp(r.right, 0, innerWidth);\n const spawn = { x: (left + right) / 2 - origin.left, y: top + Math.min(120, (bottom - top) * 0.25) - origin.top };\n\n let resolveFinished!: () => void;\n const finished = new Promise<void>((res) => (resolveFinished = res));\n let tornDown = false;\n const teardown = () => {\n if (tornDown) return;\n tornDown = true;\n tl.kill();\n for (const s of splits) s?.restore();\n saved.forEach((entry, el) => {\n for (const p of RESTORED_PROPS) {\n const [value, priority] = entry.props[p];\n if (value) el.style.setProperty(p, value, priority);\n else el.style.removeProperty(p);\n }\n if (!entry.hadStyle && !el.getAttribute('style')) el.removeAttribute('style');\n });\n layer.remove();\n resolveFinished();\n };\n\n const tl: Timeline = new Timeline({\n paused: true,\n onStart: () => o.onStart?.(),\n onUpdate: () => o.onProgress?.(tl.progress()),\n onComplete: () => {\n if (o.cleanup) teardown();\n else resolveFinished();\n o.onComplete?.();\n },\n });\n\n // Per-agent scheduling state.\n const state = agents.map((a, n) => {\n const offset = (n - (agents.length - 1) / 2) * 34;\n const pos = { x: spawn.x + offset, y: spawn.y + (n % 2) * 18 };\n tl.fromTo(a.el, { x: pos.x, y: pos.y, scale: 0, autoAlpha: 0 }, { scale: 1, autoAlpha: 1, duration: 0.42, ease: 'back.out(2)' }, n * 0.07);\n return { pos, free: 0.45 + n * 0.07, last: 0 };\n });\n\n const say = (i: number, text: string, at: number) => tl.set(agents[i].tag, { attr: { 'data-action': text } }, at);\n const cursor = (i: number, mode: 'arrow' | 'cross' | 'beam', at: number) => tl.set(agents[i].el, { attr: { 'data-mode': mode } }, at);\n\n const move = (i: number, to: Point, at: number, dur: number) => {\n const from = state[i].pos;\n tl.fromTo(agents[i].el, { x: from.x, y: from.y }, { x: to.x, y: to.y, duration: dur, ease: MOVE_EASE, ...LATE }, at);\n state[i].pos = { ...to };\n };\n\n /** Drag out a box from the task's top-left to bottom-right, with the cursor following. */\n const drag = (i: number, task: Task, kind: TaskKind, at: number, dur: number, showSize: boolean) => {\n const { box, size } = createDrawBox(layer, kind, agents[i].config.color, showSize);\n const { x, y, w, h } = task.rect;\n set(box, { x, y });\n tl.set(box, { autoAlpha: 1 }, at);\n const vars: TweenVars = { width: w, height: h, duration: dur, ease: MOVE_EASE, ...LATE };\n if (size) {\n vars.onUpdate = () => {\n // Read back the value we just wrote (not offsetWidth) to avoid a forced layout per frame.\n size.textContent = `${Math.round(parseFloat(box.style.width) || 0)} × ${Math.round(parseFloat(box.style.height) || 0)}`;\n };\n }\n tl.fromTo(box, { width: 0, height: 0 }, vars, at);\n move(i, { x: x + w, y: y + h }, at, dur);\n return box;\n };\n\n const fadeIn = (task: Task, at: number) => {\n tl.set(task.el, { visibility: 'visible' }, at);\n tl.fromTo(task.el, { opacity: 0 }, { opacity: finalOpacity[task.id], duration: TIMING.fade, ease: 'power1.out', ...LATE }, at);\n };\n\n /** Schedules one task for agent `i` starting at `at`; returns when the agent is free. */\n const perform = (i: number, task: Task, at: number): number => {\n let t = at;\n\n if (task.kind === 'media' || task.kind === 'block') {\n say(i, `placing ${task.label}`, t);\n cursor(i, 'cross', t);\n const dur = TIMING.draw(task.area);\n const box = drag(i, task, task.kind, t, dur, true);\n t += dur;\n tl.set(task.el, { visibility: 'visible' }, t);\n tl.fromTo(task.el, { clipPath: 'inset(0% 0% 100% 0%)' }, { clipPath: 'inset(0% 0% 0% 0%)', duration: TIMING.sweep, ease: 'power2.out', ...LATE }, t);\n tl.to(box, { autoAlpha: 0, duration: TIMING.sweep, ...LATE }, t);\n cursor(i, 'arrow', t);\n return t + TIMING.sweep * 0.6;\n }\n\n let frame: HTMLElement | null = null;\n if (task.hasBox) {\n say(i, `drawing ${task.kind === 'text' ? task.el.tagName.toLowerCase() : task.label}`, t);\n cursor(i, 'cross', t);\n const dur = TIMING.draw(task.area);\n frame = drag(i, task, 'box', t, dur, true);\n t += dur;\n fadeIn(task, t);\n tl.to(frame, { autoAlpha: 0, duration: TIMING.fade, ...LATE }, t);\n cursor(i, 'arrow', t);\n if (task.kind === 'box') return t + TIMING.fade * 0.5;\n t += TIMING.fade * 0.6;\n }\n\n const chunks = splits[task.id]!.chunks;\n if (!frame) {\n say(i, 'text box', t);\n cursor(i, 'cross', t);\n const dur = TIMING.frame(task.area);\n frame = drag(i, task, 'text', t, dur, false);\n t += dur;\n tl.set(task.el, { visibility: 'visible' }, t);\n }\n if (!chunks.length) return t;\n\n // Measure where the caret sits after each chunk (chunks are hidden, but laid out).\n const ends: LinePoint[] = chunks.map((c) => {\n const b = c.getBoundingClientRect();\n return { x: b.right - origin.left, y: b.top - origin.top, h: b.height };\n });\n const f = chunks[0].getBoundingClientRect();\n const start: LinePoint = { x: f.left - origin.left, y: f.top - origin.top, h: f.height };\n const handle = (p: LinePoint): Point => ({ x: p.x + 9, y: p.y + p.h * 0.55 });\n\n const wordy = chunks.some((c) => /\\S\\s*\\S/.test(c.textContent || ''));\n const typeDur = clamp(chunks.length * (wordy ? TIMING.perWord : TIMING.perChar), 0.2, TIMING.typeMax);\n const reach = 0.22;\n\n move(i, handle(start), t, reach);\n cursor(i, 'beam', t + reach * 0.5);\n t += reach;\n say(i, `typing ${task.label}`, t);\n\n const caret = agents[i].caret;\n tl.set(caret, { x: start.x, y: start.y, height: start.h, autoAlpha: 1 }, t);\n\n const counter = { n: 0 };\n let shown = 0;\n const total = chunks.length;\n tl.fromTo(\n counter,\n { n: 0 },\n {\n n: total,\n duration: typeDur,\n ease: 'none',\n ...LATE,\n onUpdate: () => {\n const k = Math.min(total, Math.round(counter.n));\n if (k > shown) for (let j = shown; j < k; j++) chunks[j].style.visibility = '';\n else for (let j = k; j < shown; j++) chunks[j].style.visibility = 'hidden';\n shown = k;\n const p = k === 0 ? start : ends[k - 1];\n set(caret, { x: p.x, y: p.y, height: p.h });\n set(agents[i].el, handle(p));\n },\n },\n t,\n );\n t += typeDur;\n state[i].pos = handle(ends[total - 1]);\n tl.set(caret, { autoAlpha: 0 }, t + 0.12);\n tl.to(frame, { autoAlpha: 0, duration: 0.25, ...LATE }, t);\n cursor(i, 'arrow', t + 0.12);\n return t + 0.08;\n };\n\n // Greedy scheduler: the earliest-free agent takes the reachable task it can start soonest,\n // looking at the next 10 tasks in reading order. Children wait for their parent.\n const queue = tasks\n .slice()\n .sort((a, b) => Math.round(a.rect.y / 24) - Math.round(b.rect.y / 24) || a.rect.x - b.rect.x || a.id - b.id);\n const doneAt = new Array<number>(tasks.length).fill(-1);\n\n while (queue.length) {\n let i = 0;\n for (let k = 1; k < state.length; k++) if (state[k].free < state[i].free) i = k;\n const st = state[i];\n\n let best = -1;\n let bestScore = Infinity;\n let bestStart = 0;\n let bestTravel = 0;\n let considered = 0;\n for (let j = 0; j < queue.length && considered < 10; j++) {\n const task = queue[j];\n if (task.parent !== -1 && doneAt[task.parent] < 0) continue;\n const travel = TIMING.travel(distance(st.pos, task.rect));\n const start = Math.max(st.free + travel, task.parent === -1 ? 0 : doneAt[task.parent] + 0.05);\n const score = start + considered * 0.04;\n if (score < bestScore) {\n bestScore = score;\n best = j;\n bestStart = start;\n bestTravel = travel;\n }\n considered++;\n }\n if (best < 0) {\n best = 0;\n bestTravel = TIMING.travel(distance(st.pos, queue[0].rect));\n bestStart = st.free + bestTravel;\n }\n\n const task = queue.splice(best, 1)[0];\n say(i, `→ ${task.label}`, bestStart - bestTravel);\n move(i, { x: task.rect.x, y: task.rect.y }, bestStart - bestTravel, bestTravel);\n doneAt[task.id] = perform(i, task, bestStart);\n st.free = doneAt[task.id] + TIMING.gap;\n st.last = doneAt[task.id];\n }\n\n // Wrap up: each agent reports done, then the crew floats away.\n const end = Math.max(0.5, ...doneAt);\n agents.forEach((a, n) => {\n say(n, 'done ✓', state[n].last + 0.05);\n cursor(n, 'arrow', state[n].last + 0.05);\n tl.to(a.el, { autoAlpha: 0, scale: 0.6, y: '-=14', duration: 0.35, ease: 'power2.in', ...LATE }, end + 0.35 + n * 0.05);\n });\n\n if (o.duration && o.duration > 0) tl.timeScale(tl.duration() / o.duration);\n else tl.timeScale(o.speed || 1);\n\n return { tl, finished, teardown };\n}\n\nconst noop = () => {};\n\n/**\n * Blank `target`, then let a crew of cursors rebuild it: drawing boxes, typing text and\n * placing media until the real content is back.\n */\nexport function assemble(target: string | Element, options: AssembleOptions = {}): Crew {\n const root = (typeof target === 'string' ? document.querySelector(target) : target) as StyledElement | null;\n if (!root) throw new Error(`cursorcrew: target not found (${String(target)})`);\n\n const o: Resolved = {\n agents: 5,\n speed: 1,\n typing: 'auto',\n maxTasks: 250,\n cleanup: true,\n zIndex: 2147483000,\n labels: true,\n actions: true,\n autoplay: true,\n trigger: 'immediate',\n reducedMotion: 'respect',\n ...options,\n };\n\n if (o.reducedMotion === 'respect' && typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches) {\n root.removeAttribute('data-assemble-pending');\n if (o.onComplete) queueMicrotask(o.onComplete);\n return {\n timeline: new Timeline({ paused: true }),\n finished: Promise.resolve(),\n play: noop,\n pause: noop,\n finish: noop,\n replay: noop,\n destroy: noop,\n };\n }\n\n let current = build(root, o);\n let observer: IntersectionObserver | null = null;\n const stopWatching = () => {\n observer?.disconnect();\n observer = null;\n };\n\n if (o.autoplay) {\n if (o.trigger === 'viewport' && root !== document.body && typeof IntersectionObserver !== 'undefined') {\n observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((e) => e.isIntersecting)) {\n stopWatching();\n current.tl.play();\n }\n },\n { threshold: 0.15 },\n );\n observer.observe(root);\n } else {\n current.tl.play();\n }\n }\n\n return {\n get timeline() {\n return current.tl;\n },\n get finished() {\n return current.finished;\n },\n play: () => void current.tl.play(),\n pause: () => void current.tl.pause(),\n finish() {\n stopWatching();\n current.tl.progress(1);\n },\n replay() {\n stopWatching();\n current.teardown();\n current = build(root, o);\n current.tl.play();\n },\n destroy() {\n stopWatching();\n current.teardown();\n },\n };\n}\n"],"mappings":"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","names":["t","task"]}
@@ -0,0 +1,27 @@
1
+ "use strict";var CursorCrew=(()=>{var ee=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var Le=Object.prototype.hasOwnProperty;var Be=(e,t)=>{for(var n in t)ee(e,n,{get:t[n],enumerable:!0})},Fe=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Oe(t))!Le.call(e,o)&&o!==n&&ee(e,o,{get:()=>t[o],enumerable:!(r=Pe(t,o))||r.enumerable});return e};var De=e=>Fe(ee({},"__esModule",{value:!0}),e);var Je={};Be(Je,{DEFAULT_AGENTS:()=>K,Timeline:()=>V,assemble:()=>Ce});var j={none:e=>e,"power1.in":e=>e*e,"power1.out":e=>1-(1-e)*(1-e),"power1.inOut":e=>e<.5?2*e*e:1-Math.pow(-2*e+2,2)/2,"power2.in":e=>e*e*e,"power2.out":e=>1-Math.pow(1-e,3),"power2.inOut":e=>e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2};function $e(e){if(typeof e=="function")return e;if(!e)return j["power1.out"];if(j[e])return j[e];let t=/^back\.out(?:\(([\d.]+)\))?$/.exec(e);if(t){let n=t[1]?+t[1]:1.70158,r=n+1;return j[e]=o=>1+r*Math.pow(o-1,3)+n*Math.pow(o-1,2)}return j["power1.out"]}var ne=new Set(["duration","ease","immediateRender","onUpdate","onComplete","onStart","overwrite"]),le=new Set(["x","y","scale"]),ae=new WeakMap;function ce(e){let t=ae.get(e);return t||ae.set(e,t={x:0,y:0,scale:1}),t}var de=e=>!!e&&e.nodeType===1;function He(e,t){if(!de(e))return e[t];if(le.has(t))return ce(e)[t];let n=getComputedStyle(e);if(t==="autoAlpha")return n.visibility==="hidden"?0:parseFloat(n.opacity);let r=String(e.style[t]||n[t]||"");return/^-?[\d.]+(px)?$/.test(r)?parseFloat(r):r}function z(e,t){let n=t;if(!de(e)){for(let c in n)ne.has(c)||(e[c]=n[c]);return}let r=e.style,o=null;for(let c in n){if(ne.has(c))continue;let d=n[c];if(c==="attr")for(let[g,E]of Object.entries(d))e.setAttribute(g,E);else le.has(c)?(o??(o=ce(e)))[c]=d:c==="autoAlpha"?(r.opacity=String(d),r.visibility=d<=0?"hidden":"inherit"):c==="width"||c==="height"?r[c]=typeof d=="number"?`${d}px`:d:r[c]=typeof d=="number"?String(d):d}o&&(r.transform=`translate3d(${o.x}px,${o.y}px,0)${o.scale!==1?` scale(${o.scale})`:""}`)}var te=/-?\d*\.?\d+(?:e[-+]?\d+)?/gi;function Ve(e,t){if(typeof t=="string"&&/^[-+]=/.test(t)&&(t=(Number(e)||0)+(t[0]==="-"?-1:1)*parseFloat(t.slice(2))),typeof t=="number"){let n=Number(e)||0,r=t;return o=>n+(r-n)*o}if(typeof t=="string"&&typeof e=="string"){let n=t.match(te)??[],r=e.match(te)??[];if(n.length&&r.length===n.length){let o=t.split(te);return c=>{let d=o[0];for(let g=0;g<n.length;g++)d+=+r[g]+(+n[g]-+r[g])*c+o[g+1];return d}}}return()=>t}var V=class{constructor(t={}){this.opts=t;this.kids=[];this.t=0;this.end=0;this.ts=1;this.paused=!0;this.dead=!1;this.started=!1;this.completed=!1;this.raf=0;this.last=0;this.tick=this.tick.bind(this),t.paused||this.play()}set(t,n,r){return this.add(t,null,{...n,duration:0},r)}to(t,n,r){return this.add(t,null,n,r)}fromTo(t,n,r,o){return r.immediateRender!==!1&&z(t,n),this.add(t,n,r,o)}play(){return this.dead||this.completed?this:(this.paused=!1,this.raf||(this.last=performance.now(),this.raf=requestAnimationFrame(this.tick)),this)}pause(){return this.paused=!0,this.raf&&cancelAnimationFrame(this.raf),this.raf=0,this}kill(){return this.pause(),this.dead=!0,this.kids=[],this}duration(){return this.end}time(){return this.t}isActive(){return!this.paused&&!this.dead&&!this.completed}timeScale(t){return t===void 0?this.ts:(this.ts=t>0&&Number.isFinite(t)?t:1,this)}progress(t){return t===void 0?this.end?this.t/this.end:1:(this.goto(t*this.end),this)}add(t,n,r,o){let c={target:t,from:n,to:r,start:o??this.end,dur:Math.max(0,r.duration??.5),ease:$e(r.ease),fns:null,done:!1},d=this.kids.length;for(;d>0&&this.kids[d-1].start>c.start;)d--;return this.kids.splice(d,0,c),this.end=Math.max(this.end,c.start+c.dur),this}render(t){for(let n of this.kids){if(n.start>t)break;if(n.done)continue;if(!n.fns){n.fns={};for(let d in n.to)if(!ne.has(d))if(d==="attr"){let g=n.to.attr;n.fns.attr=()=>g}else n.fns[d]=Ve(n.from&&d in n.from?n.from[d]:He(n.target,d),n.to[d])}let r=n.dur?Math.min(1,(t-n.start)/n.dur):1,o=n.ease(r),c={};for(let d in n.fns)c[d]=n.fns[d](o);z(n.target,c),n.to.onUpdate?.(),r>=1&&(n.done=!0)}}goto(t){this.dead||(t=Math.max(0,Math.min(t,this.end)),this.started||(this.started=!0,this.opts.onStart?.()),this.t=t,this.render(t),this.opts.onUpdate?.(),t>=this.end&&!this.completed&&(this.completed=!0,this.pause(),this.opts.onComplete?.()))}tick(t){if(this.raf=0,this.paused||this.dead)return;let n=(t-this.last)/1e3;this.last=t,n>.25&&(n=1/60),this.goto(this.t+n*this.ts),!this.paused&&!this.dead&&(this.raf=requestAnimationFrame(this.tick))}};var pe=new Set(["SCRIPT","STYLE","TEMPLATE","NOSCRIPT","LINK","META","HEAD","TITLE","BR","WBR","SOURCE","TRACK"]),re=new Set(["IMG","SVG","svg","VIDEO","CANVAS","PICTURE","IFRAME","OBJECT","EMBED"]),oe=new Set(["INPUT","TEXTAREA","SELECT","PROGRESS","METER"]),ue=e=>!e||e==="transparent"||/^rgba?\([^,)]+,[^,)]+,[^,)]+,\s*0*\.?0*%?\s*\)$/.test(e)||/\/\s*0*\.?0*%?\s*\)$/.test(e);function Ue(e){if(!ue(e.backgroundColor)||e.backgroundImage&&e.backgroundImage!=="none"||e.boxShadow&&e.boxShadow!=="none")return!0;for(let t of["Top","Right","Bottom","Left"]){let n=parseFloat(e[`border${t}Width`]),r=e[`border${t}Style`];if(n>0&&r!=="none"&&r!=="hidden"&&!ue(e[`border${t}Color`]))return!0}return!1}function We(e){for(let t of Array.from(e.childNodes))if(t.nodeType===3&&t.nodeValue&&t.nodeValue.trim())return!0;return!1}function me(e){for(let t of Array.from(e.children))if(t.tagName!=="BR"&&(re.has(t.tagName)||oe.has(t.tagName)||getComputedStyle(t).display!=="inline"||!me(t)))return!1;return!0}function _e(e){if(!e.textContent||!e.textContent.trim())return!1;for(let t of Array.from(e.children)){if(pe.has(t.tagName))continue;if(re.has(t.tagName)||oe.has(t.tagName))return!1;let n=getComputedStyle(t).display;if(n!=="inline"&&n!=="contents"||!me(t))return!1}return!0}function ze(e,t){if(t==="text"){let o=(e.textContent||"").replace(/\s+/g," ").trim();return`\u201C${o.length>18?o.slice(0,17)+"\u2026":o}\u201D`}let n=e.tagName.toLowerCase();if(t==="media")return n==="img"||n==="picture"?"image":n;let r=(e.getAttribute("class")||"").trim().split(/\s+/)[0];return r?`${n}.${r.slice(0,16)}`:n}function fe(e,t,n){let r=[],o=(a,u,T,C)=>{let x=a.getBoundingClientRect(),S={x:x.left-t.left,y:x.top-t.top,w:x.width,h:x.height};return r.push({id:r.length,el:a,kind:u,hasBox:T,rect:S,parent:C,label:ze(a,u),area:S.w*S.h}),r.length-1},c=(a,u,T)=>{if(pe.has(a.tagName))return;let C=a.getAttribute("data-assemble");if(C==="skip")return;let x=getComputedStyle(a);if(x.display==="none")return;let S=a.getBoundingClientRect(),R=S.width>=2&&S.height>=2,U=a.tagName;if(R&&!(T&&(U==="BODY"||U==="HTML"))){if(C==="block")return void o(a,"block",!1,u);if(re.has(U))return void o(a,"media",!1,u);if(oe.has(U))return void o(a,"box",!0,u);let D=Ue(x);if(We(a)||_e(a))return void o(a,"text",D,u);D&&(u=o(a,"box",!0,u))}for(let D of Array.from(a.children))c(D,u,!1)};if(c(e,-1,!0),r.length<=n)return r;let d=new Set;for(let a of r.filter(u=>u.parent!==-1).sort((u,T)=>u.area-T.area)){if(r.length-d.size<=n)break;d.add(a.id)}let g=a=>{for(;a!==-1&&d.has(a);)a=r[a].parent;return a},E=r.filter(a=>!d.has(a.id)),p=new Map;E.forEach((a,u)=>p.set(a.id,u));for(let a of E){let u=g(a.parent);a.parent=u===-1?-1:p.get(u)}return E.forEach((a,u)=>a.id=u),E}var he=typeof Intl<"u"?Intl.Segmenter:void 0,ge=he?new he(void 0,{granularity:"grapheme"}):null,Ke=e=>ge?Array.from(ge.segment(e),t=>t.segment):Array.from(e),Ge=160;function be(e,t){let n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode(p){let a=p.parentElement;return!a||a.closest("script,style,svg,textarea")?NodeFilter.FILTER_REJECT:p.nodeValue?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),r=[];for(;n.nextNode();)r.push(n.currentNode);let o=r.reduce((p,a)=>p+(a.nodeValue||"").trim().length,0),c=t==="word"||t==="auto"&&o>Ge,d=[],g=[];for(let p of r){let a=p.nodeValue||"";if(!a.trim())continue;let u=c?a.match(/\s+|\S+/g)||[]:Ke(a),T=document.createDocumentFragment(),C=[];for(let x of u){let S;if(!x.trim())S=document.createTextNode(x);else{let R=document.createElement("span");R.textContent=x,R.style.visibility="hidden",R.setAttribute("data-cc-chunk",""),d.push(R),S=R}T.appendChild(S),C.push(S)}if(/flex|grid/.test(getComputedStyle(p.parentElement).display)){let x=document.createElement("span");x.appendChild(T),T.appendChild(x),C.splice(0,C.length,x)}p.parentNode.insertBefore(T,p),p.parentNode.removeChild(p),g.push({original:p,created:C})}let E=!1;return{chunks:d,restore(){if(!E){E=!0;for(let{original:p,created:a}of g){let u=a[0];u&&u.parentNode&&u.parentNode.insertBefore(p,u);for(let T of a)T.parentNode?.removeChild(T)}}}}}var K=[{name:"Atlas",color:"#6d5efc"},{name:"Nova",color:"#f2547d"},{name:"Echo",color:"#12a8a0"},{name:"Pixel",color:"#f08a24"},{name:"Orbit",color:"#2f80ed"},{name:"Juno",color:"#9b51e0"},{name:"Sol",color:"#d4a20b"},{name:"Kai",color:"#27ae60"}];function xe(e){if(Array.isArray(e)&&e.length)return e.slice();let t=Math.min(24,Math.max(1,typeof e=="number"?Math.round(e):5));return Array.from({length:t},(n,r)=>{let o=K[r%K.length];return r<K.length?{...o}:{name:`${o.name} ${Math.floor(r/K.length)+1}`,color:o.color}})}var ye="cursorcrew-css",je=`
2
+ [data-assemble-pending]{visibility:hidden}
3
+ .cc-layer{position:absolute;left:0;top:0;overflow:hidden;pointer-events:none}
4
+ .cc-layer *{box-sizing:border-box}
5
+ .cc-agent{position:absolute;left:0;top:0;width:0;height:0;will-change:transform;z-index:3}
6
+ .cc-ic{position:absolute;display:none;overflow:visible;filter:drop-shadow(0 1px 2px rgba(0,0,0,.25))}
7
+ .cc-agent[data-mode=arrow] .cc-arrow,.cc-agent[data-mode=cross] .cc-cross,.cc-agent[data-mode=beam] .cc-beam{display:block}
8
+ .cc-arrow{left:-1px;top:-1px;width:18px;height:22px}
9
+ .cc-cross{left:-9px;top:-9px;width:18px;height:18px}
10
+ .cc-beam{left:-5px;top:-10px;width:10px;height:20px}
11
+ .cc-tag{position:absolute;left:14px;top:18px;display:flex;align-items:center;gap:6px;white-space:nowrap;
12
+ font:600 11px/1 ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif;color:#fff;background:var(--c);
13
+ padding:4px 7px;border-radius:2px 8px 8px 8px;box-shadow:0 2px 6px rgba(0,0,0,.18);letter-spacing:.01em}
14
+ .cc-tag::after{content:attr(data-action);font-weight:500;opacity:.82;max-width:180px;overflow:hidden;text-overflow:ellipsis}
15
+ .cc-tag[data-action=""]::after{display:none}
16
+ .cc-noactions .cc-tag::after{display:none}
17
+ .cc-nolabels .cc-tag{display:none}
18
+ .cc-draw{position:absolute;left:0;top:0;width:0;height:0;visibility:hidden;opacity:0;z-index:1;
19
+ border:1.5px solid var(--c);background:color-mix(in srgb,var(--c) 7%,transparent)}
20
+ .cc-draw[data-kind=text]{border-style:dashed;background:none}
21
+ .cc-draw[data-kind=media],.cc-draw[data-kind=block]{background:repeating-linear-gradient(135deg,
22
+ color-mix(in srgb,var(--c) 14%,transparent) 0 6px,color-mix(in srgb,var(--c) 4%,transparent) 6px 12px)}
23
+ .cc-dim{position:absolute;left:50%;top:100%;transform:translate(-50%,5px);font:600 10px/1 ui-monospace,SFMono-Regular,Menlo,monospace;
24
+ color:#fff;background:var(--c);padding:3px 5px;border-radius:3px;white-space:nowrap}
25
+ .cc-caret{position:absolute;left:0;top:0;width:2px;visibility:hidden;opacity:0;z-index:2;background:var(--c)}
26
+ `;function we(){if(document.getElementById(ye))return;let e=document.createElement("style");e.id=ye,e.textContent=je,document.head.appendChild(e)}function ve(e,t,n){let r=document.createElement("div");r.className="cc-layer"+(t?"":" cc-nolabels")+(n?"":" cc-noactions"),r.setAttribute("aria-hidden","true");let o=document.documentElement;return r.style.width=Math.max(o.scrollWidth,document.body.scrollWidth)+"px",r.style.height=Math.max(o.scrollHeight,document.body.scrollHeight)+"px",r.style.zIndex=String(e),document.body.appendChild(r),r}var qe='<svg class="cc-ic cc-arrow" viewBox="0 0 18 22"><path d="M1.5 1.5v16.2l4.3-4.1 2.9 6.6 2.7-1.2-2.9-6.5h6z" fill="var(--c)" stroke="#fff" stroke-width="1.5" stroke-linejoin="round"/></svg><svg class="cc-ic cc-cross" viewBox="0 0 18 18"><path d="M9 1v16M1 9h16" stroke="#fff" stroke-width="3.5" stroke-linecap="round"/><path d="M9 1v16M1 9h16" stroke="var(--c)" stroke-width="1.6" stroke-linecap="round"/></svg><svg class="cc-ic cc-beam" viewBox="0 0 10 20"><path d="M2 1.5h6M5 1.5v17M2 18.5h6" stroke="#fff" stroke-width="3.5" stroke-linecap="round"/><path d="M2 1.5h6M5 1.5v17M2 18.5h6" stroke="var(--c)" stroke-width="1.6" stroke-linecap="round"/></svg>';function Te(e,t){let n=document.createElement("div");n.className="cc-agent",n.dataset.mode="arrow",n.style.setProperty("--c",t.color),n.innerHTML=qe;let r=document.createElement("div");r.className="cc-tag",r.textContent=t.name,r.setAttribute("data-action",""),n.appendChild(r);let o=document.createElement("div");return o.className="cc-caret",o.style.setProperty("--c",t.color),e.appendChild(n),e.appendChild(o),{el:n,tag:r,caret:o,config:t}}function Ee(e,t,n,r){let o=document.createElement("div");o.className="cc-draw",o.dataset.kind=t,o.style.setProperty("--c",n);let c=null;return r&&(c=document.createElement("div"),c.className="cc-dim",o.appendChild(c)),e.appendChild(o),{box:o,size:c}}var F=(e,t,n)=>Math.min(n,Math.max(t,e)),Se=(e,t)=>Math.hypot(e.x-t.x,e.y-t.y),v={travel:e=>F(.22+e/1700,.28,.85),draw:e=>F(.32+Math.sqrt(e)/1500,.38,.95),frame:e=>F(.18+Math.sqrt(e)/2600,.2,.45),fade:.3,sweep:.6,perChar:.028,perWord:.075,typeMax:1.7,gap:.06},ke=["visibility","opacity","clip-path","-webkit-clip-path"],Me="power2.inOut",O={immediateRender:!1};function Ae(e,t){we();let n=new Map,r=s=>{if(n.has(s))return;let i={};for(let f of ke)i[f]=[s.style.getPropertyValue(f),s.style.getPropertyPriority(f)];n.set(s,{hadStyle:s.hasAttribute("style"),props:i})},o=ve(t.zIndex,t.labels,t.actions),c=o.getBoundingClientRect(),d=fe(e,c,t.maxTasks),g=d.map(s=>parseFloat(getComputedStyle(s.el).opacity)||1);r(e),e.style.visibility="hidden",e.removeAttribute("data-assemble-pending");let E=d.map(s=>(r(s.el),s.el.style.visibility="hidden",s.kind==="text"?be(s.el,t.typing):null)),p=xe(t.agents).map(s=>Te(o,s)),a=e.getBoundingClientRect(),u=F(a.top,0,innerHeight),T=F(a.bottom,0,innerHeight),C=F(a.left,0,innerWidth),x=F(a.right,0,innerWidth),S={x:(C+x)/2-c.left,y:u+Math.min(120,(T-u)*.25)-c.top},R,U=new Promise(s=>R=s),D=!1,se=()=>{if(!D){D=!0,m.kill();for(let s of E)s?.restore();n.forEach((s,i)=>{for(let f of ke){let[l,b]=s.props[f];l?i.style.setProperty(f,l,b):i.style.removeProperty(f)}!s.hadStyle&&!i.getAttribute("style")&&i.removeAttribute("style")}),o.remove(),R()}},m=new V({paused:!0,onStart:()=>t.onStart?.(),onUpdate:()=>t.onProgress?.(m.progress()),onComplete:()=>{t.cleanup?se():R(),t.onComplete?.()}}),I=p.map((s,i)=>{let f=(i-(p.length-1)/2)*34,l={x:S.x+f,y:S.y+i%2*18};return m.fromTo(s.el,{x:l.x,y:l.y,scale:0,autoAlpha:0},{scale:1,autoAlpha:1,duration:.42,ease:"back.out(2)"},i*.07),{pos:l,free:.45+i*.07,last:0}}),W=(s,i,f)=>m.set(p[s].tag,{attr:{"data-action":i}},f),L=(s,i,f)=>m.set(p[s].el,{attr:{"data-mode":i}},f),Y=(s,i,f,l)=>{let b=I[s].pos;m.fromTo(p[s].el,{x:b.x,y:b.y},{x:i.x,y:i.y,duration:l,ease:Me,...O},f),I[s].pos={...i}},X=(s,i,f,l,b,w)=>{let{box:M,size:k}=Ee(o,f,p[s].config.color,w),{x:y,y:A,w:$,h:B}=i.rect;z(M,{x:y,y:A}),m.set(M,{autoAlpha:1},l);let P={width:$,height:B,duration:b,ease:Me,...O};return k&&(P.onUpdate=()=>{k.textContent=`${Math.round(parseFloat(M.style.width)||0)} \xD7 ${Math.round(parseFloat(M.style.height)||0)}`}),m.fromTo(M,{width:0,height:0},P,l),Y(s,{x:y+$,y:A+B},l,b),M},Re=(s,i)=>{m.set(s.el,{visibility:"visible"},i),m.fromTo(s.el,{opacity:0},{opacity:g[s.id],duration:v.fade,ease:"power1.out",...O},i)},Ne=(s,i,f)=>{let l=f;if(i.kind==="media"||i.kind==="block"){W(s,`placing ${i.label}`,l),L(s,"cross",l);let h=v.draw(i.area),N=X(s,i,i.kind,l,h,!0);return l+=h,m.set(i.el,{visibility:"visible"},l),m.fromTo(i.el,{clipPath:"inset(0% 0% 100% 0%)"},{clipPath:"inset(0% 0% 0% 0%)",duration:v.sweep,ease:"power2.out",...O},l),m.to(N,{autoAlpha:0,duration:v.sweep,...O},l),L(s,"arrow",l),l+v.sweep*.6}let b=null;if(i.hasBox){W(s,`drawing ${i.kind==="text"?i.el.tagName.toLowerCase():i.label}`,l),L(s,"cross",l);let h=v.draw(i.area);if(b=X(s,i,"box",l,h,!0),l+=h,Re(i,l),m.to(b,{autoAlpha:0,duration:v.fade,...O},l),L(s,"arrow",l),i.kind==="box")return l+v.fade*.5;l+=v.fade*.6}let w=E[i.id].chunks;if(!b){W(s,"text box",l),L(s,"cross",l);let h=v.frame(i.area);b=X(s,i,"text",l,h,!1),l+=h,m.set(i.el,{visibility:"visible"},l)}if(!w.length)return l;let M=w.map(h=>{let N=h.getBoundingClientRect();return{x:N.right-c.left,y:N.top-c.top,h:N.height}}),k=w[0].getBoundingClientRect(),y={x:k.left-c.left,y:k.top-c.top,h:k.height},A=h=>({x:h.x+9,y:h.y+h.h*.55}),$=w.some(h=>/\S\s*\S/.test(h.textContent||"")),B=F(w.length*($?v.perWord:v.perChar),.2,v.typeMax),P=.22;Y(s,A(y),l,P),L(s,"beam",l+P*.5),l+=P,W(s,`typing ${i.label}`,l);let Q=p[s].caret;m.set(Q,{x:y.x,y:y.y,height:y.h,autoAlpha:1},l);let ie={n:0},J=0,Z=w.length;return m.fromTo(ie,{n:0},{n:Z,duration:B,ease:"none",...O,onUpdate:()=>{let h=Math.min(Z,Math.round(ie.n));if(h>J)for(let H=J;H<h;H++)w[H].style.visibility="";else for(let H=h;H<J;H++)w[H].style.visibility="hidden";J=h;let N=h===0?y:M[h-1];z(Q,{x:N.x,y:N.y,height:N.h}),z(p[s].el,A(N))}},l),l+=B,I[s].pos=A(M[Z-1]),m.set(Q,{autoAlpha:0},l+.12),m.to(b,{autoAlpha:0,duration:.25,...O},l),L(s,"arrow",l+.12),l+.08},G=d.slice().sort((s,i)=>Math.round(s.rect.y/24)-Math.round(i.rect.y/24)||s.rect.x-i.rect.x||s.id-i.id),_=new Array(d.length).fill(-1);for(;G.length;){let s=0;for(let y=1;y<I.length;y++)I[y].free<I[s].free&&(s=y);let i=I[s],f=-1,l=1/0,b=0,w=0,M=0;for(let y=0;y<G.length&&M<10;y++){let A=G[y];if(A.parent!==-1&&_[A.parent]<0)continue;let $=v.travel(Se(i.pos,A.rect)),B=Math.max(i.free+$,A.parent===-1?0:_[A.parent]+.05),P=B+M*.04;P<l&&(l=P,f=y,b=B,w=$),M++}f<0&&(f=0,w=v.travel(Se(i.pos,G[0].rect)),b=i.free+w);let k=G.splice(f,1)[0];W(s,`\u2192 ${k.label}`,b-w),Y(s,{x:k.rect.x,y:k.rect.y},b-w,w),_[k.id]=Ne(s,k,b),i.free=_[k.id]+v.gap,i.last=_[k.id]}let Ie=Math.max(.5,..._);return p.forEach((s,i)=>{W(i,"done \u2713",I[i].last+.05),L(i,"arrow",I[i].last+.05),m.to(s.el,{autoAlpha:0,scale:.6,y:"-=14",duration:.35,ease:"power2.in",...O},Ie+.35+i*.05)}),t.duration&&t.duration>0?m.timeScale(m.duration()/t.duration):m.timeScale(t.speed||1),{tl:m,finished:U,teardown:se}}var q=()=>{};function Ce(e,t={}){let n=typeof e=="string"?document.querySelector(e):e;if(!n)throw new Error(`cursorcrew: target not found (${String(e)})`);let r={agents:5,speed:1,typing:"auto",maxTasks:250,cleanup:!0,zIndex:2147483e3,labels:!0,actions:!0,autoplay:!0,trigger:"immediate",reducedMotion:"respect",...t};if(r.reducedMotion==="respect"&&typeof matchMedia<"u"&&matchMedia("(prefers-reduced-motion: reduce)").matches)return n.removeAttribute("data-assemble-pending"),r.onComplete&&queueMicrotask(r.onComplete),{timeline:new V({paused:!0}),finished:Promise.resolve(),play:q,pause:q,finish:q,replay:q,destroy:q};let o=Ae(n,r),c=null,d=()=>{c?.disconnect(),c=null};return r.autoplay&&(r.trigger==="viewport"&&n!==document.body&&typeof IntersectionObserver<"u"?(c=new IntersectionObserver(g=>{g.some(E=>E.isIntersecting)&&(d(),o.tl.play())},{threshold:.15}),c.observe(n)):o.tl.play()),{get timeline(){return o.tl},get finished(){return o.finished},play:()=>{o.tl.play()},pause:()=>{o.tl.pause()},finish(){d(),o.tl.progress(1)},replay(){d(),o.teardown(),o=Ae(n,r),o.tl.play()},destroy(){d(),o.teardown()}}}return De(Je);})();
27
+ //# sourceMappingURL=cursorcrew.global.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/timeline.ts","../src/scan.ts","../src/text.ts","../src/overlay.ts","../src/assemble.ts"],"sourcesContent":["export { assemble } from './assemble';\nexport type { AssembleOptions, Crew } from './assemble';\nexport { DEFAULT_AGENTS } from './overlay';\nexport type { AgentConfig } from './overlay';\nexport { Timeline } from './timeline';\nexport type { TimelineOptions, TweenVars, Ease, EaseName } from './timeline';\nexport type { TypingMode } from './text';\n","/**\n * A tiny requestAnimationFrame timeline engine.\n *\n * It covers exactly what cursorcrew needs (absolute-position set / to / fromTo,\n * play, pause, kill, progress, timeScale) so the library ships with zero\n * dependencies. Transforms are written as translate3d so moving cursors and\n * boxes stay on the compositor.\n */\n\nexport type Ease = (t: number) => number;\nexport type EaseName =\n | 'none'\n | 'power1.in'\n | 'power1.out'\n | 'power1.inOut'\n | 'power2.in'\n | 'power2.out'\n | 'power2.inOut'\n | 'back.out'\n | `back.out(${number})`;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type TweenTarget = Element | Record<string, any>;\n\nexport interface TweenVars {\n duration?: number;\n ease?: EaseName | Ease;\n immediateRender?: boolean;\n onUpdate?: () => void;\n attr?: Record<string, string>;\n [prop: string]: unknown;\n}\n\nexport interface TimelineOptions {\n paused?: boolean;\n onStart?: () => void;\n onUpdate?: () => void;\n onComplete?: () => void;\n}\n\nconst EASES: Record<string, Ease> = {\n none: (t) => t,\n 'power1.in': (t) => t * t,\n 'power1.out': (t) => 1 - (1 - t) * (1 - t),\n 'power1.inOut': (t) => (t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2),\n 'power2.in': (t) => t * t * t,\n 'power2.out': (t) => 1 - Math.pow(1 - t, 3),\n 'power2.inOut': (t) => (t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2),\n};\n\nfunction getEase(name: EaseName | Ease | undefined): Ease {\n if (typeof name === 'function') return name;\n if (!name) return EASES['power1.out'];\n if (EASES[name]) return EASES[name];\n const m = /^back\\.out(?:\\(([\\d.]+)\\))?$/.exec(name);\n if (m) {\n const c1 = m[1] ? +m[1] : 1.70158;\n const c3 = c1 + 1;\n return (EASES[name] = (t) => 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2));\n }\n return EASES['power1.out'];\n}\n\nconst RESERVED = new Set(['duration', 'ease', 'immediateRender', 'onUpdate', 'onComplete', 'onStart', 'overwrite']);\nconst TRANSFORM = new Set(['x', 'y', 'scale']);\n\ninterface TransformState {\n x: number;\n y: number;\n scale: number;\n}\nconst transforms = new WeakMap<Element, TransformState>();\nfunction transformOf(el: Element): TransformState {\n let t = transforms.get(el);\n if (!t) transforms.set(el, (t = { x: 0, y: 0, scale: 1 }));\n return t;\n}\n\nconst isElement = (o: unknown): o is Element & ElementCSSInlineStyle =>\n !!o && (o as Node).nodeType === 1;\n\nfunction read(target: TweenTarget, prop: string): unknown {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (!isElement(target)) return (target as Record<string, any>)[prop];\n if (TRANSFORM.has(prop)) return transformOf(target)[prop as keyof TransformState];\n const cs = getComputedStyle(target);\n if (prop === 'autoAlpha') return cs.visibility === 'hidden' ? 0 : parseFloat(cs.opacity);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const v = String((target.style as any)[prop] || (cs as any)[prop] || '');\n return /^-?[\\d.]+(px)?$/.test(v) ? parseFloat(v) : v;\n}\n\n/** Apply values to a target immediately (no animation). */\nexport function set(target: TweenTarget, values: object): void {\n const props = values as Record<string, unknown>;\n if (!isElement(target)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n for (const k in props) if (!RESERVED.has(k)) (target as Record<string, any>)[k] = props[k];\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const s = target.style as any;\n let t: TransformState | null = null;\n for (const p in props) {\n if (RESERVED.has(p)) continue;\n const v = props[p];\n if (p === 'attr') {\n for (const [k, val] of Object.entries(v as Record<string, string>)) target.setAttribute(k, val);\n } else if (TRANSFORM.has(p)) {\n (t ??= transformOf(target))[p as keyof TransformState] = v as number;\n } else if (p === 'autoAlpha') {\n s.opacity = String(v);\n s.visibility = (v as number) <= 0 ? 'hidden' : 'inherit';\n } else if (p === 'width' || p === 'height') {\n s[p] = typeof v === 'number' ? `${v}px` : v;\n } else {\n s[p] = typeof v === 'number' ? String(v) : v;\n }\n }\n if (t) s.transform = `translate3d(${t.x}px,${t.y}px,0)${t.scale !== 1 ? ` scale(${t.scale})` : ''}`;\n}\n\nconst NUMBER = /-?\\d*\\.?\\d+(?:e[-+]?\\d+)?/gi;\n\nfunction interpolator(from: unknown, to: unknown): (e: number) => unknown {\n if (typeof to === 'string' && /^[-+]=/.test(to)) {\n to = (Number(from) || 0) + (to[0] === '-' ? -1 : 1) * parseFloat(to.slice(2));\n }\n if (typeof to === 'number') {\n const a = Number(from) || 0;\n const b = to;\n return (e) => a + (b - a) * e;\n }\n if (typeof to === 'string' && typeof from === 'string') {\n const bn = to.match(NUMBER) ?? [];\n const an = from.match(NUMBER) ?? [];\n if (bn.length && an.length === bn.length) {\n const parts = to.split(NUMBER);\n return (e) => {\n let out = parts[0];\n for (let i = 0; i < bn.length; i++) out += +an[i] + (+bn[i] - +an[i]) * e + parts[i + 1];\n return out;\n };\n }\n }\n // Non-numeric values (visibility, attributes…) snap at the start.\n return () => to;\n}\n\ninterface Tween {\n target: TweenTarget;\n from: Record<string, unknown> | null;\n to: TweenVars;\n start: number;\n dur: number;\n ease: Ease;\n fns: Record<string, (e: number) => unknown> | null;\n done: boolean;\n}\n\nexport class Timeline {\n private kids: Tween[] = [];\n private t = 0;\n private end = 0;\n private ts = 1;\n private paused = true;\n private dead = false;\n private started = false;\n private completed = false;\n private raf = 0;\n private last = 0;\n\n constructor(private readonly opts: TimelineOptions = {}) {\n this.tick = this.tick.bind(this);\n if (!opts.paused) this.play();\n }\n\n /** Apply `vars` instantly at `position` seconds. */\n set(target: TweenTarget, vars: TweenVars, position?: number): this {\n return this.add(target, null, { ...vars, duration: 0 }, position);\n }\n\n /** Tween from the target's current values (read when the tween starts). */\n to(target: TweenTarget, vars: TweenVars, position?: number): this {\n return this.add(target, null, vars, position);\n }\n\n /** Tween between explicit values. Renders `from` right away unless `immediateRender: false`. */\n fromTo(target: TweenTarget, from: Record<string, unknown>, to: TweenVars, position?: number): this {\n if (to.immediateRender !== false) set(target, from);\n return this.add(target, from, to, position);\n }\n\n play(): this {\n if (this.dead || this.completed) return this;\n this.paused = false;\n if (!this.raf) {\n this.last = performance.now();\n this.raf = requestAnimationFrame(this.tick);\n }\n return this;\n }\n\n pause(): this {\n this.paused = true;\n if (this.raf) cancelAnimationFrame(this.raf);\n this.raf = 0;\n return this;\n }\n\n kill(): this {\n this.pause();\n this.dead = true;\n this.kids = [];\n return this;\n }\n\n /** Total length in seconds, before timeScale. */\n duration(): number {\n return this.end;\n }\n\n /** Current playhead in seconds. */\n time(): number {\n return this.t;\n }\n\n isActive(): boolean {\n return !this.paused && !this.dead && !this.completed;\n }\n\n timeScale(): number;\n timeScale(value: number): this;\n timeScale(value?: number): number | this {\n if (value === undefined) return this.ts;\n this.ts = value > 0 && Number.isFinite(value) ? value : 1;\n return this;\n }\n\n progress(): number;\n progress(value: number): this;\n progress(value?: number): number | this {\n if (value === undefined) return this.end ? this.t / this.end : 1;\n this.goto(value * this.end);\n return this;\n }\n\n private add(target: TweenTarget, from: Record<string, unknown> | null, to: TweenVars, position?: number): this {\n const tween: Tween = {\n target,\n from,\n to,\n start: position ?? this.end,\n dur: Math.max(0, to.duration ?? 0.5),\n ease: getEase(to.ease),\n fns: null,\n done: false,\n };\n // Keep children sorted by start time (stable), so later tweens win on overlap.\n let i = this.kids.length;\n while (i > 0 && this.kids[i - 1].start > tween.start) i--;\n this.kids.splice(i, 0, tween);\n this.end = Math.max(this.end, tween.start + tween.dur);\n return this;\n }\n\n private render(time: number): void {\n for (const c of this.kids) {\n if (c.start > time) break;\n if (c.done) continue;\n if (!c.fns) {\n c.fns = {};\n for (const k in c.to) {\n if (RESERVED.has(k)) continue;\n if (k === 'attr') {\n const attr = c.to.attr;\n c.fns.attr = () => attr;\n } else {\n c.fns[k] = interpolator(c.from && k in c.from ? c.from[k] : read(c.target, k), c.to[k]);\n }\n }\n }\n const p = c.dur ? Math.min(1, (time - c.start) / c.dur) : 1;\n const e = c.ease(p);\n const props: Record<string, unknown> = {};\n for (const f in c.fns) props[f] = c.fns[f](e);\n set(c.target, props);\n c.to.onUpdate?.();\n if (p >= 1) c.done = true;\n }\n }\n\n private goto(time: number): void {\n if (this.dead) return;\n time = Math.max(0, Math.min(time, this.end));\n if (!this.started) {\n this.started = true;\n this.opts.onStart?.();\n }\n this.t = time;\n this.render(time);\n this.opts.onUpdate?.();\n if (time >= this.end && !this.completed) {\n this.completed = true;\n this.pause();\n this.opts.onComplete?.();\n }\n }\n\n private tick(now: number): void {\n this.raf = 0;\n if (this.paused || this.dead) return;\n let dt = (now - this.last) / 1000;\n this.last = now;\n // Lag smoothing: a stalled or backgrounded tab resumes instead of jumping ahead.\n if (dt > 0.25) dt = 1 / 60;\n this.goto(this.t + dt * this.ts);\n if (!this.paused && !this.dead) this.raf = requestAnimationFrame(this.tick);\n }\n}\n","/** Walks a DOM subtree and turns it into an ordered list of build tasks. */\n\nexport type StyledElement = Element & ElementCSSInlineStyle;\nexport type TaskKind = 'box' | 'text' | 'media' | 'block';\n\nexport interface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface Task {\n id: number;\n el: StyledElement;\n kind: TaskKind;\n /** Whether the element paints a surface (fill, border, shadow) that gets drawn first. */\n hasBox: boolean;\n /** Position relative to the overlay layer. */\n rect: Rect;\n /** Index of the nearest ancestor task, or -1. Children wait for their parent. */\n parent: number;\n label: string;\n area: number;\n}\n\nconst SKIP_TAGS = new Set(['SCRIPT', 'STYLE', 'TEMPLATE', 'NOSCRIPT', 'LINK', 'META', 'HEAD', 'TITLE', 'BR', 'WBR', 'SOURCE', 'TRACK']);\nconst MEDIA_TAGS = new Set(['IMG', 'SVG', 'svg', 'VIDEO', 'CANVAS', 'PICTURE', 'IFRAME', 'OBJECT', 'EMBED']);\nconst CONTROL_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT', 'PROGRESS', 'METER']);\n\n/** Only a zero *alpha* counts: rgba(r, g, b, 0) or modern `… / 0` syntax. rgb(255, 0, 0) is red, not transparent. */\nconst isTransparent = (c: string | null | undefined): boolean =>\n !c ||\n c === 'transparent' ||\n /^rgba?\\([^,)]+,[^,)]+,[^,)]+,\\s*0*\\.?0*%?\\s*\\)$/.test(c) ||\n /\\/\\s*0*\\.?0*%?\\s*\\)$/.test(c);\n\nfunction paintsSurface(cs: CSSStyleDeclaration): boolean {\n if (!isTransparent(cs.backgroundColor)) return true;\n if (cs.backgroundImage && cs.backgroundImage !== 'none') return true;\n if (cs.boxShadow && cs.boxShadow !== 'none') return true;\n for (const side of ['Top', 'Right', 'Bottom', 'Left'] as const) {\n const width = parseFloat(cs[`border${side}Width`]);\n const style = cs[`border${side}Style`];\n if (width > 0 && style !== 'none' && style !== 'hidden' && !isTransparent(cs[`border${side}Color`])) return true;\n }\n return false;\n}\n\nfunction hasOwnText(el: Element): boolean {\n for (const node of Array.from(el.childNodes)) {\n if (node.nodeType === 3 && node.nodeValue && node.nodeValue.trim()) return true;\n }\n return false;\n}\n\n/** True when every descendant is inline, so the element can be typed as one text run. */\nfunction onlyInlineDescendants(el: Element): boolean {\n for (const child of Array.from(el.children)) {\n if (child.tagName === 'BR') continue;\n if (MEDIA_TAGS.has(child.tagName) || CONTROL_TAGS.has(child.tagName)) return false;\n if (getComputedStyle(child).display !== 'inline' || !onlyInlineDescendants(child)) return false;\n }\n return true;\n}\n\nfunction isInlineTextBlock(el: Element): boolean {\n if (!el.textContent || !el.textContent.trim()) return false;\n for (const child of Array.from(el.children)) {\n if (SKIP_TAGS.has(child.tagName)) continue;\n if (MEDIA_TAGS.has(child.tagName) || CONTROL_TAGS.has(child.tagName)) return false;\n const display = getComputedStyle(child).display;\n if ((display !== 'inline' && display !== 'contents') || !onlyInlineDescendants(child)) return false;\n }\n return true;\n}\n\nfunction labelFor(el: Element, kind: TaskKind): string {\n if (kind === 'text') {\n const text = (el.textContent || '').replace(/\\s+/g, ' ').trim();\n return `“${text.length > 18 ? text.slice(0, 17) + '…' : text}”`;\n }\n const tag = el.tagName.toLowerCase();\n if (kind === 'media') return tag === 'img' || tag === 'picture' ? 'image' : tag;\n const cls = (el.getAttribute('class') || '').trim().split(/\\s+/)[0];\n return cls ? `${tag}.${cls.slice(0, 16)}` : tag;\n}\n\nexport function collectTasks(root: Element, origin: DOMRect, maxTasks: number): Task[] {\n const tasks: Task[] = [];\n\n const add = (el: Element, kind: TaskKind, hasBox: boolean, parent: number): number => {\n const r = el.getBoundingClientRect();\n const rect = { x: r.left - origin.left, y: r.top - origin.top, w: r.width, h: r.height };\n tasks.push({ id: tasks.length, el: el as StyledElement, kind, hasBox, rect, parent, label: labelFor(el, kind), area: rect.w * rect.h });\n return tasks.length - 1;\n };\n\n const walk = (el: Element, parent: number, isRoot: boolean): void => {\n if (SKIP_TAGS.has(el.tagName)) return;\n const mode = el.getAttribute('data-assemble');\n if (mode === 'skip') return;\n const cs = getComputedStyle(el);\n if (cs.display === 'none') return;\n\n const r = el.getBoundingClientRect();\n const visible = r.width >= 2 && r.height >= 2;\n const tag = el.tagName;\n\n if (visible && !(isRoot && (tag === 'BODY' || tag === 'HTML'))) {\n if (mode === 'block') return void add(el, 'block', false, parent);\n if (MEDIA_TAGS.has(tag)) return void add(el, 'media', false, parent);\n if (CONTROL_TAGS.has(tag)) return void add(el, 'box', true, parent);\n const box = paintsSurface(cs);\n if (hasOwnText(el) || isInlineTextBlock(el)) return void add(el, 'text', box, parent);\n if (box) parent = add(el, 'box', true, parent);\n }\n for (const child of Array.from(el.children)) walk(child, parent, false);\n };\n\n walk(root, -1, true);\n if (tasks.length <= maxTasks) return tasks;\n\n // Too many tasks: drop the smallest nested ones and re-parent their children.\n const dropped = new Set<number>();\n for (const t of tasks.filter((t) => t.parent !== -1).sort((a, b) => a.area - b.area)) {\n if (tasks.length - dropped.size <= maxTasks) break;\n dropped.add(t.id);\n }\n const keptAncestor = (p: number): number => {\n while (p !== -1 && dropped.has(p)) p = tasks[p].parent;\n return p;\n };\n const kept = tasks.filter((t) => !dropped.has(t.id));\n const newIndex = new Map<number, number>();\n kept.forEach((t, i) => newIndex.set(t.id, i));\n for (const t of kept) {\n const p = keptAncestor(t.parent);\n t.parent = p === -1 ? -1 : newIndex.get(p)!;\n }\n kept.forEach((t, i) => (t.id = i));\n return kept;\n}\n","/** Splits an element's text into hidden spans that can be revealed one by one. */\n\nexport type TypingMode = 'auto' | 'char' | 'word';\n\nexport interface TextSplit {\n chunks: HTMLSpanElement[];\n /** Puts the original text nodes back. Safe to call more than once. */\n restore(): void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst Segmenter = typeof Intl !== 'undefined' ? (Intl as any).Segmenter : undefined;\nconst segmenter = Segmenter ? new Segmenter(undefined, { granularity: 'grapheme' }) : null;\nconst graphemes = (s: string): string[] =>\n segmenter ? Array.from(segmenter.segment(s) as Iterable<{ segment: string }>, (x) => x.segment) : Array.from(s);\n\n/** Text longer than this many characters is typed word by word in `auto` mode. */\nconst WORD_THRESHOLD = 160;\n\nexport function splitText(el: Element, mode: TypingMode): TextSplit {\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, {\n acceptNode(node) {\n const parent = node.parentElement;\n if (!parent || parent.closest('script,style,svg,textarea')) return NodeFilter.FILTER_REJECT;\n return node.nodeValue ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n });\n const nodes: Text[] = [];\n while (walker.nextNode()) nodes.push(walker.currentNode as Text);\n\n const length = nodes.reduce((n, t) => n + (t.nodeValue || '').trim().length, 0);\n const byWord = mode === 'word' || (mode === 'auto' && length > WORD_THRESHOLD);\n\n const chunks: HTMLSpanElement[] = [];\n const replaced: { original: Text; created: Node[] }[] = [];\n\n for (const node of nodes) {\n const value = node.nodeValue || '';\n if (!value.trim()) continue;\n const pieces = byWord ? value.match(/\\s+|\\S+/g) || [] : graphemes(value);\n const fragment = document.createDocumentFragment();\n const created: Node[] = [];\n for (const piece of pieces) {\n let out: Node;\n if (!piece.trim()) {\n out = document.createTextNode(piece);\n } else {\n const span = document.createElement('span');\n span.textContent = piece;\n span.style.visibility = 'hidden';\n span.setAttribute('data-cc-chunk', '');\n chunks.push(span);\n out = span;\n }\n fragment.appendChild(out);\n created.push(out);\n }\n // In a flex or grid container every child is its own item, which would drop the\n // spaces and shift the layout. One wrapper keeps the text a single item, as it was.\n if (/flex|grid/.test(getComputedStyle(node.parentElement!).display)) {\n const item = document.createElement('span');\n item.appendChild(fragment);\n fragment.appendChild(item);\n created.splice(0, created.length, item);\n }\n node.parentNode!.insertBefore(fragment, node);\n node.parentNode!.removeChild(node);\n replaced.push({ original: node, created });\n }\n\n let restored = false;\n return {\n chunks,\n restore() {\n if (restored) return;\n restored = true;\n for (const { original, created } of replaced) {\n const first = created[0];\n if (first && first.parentNode) first.parentNode.insertBefore(original, first);\n for (const n of created) n.parentNode?.removeChild(n);\n }\n },\n };\n}\n","/** The overlay layer: cursors, draw boxes and carets, plus their stylesheet. */\n\nexport interface AgentConfig {\n name: string;\n color: string;\n}\n\nexport interface Agent {\n el: HTMLDivElement;\n tag: HTMLDivElement;\n caret: HTMLDivElement;\n config: AgentConfig;\n}\n\nexport const DEFAULT_AGENTS: readonly AgentConfig[] = [\n { name: 'Atlas', color: '#6d5efc' },\n { name: 'Nova', color: '#f2547d' },\n { name: 'Echo', color: '#12a8a0' },\n { name: 'Pixel', color: '#f08a24' },\n { name: 'Orbit', color: '#2f80ed' },\n { name: 'Juno', color: '#9b51e0' },\n { name: 'Sol', color: '#d4a20b' },\n { name: 'Kai', color: '#27ae60' },\n];\n\nexport function resolveAgents(agents: number | readonly AgentConfig[] | undefined): AgentConfig[] {\n if (Array.isArray(agents) && agents.length) return agents.slice();\n const count = Math.min(24, Math.max(1, typeof agents === 'number' ? Math.round(agents) : 5));\n return Array.from({ length: count }, (_, i) => {\n const base = DEFAULT_AGENTS[i % DEFAULT_AGENTS.length];\n return i < DEFAULT_AGENTS.length ? { ...base } : { name: `${base.name} ${Math.floor(i / DEFAULT_AGENTS.length) + 1}`, color: base.color };\n });\n}\n\nconst STYLE_ID = 'cursorcrew-css';\n\nconst CSS = `\n[data-assemble-pending]{visibility:hidden}\n.cc-layer{position:absolute;left:0;top:0;overflow:hidden;pointer-events:none}\n.cc-layer *{box-sizing:border-box}\n.cc-agent{position:absolute;left:0;top:0;width:0;height:0;will-change:transform;z-index:3}\n.cc-ic{position:absolute;display:none;overflow:visible;filter:drop-shadow(0 1px 2px rgba(0,0,0,.25))}\n.cc-agent[data-mode=arrow] .cc-arrow,.cc-agent[data-mode=cross] .cc-cross,.cc-agent[data-mode=beam] .cc-beam{display:block}\n.cc-arrow{left:-1px;top:-1px;width:18px;height:22px}\n.cc-cross{left:-9px;top:-9px;width:18px;height:18px}\n.cc-beam{left:-5px;top:-10px;width:10px;height:20px}\n.cc-tag{position:absolute;left:14px;top:18px;display:flex;align-items:center;gap:6px;white-space:nowrap;\n font:600 11px/1 ui-sans-serif,system-ui,-apple-system,\"Segoe UI\",sans-serif;color:#fff;background:var(--c);\n padding:4px 7px;border-radius:2px 8px 8px 8px;box-shadow:0 2px 6px rgba(0,0,0,.18);letter-spacing:.01em}\n.cc-tag::after{content:attr(data-action);font-weight:500;opacity:.82;max-width:180px;overflow:hidden;text-overflow:ellipsis}\n.cc-tag[data-action=\"\"]::after{display:none}\n.cc-noactions .cc-tag::after{display:none}\n.cc-nolabels .cc-tag{display:none}\n.cc-draw{position:absolute;left:0;top:0;width:0;height:0;visibility:hidden;opacity:0;z-index:1;\n border:1.5px solid var(--c);background:color-mix(in srgb,var(--c) 7%,transparent)}\n.cc-draw[data-kind=text]{border-style:dashed;background:none}\n.cc-draw[data-kind=media],.cc-draw[data-kind=block]{background:repeating-linear-gradient(135deg,\n color-mix(in srgb,var(--c) 14%,transparent) 0 6px,color-mix(in srgb,var(--c) 4%,transparent) 6px 12px)}\n.cc-dim{position:absolute;left:50%;top:100%;transform:translate(-50%,5px);font:600 10px/1 ui-monospace,SFMono-Regular,Menlo,monospace;\n color:#fff;background:var(--c);padding:3px 5px;border-radius:3px;white-space:nowrap}\n.cc-caret{position:absolute;left:0;top:0;width:2px;visibility:hidden;opacity:0;z-index:2;background:var(--c)}\n`;\n\nexport function injectStyles(): void {\n if (document.getElementById(STYLE_ID)) return;\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = CSS;\n document.head.appendChild(style);\n}\n\n/** A full-document, click-through layer the crew draws on. */\nexport function createLayer(zIndex: number, labels: boolean, actions: boolean): HTMLDivElement {\n const layer = document.createElement('div');\n layer.className = 'cc-layer' + (labels ? '' : ' cc-nolabels') + (actions ? '' : ' cc-noactions');\n layer.setAttribute('aria-hidden', 'true');\n const doc = document.documentElement;\n layer.style.width = Math.max(doc.scrollWidth, document.body.scrollWidth) + 'px';\n layer.style.height = Math.max(doc.scrollHeight, document.body.scrollHeight) + 'px';\n layer.style.zIndex = String(zIndex);\n document.body.appendChild(layer);\n return layer;\n}\n\nconst ICONS =\n '<svg class=\"cc-ic cc-arrow\" viewBox=\"0 0 18 22\"><path d=\"M1.5 1.5v16.2l4.3-4.1 2.9 6.6 2.7-1.2-2.9-6.5h6z\" fill=\"var(--c)\" stroke=\"#fff\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/></svg>' +\n '<svg class=\"cc-ic cc-cross\" viewBox=\"0 0 18 18\"><path d=\"M9 1v16M1 9h16\" stroke=\"#fff\" stroke-width=\"3.5\" stroke-linecap=\"round\"/><path d=\"M9 1v16M1 9h16\" stroke=\"var(--c)\" stroke-width=\"1.6\" stroke-linecap=\"round\"/></svg>' +\n '<svg class=\"cc-ic cc-beam\" viewBox=\"0 0 10 20\"><path d=\"M2 1.5h6M5 1.5v17M2 18.5h6\" stroke=\"#fff\" stroke-width=\"3.5\" stroke-linecap=\"round\"/><path d=\"M2 1.5h6M5 1.5v17M2 18.5h6\" stroke=\"var(--c)\" stroke-width=\"1.6\" stroke-linecap=\"round\"/></svg>';\n\nexport function createAgent(layer: HTMLElement, config: AgentConfig): Agent {\n const el = document.createElement('div');\n el.className = 'cc-agent';\n el.dataset.mode = 'arrow';\n el.style.setProperty('--c', config.color);\n el.innerHTML = ICONS;\n\n const tag = document.createElement('div');\n tag.className = 'cc-tag';\n tag.textContent = config.name;\n tag.setAttribute('data-action', '');\n el.appendChild(tag);\n\n const caret = document.createElement('div');\n caret.className = 'cc-caret';\n caret.style.setProperty('--c', config.color);\n\n layer.appendChild(el);\n layer.appendChild(caret);\n return { el, tag, caret, config };\n}\n\nexport function createDrawBox(layer: HTMLElement, kind: string, color: string, withSize: boolean) {\n const box = document.createElement('div');\n box.className = 'cc-draw';\n box.dataset.kind = kind;\n box.style.setProperty('--c', color);\n let size: HTMLDivElement | null = null;\n if (withSize) {\n size = document.createElement('div');\n size.className = 'cc-dim';\n box.appendChild(size);\n }\n layer.appendChild(box);\n return { box, size };\n}\n","import { Timeline, set, type TweenVars } from './timeline';\nimport { collectTasks, type StyledElement, type Task, type TaskKind } from './scan';\nimport { splitText, type TextSplit, type TypingMode } from './text';\nimport { createAgent, createDrawBox, createLayer, injectStyles, resolveAgents, type AgentConfig } from './overlay';\n\nexport interface AssembleOptions {\n /** How many agents, or a list of names and colors. Default 5 (max 24). */\n agents?: number | readonly AgentConfig[];\n /** Fit the whole build into this many seconds. Omit or 0 for the natural length. */\n duration?: number;\n /** Playback speed when `duration` is not set. Default 1. */\n speed?: number;\n /** `immediate` plays right away; `viewport` waits until the target scrolls into view. */\n trigger?: 'immediate' | 'viewport';\n /** Start automatically. Default true. */\n autoplay?: boolean;\n /** How text is typed. `auto` types short text by letter and long text by word. */\n typing?: TypingMode;\n /** Upper bound on animated pieces; the smallest nested ones are merged into their parent. Default 250. */\n maxTasks?: number;\n /** Remove the overlay and restore inline styles when done. Default true. */\n cleanup?: boolean;\n /** z-index of the overlay layer. */\n zIndex?: number;\n /** Show agent name tags. Default true. */\n labels?: boolean;\n /** Show what each agent is doing next to its name. Default true. */\n actions?: boolean;\n /** `respect` skips the animation when the user prefers reduced motion. Default `respect`. */\n reducedMotion?: 'respect' | 'ignore';\n onStart?: () => void;\n /** Called every frame with progress from 0 to 1. */\n onProgress?: (progress: number) => void;\n onComplete?: () => void;\n}\n\nexport interface Crew {\n /** The underlying timeline (play, pause, progress, timeScale…). */\n readonly timeline: Timeline;\n /** Resolves when the build finishes or the crew is destroyed. */\n readonly finished: Promise<void>;\n play(): void;\n pause(): void;\n /** Jump to the end, revealing everything. */\n finish(): void;\n /** Reset the target and build it again. */\n replay(): void;\n /** Stop and restore the target as it was. */\n destroy(): void;\n}\n\ntype Resolved = Required<Omit<AssembleOptions, 'onStart' | 'onProgress' | 'onComplete' | 'duration'>> &\n Pick<AssembleOptions, 'onStart' | 'onProgress' | 'onComplete' | 'duration'>;\n\ninterface Point {\n x: number;\n y: number;\n}\ninterface LinePoint extends Point {\n h: number;\n}\n\nconst clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));\nconst distance = (a: Point, b: Point) => Math.hypot(a.x - b.x, a.y - b.y);\n\n/** Timing model, in seconds. */\nconst TIMING = {\n travel: (px: number) => clamp(0.22 + px / 1700, 0.28, 0.85),\n draw: (area: number) => clamp(0.32 + Math.sqrt(area) / 1500, 0.38, 0.95),\n frame: (area: number) => clamp(0.18 + Math.sqrt(area) / 2600, 0.2, 0.45),\n fade: 0.3,\n sweep: 0.6,\n perChar: 0.028,\n perWord: 0.075,\n typeMax: 1.7,\n gap: 0.06,\n};\n\nconst RESTORED_PROPS = ['visibility', 'opacity', 'clip-path', '-webkit-clip-path'];\nconst MOVE_EASE = 'power2.inOut';\nconst LATE = { immediateRender: false } as const;\n\ninterface Build {\n tl: Timeline;\n finished: Promise<void>;\n teardown(): void;\n}\n\nfunction build(root: StyledElement, o: Resolved): Build {\n injectStyles();\n\n // Remember inline styles we are about to touch so teardown restores them exactly.\n const saved = new Map<StyledElement, { hadStyle: boolean; props: Record<string, [string, string]> }>();\n const remember = (el: StyledElement) => {\n if (saved.has(el)) return;\n const props: Record<string, [string, string]> = {};\n for (const p of RESTORED_PROPS) props[p] = [el.style.getPropertyValue(p), el.style.getPropertyPriority(p)];\n saved.set(el, { hadStyle: el.hasAttribute('style'), props });\n };\n\n const layer = createLayer(o.zIndex, o.labels, o.actions);\n const origin = layer.getBoundingClientRect();\n const tasks = collectTasks(root, origin, o.maxTasks);\n const finalOpacity = tasks.map((t) => parseFloat(getComputedStyle(t.el).opacity) || 1);\n\n remember(root);\n root.style.visibility = 'hidden';\n root.removeAttribute('data-assemble-pending');\n const splits: (TextSplit | null)[] = tasks.map((t) => {\n remember(t.el);\n t.el.style.visibility = 'hidden';\n return t.kind === 'text' ? splitText(t.el, o.typing) : null;\n });\n\n const agents = resolveAgents(o.agents).map((cfg) => createAgent(layer, cfg));\n\n // Agents spawn near the top of the target's visible part.\n const r = root.getBoundingClientRect();\n const top = clamp(r.top, 0, innerHeight);\n const bottom = clamp(r.bottom, 0, innerHeight);\n const left = clamp(r.left, 0, innerWidth);\n const right = clamp(r.right, 0, innerWidth);\n const spawn = { x: (left + right) / 2 - origin.left, y: top + Math.min(120, (bottom - top) * 0.25) - origin.top };\n\n let resolveFinished!: () => void;\n const finished = new Promise<void>((res) => (resolveFinished = res));\n let tornDown = false;\n const teardown = () => {\n if (tornDown) return;\n tornDown = true;\n tl.kill();\n for (const s of splits) s?.restore();\n saved.forEach((entry, el) => {\n for (const p of RESTORED_PROPS) {\n const [value, priority] = entry.props[p];\n if (value) el.style.setProperty(p, value, priority);\n else el.style.removeProperty(p);\n }\n if (!entry.hadStyle && !el.getAttribute('style')) el.removeAttribute('style');\n });\n layer.remove();\n resolveFinished();\n };\n\n const tl: Timeline = new Timeline({\n paused: true,\n onStart: () => o.onStart?.(),\n onUpdate: () => o.onProgress?.(tl.progress()),\n onComplete: () => {\n if (o.cleanup) teardown();\n else resolveFinished();\n o.onComplete?.();\n },\n });\n\n // Per-agent scheduling state.\n const state = agents.map((a, n) => {\n const offset = (n - (agents.length - 1) / 2) * 34;\n const pos = { x: spawn.x + offset, y: spawn.y + (n % 2) * 18 };\n tl.fromTo(a.el, { x: pos.x, y: pos.y, scale: 0, autoAlpha: 0 }, { scale: 1, autoAlpha: 1, duration: 0.42, ease: 'back.out(2)' }, n * 0.07);\n return { pos, free: 0.45 + n * 0.07, last: 0 };\n });\n\n const say = (i: number, text: string, at: number) => tl.set(agents[i].tag, { attr: { 'data-action': text } }, at);\n const cursor = (i: number, mode: 'arrow' | 'cross' | 'beam', at: number) => tl.set(agents[i].el, { attr: { 'data-mode': mode } }, at);\n\n const move = (i: number, to: Point, at: number, dur: number) => {\n const from = state[i].pos;\n tl.fromTo(agents[i].el, { x: from.x, y: from.y }, { x: to.x, y: to.y, duration: dur, ease: MOVE_EASE, ...LATE }, at);\n state[i].pos = { ...to };\n };\n\n /** Drag out a box from the task's top-left to bottom-right, with the cursor following. */\n const drag = (i: number, task: Task, kind: TaskKind, at: number, dur: number, showSize: boolean) => {\n const { box, size } = createDrawBox(layer, kind, agents[i].config.color, showSize);\n const { x, y, w, h } = task.rect;\n set(box, { x, y });\n tl.set(box, { autoAlpha: 1 }, at);\n const vars: TweenVars = { width: w, height: h, duration: dur, ease: MOVE_EASE, ...LATE };\n if (size) {\n vars.onUpdate = () => {\n // Read back the value we just wrote (not offsetWidth) to avoid a forced layout per frame.\n size.textContent = `${Math.round(parseFloat(box.style.width) || 0)} × ${Math.round(parseFloat(box.style.height) || 0)}`;\n };\n }\n tl.fromTo(box, { width: 0, height: 0 }, vars, at);\n move(i, { x: x + w, y: y + h }, at, dur);\n return box;\n };\n\n const fadeIn = (task: Task, at: number) => {\n tl.set(task.el, { visibility: 'visible' }, at);\n tl.fromTo(task.el, { opacity: 0 }, { opacity: finalOpacity[task.id], duration: TIMING.fade, ease: 'power1.out', ...LATE }, at);\n };\n\n /** Schedules one task for agent `i` starting at `at`; returns when the agent is free. */\n const perform = (i: number, task: Task, at: number): number => {\n let t = at;\n\n if (task.kind === 'media' || task.kind === 'block') {\n say(i, `placing ${task.label}`, t);\n cursor(i, 'cross', t);\n const dur = TIMING.draw(task.area);\n const box = drag(i, task, task.kind, t, dur, true);\n t += dur;\n tl.set(task.el, { visibility: 'visible' }, t);\n tl.fromTo(task.el, { clipPath: 'inset(0% 0% 100% 0%)' }, { clipPath: 'inset(0% 0% 0% 0%)', duration: TIMING.sweep, ease: 'power2.out', ...LATE }, t);\n tl.to(box, { autoAlpha: 0, duration: TIMING.sweep, ...LATE }, t);\n cursor(i, 'arrow', t);\n return t + TIMING.sweep * 0.6;\n }\n\n let frame: HTMLElement | null = null;\n if (task.hasBox) {\n say(i, `drawing ${task.kind === 'text' ? task.el.tagName.toLowerCase() : task.label}`, t);\n cursor(i, 'cross', t);\n const dur = TIMING.draw(task.area);\n frame = drag(i, task, 'box', t, dur, true);\n t += dur;\n fadeIn(task, t);\n tl.to(frame, { autoAlpha: 0, duration: TIMING.fade, ...LATE }, t);\n cursor(i, 'arrow', t);\n if (task.kind === 'box') return t + TIMING.fade * 0.5;\n t += TIMING.fade * 0.6;\n }\n\n const chunks = splits[task.id]!.chunks;\n if (!frame) {\n say(i, 'text box', t);\n cursor(i, 'cross', t);\n const dur = TIMING.frame(task.area);\n frame = drag(i, task, 'text', t, dur, false);\n t += dur;\n tl.set(task.el, { visibility: 'visible' }, t);\n }\n if (!chunks.length) return t;\n\n // Measure where the caret sits after each chunk (chunks are hidden, but laid out).\n const ends: LinePoint[] = chunks.map((c) => {\n const b = c.getBoundingClientRect();\n return { x: b.right - origin.left, y: b.top - origin.top, h: b.height };\n });\n const f = chunks[0].getBoundingClientRect();\n const start: LinePoint = { x: f.left - origin.left, y: f.top - origin.top, h: f.height };\n const handle = (p: LinePoint): Point => ({ x: p.x + 9, y: p.y + p.h * 0.55 });\n\n const wordy = chunks.some((c) => /\\S\\s*\\S/.test(c.textContent || ''));\n const typeDur = clamp(chunks.length * (wordy ? TIMING.perWord : TIMING.perChar), 0.2, TIMING.typeMax);\n const reach = 0.22;\n\n move(i, handle(start), t, reach);\n cursor(i, 'beam', t + reach * 0.5);\n t += reach;\n say(i, `typing ${task.label}`, t);\n\n const caret = agents[i].caret;\n tl.set(caret, { x: start.x, y: start.y, height: start.h, autoAlpha: 1 }, t);\n\n const counter = { n: 0 };\n let shown = 0;\n const total = chunks.length;\n tl.fromTo(\n counter,\n { n: 0 },\n {\n n: total,\n duration: typeDur,\n ease: 'none',\n ...LATE,\n onUpdate: () => {\n const k = Math.min(total, Math.round(counter.n));\n if (k > shown) for (let j = shown; j < k; j++) chunks[j].style.visibility = '';\n else for (let j = k; j < shown; j++) chunks[j].style.visibility = 'hidden';\n shown = k;\n const p = k === 0 ? start : ends[k - 1];\n set(caret, { x: p.x, y: p.y, height: p.h });\n set(agents[i].el, handle(p));\n },\n },\n t,\n );\n t += typeDur;\n state[i].pos = handle(ends[total - 1]);\n tl.set(caret, { autoAlpha: 0 }, t + 0.12);\n tl.to(frame, { autoAlpha: 0, duration: 0.25, ...LATE }, t);\n cursor(i, 'arrow', t + 0.12);\n return t + 0.08;\n };\n\n // Greedy scheduler: the earliest-free agent takes the reachable task it can start soonest,\n // looking at the next 10 tasks in reading order. Children wait for their parent.\n const queue = tasks\n .slice()\n .sort((a, b) => Math.round(a.rect.y / 24) - Math.round(b.rect.y / 24) || a.rect.x - b.rect.x || a.id - b.id);\n const doneAt = new Array<number>(tasks.length).fill(-1);\n\n while (queue.length) {\n let i = 0;\n for (let k = 1; k < state.length; k++) if (state[k].free < state[i].free) i = k;\n const st = state[i];\n\n let best = -1;\n let bestScore = Infinity;\n let bestStart = 0;\n let bestTravel = 0;\n let considered = 0;\n for (let j = 0; j < queue.length && considered < 10; j++) {\n const task = queue[j];\n if (task.parent !== -1 && doneAt[task.parent] < 0) continue;\n const travel = TIMING.travel(distance(st.pos, task.rect));\n const start = Math.max(st.free + travel, task.parent === -1 ? 0 : doneAt[task.parent] + 0.05);\n const score = start + considered * 0.04;\n if (score < bestScore) {\n bestScore = score;\n best = j;\n bestStart = start;\n bestTravel = travel;\n }\n considered++;\n }\n if (best < 0) {\n best = 0;\n bestTravel = TIMING.travel(distance(st.pos, queue[0].rect));\n bestStart = st.free + bestTravel;\n }\n\n const task = queue.splice(best, 1)[0];\n say(i, `→ ${task.label}`, bestStart - bestTravel);\n move(i, { x: task.rect.x, y: task.rect.y }, bestStart - bestTravel, bestTravel);\n doneAt[task.id] = perform(i, task, bestStart);\n st.free = doneAt[task.id] + TIMING.gap;\n st.last = doneAt[task.id];\n }\n\n // Wrap up: each agent reports done, then the crew floats away.\n const end = Math.max(0.5, ...doneAt);\n agents.forEach((a, n) => {\n say(n, 'done ✓', state[n].last + 0.05);\n cursor(n, 'arrow', state[n].last + 0.05);\n tl.to(a.el, { autoAlpha: 0, scale: 0.6, y: '-=14', duration: 0.35, ease: 'power2.in', ...LATE }, end + 0.35 + n * 0.05);\n });\n\n if (o.duration && o.duration > 0) tl.timeScale(tl.duration() / o.duration);\n else tl.timeScale(o.speed || 1);\n\n return { tl, finished, teardown };\n}\n\nconst noop = () => {};\n\n/**\n * Blank `target`, then let a crew of cursors rebuild it: drawing boxes, typing text and\n * placing media until the real content is back.\n */\nexport function assemble(target: string | Element, options: AssembleOptions = {}): Crew {\n const root = (typeof target === 'string' ? document.querySelector(target) : target) as StyledElement | null;\n if (!root) throw new Error(`cursorcrew: target not found (${String(target)})`);\n\n const o: Resolved = {\n agents: 5,\n speed: 1,\n typing: 'auto',\n maxTasks: 250,\n cleanup: true,\n zIndex: 2147483000,\n labels: true,\n actions: true,\n autoplay: true,\n trigger: 'immediate',\n reducedMotion: 'respect',\n ...options,\n };\n\n if (o.reducedMotion === 'respect' && typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches) {\n root.removeAttribute('data-assemble-pending');\n if (o.onComplete) queueMicrotask(o.onComplete);\n return {\n timeline: new Timeline({ paused: true }),\n finished: Promise.resolve(),\n play: noop,\n pause: noop,\n finish: noop,\n replay: noop,\n destroy: noop,\n };\n }\n\n let current = build(root, o);\n let observer: IntersectionObserver | null = null;\n const stopWatching = () => {\n observer?.disconnect();\n observer = null;\n };\n\n if (o.autoplay) {\n if (o.trigger === 'viewport' && root !== document.body && typeof IntersectionObserver !== 'undefined') {\n observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((e) => e.isIntersecting)) {\n stopWatching();\n current.tl.play();\n }\n },\n { threshold: 0.15 },\n );\n observer.observe(root);\n } else {\n current.tl.play();\n }\n }\n\n return {\n get timeline() {\n return current.tl;\n },\n get finished() {\n return current.finished;\n },\n play: () => void current.tl.play(),\n pause: () => void current.tl.pause(),\n finish() {\n stopWatching();\n current.tl.progress(1);\n },\n replay() {\n stopWatching();\n current.teardown();\n current = build(root, o);\n current.tl.play();\n },\n destroy() {\n stopWatching();\n current.teardown();\n },\n };\n}\n"],"mappings":"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","names":["src_exports","__export","DEFAULT_AGENTS","Timeline","assemble","EASES","t","getEase","name","m","c1","c3","RESERVED","TRANSFORM","transforms","transformOf","el","isElement","o","read","target","prop","cs","v","set","values","props","k","s","p","val","NUMBER","interpolator","from","to","a","b","e","bn","an","parts","out","i","Timeline","opts","vars","position","value","tween","time","c","attr","f","now","dt","SKIP_TAGS","MEDIA_TAGS","CONTROL_TAGS","isTransparent","c","paintsSurface","cs","side","width","style","hasOwnText","el","node","onlyInlineDescendants","child","isInlineTextBlock","display","labelFor","kind","text","tag","cls","collectTasks","root","origin","maxTasks","tasks","add","hasBox","parent","r","rect","walk","isRoot","mode","visible","box","dropped","t","a","b","keptAncestor","p","kept","newIndex","i","Segmenter","segmenter","graphemes","s","x","WORD_THRESHOLD","splitText","el","mode","walker","node","parent","nodes","length","n","t","byWord","chunks","replaced","value","pieces","fragment","created","piece","out","span","item","restored","original","first","DEFAULT_AGENTS","resolveAgents","agents","count","_","i","base","STYLE_ID","CSS","injectStyles","style","createLayer","zIndex","labels","actions","layer","doc","ICONS","createAgent","config","el","tag","caret","createDrawBox","kind","color","withSize","box","size","clamp","v","lo","hi","distance","a","b","TIMING","px","area","RESTORED_PROPS","MOVE_EASE","LATE","build","root","o","injectStyles","saved","remember","el","props","p","layer","createLayer","origin","tasks","collectTasks","finalOpacity","t","splits","splitText","agents","resolveAgents","cfg","createAgent","r","top","bottom","left","right","spawn","resolveFinished","finished","res","tornDown","teardown","tl","entry","value","priority","Timeline","state","n","offset","pos","say","i","text","at","cursor","mode","move","to","dur","from","drag","task","kind","showSize","box","size","createDrawBox","x","y","w","h","set","vars","fadeIn","perform","frame","chunks","ends","c","f","start","handle","wordy","typeDur","reach","caret","counter","shown","total","k","j","queue","doneAt","st","best","bestScore","bestStart","bestTravel","considered","travel","score","end","noop","assemble","target","options","current","observer","stopWatching","entries","e"]}