{"_id":"@angelardanaz/air","_rev":"7-7e00be323e25f858c4c90b3ba6c59243","name":"@angelardanaz/air","dist-tags":{"latest":"1.1.1"},"versions":{"1.0.0":{"name":"@angelardanaz/air","version":"1.0.0","keywords":[],"author":"","license":"ISC","_id":"@angelardanaz/air@1.0.0","maintainers":[{"name":"angelardanaz","email":"angelardanaz2@gmail.com"}],"homepage":"https://github.com/ardanazangel/air#readme","bugs":{"url":"https://github.com/ardanazangel/air/issues"},"dist":{"shasum":"f507797e9648c48a02ee3a4500f35dde5c1f15cb","tarball":"https://registry.npmjs.org/@angelardanaz/air/-/air-1.0.0.tgz","fileCount":2,"integrity":"sha512-HT7/dSjimW9cpeu9wvXGVK3/tqerTRxj2wt7CtqEBdKoU58RdPR8+6MSNlHHT7E967dojbz7XYzFpRxqJKWYig==","signatures":[{"sig":"MEUCIFwlX5/bFBrfazs6+ubvhCcjZJ4HAmGFuUgKmxT7XOiZAiEAx+9Y3xegnGFCAPSqAH8tUz41Jb8Cc8CsSwF9yMhqBOE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21333},"main":"core.js","type":"commonjs","gitHead":"d359dc97a8155f38756c6da11a73e02391cc3249","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"angelardanaz","email":"angelardanaz2@gmail.com"},"repository":{"url":"git+https://github.com/ardanazangel/air.git","type":"git"},"_npmVersion":"11.5.1","description":"","directories":{},"_nodeVersion":"24.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/air_1.0.0_1757681890396_0.8885262827429707","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@angelardanaz/air","version":"1.0.1","keywords":[],"author":"","license":"ISC","_id":"@angelardanaz/air@1.0.1","maintainers":[{"name":"angelardanaz","email":"angelardanaz2@gmail.com"}],"homepage":"https://github.com/ardanazangel/air#readme","bugs":{"url":"https://github.com/ardanazangel/air/issues"},"dist":{"shasum":"b84deeb40353780548700c1aad1a85dd688c5a0e","tarball":"https://registry.npmjs.org/@angelardanaz/air/-/air-1.0.1.tgz","fileCount":2,"integrity":"sha512-CE/Kn+nvMLBc4vlIbtqJb9CDiz9duqNSWuvwWNQ+B516+6naTrnFS/vb1Yy96NaZXDx5JcPxZ66T4OSZhsDeiw==","signatures":[{"sig":"MEUCIQDLa3MhIcinjxZ2oXCxF0bNhPCErDZTWb8nAikMJdnXYQIgYjVlRgC2uLownIAU5V3rXdE8ckCSM/3hlVi9ZpitJoc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21334},"main":"index.js","type":"commonjs","gitHead":"d359dc97a8155f38756c6da11a73e02391cc3249","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"angelardanaz","email":"angelardanaz2@gmail.com"},"repository":{"url":"git+https://github.com/ardanazangel/air.git","type":"git"},"_npmVersion":"11.5.1","description":"","directories":{},"_nodeVersion":"24.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/air_1.0.1_1757682708287_0.5663792287438705","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@angelardanaz/air","version":"1.0.2","keywords":[],"author":"","license":"ISC","_id":"@angelardanaz/air@1.0.2","maintainers":[{"name":"angelardanaz","email":"angelardanaz2@gmail.com"}],"homepage":"https://github.com/ardanazangel/air#readme","bugs":{"url":"https://github.com/ardanazangel/air/issues"},"dist":{"shasum":"530e97acff7e4c07b107035b398e9bae4290267f","tarball":"https://registry.npmjs.org/@angelardanaz/air/-/air-1.0.2.tgz","fileCount":2,"integrity":"sha512-yQvaHnuupKaIXp8dBmAejSHHtJsQLGxMHkx5Lsrxe+E3zdzW4sRfNmTqtzIhhZoQU66zDlzjki5XmCOam6J7Vg==","signatures":[{"sig":"MEYCIQCJCYUB3Sc7NcpebTx26COvZ4fNoywCEPA5bYVXHdRy/gIhAO5htYB266kH5JJSsjD6vkd0ScSu/okSzZSSMrM86lcG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21332},"main":"index.js","type":"module","gitHead":"d359dc97a8155f38756c6da11a73e02391cc3249","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"angelardanaz","email":"angelardanaz2@gmail.com"},"repository":{"url":"git+https://github.com/ardanazangel/air.git","type":"git"},"_npmVersion":"11.5.1","description":"","directories":{},"_nodeVersion":"24.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/air_1.0.2_1757682932755_0.02125860856342121","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@angelardanaz/air","version":"1.0.3","keywords":[],"author":"","license":"ISC","_id":"@angelardanaz/air@1.0.3","maintainers":[{"name":"angelardanaz","email":"angelardanaz2@gmail.com"}],"homepage":"https://github.com/ardanazangel/air#readme","bugs":{"url":"https://github.com/ardanazangel/air/issues"},"dist":{"shasum":"b32ba44cfe5c67b15f5ba01c15b005f68dee1bdd","tarball":"https://registry.npmjs.org/@angelardanaz/air/-/air-1.0.3.tgz","fileCount":2,"integrity":"sha512-ycjxGdEvtqjHHQSoWkEZ1JUijkXDpBsmsEPsnwxJS3wjh5MyNp8DkbqhcCICYN2yF86lgp2l29neXhg/ZMjEWA==","signatures":[{"sig":"MEUCIFe8bTBow2F6hzcgg3XIMessJAQQkIA0ZvfT6roq+kT1AiEAwpKaZdI9sS9eGCzrYV6umEA5CNbDhWft9rx0Iyo4GqY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29543},"main":"index.js","type":"module","gitHead":"4dd85bf9b376934a02b971f236846281c77ca01a","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"angelardanaz","email":"angelardanaz2@gmail.com"},"repository":{"url":"git+https://github.com/ardanazangel/air.git","type":"git"},"_npmVersion":"11.5.1","description":"","directories":{},"_nodeVersion":"24.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/air_1.0.3_1757714972656_0.8680589388465603","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@angelardanaz/air","version":"1.0.4","keywords":[],"author":"","license":"ISC","_id":"@angelardanaz/air@1.0.4","maintainers":[{"name":"angelardanaz","email":"angelardanaz2@gmail.com"}],"homepage":"https://github.com/ardanazangel/air#readme","bugs":{"url":"https://github.com/ardanazangel/air/issues"},"dist":{"shasum":"f474a0c0e3cc56cd219d927b66343b48b3c0931b","tarball":"https://registry.npmjs.org/@angelardanaz/air/-/air-1.0.4.tgz","fileCount":3,"integrity":"sha512-jdad97DYlVk3oHrVm6spX7TbEfws16bjWLaiJzZsnFe7EJ6KizAIM33yqEu92ln4a9IuWQrYLAzBayG7AI0JrA==","signatures":[{"sig":"MEYCIQCYcbndlOMMg6eP9ZbmxncuhCeuaMj3vXVSmm7Y8or5AwIhAK/b7U+gSfHl5Q6nRrSI7FwjGMSRE3z8/OT7AFmmmYMB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":32480},"main":"index.js","type":"module","gitHead":"a1ffb0d80a6b7932b7ee37741cd88d6a6a8b6af8","scripts":{"test":"node tests/animate.test.js"},"_npmUser":{"name":"angelardanaz","email":"angelardanaz2@gmail.com"},"repository":{"url":"git+https://github.com/ardanazangel/air.git","type":"git"},"_npmVersion":"11.5.1","description":"Pequena utilidad para animaciones web que combina helpers para `animate`, `scrollTrigger` y un motor de scroll suave.","directories":{},"_nodeVersion":"24.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/air_1.0.4_1758046219616_0.6550061270881182","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@angelardanaz/air","version":"1.1.0","keywords":[],"author":"","license":"ISC","_id":"@angelardanaz/air@1.1.0","maintainers":[{"name":"angelardanaz","email":"angelardanaz2@gmail.com"}],"homepage":"https://github.com/ardanazangel/air#readme","bugs":{"url":"https://github.com/ardanazangel/air/issues"},"dist":{"shasum":"1d6102a9daea3ba78043b26292a608d226775b38","tarball":"https://registry.npmjs.org/@angelardanaz/air/-/air-1.1.0.tgz","fileCount":15,"integrity":"sha512-f8abd1lIWNJ6BBVYdqX91ZDWWqYFsXmExbXGv79VOPVUQaMxOuPQo1u7l0f4+fZeV7gTJhz6avoUzwPkgXfJBA==","signatures":[{"sig":"MEQCIHh9VzStreUHNpdPL7pb/z67ksKokSXiuHwrjS6tZwpDAiB38N6F6eYeTaX3mtW4gDmgbCHvXNbngvcjqJ/aBMnR9w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41090},"main":"index.js","type":"module","gitHead":"149d219f25df6c0e78500a6638f8dba7c960537b","scripts":{"test":"node tests/animate.test.js"},"_npmUser":{"name":"angelardanaz","email":"angelardanaz2@gmail.com"},"repository":{"url":"git+https://github.com/ardanazangel/air.git","type":"git"},"_npmVersion":"11.5.1","description":"Utilidad ligera para animaciones web: animacion declarativa con la Web Animations API, triggers de scroll, scroll suave y helpers (`stagger`, `split`, `tween`, `easings`).","directories":{},"_nodeVersion":"24.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/air_1.1.0_1765048863865_0.08028642740467973","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@angelardanaz/air","version":"1.1.1","description":"Utilidad ligera para animaciones web: animacion declarativa con la Web Animations API, triggers de scroll, scroll suave y helpers (`stagger`, `split`, `tween`, `easings`).","main":"index.js","scripts":{"test":"node tests/animate.test.js","build":"esbuild src/index.js --bundle --format=esm --minify --sourcemap --target=es2018 --outfile=dist/air.min.js","prepublishOnly":"npm run build"},"repository":{"type":"git","url":"git+https://github.com/ardanazangel/air.git"},"keywords":[],"author":"","license":"ISC","type":"module","bugs":{"url":"https://github.com/ardanazangel/air/issues"},"homepage":"https://github.com/ardanazangel/air#readme","publishConfig":{"access":"public"},"devDependencies":{"esbuild":"^0.27.1"},"_id":"@angelardanaz/air@1.1.1","gitHead":"149d219f25df6c0e78500a6638f8dba7c960537b","_nodeVersion":"24.7.0","_npmVersion":"11.5.1","dist":{"integrity":"sha512-HPcypdVgKr/KnJLe6EwKKRwcm/a1VomJn1tjPN9SWBSHPJhZFvrXL5H7raTkVuveOQQQJ06ZDLjwN9uDVECzeg==","shasum":"4c607e38c40e5f9772b02016901dd3f4ab5ce9aa","tarball":"https://registry.npmjs.org/@angelardanaz/air/-/air-1.1.1.tgz","fileCount":17,"unpackedSize":133366,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDlYrjNFr5wL1qa5yAtGfmMdwtpZPjKJAWwolYgOEVnQwIgZZbKCdGX3+3EBsCp2VabjHI0qGNuZBDf/Hwx22tzCZ0="}]},"_npmUser":{"name":"angelardanaz","email":"angelardanaz2@gmail.com"},"directories":{},"maintainers":[{"name":"angelardanaz","email":"angelardanaz2@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/air_1.1.1_1765050021920_0.2383575954057744"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-12T12:58:10.323Z","modified":"2025-12-06T19:40:22.391Z","1.0.0":"2025-09-12T12:58:10.616Z","1.0.1":"2025-09-12T13:11:48.484Z","1.0.2":"2025-09-12T13:15:32.944Z","1.0.3":"2025-09-12T22:09:32.849Z","1.0.4":"2025-09-16T18:10:19.823Z","1.1.0":"2025-12-06T19:21:04.017Z","1.1.1":"2025-12-06T19:40:22.082Z"},"bugs":{"url":"https://github.com/ardanazangel/air/issues"},"license":"ISC","homepage":"https://github.com/ardanazangel/air#readme","keywords":[],"repository":{"type":"git","url":"git+https://github.com/ardanazangel/air.git"},"description":"Utilidad ligera para animaciones web: animacion declarativa con la Web Animations API, triggers de scroll, scroll suave y helpers (`stagger`, `split`, `tween`, `easings`).","maintainers":[{"name":"angelardanaz","email":"angelardanaz2@gmail.com"}],"readme":"# air\n\nUtilidad ligera para animaciones web: animacion declarativa con la Web Animations API, triggers de scroll, scroll suave y helpers (`stagger`, `split`, `tween`, `easings`).\n\n## Instalacion\n\n```bash\nnpm install @angelardanaz/air\n```\n\n## API\n\n### animate(targets, keyframes, options)\nAnimaciones con la Web Animations API, con normalizacion de keyframes y soporte integrado para `scrollTrigger`.\n\n- `targets`: Element o iterable de elementos (NodeList, array).  \n- `keyframes`: array de fotogramas, objeto `{ from, to }` o solo `{ to }`. Si solo se declara el final, el inicio se rellena leyendo estilos computados (`transform`, `translate/x/y`, valores numericos).\n- `options` principales:\n  - `duration` (ms, 600 por defecto) y `delay`.\n  - `easing`: nombre abreviado (`i1`, `o3`, `li`, etc.), string CSS o `cubic-bezier(...)`.\n  - `stagger`: funcion `(index, total) => delay`. Usa `stagger()` de la libreria para obtenerla facilmente.\n  - `onComplete`: callback al terminar cada animacion (`[{ el, animation }]`).\n  - `scrollTrigger`: objeto de opciones de `scrollTrigger` para animacion manual ligada al scroll.\n- Devuelve `{ el, animation }` (modo Web Animations) o `{ el, trigger }` (modo `scrollTrigger`).\n\nEjemplo con solo `to` y `stagger`:\n```js\nimport { animate, stagger } from \"@angelardanaz/air\";\n\nconst cards = document.querySelectorAll(\".card\");\n\nanimate(cards, { to: { opacity: 1, y: 0 } }, {\n  duration: 700,\n  easing: \"io2\",\n  delay: 150,\n  stagger: stagger(80, { from: \"center\" }),\n});\n```\n\n### scrollTrigger(options)\nVincula el progreso de una animacion (o cualquier callback) al desplazamiento usando el scroll nativo del navegador o una instancia de `scroll`.\n\n- `scroll`: instancia de `scroll` o deja vacio para usar el scroll nativo del navegador.  \n- `trigger`: elemento o funcion que lo devuelve.  \n- `start` / `end`: numero (px), string tipo `\"top center\"` (`elemento viewport`) o funcion que recibe `{ el, vh, current, maxScroll, rect, top, bottom }` y devuelve una posicion absoluta.\n- Callbacks: `onEnter`, `onLeave`, `onUpdate({ progress, rawProgress, current, start, end, entered, el, direction, velocity })`.\n- Flags: `once` (destruye tras el primer paso), `scrub` (`true` sin suavizado o numero en ms para amortiguar), `markers` (muestra lineas de inicio/fin) y `pin` (sticky mientras se esta dentro del rango).\n- Devuelve `{ recalc, destroy, state }`.\n\nEjemplo ligando una animacion manual:\n```js\nimport { animate, scroll } from \"@angelardanaz/air\";\n\nconst scroller = new scroll();\nconst hero = document.querySelector(\".hero\");\n\nanimate(hero, { to: { y: -120, opacity: 0 } }, {\n  easing: \"io3\",\n  scrollTrigger: {\n    scroll: scroller,\n    start: \"top top\",\n    end: \"bottom center\",\n    scrub: 180,\n  },\n});\n```\n\n### scroll (clase)\nMotor de scroll suave con soporte para rueda, tactil y teclado. Respeta `prefers-reduced-motion` desactivando la inercia.\n\n- Opciones: `container` (por defecto `[data-scroll-container]` o documento), `content` (primer hijo por defecto), `damping` (0.1), `wheelMultiplier` / `touchMultiplier` (1), `keyStep` (80), `easing` (funcion), `smoothToDuration` (0), `autoResize` (true).\n- Estado expuesto: `current`, `target`, `maxScroll`, `state.reduceMotion`, `velocity`, `direction`.\n- `onUpdate(fn)`: se llama en cada frame y devuelve una funcion para desuscribirse.\n- `scrollTo(y, { immediate, duration, easing })`: mueve a la posicion objetivo, respetando limites; devuelve una promesa que resuelve al finalizar.\n- `enable()`, `disable()`, `destroy()`: control del ciclo de vida.\n\n### tween(options)\nInterpolacion generica sin tocar el DOM, basada en `requestAnimationFrame`.\n\n- `from` y `to`: numero, array o objeto; los campos ausentes se rellenan con cero.\n- `duration` (600), `delay` (0), `easing` (nombre abreviado o funcion), `autoplay` (true).\n- Callbacks: `onStart`, `onUpdate({ value, progress, rawProgress })`, `onComplete`.\n- Control: `play()`, `pause()`, `resume()`, `cancel()`, `seek(p)`, `isActive()`, `progress()`.\n\nEjemplo basico actualizando estilos sin Web Animations:\n```js\nimport { tween } from \"@angelardanaz/air\";\n\nconst box = document.querySelector(\".box\");\n\nconst control = tween({\n  from: { x: 0, opacity: 0.4 },\n  to: { x: 180, opacity: 1 },\n  duration: 900,\n  easing: \"io3\",\n  onUpdate: ({ value }) => {\n    box.style.transform = `translateX(${value.x}px)`;\n    box.style.opacity = value.opacity;\n  },\n});\n\n// control.pause(); control.resume(); control.seek(0.5); control.cancel();\n```\n\n### stagger(each = 50, { from = \"start\" })\nGenera una funcion para escalonar retardos: desde el inicio, el final o el centro. Ideal para pasarlo a `options.stagger` de `animate`.\n\n### split(el, mode = \"letters\")\nDivide el texto de un elemento en spans para animarlos por separado. Modos: `\"letters\"`, `\"words\"`, `\"lines\"`. Devuelve el array de spans generados y aplica clases `split-wrapper` + `letter|word|line` para estilizarlos.\n\n### Easings y helpers\n- `EASINGS`: mapa de nombres abreviados (`li`, `i1`..`i6`, `o1`..`o6`, `io1`..`io6`) a puntos de curva.\n- `DEFAULT_EASING_NAME`: `li` (lineal).\n- `easingNameToFn(name|fn)`: devuelve una funcion de easing (o la misma si ya es funcion).\n- `easingNameToTiming(name)`: devuelve string `cubic-bezier(...)` para usar en CSS.\n- `cubicBezier(x1, y1, x2, y2)`: genera un easing personalizado.\n\n## Demo local\n\nHay un ejemplo rapido en `demo/` (ignorado en git y fuera del paquete npm). Levanta un server estatico y abre `demo/index.html`, por ejemplo:\n\n```bash\npython -m http.server 4173 --directory demo\n# o cualquier servidor estatico (npx serve demo, http-server demo, etc.)\n```\n\n## Build/minificado\n\nGenera el bundle ESM minificado en `dist/air.min.js` con:\n\n```bash\nnpm run build\n```\n\nSe ejecuta automaticamente en `npm publish` via `prepublishOnly`.\n\n## Tests\n\n```bash\nnpm test\n```\n","readmeFilename":"README.md"}