svg-scroll-draw 2.13.0 → 2.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/init.js CHANGED
@@ -25,8 +25,8 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
25
 
26
26
  // src/cli/init.ts
27
27
  var readline = __toESM(require("readline"));
28
- var fs = __toESM(require("fs"));
29
- var path = __toESM(require("path"));
28
+ var fs2 = __toESM(require("fs"));
29
+ var path2 = __toESM(require("path"));
30
30
 
31
31
  // src/cli/generators.ts
32
32
  var SAMPLE_SVG_JSX = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 100">
@@ -138,6 +138,254 @@ function needsSelector(framework) {
138
138
  return framework === "vanilla";
139
139
  }
140
140
 
141
+ // src/cli/migrate.ts
142
+ var fs = __toESM(require("fs"));
143
+ var path = __toESM(require("path"));
144
+ var import_node_child_process = require("child_process");
145
+ var LIBS = ["aos", "scrollreveal", "vivus"];
146
+ var LABEL = { aos: "AOS", scrollreveal: "ScrollReveal", vivus: "vivus" };
147
+ var esc = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
148
+ function rewriteSpecifiers(src, changes) {
149
+ let out = src;
150
+ for (const lib of LIBS) {
151
+ const spec = lib === "aos" ? `aos(?:\\/dist\\/aos(?:\\.js)?)?` : esc(lib);
152
+ const target = `svg-scroll-draw/${lib}`;
153
+ const fromRe = new RegExp(`(\\bfrom\\s*)(['"])${spec}\\2`, "g");
154
+ const dynRe = new RegExp(`(\\bimport\\s*\\(\\s*)(['"])${spec}\\2(\\s*\\))`, "g");
155
+ const reqRe = new RegExp(`(\\brequire\\s*\\(\\s*)(['"])${spec}\\2(\\s*\\))`, "g");
156
+ let n = 0;
157
+ out = out.replace(fromRe, (_m, pre, q) => {
158
+ n++;
159
+ return `${pre}${q}${target}${q}`;
160
+ });
161
+ out = out.replace(dynRe, (_m, pre, q, post) => {
162
+ n++;
163
+ return `${pre}${q}${target}${q}${post}`;
164
+ });
165
+ out = out.replace(reqRe, (_m, pre, q, post) => {
166
+ n++;
167
+ return lib === "aos" ? `${pre}${q}${target}${q}${post}` : `${pre}${q}${target}${q}${post}.default`;
168
+ });
169
+ if (n) changes.push(`${LABEL[lib]}: ${n} import${n === 1 ? "" : "s"} \u2192 ${target}`);
170
+ }
171
+ return out;
172
+ }
173
+ function dropAosCssImports(src, changes) {
174
+ let n = 0;
175
+ const out = src.replace(/^[ \t]*import\s+(['"])aos\/dist\/aos(?:\.min)?\.css\1;?[ \t]*\r?\n?/gm, () => {
176
+ n++;
177
+ return "";
178
+ }).replace(/^[ \t]*require\s*\(\s*(['"])aos\/dist\/aos(?:\.min)?\.css\1\s*\);?[ \t]*\r?\n?/gm, () => {
179
+ n++;
180
+ return "";
181
+ });
182
+ if (n) changes.push(`AOS: removed ${n} aos.css import${n === 1 ? "" : "s"} (the drop-in ships its styles)`);
183
+ return out;
184
+ }
185
+ var SCRIPT_URL = {
186
+ aos: /^(?:https?:)?\/\/(?:unpkg\.com\/aos(?:@[^/]+)?(?:\/dist\/aos(?:\.min)?\.js)?|cdn\.jsdelivr\.net\/npm\/aos(?:@[^/]+)?(?:\/dist\/aos(?:\.min)?\.js)?|cdnjs\.cloudflare\.com\/ajax\/libs\/aos\/[^/]+\/aos(?:\.min)?\.js)$|(?:^|\/)node_modules\/aos\/dist\/aos(?:\.min)?\.js$/,
187
+ scrollreveal: /^(?:https?:)?\/\/(?:unpkg\.com\/scrollreveal(?:@[^/]+)?(?:\/dist\/scrollreveal(?:\.min)?\.js)?|cdn\.jsdelivr\.net\/npm\/scrollreveal(?:@[^/]+)?(?:\/dist\/scrollreveal(?:\.min)?\.js)?|cdnjs\.cloudflare\.com\/ajax\/libs\/scrollReveal\.js\/[^/]+\/scrollreveal(?:\.min)?\.js)$|(?:^|\/)node_modules\/scrollreveal\/dist\/scrollreveal(?:\.min)?\.js$/i,
188
+ vivus: /^(?:https?:)?\/\/(?:unpkg\.com\/vivus(?:@[^/]+)?(?:\/dist\/vivus(?:\.min)?\.js)?|cdn\.jsdelivr\.net\/npm\/vivus(?:@[^/]+)?(?:\/dist\/vivus(?:\.min)?\.js)?|cdnjs\.cloudflare\.com\/ajax\/libs\/vivus\/[^/]+\/vivus(?:\.min)?\.js)$|(?:^|\/)node_modules\/vivus\/dist\/vivus(?:\.min)?\.js$/
189
+ };
190
+ var AOS_CSS_URL = /^(?:https?:)?\/\/(?:unpkg\.com\/aos(?:@[^/]+)?\/dist\/aos\.css|cdn\.jsdelivr\.net\/npm\/aos(?:@[^/]+)?\/dist\/aos\.css|cdnjs\.cloudflare\.com\/ajax\/libs\/aos\/[^/]+\/aos(?:\.min)?\.css)$|(?:^|\/)node_modules\/aos\/dist\/aos\.css$/;
191
+ function rewriteScriptTags(src, version, changes) {
192
+ return src.replace(/<script\b([^>]*)>/gi, (tag, attrs) => {
193
+ const m = /\bsrc\s*=\s*(["'])([^"']+)\1/i.exec(attrs);
194
+ if (!m) return tag;
195
+ const lib = LIBS.find((l) => SCRIPT_URL[l].test(m[2]));
196
+ if (!lib) return tag;
197
+ const url = `https://unpkg.com/svg-scroll-draw@${version}/dist/cdn/${lib}.global.js`;
198
+ const hadIntegrity = /\bintegrity\s*=/i.test(attrs);
199
+ const next = attrs.replace(m[0], `src=${m[1]}${url}${m[1]}`).replace(/\s+integrity\s*=\s*(["'])[^"']*\1/gi, "");
200
+ changes.push(`${LABEL[lib]}: <script> \u2192 ${url}${hadIntegrity ? " (old integrity hash removed)" : ""}`);
201
+ return `<script${next}>`;
202
+ });
203
+ }
204
+ function dropAosCssLinks(src, changes) {
205
+ let n = 0;
206
+ const out = src.replace(/^[ \t]*<link\b[^>]*>[ \t]*\r?\n?/gim, (line) => {
207
+ const m = /\bhref\s*=\s*(["'])([^"']+)\1/i.exec(line);
208
+ if (m && AOS_CSS_URL.test(m[2])) {
209
+ n++;
210
+ return "";
211
+ }
212
+ return line;
213
+ });
214
+ if (n) changes.push(`AOS: removed ${n} aos.css <link> (the drop-in ships its styles)`);
215
+ return out;
216
+ }
217
+ function dropAosCssAtImports(src, changes) {
218
+ let n = 0;
219
+ const out = src.replace(
220
+ /^[ \t]*@import\s+(?:url\(\s*)?(['"]?)~?aos\/dist\/aos(?:\.min)?\.css\1\s*\)?\s*;?[ \t]*\r?\n?/gm,
221
+ () => {
222
+ n++;
223
+ return "";
224
+ }
225
+ );
226
+ if (n) changes.push(`AOS: removed ${n} @import of aos.css (the drop-in ships its styles)`);
227
+ return out;
228
+ }
229
+ var SCRIPT_EXT = /\.(?:[cm]?[jt]sx?|vue|svelte|astro)$/i;
230
+ var HTML_EXT = /\.(?:html?|vue|svelte|astro|php|ejs|hbs|njk|liquid|erb)$/i;
231
+ var CSS_EXT = /\.(?:css|scss|sass|less)$/i;
232
+ function migrateSource(src, filename, version) {
233
+ const changes = [];
234
+ let code = src;
235
+ if (SCRIPT_EXT.test(filename)) {
236
+ code = dropAosCssImports(code, changes);
237
+ code = rewriteSpecifiers(code, changes);
238
+ }
239
+ if (HTML_EXT.test(filename)) {
240
+ code = rewriteScriptTags(code, version, changes);
241
+ code = dropAosCssLinks(code, changes);
242
+ }
243
+ if (CSS_EXT.test(filename) || /\.(?:vue|svelte|astro)$/i.test(filename)) {
244
+ code = dropAosCssAtImports(code, changes);
245
+ }
246
+ return { code, changes };
247
+ }
248
+ function migratePackageJson(text, version) {
249
+ const changes = [];
250
+ let pkg;
251
+ try {
252
+ pkg = JSON.parse(text);
253
+ } catch {
254
+ return { code: text, changes };
255
+ }
256
+ const remove = [...LIBS, "@types/aos"];
257
+ let home = null;
258
+ for (const field of ["dependencies", "devDependencies"]) {
259
+ const deps = pkg[field];
260
+ if (!deps) continue;
261
+ for (const name of remove) {
262
+ if (name in deps) {
263
+ delete deps[name];
264
+ changes.push(`package.json: removed ${name} from ${field}`);
265
+ if (!home && name !== "@types/aos") home = field;
266
+ }
267
+ }
268
+ }
269
+ if (!home) return { code: text, changes };
270
+ const already = ["dependencies", "devDependencies"].some(
271
+ (f) => pkg[f]?.["svg-scroll-draw"]
272
+ );
273
+ if (!already) {
274
+ const deps = pkg[home] ?? (pkg[home] = {});
275
+ deps["svg-scroll-draw"] = `^${version}`;
276
+ pkg[home] = Object.fromEntries(Object.entries(deps).sort(([a], [b]) => a.localeCompare(b)));
277
+ changes.push(`package.json: added svg-scroll-draw ^${version} to ${home}`);
278
+ }
279
+ const indent = /^\{\r?\n(\t| +)/.exec(text)?.[1] ?? " ";
280
+ return { code: JSON.stringify(pkg, null, indent) + (text.endsWith("\n") ? "\n" : ""), changes };
281
+ }
282
+ var SKIP_DIRS = /* @__PURE__ */ new Set([
283
+ "node_modules",
284
+ ".git",
285
+ "dist",
286
+ "build",
287
+ "out",
288
+ ".next",
289
+ ".nuxt",
290
+ ".output",
291
+ ".svelte-kit",
292
+ ".vercel",
293
+ ".netlify",
294
+ ".turbo",
295
+ ".cache",
296
+ "coverage",
297
+ ".parcel-cache",
298
+ "vendor"
299
+ ]);
300
+ var MAX_BYTES = 2 * 1024 * 1024;
301
+ function* walk(dir) {
302
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
303
+ if (entry.isDirectory()) {
304
+ if (!SKIP_DIRS.has(entry.name) && !entry.name.startsWith(".")) yield* walk(path.join(dir, entry.name));
305
+ } else if (entry.isFile()) {
306
+ yield path.join(dir, entry.name);
307
+ }
308
+ }
309
+ }
310
+ function installCommand(dir) {
311
+ if (fs.existsSync(path.join(dir, "pnpm-lock.yaml"))) return "pnpm install";
312
+ if (fs.existsSync(path.join(dir, "yarn.lock"))) return "yarn install";
313
+ if (fs.existsSync(path.join(dir, "bun.lockb")) || fs.existsSync(path.join(dir, "bun.lock"))) return "bun install";
314
+ return "npm install";
315
+ }
316
+ function gitDirty(dir) {
317
+ try {
318
+ return (0, import_node_child_process.execSync)("git status --porcelain", { cwd: dir, stdio: ["ignore", "pipe", "ignore"] }).toString().trim() !== "";
319
+ } catch {
320
+ return false;
321
+ }
322
+ }
323
+ var HELP = `
324
+ svg-scroll-draw migrate [dir] [--dry-run] [--force]
325
+
326
+ Moves a project off AOS, ScrollReveal and vivus onto svg-scroll-draw's drop-ins:
327
+ \u2022 imports / requires of 'aos', 'scrollreveal', 'vivus' \u2192 svg-scroll-draw/<lib>
328
+ \u2022 CDN <script> tags \u2192 svg-scroll-draw's script-tag builds
329
+ \u2022 AOS's aos.css imports, <link>s and @imports removed (the drop-in ships its styles)
330
+ \u2022 package.json: the old packages swapped for svg-scroll-draw
331
+
332
+ --dry-run show what would change, write nothing
333
+ --force write even if the git working tree has uncommitted changes
334
+ `;
335
+ function runMigrate(args, version, log = console.log) {
336
+ if (args.includes("--help") || args.includes("-h")) {
337
+ log(HELP);
338
+ return 0;
339
+ }
340
+ const dryRun = args.includes("--dry-run");
341
+ const force = args.includes("--force");
342
+ const dir = path.resolve(args.find((a) => !a.startsWith("-")) ?? ".");
343
+ if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {
344
+ log(` \u2717 Not a directory: ${dir}`);
345
+ return 1;
346
+ }
347
+ const edits = [];
348
+ for (const file of walk(dir)) {
349
+ const base = path.basename(file);
350
+ const isPkg = base === "package.json";
351
+ if (!isPkg && !SCRIPT_EXT.test(base) && !HTML_EXT.test(base) && !CSS_EXT.test(base)) continue;
352
+ if (fs.statSync(file).size > MAX_BYTES) continue;
353
+ const text = fs.readFileSync(file, "utf8");
354
+ if (!isPkg && !/aos|scrollreveal|vivus/i.test(text)) continue;
355
+ const result = isPkg ? migratePackageJson(text, version) : migrateSource(text, base, version);
356
+ if (result.changes.length && result.code !== text) edits.push({ file, code: result.code, changes: result.changes });
357
+ }
358
+ log(`
359
+ svg-scroll-draw migrate${dryRun ? " (dry run)" : ""} \u2014 ${dir}
360
+ `);
361
+ if (!edits.length) {
362
+ log(" No AOS, ScrollReveal or vivus usage found. Nothing to do.\n");
363
+ return 0;
364
+ }
365
+ for (const { file, changes } of edits) {
366
+ log(` ${path.relative(dir, file) || path.basename(file)}`);
367
+ for (const c of changes) log(` \u2022 ${c}`);
368
+ }
369
+ if (dryRun) {
370
+ log(`
371
+ ${edits.length} file${edits.length === 1 ? "" : "s"} would change. Run again without --dry-run to apply.
372
+ `);
373
+ return 0;
374
+ }
375
+ if (!force && gitDirty(dir)) {
376
+ log("\n \u2717 The git working tree has uncommitted changes. Commit or stash them first so the");
377
+ log(" migration is a clean diff you can review, or pass --force to write anyway.\n");
378
+ return 1;
379
+ }
380
+ for (const { file, code } of edits) fs.writeFileSync(file, code);
381
+ const touchedPkg = edits.some((e) => path.basename(e.file) === "package.json");
382
+ log(`
383
+ \u2713 Updated ${edits.length} file${edits.length === 1 ? "" : "s"}.`);
384
+ log(` Next: ${touchedPkg ? `run \`${installCommand(dir)}\`, then ` : ""}review the diff (git diff) and try the page.
385
+ `);
386
+ return 0;
387
+ }
388
+
141
389
  // src/cli/init.ts
142
390
  var RESET = "\x1B[0m";
143
391
  var BOLD = "\x1B[1m";
@@ -147,19 +395,19 @@ var GREEN = "\x1B[32m";
147
395
  var CYAN = "\x1B[36m";
148
396
  function ask(rl, question, fallback) {
149
397
  return new Promise(
150
- (resolve) => rl.question(` ${CYAN}?${RESET} ${question} ${DIM}(${fallback})${RESET} `, (ans) => {
151
- resolve(ans.trim() || fallback);
398
+ (resolve2) => rl.question(` ${CYAN}?${RESET} ${question} ${DIM}(${fallback})${RESET} `, (ans) => {
399
+ resolve2(ans.trim() || fallback);
152
400
  })
153
401
  );
154
402
  }
155
403
  function pick(rl, question, options, fallback) {
156
404
  const opts = options.map((o, i) => `${DIM}${i + 1})${RESET} ${o}`).join(" ");
157
405
  return new Promise(
158
- (resolve) => rl.question(` ${CYAN}?${RESET} ${question}
406
+ (resolve2) => rl.question(` ${CYAN}?${RESET} ${question}
159
407
  ${opts}
160
408
  ${DIM}(${fallback})${RESET} `, (ans) => {
161
409
  const idx = parseInt(ans) - 1;
162
- resolve(idx >= 0 && idx < options.length ? options[idx] : fallback);
410
+ resolve2(idx >= 0 && idx < options.length ? options[idx] : fallback);
163
411
  })
164
412
  );
165
413
  }
@@ -179,8 +427,8 @@ async function main() {
179
427
  }
180
428
  const selector = needsSelector(framework) ? await ask(rl, "CSS selector for your SVG container?", "#my-svg") : "#my-svg";
181
429
  const outFile = FILE_NAMES[framework] ?? "scroll-draw.js";
182
- const outPath = path.join(process.cwd(), outFile);
183
- if (fs.existsSync(outPath)) {
430
+ const outPath = path2.join(process.cwd(), outFile);
431
+ if (fs2.existsSync(outPath)) {
184
432
  const overwrite = await ask(rl, `${outFile} already exists. Overwrite?`, "y");
185
433
  if (overwrite.toLowerCase() !== "y") {
186
434
  console.log(`
@@ -190,7 +438,7 @@ async function main() {
190
438
  }
191
439
  }
192
440
  const code = GENERATORS[framework]?.({ selector, easing, preset }) ?? "";
193
- fs.writeFileSync(outPath, code, "utf8");
441
+ fs2.writeFileSync(outPath, code, "utf8");
194
442
  console.log(`
195
443
  ${GREEN}\u2713${RESET} ${BOLD}${outFile}${RESET} created.
196
444
  `);
@@ -208,7 +456,30 @@ async function main() {
208
456
  rl.close();
209
457
  }
210
458
  }
211
- main().catch((e) => {
212
- console.error(e);
213
- process.exit(1);
214
- });
459
+ function ownVersion() {
460
+ try {
461
+ return JSON.parse(fs2.readFileSync(path2.join(__dirname, "..", "..", "package.json"), "utf8")).version;
462
+ } catch {
463
+ return "latest";
464
+ }
465
+ }
466
+ var USAGE = `
467
+ npx svg-scroll-draw init scaffold a starter file
468
+ npx svg-scroll-draw migrate switch a project from AOS, ScrollReveal or vivus (--dry-run to preview)
469
+ `;
470
+ var [command, ...rest] = process.argv.slice(2);
471
+ if (command === "help" || command === "--help" || command === "-h") {
472
+ console.log(USAGE);
473
+ } else if (command === "migrate") {
474
+ process.exitCode = runMigrate(rest, ownVersion());
475
+ } else if (command === void 0 || command === "init") {
476
+ main().catch((e) => {
477
+ console.error(e);
478
+ process.exit(1);
479
+ });
480
+ } else {
481
+ console.error(`
482
+ Unknown command "${command}".
483
+ ${USAGE}`);
484
+ process.exitCode = 1;
485
+ }
@@ -0,0 +1,12 @@
1
+ declare function enable(): void;
2
+ declare function disable(): void;
3
+ declare function toggle(): void;
4
+ declare function highlight(target: string | Element): void;
5
+ declare const devtools: {
6
+ enable: typeof enable;
7
+ disable: typeof disable;
8
+ toggle: typeof toggle;
9
+ highlight: typeof highlight;
10
+ };
11
+
12
+ export { devtools };
@@ -0,0 +1,12 @@
1
+ declare function enable(): void;
2
+ declare function disable(): void;
3
+ declare function toggle(): void;
4
+ declare function highlight(target: string | Element): void;
5
+ declare const devtools: {
6
+ enable: typeof enable;
7
+ disable: typeof disable;
8
+ toggle: typeof toggle;
9
+ highlight: typeof highlight;
10
+ };
11
+
12
+ export { devtools };
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ "use strict";var z=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var le=Object.prototype.hasOwnProperty;var ce=(e,n)=>{for(var t in n)z(e,t,{get:n[t],enumerable:!0})},de=(e,n,t,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let i of ae(n))!le.call(e,i)&&i!==t&&z(e,i,{get:()=>n[i],enumerable:!(o=se(n,i))||o.enumerable});return e};var ue=e=>de(z({},"__esModule",{value:!0}),e);var Oe={};ce(Oe,{useScrollReveal:()=>Le});module.exports=ue(Oe);var T=require("react");function V(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches}var Z="4.0.9",W=()=>typeof window<"u"&&typeof document<"u",H=e=>e!==null&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]";function q(e,...n){for(let t of n)if(H(t))for(let o of Object.keys(t)){let i=t[o];H(i)?(H(e[o])||(e[o]={}),q(e[o],i)):e[o]=i}return e}function A(e){if(typeof e=="string")try{return Array.from(document.querySelectorAll(e))}catch{return[]}return e instanceof Element?[e]:e&&typeof e.length=="number"?Array.from(e).filter(n=>n instanceof Element):[]}var $=(e=navigator.userAgent)=>/Android|iPhone|iPad|iPod/i.test(e),Q=!1;function D(e,...n){Q&&typeof console<"u"&&console.log(`%cScrollReveal: ${e}${n.map(t=>`
3
+ \u2014 ${t}`).join("")}`,"color: #ea654b;")}var k=()=>[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function fe(e,n){let t=[];for(let o=0;o<4;o++)for(let i=0;i<4;i++){let r=0;for(let s=0;s<4;s++)r+=e[i+4*s]*n[4*o+s];t[i+4*o]=r}return t}function me(e){let n=/matrix(3d)?\(([^)]+)\)/.exec(e||"");if(!n)return k();let t=n[2].split(", ").map(parseFloat);if(t.length===16)return t;let o=k();return[o[0],o[1],o[4],o[5],o[12],o[13]]=t,o}function N(e,n){let t=Math.PI/180*n,o=Math.cos(t),i=Math.sin(t),r=k(),[s,a,c,h]=e==="x"?[5,10,6,9]:e==="y"?[0,10,8,2]:[0,5,1,4];return r[s]=r[a]=o,r[c]=i,r[h]=-i,r}function be(e,n){let t=k();return t[e==="X"?12:13]=n,t}function ve(e){let n=k();return n[0]=n[5]=e,n}function g(e,n){for(let t of n.split(";")){let o=t.indexOf(":");if(o<1)continue;let i=t.slice(0,o).trim(),r=t.slice(o+1).trim();i&&r&&e.style.setProperty(i,r)}}function pe(e){let{node:n,config:t}=e,o=window.getComputedStyle(n),i=(n.getAttribute("style")||"").match(/[\w-]+\s*:\s*[^;]+\s*/gi)||[],r=i.map(d=>d.trim()),s=`${r.join("; ")};`,a=i.some(d=>/visibility\s?:\s?visible/i.test(d))?s:`${[...r,"visibility: visible"].join("; ")};`,c=parseFloat(o.opacity),h=t.opacity!==null&&!isNaN(parseFloat(String(t.opacity)))?parseFloat(String(t.opacity)):c,b=c!==h?{computed:`opacity: ${c};`,generated:`opacity: ${h};`}:{computed:"",generated:""},u=[];if(parseFloat(t.distance)){let d=t.origin==="top"||t.origin==="bottom"?"Y":"X",f=t.distance;(t.origin==="top"||t.origin==="left")&&(f=f.startsWith("-")?f.slice(1):`-${f}`);let E=f.match(/(^-?\d+\.?\d?)|(em$|px$|%$)/g)||[],m=Number(E[0]),C=E[1],L;if(C==="em")L=parseInt(o.fontSize,10)*m;else if(C==="px")L=m;else if(C==="%"){let U=n.getBoundingClientRect();L=(d==="Y"?U.height:U.width)*m/100}else throw new RangeError("Unrecognized or missing distance unit.");u.push(be(d,L))}t.rotate.x&&u.push(N("x",t.rotate.x)),t.rotate.y&&u.push(N("y",t.rotate.y)),t.rotate.z&&u.push(N("z",t.rotate.z)),t.scale!==1&&u.push(ve(t.scale===0?2e-4:t.scale));let v={initial:"",final:""};if(u.length){let d=me(o.transform);v={initial:`transform: matrix3d(${u.reduce(fe,d).join(", ")});`,final:`transform: matrix3d(${d.join(", ")});`}}let w={delayed:"",instant:""};if(b.generated||v.initial){let d=m=>`${m/1e3}s`,f=[],E=m=>({delayed:`${m} ${d(t.duration)} ${t.easing} ${d(t.delay)}`,instant:`${m} ${d(t.duration)} ${t.easing} 0s`});o.transition&&!/all 0s|none 0s/.test(o.transition)&&f.push({delayed:o.transition,instant:o.transition}),b.generated&&f.push(E("opacity")),v.initial&&f.push(E("transform")),w={delayed:`transition: ${f.map(m=>m.delayed).join(", ")};`,instant:`transition: ${f.map(m=>m.instant).join(", ")};`}}return{inline:{computed:s,generated:a},opacity:b,position:o.position,transform:v,transition:w}}var M=(...e)=>e.filter(n=>n!=="").join(" "),ge=()=>({delay:0,distance:"0",duration:600,easing:"cubic-bezier(0.5, 0, 0, 1)",interval:0,opacity:0,origin:"bottom",rotate:{x:0,y:0,z:0},scale:1,cleanup:!1,container:document.documentElement,desktop:!0,mobile:!0,reset:!1,useDelay:"always",viewFactor:0,viewOffset:{top:0,right:0,bottom:0,left:0},afterReset:()=>{},afterReveal:()=>{},beforeReset:()=>{},beforeReveal:()=>{}}),p=null,O=null,l={containers:{},elements:{},history:[],sequences:{}},B=!0,j=null,R=0,G=!1,ye=0,F=()=>ye++;function J(e,n=!1){let t=e,o=n?t.clientHeight:t.offsetHeight,i=n?t.clientWidth:t.offsetWidth,r=0,s=0,a=t;for(;a;)isNaN(a.offsetTop)||(r+=a.offsetTop),isNaN(a.offsetLeft)||(s+=a.offsetLeft),a=a.offsetParent;return{bounds:{top:r,right:s+i,bottom:r+o,left:s},height:o,width:i}}var he=e=>e.node===document.documentElement?{top:window.pageYOffset,left:window.pageXOffset}:{top:e.node.scrollTop,left:e.node.scrollLeft};function we(e){let n=l.containers[e.containerId];if(!n||!n.geometry||!n.scroll||!e.geometry)return!1;let t=Math.max(0,Math.min(1,e.config.viewFactor)),o=e.config.viewOffset,i=e.geometry,r={top:i.bounds.top+i.height*t,right:i.bounds.right-i.width*t,bottom:i.bounds.bottom-i.height*t,left:i.bounds.left+i.width*t},s={top:n.geometry.bounds.top+n.scroll.top+o.top,right:n.geometry.bounds.right+n.scroll.left-o.right,bottom:n.geometry.bounds.bottom+n.scroll.top-o.bottom,left:n.geometry.bounds.left+n.scroll.left+o.left};return r.top<s.bottom&&r.right>s.left&&r.bottom>s.top&&r.left<s.right||e.styles.position==="fixed"}function _(e,n=!1){let t=n?e.config.duration+e.config.delay:e.config.duration,o=0;e.timer&&(o=Date.now()-e.timer.start,clearTimeout(e.timer.clock)),(e.revealed?e.config.beforeReveal:e.config.beforeReset)(e.node),e.timer={start:Date.now(),clock:setTimeout(()=>{(e.revealed?e.config.afterReveal:e.config.afterReset)(e.node),e.timer=null,e.revealed&&!e.config.reset&&e.config.cleanup&&X(e.node)},t-o)}}function Re(e,n){let t=e.styles;e.revealed=e.seen=!0,g(e.node,M(t.inline.generated,t.opacity.computed,t.transform.final,n?t.transition.delayed:t.transition.instant)),_(e,n)}function Se(e){let n=e.styles;e.revealed=!1,g(e.node,M(n.inline.generated,n.opacity.generated,n.transform.initial,n.transition.instant)),_(e)}function x(e,n={}){let t=n.pristine||B,o=e.config.useDelay,i=o==="always"||o==="onload"&&t||o==="once"&&!e.seen;if(n.reveal||e.visible&&!e.revealed)return Re(e,i);if(n.reset||!e.visible&&e.revealed&&e.config.reset)return Se(e)}function K(e,n){let t=[],o=[],i=[];return e.members.forEach((r,s)=>{l.elements[r]?.[n]&&o.push(s)}),o.length&&e.members.forEach((r,s)=>{let a=l.elements[r];a&&!a[n]&&(s<o[0]?t:i).push(s)}),{head:t,body:o,foot:i}}function I(e,n,t,o){let i=t<0?"head":"foot",r=l.elements[e.members[n+t]];e.blocked[i]=!0,setTimeout(()=>{e.blocked[i]=!1,r&&ee(r,o)},e.interval)}function ee(e,n=B){if(!e.visible&&e.revealed&&e.config.reset)return x(e,{reset:!0});let t=e.sequence&&l.sequences[e.sequence.id];if(!t||!e.sequence)return;let o=e.sequence.index,i=K(t,"visible"),r=K(t,"revealed");if(!r.body.length){let a=i.body[0],c=l.elements[t.members[a]];if(c)return I(t,a,-1,n),I(t,a,1,n),x(c,{reveal:!0,pristine:n})}let s=a=>a[a.length-1];if(!t.blocked.head&&o===s(r.head)&&o>=(i.body[0]??1/0))return I(t,o,-1,n),x(e,{reveal:!0,pristine:n});if(!t.blocked.foot&&o===r.foot[0]&&o<=(s(i.body)??-1/0))return I(t,o,1,n),x(e,{reveal:!0,pristine:n})}function Ee(){R=0;let e=G;G=!1;for(let t of Object.values(l.containers))(e||!t.geometry)&&(t.geometry=J(t.node,!0)),t.scroll=he(t);let n=Object.values(l.elements);for(let t of n)(e||!t.geometry)&&(t.geometry=J(t.node)),t.visible=we(t);for(let t of n)t.sequence?ee(t):x(t);B=!1}function y(e){let n=e?e.type:"init";(n==="init"||n==="resize")&&(G=!0),R||(R=requestAnimationFrame(Ee))}var S=e=>e.node===document.documentElement?window:e.node;function te(){let e=new Set(Array.from(document.querySelectorAll("[data-sr-id]")).map(o=>parseInt(o.getAttribute("data-sr-id")||"",10)));for(let o of Object.values(l.elements))e.has(o.id)||delete l.elements[o.id];let n=new Set,t=new Set;for(let o of Object.values(l.elements))n.add(o.containerId),o.sequence&&t.add(o.sequence.id);for(let o of Object.values(l.containers))n.has(o.id)||(S(o).removeEventListener("scroll",y),S(o).removeEventListener("resize",y),delete l.containers[o.id]);for(let o of Object.values(l.sequences))t.has(o.id)||delete l.sequences[o.id]}function ne(){j=null,te();let e=V();for(let n of Object.values(l.elements)){let t=n.styles;e?(n.visible=n.revealed=n.seen=!0,g(n.node,M(t.inline.generated,t.opacity.computed,t.transform.final,"transition: none;"))):n.visible?(n.revealed=!0,g(n.node,M(t.inline.generated,t.opacity.computed,t.transform.final))):(n.revealed=!1,g(n.node,M(t.inline.generated,t.opacity.generated,t.transform.initial)))}if(!e){for(let n of Object.values(l.containers))S(n).addEventListener("scroll",y),S(n).addEventListener("resize",y);y()}}function oe(e,n={},t=!1){if(!p)return;let o=[],i=n.interval||0,r,s;try{if(i){let c=Math.abs(i);if(isNaN(c))throw new RangeError("Invalid sequence interval.");r={id:F(),interval:Math.max(c,16),members:[],blocked:{head:!1,foot:!1}}}let a=A(e);if(!a.length)throw new Error("Invalid reveal target.");s=[];for(let c of a){let h=c.getAttribute("data-sr-id"),b=h!==null?l.elements[Number(h)]:void 0,u=b?q({},b):{id:F(),node:c,seen:!1,revealed:!1,visible:!1};b&&g(c,b.styles.inline.computed);let v=q({},b?b.config:p,n);if(!v.mobile&&$()||!v.desktop&&!$()){b&&X(c);continue}let w=A(v.container)[0];if(!w)throw new Error("Invalid container.");if(!w.contains(c))continue;let d=[...o,...Object.values(l.containers)].find(f=>f.node===w)?.id;d===void 0&&(d=F(),o.push({id:d,node:w})),u.config=v,u.containerId=d,u.styles=pe(u),r&&(u.sequence={id:r.id,index:r.members.length},r.members.push(u.id)),s.push(u)}for(let c of s)l.elements[c.id]=c,c.node.setAttribute("data-sr-id",String(c.id))}catch(a){return D("Reveal failed.",a.message)}for(let a of o)l.containers[a.id]=a;r&&(l.sequences[r.id]=r),t||(l.history.push({target:e,options:n}),j&&clearTimeout(j),j=setTimeout(ne,0))}function X(e){let n=!1;for(let t of A(e)){let o=t.getAttribute("data-sr-id");if(o===null)continue;n=!0;let i=l.elements[Number(o)];i&&(i.timer&&clearTimeout(i.timer.clock),g(i.node,i.styles.inline.generated),delete l.elements[i.id]),t.removeAttribute("data-sr-id")}n&&te()}function xe(){for(let e of Object.values(l.elements))g(e.node,e.styles.inline.generated),e.node.removeAttribute("data-sr-id");for(let e of Object.values(l.containers))S(e).removeEventListener("scroll",y),S(e).removeEventListener("resize",y);R&&cancelAnimationFrame(R),R=0,l={containers:{},elements:{},history:[],sequences:{}}}function Me(){for(let e of l.history)oe(e.target,e.options,!0);ne()}var P=()=>(W()&&document.documentElement.classList.remove("sr"),{reveal(){},clean(){},destroy(){},sync(){},defaults:{},version:Z,noop:!0});function ie(){if(!W())return!1;let e=document.documentElement.style;return("transform"in e||"WebkitTransform"in e)&&("transition"in e||"WebkitTransition"in e)}function ke(){document.documentElement.classList.add("sr"),document.body?document.body.style.height="100%":document.addEventListener("DOMContentLoaded",()=>{document.body.style.height="100%"},{once:!0})}function Te(e={}){if(!W()||!ie())return P();let n;try{if(n=q({},p??ge(),e),!A(n.container)[0])throw new Error("Invalid container.")}catch(t){return D("Invalid configuration.",t.message),P()}return p=n,!p.mobile&&$()||!p.desktop&&!$()?(D("This device is disabled.",`desktop: ${p.desktop}`,`mobile: ${p.mobile}`),P()):(ke(),O||(O={reveal:(t,o)=>oe(t,o),clean:X,destroy:xe,sync:Me,get defaults(){return p},version:Z,noop:!1},Object.defineProperty(O,"delegate",{value:y})),O)}var Y=Te;Y.isSupported=ie;Object.defineProperty(Y,"debug",{get:()=>Q,set:e=>{typeof e=="boolean"&&(Q=e)}});var re=Y;function Le(e={}){let n=(0,T.useRef)(null),t=(0,T.useRef)(e);return t.current=e,(0,T.useEffect)(()=>{let o=n.current;if(!o)return;let{selector:i,...r}=t.current,s=i?Array.from(o.querySelectorAll(i)):o,a=re();return a.reveal(s,r),()=>a.clean(s)},[]),n}0&&(module.exports={useScrollReveal});
@@ -0,0 +1,58 @@
1
+ import { RefObject } from 'react';
2
+
3
+ interface ScrollRevealOptions {
4
+ delay?: number;
5
+ /** A length with a unit: `'20px'`, `'2em'`, `'50%'`. */
6
+ distance?: string;
7
+ duration?: number;
8
+ easing?: string;
9
+ /** Ms between members of a sequence. Only read from `reveal()` options. */
10
+ interval?: number;
11
+ /** Starting opacity; `null` leaves opacity alone. */
12
+ opacity?: number | null;
13
+ origin?: 'top' | 'right' | 'bottom' | 'left';
14
+ rotate?: {
15
+ x?: number;
16
+ y?: number;
17
+ z?: number;
18
+ };
19
+ scale?: number;
20
+ cleanup?: boolean;
21
+ container?: string | Element;
22
+ desktop?: boolean;
23
+ mobile?: boolean;
24
+ reset?: boolean;
25
+ useDelay?: 'always' | 'once' | 'onload';
26
+ viewFactor?: number;
27
+ viewOffset?: {
28
+ top?: number;
29
+ right?: number;
30
+ bottom?: number;
31
+ left?: number;
32
+ };
33
+ afterReset?: (el: Element) => void;
34
+ afterReveal?: (el: Element) => void;
35
+ beforeReset?: (el: Element) => void;
36
+ beforeReveal?: (el: Element) => void;
37
+ }
38
+
39
+ /**
40
+ * svg-scroll-draw/scrollreveal/react — the ScrollReveal drop-in for React.
41
+ *
42
+ * The usual ScrollReveal setup is one global `ScrollReveal().reveal('.card')` at
43
+ * start-up, which misses every component that mounts later (a route change, a
44
+ * list that loads) and never cleans up. This hook reveals the element its ref is
45
+ * on — or, with `selector`, that element's matching children, which is how an
46
+ * `interval` sequence is written — and cleans it on unmount.
47
+ *
48
+ * Options are read once, on mount. Defaults set with `ScrollReveal({ ... })`
49
+ * elsewhere still apply, as they would in ScrollReveal.
50
+ */
51
+
52
+ interface UseScrollRevealOptions extends ScrollRevealOptions {
53
+ /** Reveal the element's descendants matching this selector instead of the element itself. */
54
+ selector?: string;
55
+ }
56
+ declare function useScrollReveal<T extends Element = HTMLDivElement>(options?: UseScrollRevealOptions): RefObject<T>;
57
+
58
+ export { type UseScrollRevealOptions, useScrollReveal };
@@ -0,0 +1,58 @@
1
+ import { RefObject } from 'react';
2
+
3
+ interface ScrollRevealOptions {
4
+ delay?: number;
5
+ /** A length with a unit: `'20px'`, `'2em'`, `'50%'`. */
6
+ distance?: string;
7
+ duration?: number;
8
+ easing?: string;
9
+ /** Ms between members of a sequence. Only read from `reveal()` options. */
10
+ interval?: number;
11
+ /** Starting opacity; `null` leaves opacity alone. */
12
+ opacity?: number | null;
13
+ origin?: 'top' | 'right' | 'bottom' | 'left';
14
+ rotate?: {
15
+ x?: number;
16
+ y?: number;
17
+ z?: number;
18
+ };
19
+ scale?: number;
20
+ cleanup?: boolean;
21
+ container?: string | Element;
22
+ desktop?: boolean;
23
+ mobile?: boolean;
24
+ reset?: boolean;
25
+ useDelay?: 'always' | 'once' | 'onload';
26
+ viewFactor?: number;
27
+ viewOffset?: {
28
+ top?: number;
29
+ right?: number;
30
+ bottom?: number;
31
+ left?: number;
32
+ };
33
+ afterReset?: (el: Element) => void;
34
+ afterReveal?: (el: Element) => void;
35
+ beforeReset?: (el: Element) => void;
36
+ beforeReveal?: (el: Element) => void;
37
+ }
38
+
39
+ /**
40
+ * svg-scroll-draw/scrollreveal/react — the ScrollReveal drop-in for React.
41
+ *
42
+ * The usual ScrollReveal setup is one global `ScrollReveal().reveal('.card')` at
43
+ * start-up, which misses every component that mounts later (a route change, a
44
+ * list that loads) and never cleans up. This hook reveals the element its ref is
45
+ * on — or, with `selector`, that element's matching children, which is how an
46
+ * `interval` sequence is written — and cleans it on unmount.
47
+ *
48
+ * Options are read once, on mount. Defaults set with `ScrollReveal({ ... })`
49
+ * elsewhere still apply, as they would in ScrollReveal.
50
+ */
51
+
52
+ interface UseScrollRevealOptions extends ScrollRevealOptions {
53
+ /** Reveal the element's descendants matching this selector instead of the element itself. */
54
+ selector?: string;
55
+ }
56
+ declare function useScrollReveal<T extends Element = HTMLDivElement>(options?: UseScrollRevealOptions): RefObject<T>;
57
+
58
+ export { type UseScrollRevealOptions, useScrollReveal };
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import{useEffect as Re,useRef as ie}from"react";function Y(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches}var J="4.0.9",D=()=>typeof window<"u"&&typeof document<"u",C=e=>e!==null&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]";function j(e,...n){for(let t of n)if(C(t))for(let o of Object.keys(t)){let i=t[o];C(i)?(C(e[o])||(e[o]={}),j(e[o],i)):e[o]=i}return e}function q(e){if(typeof e=="string")try{return Array.from(document.querySelectorAll(e))}catch{return[]}return e instanceof Element?[e]:e&&typeof e.length=="number"?Array.from(e).filter(n=>n instanceof Element):[]}var A=(e=navigator.userAgent)=>/Android|iPhone|iPad|iPod/i.test(e),F=!1;function P(e,...n){F&&typeof console<"u"&&console.log(`%cScrollReveal: ${e}${n.map(t=>`
3
+ \u2014 ${t}`).join("")}`,"color: #ea654b;")}var k=()=>[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function re(e,n){let t=[];for(let o=0;o<4;o++)for(let i=0;i<4;i++){let r=0;for(let s=0;s<4;s++)r+=e[i+4*s]*n[4*o+s];t[i+4*o]=r}return t}function se(e){let n=/matrix(3d)?\(([^)]+)\)/.exec(e||"");if(!n)return k();let t=n[2].split(", ").map(parseFloat);if(t.length===16)return t;let o=k();return[o[0],o[1],o[4],o[5],o[12],o[13]]=t,o}function z(e,n){let t=Math.PI/180*n,o=Math.cos(t),i=Math.sin(t),r=k(),[s,a,c,h]=e==="x"?[5,10,6,9]:e==="y"?[0,10,8,2]:[0,5,1,4];return r[s]=r[a]=o,r[c]=i,r[h]=-i,r}function ae(e,n){let t=k();return t[e==="X"?12:13]=n,t}function le(e){let n=k();return n[0]=n[5]=e,n}function g(e,n){for(let t of n.split(";")){let o=t.indexOf(":");if(o<1)continue;let i=t.slice(0,o).trim(),r=t.slice(o+1).trim();i&&r&&e.style.setProperty(i,r)}}function ce(e){let{node:n,config:t}=e,o=window.getComputedStyle(n),i=(n.getAttribute("style")||"").match(/[\w-]+\s*:\s*[^;]+\s*/gi)||[],r=i.map(d=>d.trim()),s=`${r.join("; ")};`,a=i.some(d=>/visibility\s?:\s?visible/i.test(d))?s:`${[...r,"visibility: visible"].join("; ")};`,c=parseFloat(o.opacity),h=t.opacity!==null&&!isNaN(parseFloat(String(t.opacity)))?parseFloat(String(t.opacity)):c,b=c!==h?{computed:`opacity: ${c};`,generated:`opacity: ${h};`}:{computed:"",generated:""},u=[];if(parseFloat(t.distance)){let d=t.origin==="top"||t.origin==="bottom"?"Y":"X",f=t.distance;(t.origin==="top"||t.origin==="left")&&(f=f.startsWith("-")?f.slice(1):`-${f}`);let E=f.match(/(^-?\d+\.?\d?)|(em$|px$|%$)/g)||[],m=Number(E[0]),$=E[1],T;if($==="em")T=parseInt(o.fontSize,10)*m;else if($==="px")T=m;else if($==="%"){let X=n.getBoundingClientRect();T=(d==="Y"?X.height:X.width)*m/100}else throw new RangeError("Unrecognized or missing distance unit.");u.push(ae(d,T))}t.rotate.x&&u.push(z("x",t.rotate.x)),t.rotate.y&&u.push(z("y",t.rotate.y)),t.rotate.z&&u.push(z("z",t.rotate.z)),t.scale!==1&&u.push(le(t.scale===0?2e-4:t.scale));let v={initial:"",final:""};if(u.length){let d=se(o.transform);v={initial:`transform: matrix3d(${u.reduce(re,d).join(", ")});`,final:`transform: matrix3d(${d.join(", ")});`}}let w={delayed:"",instant:""};if(b.generated||v.initial){let d=m=>`${m/1e3}s`,f=[],E=m=>({delayed:`${m} ${d(t.duration)} ${t.easing} ${d(t.delay)}`,instant:`${m} ${d(t.duration)} ${t.easing} 0s`});o.transition&&!/all 0s|none 0s/.test(o.transition)&&f.push({delayed:o.transition,instant:o.transition}),b.generated&&f.push(E("opacity")),v.initial&&f.push(E("transform")),w={delayed:`transition: ${f.map(m=>m.delayed).join(", ")};`,instant:`transition: ${f.map(m=>m.instant).join(", ")};`}}return{inline:{computed:s,generated:a},opacity:b,position:o.position,transform:v,transition:w}}var M=(...e)=>e.filter(n=>n!=="").join(" "),de=()=>({delay:0,distance:"0",duration:600,easing:"cubic-bezier(0.5, 0, 0, 1)",interval:0,opacity:0,origin:"bottom",rotate:{x:0,y:0,z:0},scale:1,cleanup:!1,container:document.documentElement,desktop:!0,mobile:!0,reset:!1,useDelay:"always",viewFactor:0,viewOffset:{top:0,right:0,bottom:0,left:0},afterReset:()=>{},afterReveal:()=>{},beforeReset:()=>{},beforeReveal:()=>{}}),p=null,L=null,l={containers:{},elements:{},history:[],sequences:{}},G=!0,I=null,R=0,Q=!1,ue=0,H=()=>ue++;function U(e,n=!1){let t=e,o=n?t.clientHeight:t.offsetHeight,i=n?t.clientWidth:t.offsetWidth,r=0,s=0,a=t;for(;a;)isNaN(a.offsetTop)||(r+=a.offsetTop),isNaN(a.offsetLeft)||(s+=a.offsetLeft),a=a.offsetParent;return{bounds:{top:r,right:s+i,bottom:r+o,left:s},height:o,width:i}}var fe=e=>e.node===document.documentElement?{top:window.pageYOffset,left:window.pageXOffset}:{top:e.node.scrollTop,left:e.node.scrollLeft};function me(e){let n=l.containers[e.containerId];if(!n||!n.geometry||!n.scroll||!e.geometry)return!1;let t=Math.max(0,Math.min(1,e.config.viewFactor)),o=e.config.viewOffset,i=e.geometry,r={top:i.bounds.top+i.height*t,right:i.bounds.right-i.width*t,bottom:i.bounds.bottom-i.height*t,left:i.bounds.left+i.width*t},s={top:n.geometry.bounds.top+n.scroll.top+o.top,right:n.geometry.bounds.right+n.scroll.left-o.right,bottom:n.geometry.bounds.bottom+n.scroll.top-o.bottom,left:n.geometry.bounds.left+n.scroll.left+o.left};return r.top<s.bottom&&r.right>s.left&&r.bottom>s.top&&r.left<s.right||e.styles.position==="fixed"}function K(e,n=!1){let t=n?e.config.duration+e.config.delay:e.config.duration,o=0;e.timer&&(o=Date.now()-e.timer.start,clearTimeout(e.timer.clock)),(e.revealed?e.config.beforeReveal:e.config.beforeReset)(e.node),e.timer={start:Date.now(),clock:setTimeout(()=>{(e.revealed?e.config.afterReveal:e.config.afterReset)(e.node),e.timer=null,e.revealed&&!e.config.reset&&e.config.cleanup&&W(e.node)},t-o)}}function be(e,n){let t=e.styles;e.revealed=e.seen=!0,g(e.node,M(t.inline.generated,t.opacity.computed,t.transform.final,n?t.transition.delayed:t.transition.instant)),K(e,n)}function ve(e){let n=e.styles;e.revealed=!1,g(e.node,M(n.inline.generated,n.opacity.generated,n.transform.initial,n.transition.instant)),K(e)}function x(e,n={}){let t=n.pristine||G,o=e.config.useDelay,i=o==="always"||o==="onload"&&t||o==="once"&&!e.seen;if(n.reveal||e.visible&&!e.revealed)return be(e,i);if(n.reset||!e.visible&&e.revealed&&e.config.reset)return ve(e)}function V(e,n){let t=[],o=[],i=[];return e.members.forEach((r,s)=>{l.elements[r]?.[n]&&o.push(s)}),o.length&&e.members.forEach((r,s)=>{let a=l.elements[r];a&&!a[n]&&(s<o[0]?t:i).push(s)}),{head:t,body:o,foot:i}}function O(e,n,t,o){let i=t<0?"head":"foot",r=l.elements[e.members[n+t]];e.blocked[i]=!0,setTimeout(()=>{e.blocked[i]=!1,r&&Z(r,o)},e.interval)}function Z(e,n=G){if(!e.visible&&e.revealed&&e.config.reset)return x(e,{reset:!0});let t=e.sequence&&l.sequences[e.sequence.id];if(!t||!e.sequence)return;let o=e.sequence.index,i=V(t,"visible"),r=V(t,"revealed");if(!r.body.length){let a=i.body[0],c=l.elements[t.members[a]];if(c)return O(t,a,-1,n),O(t,a,1,n),x(c,{reveal:!0,pristine:n})}let s=a=>a[a.length-1];if(!t.blocked.head&&o===s(r.head)&&o>=(i.body[0]??1/0))return O(t,o,-1,n),x(e,{reveal:!0,pristine:n});if(!t.blocked.foot&&o===r.foot[0]&&o<=(s(i.body)??-1/0))return O(t,o,1,n),x(e,{reveal:!0,pristine:n})}function pe(){R=0;let e=Q;Q=!1;for(let t of Object.values(l.containers))(e||!t.geometry)&&(t.geometry=U(t.node,!0)),t.scroll=fe(t);let n=Object.values(l.elements);for(let t of n)(e||!t.geometry)&&(t.geometry=U(t.node)),t.visible=me(t);for(let t of n)t.sequence?Z(t):x(t);G=!1}function y(e){let n=e?e.type:"init";(n==="init"||n==="resize")&&(Q=!0),R||(R=requestAnimationFrame(pe))}var S=e=>e.node===document.documentElement?window:e.node;function _(){let e=new Set(Array.from(document.querySelectorAll("[data-sr-id]")).map(o=>parseInt(o.getAttribute("data-sr-id")||"",10)));for(let o of Object.values(l.elements))e.has(o.id)||delete l.elements[o.id];let n=new Set,t=new Set;for(let o of Object.values(l.elements))n.add(o.containerId),o.sequence&&t.add(o.sequence.id);for(let o of Object.values(l.containers))n.has(o.id)||(S(o).removeEventListener("scroll",y),S(o).removeEventListener("resize",y),delete l.containers[o.id]);for(let o of Object.values(l.sequences))t.has(o.id)||delete l.sequences[o.id]}function ee(){I=null,_();let e=Y();for(let n of Object.values(l.elements)){let t=n.styles;e?(n.visible=n.revealed=n.seen=!0,g(n.node,M(t.inline.generated,t.opacity.computed,t.transform.final,"transition: none;"))):n.visible?(n.revealed=!0,g(n.node,M(t.inline.generated,t.opacity.computed,t.transform.final))):(n.revealed=!1,g(n.node,M(t.inline.generated,t.opacity.generated,t.transform.initial)))}if(!e){for(let n of Object.values(l.containers))S(n).addEventListener("scroll",y),S(n).addEventListener("resize",y);y()}}function te(e,n={},t=!1){if(!p)return;let o=[],i=n.interval||0,r,s;try{if(i){let c=Math.abs(i);if(isNaN(c))throw new RangeError("Invalid sequence interval.");r={id:H(),interval:Math.max(c,16),members:[],blocked:{head:!1,foot:!1}}}let a=q(e);if(!a.length)throw new Error("Invalid reveal target.");s=[];for(let c of a){let h=c.getAttribute("data-sr-id"),b=h!==null?l.elements[Number(h)]:void 0,u=b?j({},b):{id:H(),node:c,seen:!1,revealed:!1,visible:!1};b&&g(c,b.styles.inline.computed);let v=j({},b?b.config:p,n);if(!v.mobile&&A()||!v.desktop&&!A()){b&&W(c);continue}let w=q(v.container)[0];if(!w)throw new Error("Invalid container.");if(!w.contains(c))continue;let d=[...o,...Object.values(l.containers)].find(f=>f.node===w)?.id;d===void 0&&(d=H(),o.push({id:d,node:w})),u.config=v,u.containerId=d,u.styles=ce(u),r&&(u.sequence={id:r.id,index:r.members.length},r.members.push(u.id)),s.push(u)}for(let c of s)l.elements[c.id]=c,c.node.setAttribute("data-sr-id",String(c.id))}catch(a){return P("Reveal failed.",a.message)}for(let a of o)l.containers[a.id]=a;r&&(l.sequences[r.id]=r),t||(l.history.push({target:e,options:n}),I&&clearTimeout(I),I=setTimeout(ee,0))}function W(e){let n=!1;for(let t of q(e)){let o=t.getAttribute("data-sr-id");if(o===null)continue;n=!0;let i=l.elements[Number(o)];i&&(i.timer&&clearTimeout(i.timer.clock),g(i.node,i.styles.inline.generated),delete l.elements[i.id]),t.removeAttribute("data-sr-id")}n&&_()}function ge(){for(let e of Object.values(l.elements))g(e.node,e.styles.inline.generated),e.node.removeAttribute("data-sr-id");for(let e of Object.values(l.containers))S(e).removeEventListener("scroll",y),S(e).removeEventListener("resize",y);R&&cancelAnimationFrame(R),R=0,l={containers:{},elements:{},history:[],sequences:{}}}function ye(){for(let e of l.history)te(e.target,e.options,!0);ee()}var N=()=>(D()&&document.documentElement.classList.remove("sr"),{reveal(){},clean(){},destroy(){},sync(){},defaults:{},version:J,noop:!0});function ne(){if(!D())return!1;let e=document.documentElement.style;return("transform"in e||"WebkitTransform"in e)&&("transition"in e||"WebkitTransition"in e)}function he(){document.documentElement.classList.add("sr"),document.body?document.body.style.height="100%":document.addEventListener("DOMContentLoaded",()=>{document.body.style.height="100%"},{once:!0})}function we(e={}){if(!D()||!ne())return N();let n;try{if(n=j({},p??de(),e),!q(n.container)[0])throw new Error("Invalid container.")}catch(t){return P("Invalid configuration.",t.message),N()}return p=n,!p.mobile&&A()||!p.desktop&&!A()?(P("This device is disabled.",`desktop: ${p.desktop}`,`mobile: ${p.mobile}`),N()):(he(),L||(L={reveal:(t,o)=>te(t,o),clean:W,destroy:ge,sync:ye,get defaults(){return p},version:J,noop:!1},Object.defineProperty(L,"delegate",{value:y})),L)}var B=we;B.isSupported=ne;Object.defineProperty(B,"debug",{get:()=>F,set:e=>{typeof e=="boolean"&&(F=e)}});var oe=B;function Te(e={}){let n=ie(null),t=ie(e);return t.current=e,Re(()=>{let o=n.current;if(!o)return;let{selector:i,...r}=t.current,s=i?Array.from(o.querySelectorAll(i)):o,a=oe();return a.reveal(s,r),()=>a.clean(s)},[]),n}export{Te as useScrollReveal};
@@ -32,18 +32,21 @@ interface ScrollDrawInstance {
32
32
  refresh?: () => void;
33
33
  }
34
34
 
35
- interface ScrollVideoOptions {
36
- trigger?: TriggerConfig;
37
- from?: number;
38
- to?: number;
35
+ interface ScrollTextOptions {
36
+ split?: 'chars' | 'words' | 'lines';
37
+ stagger?: number;
39
38
  easing?: EasingName | ((t: number) => number);
39
+ from?: {
40
+ opacity?: number;
41
+ y?: number;
42
+ x?: number;
43
+ rotate?: number;
44
+ scale?: number;
45
+ };
46
+ trigger?: TriggerConfig;
40
47
  once?: boolean;
41
- axis?: 'x' | 'y';
42
- preload?: 'auto' | 'metadata';
43
- onReady?: () => void;
44
48
  onComplete?: () => void;
45
- onProgress?: (alpha: number) => void;
46
49
  }
47
- declare function scrollVideo(target: string | HTMLVideoElement, options?: ScrollVideoOptions): ScrollDrawInstance;
50
+ declare function scrollText(target: string | Element, options?: ScrollTextOptions): ScrollDrawInstance;
48
51
 
49
- export { type ScrollVideoOptions, scrollVideo };
52
+ export { type ScrollTextOptions, scrollText };
@@ -32,18 +32,21 @@ interface ScrollDrawInstance {
32
32
  refresh?: () => void;
33
33
  }
34
34
 
35
- interface ScrollVideoOptions {
36
- trigger?: TriggerConfig;
37
- from?: number;
38
- to?: number;
35
+ interface ScrollTextOptions {
36
+ split?: 'chars' | 'words' | 'lines';
37
+ stagger?: number;
39
38
  easing?: EasingName | ((t: number) => number);
39
+ from?: {
40
+ opacity?: number;
41
+ y?: number;
42
+ x?: number;
43
+ rotate?: number;
44
+ scale?: number;
45
+ };
46
+ trigger?: TriggerConfig;
40
47
  once?: boolean;
41
- axis?: 'x' | 'y';
42
- preload?: 'auto' | 'metadata';
43
- onReady?: () => void;
44
48
  onComplete?: () => void;
45
- onProgress?: (alpha: number) => void;
46
49
  }
47
- declare function scrollVideo(target: string | HTMLVideoElement, options?: ScrollVideoOptions): ScrollDrawInstance;
50
+ declare function scrollText(target: string | Element, options?: ScrollTextOptions): ScrollDrawInstance;
48
51
 
49
- export { type ScrollVideoOptions, scrollVideo };
52
+ export { type ScrollTextOptions, scrollText };
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ "use strict";var p=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var x=(r,t)=>{for(var e in t)p(r,e,{get:t[e],enumerable:!0})},$=(r,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of R(t))!S.call(r,s)&&s!==e&&p(r,s,{get:()=>t[s],enumerable:!(n=L(t,s))||n.enumerable});return r};var A=r=>$(p({},"__esModule",{value:!0}),r);var D={};x(D,{useVivus:()=>P});module.exports=A(D);var u=require("react");function v(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches}var M=typeof __SVG_SCROLL_DRAW_DEV__<"u"?__SVG_SCROLL_DRAW_DEV__:typeof process<"u"&&typeof process.env<"u"&&process.env.NODE_ENV!=="production";function y(r,...t){M&&console.warn(`[svg-scroll-draw] ${r}`,...t)}var T=["delayed","sync","async","nsync","oneByOne","scenario","scenario-sync"],k=["inViewport","manual","autostart"];function d(r,t){let e=parseInt(r,10);return e>=0?e:t}function O(r){if(typeof window>"u")return!1;let t=window,e=n=>typeof t[n]=="function"&&r instanceof t[n];return e("SVGSVGElement")||e("SVGGElement")||r?.constructor===t.SVGElement}var b=["cx","cy","points","r","rx","ry","x","x1","x2","y","y1","y2"],C=["line","ellipse","circle","polygon","polyline","rect"],F="http://www.w3.org/2000/svg";function w(r){let t=r.points.trim().split(" ");if(r.points.indexOf(",")===-1){let n=[];for(let s=0;s<t.length;s+=2)n.push(`${t[s]},${t[s+1]}`);t=n}let e=`M${t[0]}`;for(let n=1;n<t.length;n++)t[n].indexOf(",")!==-1&&(e+=`L${t[n]}`);return e}function E(r,t,e,n){let s=parseFloat(e)||0,a=parseFloat(n)||0,i=parseFloat(r)||0,o=parseFloat(t)||0,l=i-s,h=i+s;return`M${l},${o}A${s},${a} 0,1,1 ${h},${o}A${s},${a} 0,1,1 ${l},${o}`}var I={line:r=>`M${r.x1||0},${r.y1||0}L${r.x2||0},${r.y2||0}`,rect(r){let t=parseFloat(r.x)||0,e=parseFloat(r.y)||0,n=parseFloat(r.width)||0,s=parseFloat(r.height)||0;if(r.rx||r.ry){let a=parseInt(r.rx,10)||-1,i=parseInt(r.ry,10)||-1;a=Math.min(Math.max(a<0?i:a,0),n/2),i=Math.min(Math.max(i<0?a:i,0),s/2);let o=`A ${a},${i},0,0,1,`;return`M ${t+a},${e} L ${t+n-a},${e} ${o}${t+n},${e+i} L ${t+n},${e+s-i} ${o}${t+n-a},${e+s} L ${t+a},${e+s} ${o}${t},${e+s-i} L ${t},${e+i} ${o}${t+a},${e}`}return`M${t} ${e} L${t+n} ${e} L${t+n} ${e+s} L${t} ${e+s} Z`},polyline:w,polygon:r=>`${w(r)}Z`,ellipse:r=>E(r.cx,r.cy,r.rx,r.ry),circle:r=>E(r.cx,r.cy,r.r,r.r)};function G(r){for(let t of Array.from(r.querySelectorAll(C.join(",")))){let e={};for(let{name:a,value:i}of Array.from(t.attributes)){if(b.indexOf(a)!==-1&&i.indexOf("%")!==-1)throw new Error("Pathformer [parseAttr]: a SVG shape got values in percentage. This cannot be transformed into 'path' tags. Please use 'viewBox'.");e[a]=i}let n=I[t.tagName.toLowerCase()](e),s=document.createElementNS(F,"path");for(let{name:a,value:i}of Array.from(t.attributes))b.indexOf(a)===-1&&s.setAttribute(a,i);s.setAttribute("d",n),t.parentNode?.replaceChild(s,t)}}var c=class c{constructor(t,e,n){this.isReady=!1;this.type="delayed";this.start="inViewport";this.duration=120;this.delay=null;this.dashGap=1;this.forceRender=!1;this.reverseStack=!1;this.selfDestroy=!1;this.ignoreInvisible=!1;this.animTimingFunction=c.LINEAR;this.pathTimingFunction=c.LINEAR;this.callback=()=>{};this.map=[];this.frameLength=0;this.currentFrame=0;this.delayUnit=0;this.speed=1;this.handle=null;this.instanceCallback=null;this.mustRecalcScale=null;this.viewportListener=null;this.setElement(t,e),this.setOptions(e),this.setCallback(n),this.isReady&&this.init()}setElement(t,e){if(t===void 0)throw new Error('Vivus [constructor]: "element" parameter is required');let n=t;if(typeof n=="string"){let s=document.getElementById(n);if(!s)throw new Error('Vivus [constructor]: "element" parameter is not related to an existing ID');n=s}if(this.parentEl=n,e&&e.file){let s=new XMLHttpRequest;s.addEventListener("load",()=>{let a=document.createElement("div");a.innerHTML=s.responseText;let i=a.querySelector("svg");if(!i)throw new Error(`Vivus [load]: Cannot find the SVG in the loaded file : ${e.file}`);this.el=i,i.setAttribute("width","100%"),i.setAttribute("height","100%"),this.parentEl.appendChild(i),this.isReady=!0,this.init()}),s.open("GET",e.file),s.send();return}if(O(n)){this.el=n,this.isReady=!0;return}if(n instanceof HTMLObjectElement){let s=n,a=i=>{if(this.isReady)return;let o=s.contentDocument&&s.contentDocument.querySelector("svg");if(!o&&i)throw new Error("Vivus [constructor]: object loaded does not contain any SVG");o&&(s.getAttribute("built-by-vivus")&&(this.parentEl.insertBefore(o,s),this.parentEl.removeChild(s),o.setAttribute("width","100%"),o.setAttribute("height","100%")),this.el=o,this.isReady=!0,this.init())};a(),this.isReady||s.addEventListener("load",a);return}throw new Error('Vivus [constructor]: "element" parameter is not valid (or miss the "file" attribute)')}setOptions(t){if(t!==void 0&&(t===null||t.constructor!==Object))throw new Error('Vivus [constructor]: "options" parameter must be an object');let e=t||{};if(e.type&&T.indexOf(e.type)===-1)throw new Error(`Vivus [constructor]: ${e.type} is not an existing animation \`type\``);if(e.start&&k.indexOf(e.start)===-1)throw new Error(`Vivus [constructor]: ${e.start} is not an existing \`start\` option`);this.type=e.type||"delayed",this.start=e.start||"inViewport";let n=navigator.userAgent,s=n.indexOf("MSIE")!==-1||n.indexOf("Trident/")!==-1||n.indexOf("Edge/")!==-1;if(this.duration=d(e.duration,120),this.delay=d(e.delay,null),this.dashGap=d(e.dashGap,1),this.forceRender=Object.prototype.hasOwnProperty.call(e,"forceRender")?!!e.forceRender:s,this.reverseStack=!!e.reverseStack,this.selfDestroy=!!e.selfDestroy,this.onReady=e.onReady,this.map=[],this.ignoreInvisible=Object.prototype.hasOwnProperty.call(e,"ignoreInvisible")?!!e.ignoreInvisible:!1,this.animTimingFunction=e.animTimingFunction||c.LINEAR,this.pathTimingFunction=e.pathTimingFunction||c.LINEAR,this.delay!==null&&this.delay>=this.duration)throw new Error("Vivus [constructor]: delay must be shorter than duration")}setCallback(t){if(t&&typeof t!="function")throw new Error('Vivus [constructor]: "callback" parameter must be a function');this.callback=t||(()=>{})}mapping(){let t=0,e=0,n=0,s=!1,a=Array.from(this.el.querySelectorAll("path"));a.forEach((i,o)=>{if(this.isInvisible(i))return;let l={el:i,length:0,startAt:0,duration:0,isResizeSensitive:!1},h=1;if(i.getAttribute("vector-effect")==="non-scaling-stroke"){let f=i.getBoundingClientRect(),m=i.getBBox();h=Math.max(f.width/m.width,f.height/m.height),l.isResizeSensitive=!0,s=!0}if(l.length=Math.ceil(i.getTotalLength()*h),isNaN(l.length)){y("vivus: cannot retrieve a path element length",i);return}this.map.push(l),i.style.strokeDasharray=`${l.length} ${l.length+this.dashGap*2}`,i.style.strokeDashoffset=String(l.length+this.dashGap),l.length+=this.dashGap,e+=l.length,this.renderPath(o)}),s&&y("vivus: this SVG contains non-scaling-strokes. Call instance.recalc() when the SVG is resized."),e=e===0?1:e,this.delay=this.delay===null?this.duration/3:this.delay,this.delayUnit=this.delay/(a.length>1?a.length-1:1),this.reverseStack&&this.map.reverse(),this.map.forEach((i,o)=>{let l=()=>{let h={};for(let{name:f,value:m}of Array.from(i.el.attributes))h[f]=m;return h};switch(this.type){case"delayed":i.startAt=this.delayUnit*o,i.duration=this.duration-this.delay;break;case"oneByOne":i.startAt=n/e*this.duration,i.duration=i.length/e*this.duration;break;case"sync":case"async":case"nsync":i.startAt=0,i.duration=this.duration;break;case"scenario-sync":{let h=l();i.startAt=t+(d(h["data-delay"],this.delayUnit)||0),i.duration=d(h["data-duration"],this.duration),t=h["data-async"]!==void 0?i.startAt:i.startAt+i.duration,this.frameLength=Math.max(this.frameLength,i.startAt+i.duration);break}case"scenario":{let h=l();i.startAt=d(h["data-start"],this.delayUnit)||0,i.duration=d(h["data-duration"],this.duration),this.frameLength=Math.max(this.frameLength,i.startAt+i.duration);break}}n+=i.length,this.frameLength=this.frameLength||this.duration})}recalc(){this.mustRecalcScale||(this.mustRecalcScale=requestAnimationFrame(()=>this.performLineRecalc()))}performLineRecalc(){for(let t of this.map){if(!t.isResizeSensitive)continue;let e=t.el.getBoundingClientRect(),n=t.el.getBBox(),s=Math.max(e.width/n.width,e.height/n.height);t.length=Math.ceil(t.el.getTotalLength()*s),t.el.style.strokeDasharray=`${t.length} ${t.length+this.dashGap*2}`}this.trace(),this.mustRecalcScale=null}draw(){if(this.currentFrame+=this.speed,this.currentFrame<=0)this.stop(),this.reset();else if(this.currentFrame>=this.frameLength)this.stop(),this.currentFrame=this.frameLength,this.trace(),this.selfDestroy&&this.destroy();else{this.trace(),this.handle=requestAnimationFrame(()=>this.draw());return}this.finished()}finished(){if(this.callback(this),this.instanceCallback){let t=this.instanceCallback;this.instanceCallback=null,t(this)}}trace(){let t=this.animTimingFunction(this.currentFrame/this.frameLength)*this.frameLength;this.map.forEach((e,n)=>{let s=this.pathTimingFunction(Math.max(0,Math.min(1,(t-e.startAt)/e.duration)));e.progress!==s&&(e.progress=s,e.el.style.strokeDashoffset=String(Math.floor(e.length*(1-s))),this.renderPath(n))})}renderPath(t){let e=this.forceRender&&this.map&&this.map[t];if(!e)return;let n=e.el.cloneNode(!0);e.el.parentNode?.replaceChild(n,e.el),e.el=n}init(){this.frameLength=0,this.currentFrame=0,this.map=[],G(this.el),this.mapping(),this.starter(),this.onReady&&this.onReady(this)}starter(){if(this.start==="manual")return;if(this.start==="autostart"){this.play();return}let t=()=>{this.isInViewport(this.parentEl,1)&&(this.play(),window.removeEventListener("scroll",t),this.viewportListener=null)};this.viewportListener=t,window.addEventListener("scroll",t),t()}getStatus(){return this.currentFrame===0?"start":this.currentFrame===this.frameLength?"end":"progress"}reset(){return this.setFrameProgress(0)}finish(){return this.setFrameProgress(1)}setFrameProgress(t){let e=Math.min(1,Math.max(0,t));return this.currentFrame=Math.round(this.frameLength*e),this.trace(),this}play(t,e){this.instanceCallback=null;let n=t;if(n&&typeof n=="function")this.instanceCallback=n,n=void 0;else if(n&&typeof n!="number")throw new Error("Vivus [play]: invalid speed");return e&&typeof e=="function"&&!this.instanceCallback&&(this.instanceCallback=e),this.speed=n||1,v()?(this.stop(),this.currentFrame=this.speed<0?0:this.frameLength,this.trace(),this.speed>0&&this.selfDestroy&&this.destroy(),this.finished(),this):(this.handle||this.draw(),this)}stop(){return this.handle&&(cancelAnimationFrame(this.handle),this.handle=null),this}destroy(){this.stop(),this.viewportListener&&(window.removeEventListener("scroll",this.viewportListener),this.viewportListener=null),this.map.forEach((t,e)=>{t.el.style.strokeDashoffset="",t.el.style.strokeDasharray="",this.renderPath(e)})}isInvisible(t){let e=t.getAttribute("data-ignore");if(e!==null)return e!=="false";if(this.ignoreInvisible){let n=t.getBoundingClientRect();return!n.width&&!n.height}return!1}isInViewport(t,e=0){let n=window.pageYOffset||document.documentElement.scrollTop,s=n+Math.max(document.documentElement.clientHeight,window.innerHeight),a=t.getBoundingClientRect(),i=n+a.top;return i+a.height*(e||0)<=s&&i+a.height>=n}};c.LINEAR=t=>t,c.EASE=t=>-Math.cos(t*Math.PI)/2+.5,c.EASE_OUT=t=>1-Math.pow(1-t,3),c.EASE_IN=t=>Math.pow(t,3),c.EASE_OUT_BOUNCE=t=>{let e=-Math.cos(t*(.5*Math.PI))+1,n=Math.pow(e,1.5),s=Math.pow(1-t,2),a=-Math.abs(Math.cos(n*(2.5*Math.PI)))+1;return 1-s+a*s};var g=c,V=g;function P(r={},t){let e=(0,u.useRef)(null),[n,s]=(0,u.useState)(null),a=(0,u.useRef)(r),i=(0,u.useRef)(t);return a.current=r,i.current=t,(0,u.useEffect)(()=>{if(!e.current)return;let o=new V(e.current,a.current,l=>i.current?.(l));return s(o),()=>{o.destroy(),s(null)}},[]),[e,n]}0&&(module.exports={useVivus});