Files
ditto.site/.opencode/scripts/init-hooks/lottie-dump.js
T
2026-06-29 15:11:48 -07:00

48 lines
1.6 KiB
JavaScript

// Pulls registered Lottie animations + their animationData into window.__CLONE_CAPTURE__.lottie.
// Called from __CLONE_FINALIZE__. Supports lottie-web directly; lottie-react uses lottie-web internally.
(() => {
function cssPath(el) {
if (!el || el.nodeType !== 1) return null;
if (el.id) return `#${el.id}`;
const parts = [];
while (el && el.nodeType === 1 && parts.length < 10) {
let s = el.tagName.toLowerCase();
const p = el.parentNode;
if (p) {
const sibs = Array.from(p.children).filter((c) => c.tagName === el.tagName);
if (sibs.length > 1) s += `:nth-of-type(${sibs.indexOf(el) + 1})`;
}
parts.unshift(s);
el = el.parentNode;
}
return parts.join(' > ');
}
const prevFinalize = window.__CLONE_FINALIZE__;
window.__CLONE_FINALIZE__ = function () {
if (prevFinalize)
try {
prevFinalize();
} catch {}
try {
const lottie = window.lottie || window.bodymovin;
if (!lottie || typeof lottie.getRegisteredAnimations !== 'function') return;
const anims = lottie.getRegisteredAnimations();
for (const a of anims) {
try {
window.__CLONE_CAPTURE__.lottie.push({
selector: a.wrapper instanceof Element ? cssPath(a.wrapper) : null,
renderer: a.renderer?.name || 'unknown',
animationData: a.animationData ? JSON.parse(JSON.stringify(a.animationData)) : null,
loop: a.loop,
autoplay: a.autoplay,
name: a.name,
});
} catch {}
}
} catch (e) {
window.__CLONE_CAPTURE__.lottie.push({ error: String(e) });
}
};
})();