@cosmictraveler002/anim-kit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1033 -0
  3. package/dist/anim-kit.standalone.js +117 -0
  4. package/dist/anim-kit.standalone.js.map +1 -0
  5. package/dist/core/gsap.d.ts +44 -0
  6. package/dist/core/gsap.d.ts.map +1 -0
  7. package/dist/core/gsap.js +71 -0
  8. package/dist/core/gsap.js.map +1 -0
  9. package/dist/core/guard.d.ts +3 -0
  10. package/dist/core/guard.d.ts.map +1 -0
  11. package/dist/core/guard.js +18 -0
  12. package/dist/core/guard.js.map +1 -0
  13. package/dist/core/smooth-scroll.d.ts +45 -0
  14. package/dist/core/smooth-scroll.d.ts.map +1 -0
  15. package/dist/core/smooth-scroll.js +98 -0
  16. package/dist/core/smooth-scroll.js.map +1 -0
  17. package/dist/core/split.d.ts +24 -0
  18. package/dist/core/split.d.ts.map +1 -0
  19. package/dist/core/split.js +117 -0
  20. package/dist/core/split.js.map +1 -0
  21. package/dist/core/types.d.ts +21 -0
  22. package/dist/core/types.d.ts.map +1 -0
  23. package/dist/core/types.js +9 -0
  24. package/dist/core/types.js.map +1 -0
  25. package/dist/core/util.d.ts +19 -0
  26. package/dist/core/util.d.ts.map +1 -0
  27. package/dist/core/util.js +73 -0
  28. package/dist/core/util.js.map +1 -0
  29. package/dist/effects/counter.d.ts +52 -0
  30. package/dist/effects/counter.d.ts.map +1 -0
  31. package/dist/effects/counter.js +106 -0
  32. package/dist/effects/counter.js.map +1 -0
  33. package/dist/effects/cursor-follower.d.ts +19 -0
  34. package/dist/effects/cursor-follower.d.ts.map +1 -0
  35. package/dist/effects/cursor-follower.js +76 -0
  36. package/dist/effects/cursor-follower.js.map +1 -0
  37. package/dist/effects/drag-strip.d.ts +17 -0
  38. package/dist/effects/drag-strip.d.ts.map +1 -0
  39. package/dist/effects/drag-strip.js +186 -0
  40. package/dist/effects/drag-strip.js.map +1 -0
  41. package/dist/effects/hero-shrink.d.ts +15 -0
  42. package/dist/effects/hero-shrink.d.ts.map +1 -0
  43. package/dist/effects/hero-shrink.js +40 -0
  44. package/dist/effects/hero-shrink.js.map +1 -0
  45. package/dist/effects/horizontal-scroll.d.ts +17 -0
  46. package/dist/effects/horizontal-scroll.d.ts.map +1 -0
  47. package/dist/effects/horizontal-scroll.js +87 -0
  48. package/dist/effects/horizontal-scroll.js.map +1 -0
  49. package/dist/effects/line-reveal.d.ts +34 -0
  50. package/dist/effects/line-reveal.d.ts.map +1 -0
  51. package/dist/effects/line-reveal.js +71 -0
  52. package/dist/effects/line-reveal.js.map +1 -0
  53. package/dist/effects/liquid-button.d.ts +19 -0
  54. package/dist/effects/liquid-button.d.ts.map +1 -0
  55. package/dist/effects/liquid-button.js +52 -0
  56. package/dist/effects/liquid-button.js.map +1 -0
  57. package/dist/effects/logo-reveal.d.ts +15 -0
  58. package/dist/effects/logo-reveal.d.ts.map +1 -0
  59. package/dist/effects/logo-reveal.js +49 -0
  60. package/dist/effects/logo-reveal.js.map +1 -0
  61. package/dist/effects/marquee.d.ts +13 -0
  62. package/dist/effects/marquee.d.ts.map +1 -0
  63. package/dist/effects/marquee.js +143 -0
  64. package/dist/effects/marquee.js.map +1 -0
  65. package/dist/effects/mask-reveal.d.ts +36 -0
  66. package/dist/effects/mask-reveal.d.ts.map +1 -0
  67. package/dist/effects/mask-reveal.js +102 -0
  68. package/dist/effects/mask-reveal.js.map +1 -0
  69. package/dist/effects/menu-overlay.d.ts +32 -0
  70. package/dist/effects/menu-overlay.d.ts.map +1 -0
  71. package/dist/effects/menu-overlay.js +150 -0
  72. package/dist/effects/menu-overlay.js.map +1 -0
  73. package/dist/effects/nav-hide.d.ts +13 -0
  74. package/dist/effects/nav-hide.d.ts.map +1 -0
  75. package/dist/effects/nav-hide.js +68 -0
  76. package/dist/effects/nav-hide.js.map +1 -0
  77. package/dist/effects/parallax.d.ts +11 -0
  78. package/dist/effects/parallax.d.ts.map +1 -0
  79. package/dist/effects/parallax.js +48 -0
  80. package/dist/effects/parallax.js.map +1 -0
  81. package/dist/effects/preloader.d.ts +33 -0
  82. package/dist/effects/preloader.d.ts.map +1 -0
  83. package/dist/effects/preloader.js +128 -0
  84. package/dist/effects/preloader.js.map +1 -0
  85. package/dist/effects/scatter-text.d.ts +20 -0
  86. package/dist/effects/scatter-text.d.ts.map +1 -0
  87. package/dist/effects/scatter-text.js +87 -0
  88. package/dist/effects/scatter-text.js.map +1 -0
  89. package/dist/effects/stacked-cards.d.ts +24 -0
  90. package/dist/effects/stacked-cards.d.ts.map +1 -0
  91. package/dist/effects/stacked-cards.js +106 -0
  92. package/dist/effects/stacked-cards.js.map +1 -0
  93. package/dist/effects/theme-reveal.d.ts +35 -0
  94. package/dist/effects/theme-reveal.d.ts.map +1 -0
  95. package/dist/effects/theme-reveal.js +93 -0
  96. package/dist/effects/theme-reveal.js.map +1 -0
  97. package/dist/index.d.ts +77 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +61 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/styles/anim-kit.css +361 -0
  102. package/package.json +80 -0
  103. package/src/core/gsap.ts +79 -0
  104. package/src/core/guard.ts +18 -0
  105. package/src/core/smooth-scroll.ts +143 -0
  106. package/src/core/split.ts +145 -0
  107. package/src/core/types.ts +30 -0
  108. package/src/core/util.ts +79 -0
  109. package/src/effects/counter.ts +192 -0
  110. package/src/effects/cursor-follower.ts +104 -0
  111. package/src/effects/drag-strip.ts +228 -0
  112. package/src/effects/hero-shrink.ts +69 -0
  113. package/src/effects/horizontal-scroll.ts +123 -0
  114. package/src/effects/line-reveal.ts +109 -0
  115. package/src/effects/liquid-button.ts +75 -0
  116. package/src/effects/logo-reveal.ts +76 -0
  117. package/src/effects/marquee.ts +157 -0
  118. package/src/effects/mask-reveal.ts +148 -0
  119. package/src/effects/menu-overlay.ts +218 -0
  120. package/src/effects/nav-hide.ts +90 -0
  121. package/src/effects/parallax.ts +68 -0
  122. package/src/effects/preloader.ts +187 -0
  123. package/src/effects/scatter-text.ts +129 -0
  124. package/src/effects/stacked-cards.ts +154 -0
  125. package/src/effects/theme-reveal.ts +144 -0
  126. package/src/index.ts +98 -0
  127. package/src/styles/anim-kit.css +361 -0
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Central GSAP bootstrap: registers every plugin anim-kit touches, and the
3
+ * custom eases that give the DZ!NR feel.
4
+ *
5
+ * Importing this module twice is safe — registration is idempotent.
6
+ */
7
+ import { gsap } from "gsap";
8
+ import { ScrollTrigger } from "gsap/ScrollTrigger";
9
+ import { SplitText } from "gsap/SplitText";
10
+ import { Draggable } from "gsap/Draggable";
11
+ import { CustomEase } from "gsap/CustomEase";
12
+ import { ScrollSmoother } from "gsap/ScrollSmoother";
13
+ import type { TargetLike } from "./types.js";
14
+ export { gsap, ScrollTrigger, SplitText, Draggable, CustomEase, ScrollSmoother };
15
+ /** Named eases recovered from dzinrstudio.com's bundles. */
16
+ export declare const EASES: {
17
+ /** `.76,0,.2,1` — the studio's signature menu / nav curtain ease. */
18
+ readonly curtain: "ak-curtain";
19
+ /** SVG path used for the stacked service-card cascade. */
20
+ readonly cardStack: "ak-card-stack";
21
+ /** `.165,.84,.44,1` — their headline mask reveal. */
22
+ readonly reveal: "ak-reveal";
23
+ /** `.895,.03,.685,.22` — preloader logo scale-out. */
24
+ readonly preloadOut: "ak-preload-out";
25
+ };
26
+ /** Register all plugins + custom eases exactly once. */
27
+ export declare function initGSAP(): void;
28
+ /**
29
+ * Kill every tween that animates `target`.
30
+ *
31
+ * Deliberately **not** `gsap.killTweensOf()`. That forwards to
32
+ * `tween.kill(targets, …)`, which walks each tween's *initialised*
33
+ * prop-tween lookup — but a tween created between ticker frames is still
34
+ * lazy (`_initted === false`), its lookup is empty, and the kill silently
35
+ * no-ops. Such a tween then fires *after* teardown (e.g. an equaliser batch
36
+ * rewriting `height` post-destroy). The no-arg `tween.kill()` takes the
37
+ * full-kill path and removes both initialised and lazy tweens from the
38
+ * timeline.
39
+ *
40
+ * Internal helper — effects import it from `core/gsap.js`; it is not part of
41
+ * the public barrel.
42
+ */
43
+ export declare function killTweens(target: TargetLike | Array<Element | null | undefined>): void;
44
+ //# sourceMappingURL=gsap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gsap.d.ts","sourceRoot":"","sources":["../../src/core/gsap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;AAEjF,4DAA4D;AAC5D,eAAO,MAAM,KAAK;IAChB,qEAAqE;;IAErE,0DAA0D;;IAE1D,qDAAqD;;IAErD,sDAAsD;;CAE9C,CAAC;AAIX,wDAAwD;AACxD,wBAAgB,QAAQ,IAAI,IAAI,CAuB/B;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,IAAI,CAIvF"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Central GSAP bootstrap: registers every plugin anim-kit touches, and the
3
+ * custom eases that give the DZ!NR feel.
4
+ *
5
+ * Importing this module twice is safe — registration is idempotent.
6
+ */
7
+ import { gsap } from "gsap";
8
+ import { ScrollTrigger } from "gsap/ScrollTrigger";
9
+ import { SplitText } from "gsap/SplitText";
10
+ import { Draggable } from "gsap/Draggable";
11
+ import { CustomEase } from "gsap/CustomEase";
12
+ import { ScrollSmoother } from "gsap/ScrollSmoother";
13
+ import { toArray } from "./util.js";
14
+ export { gsap, ScrollTrigger, SplitText, Draggable, CustomEase, ScrollSmoother };
15
+ /** Named eases recovered from dzinrstudio.com's bundles. */
16
+ export const EASES = {
17
+ /** `.76,0,.2,1` — the studio's signature menu / nav curtain ease. */
18
+ curtain: "ak-curtain",
19
+ /** SVG path used for the stacked service-card cascade. */
20
+ cardStack: "ak-card-stack",
21
+ /** `.165,.84,.44,1` — their headline mask reveal. */
22
+ reveal: "ak-reveal",
23
+ /** `.895,.03,.685,.22` — preloader logo scale-out. */
24
+ preloadOut: "ak-preload-out",
25
+ };
26
+ let initted = false;
27
+ /** Register all plugins + custom eases exactly once. */
28
+ export function initGSAP() {
29
+ if (initted || typeof window === "undefined")
30
+ return;
31
+ initted = true;
32
+ gsap.registerPlugin(ScrollTrigger, SplitText, Draggable, CustomEase);
33
+ // ScrollSmoother is a bonus for people who prefer it over Lenis; it is only
34
+ // registered so `ScrollSmoother.create()` works if you call it yourself.
35
+ try {
36
+ gsap.registerPlugin(ScrollSmoother);
37
+ }
38
+ catch {
39
+ /* not fatal — smoother is optional */
40
+ }
41
+ if (!CustomEase.get(EASES.curtain)) {
42
+ CustomEase.create(EASES.curtain, ".76,0,.2,1");
43
+ CustomEase.create(EASES.cardStack, "M0,0 C0,0 0.098,0.613 0.5,0.5 0.899,0.386 1,1 1,1");
44
+ CustomEase.create(EASES.reveal, ".165,.84,.44,1");
45
+ CustomEase.create(EASES.preloadOut, ".895,.03,.685,.22");
46
+ }
47
+ // Keep ScrollTrigger honest when images/fonts land late.
48
+ ScrollTrigger.config({ ignoreMobileResize: true });
49
+ }
50
+ initGSAP();
51
+ /**
52
+ * Kill every tween that animates `target`.
53
+ *
54
+ * Deliberately **not** `gsap.killTweensOf()`. That forwards to
55
+ * `tween.kill(targets, …)`, which walks each tween's *initialised*
56
+ * prop-tween lookup — but a tween created between ticker frames is still
57
+ * lazy (`_initted === false`), its lookup is empty, and the kill silently
58
+ * no-ops. Such a tween then fires *after* teardown (e.g. an equaliser batch
59
+ * rewriting `height` post-destroy). The no-arg `tween.kill()` takes the
60
+ * full-kill path and removes both initialised and lazy tweens from the
61
+ * timeline.
62
+ *
63
+ * Internal helper — effects import it from `core/gsap.js`; it is not part of
64
+ * the public barrel.
65
+ */
66
+ export function killTweens(target) {
67
+ const raw = Array.isArray(target) ? target : toArray(target);
68
+ const list = raw.filter((el) => el instanceof Element);
69
+ gsap.getTweensOf(list).forEach((t) => t.kill());
70
+ }
71
+ //# sourceMappingURL=gsap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gsap.js","sourceRoot":"","sources":["../../src/core/gsap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;AAEjF,4DAA4D;AAC5D,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,qEAAqE;IACrE,OAAO,EAAE,YAAY;IACrB,0DAA0D;IAC1D,SAAS,EAAE,eAAe;IAC1B,qDAAqD;IACrD,MAAM,EAAE,WAAW;IACnB,sDAAsD;IACtD,UAAU,EAAE,gBAAgB;CACpB,CAAC;AAEX,IAAI,OAAO,GAAG,KAAK,CAAC;AAEpB,wDAAwD;AACxD,MAAM,UAAU,QAAQ;IACtB,IAAI,OAAO,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IACrD,OAAO,GAAG,IAAI,CAAC;IAEf,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAErE,4EAA4E;IAC5E,yEAAyE;IACzE,IAAI,CAAC;QACH,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC/C,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,mDAAmD,CAAC,CAAC;QACxF,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAClD,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;IAC3D,CAAC;IAED,yDAAyD;IACzD,aAAa,CAAC,MAAM,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,QAAQ,EAAE,CAAC;AAEX;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,UAAU,CAAC,MAAsD;IAC/E,MAAM,GAAG,GAAsC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAChG,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAiB,EAAE,CAAC,EAAE,YAAY,OAAO,CAAC,CAAC;IACtE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CommonOptions, Destroy } from "./types.js";
2
+ export declare function guard(options: CommonOptions, run: () => Destroy): Destroy;
3
+ //# sourceMappingURL=guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/core/guard.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEzD,wBAAgB,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,OAAO,GAAG,OAAO,CAIzE"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Reduced-motion helper.
3
+ *
4
+ * Every effect calls `guard(options, run)`.
5
+ * - normal motion -> runs `run()` and returns its destroy fn
6
+ * - reduced motion -> returns a no-op so nothing animates. Effects that need
7
+ * content visible in both states should render the final
8
+ * state in CSS (see styles/anim-kit.css).
9
+ */
10
+ import { initGSAP } from "./gsap.js";
11
+ import { prefersReducedMotion } from "./util.js";
12
+ export function guard(options, run) {
13
+ initGSAP();
14
+ if (prefersReducedMotion() && !options.force)
15
+ return () => { };
16
+ return run();
17
+ }
18
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/core/guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAGjD,MAAM,UAAU,KAAK,CAAC,OAAsB,EAAE,GAAkB;IAC9D,QAAQ,EAAE,CAAC;IACX,IAAI,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAC9D,OAAO,GAAG,EAAE,CAAC;AACf,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Lenis smooth scrolling wired into GSAP ScrollTrigger.
3
+ *
4
+ * Uses the canonical Lenis + GSAP recipe:
5
+ * lenis.on("scroll", ScrollTrigger.update)
6
+ * gsap.ticker.add(t => lenis.raf(t * 1000))
7
+ * gsap.ticker.lagSmoothing(0)
8
+ *
9
+ * Driving Lenis from GSAP's ticker (rather than its own rAF) keeps both
10
+ * clocks on the same frame, which is what stops ScrollTrigger from stuttering.
11
+ *
12
+ * `useScrollerProxy: true` additionally proxies `document.documentElement`,
13
+ * matching dzinrstudio.com's setup — only needed if you scroll a nested
14
+ * element instead of the window.
15
+ */
16
+ import Lenis from "lenis";
17
+ import type { CommonOptions, Destroy } from "./types.js";
18
+ export interface SmoothScrollOptions extends CommonOptions {
19
+ /** Interpolation factor — lower = floatier. @default 0.08 */
20
+ lerp?: number;
21
+ /** Smooth mouse-wheel input. @default true */
22
+ smoothWheel?: boolean;
23
+ /** Smooth touch input (can fight native scrolling). @default false */
24
+ smoothTouch?: boolean;
25
+ /** Direction to smooth. @default "vertical" */
26
+ orientation?: "vertical" | "horizontal";
27
+ /** Initial scroll position in px. @default 0 */
28
+ initialScroll?: number;
29
+ /** Proxy documentElement through ScrollTrigger (nested scrollers). @default false */
30
+ useScrollerProxy?: boolean;
31
+ }
32
+ export interface SmoothScrollHandle {
33
+ /** The Lenis instance, or null when smooth scrolling was skipped. */
34
+ lenis: Lenis | null;
35
+ /** Programmatic scroll that respects the smooth scroller. */
36
+ scrollTo: (target: number | string | HTMLElement, opts?: {
37
+ duration?: number;
38
+ immediate?: boolean;
39
+ }) => void;
40
+ /** True when Lenis is actually driving the page. */
41
+ active: boolean;
42
+ destroy: Destroy;
43
+ }
44
+ export declare function smoothScroll(options?: SmoothScrollOptions): SmoothScrollHandle;
45
+ //# sourceMappingURL=smooth-scroll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smooth-scroll.d.ts","sourceRoot":"","sources":["../../src/core/smooth-scroll.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACxC,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,qEAAqE;IACrE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,6DAA6D;IAC7D,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC7G,oDAAoD;IACpD,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AASD,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,kBAAkB,CA0FlF"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Lenis smooth scrolling wired into GSAP ScrollTrigger.
3
+ *
4
+ * Uses the canonical Lenis + GSAP recipe:
5
+ * lenis.on("scroll", ScrollTrigger.update)
6
+ * gsap.ticker.add(t => lenis.raf(t * 1000))
7
+ * gsap.ticker.lagSmoothing(0)
8
+ *
9
+ * Driving Lenis from GSAP's ticker (rather than its own rAF) keeps both
10
+ * clocks on the same frame, which is what stops ScrollTrigger from stuttering.
11
+ *
12
+ * `useScrollerProxy: true` additionally proxies `document.documentElement`,
13
+ * matching dzinrstudio.com's setup — only needed if you scroll a nested
14
+ * element instead of the window.
15
+ */
16
+ import Lenis from "lenis";
17
+ import { gsap, ScrollTrigger, initGSAP } from "./gsap.js";
18
+ import { prefersReducedMotion } from "./util.js";
19
+ const INERT = {
20
+ lenis: null,
21
+ scrollTo: () => { },
22
+ active: false,
23
+ destroy: () => { },
24
+ };
25
+ export function smoothScroll(options = {}) {
26
+ initGSAP();
27
+ const { force = false, lerp = 0.08, smoothWheel = true, smoothTouch = false, orientation = "vertical", initialScroll = 0, useScrollerProxy = false, } = options;
28
+ if (typeof window === "undefined")
29
+ return INERT;
30
+ // Honour the OS-level preference: fall back to native scrolling.
31
+ if (prefersReducedMotion() && !force)
32
+ return INERT;
33
+ const lenis = new Lenis({
34
+ lerp,
35
+ smoothWheel,
36
+ syncTouch: smoothTouch,
37
+ orientation,
38
+ autoRaf: false,
39
+ });
40
+ if (initialScroll)
41
+ lenis.scrollTo(initialScroll, { immediate: true });
42
+ // 1. Let ScrollTrigger know whenever Lenis moves.
43
+ const onScroll = () => ScrollTrigger.update();
44
+ lenis.on("scroll", onScroll);
45
+ // 2. Run Lenis off GSAP's ticker so both share one frame clock.
46
+ const tick = (time) => lenis.raf(time * 1000);
47
+ gsap.ticker.add(tick);
48
+ gsap.ticker.lagSmoothing(0);
49
+ // 3. Optional: proxy the scroller (for nested/element scrollers).
50
+ if (useScrollerProxy) {
51
+ ScrollTrigger.scrollerProxy(document.documentElement, {
52
+ scrollTop(value) {
53
+ if (arguments.length && typeof value === "number") {
54
+ lenis.scrollTo(value, { immediate: true });
55
+ return value;
56
+ }
57
+ return lenis.scroll;
58
+ },
59
+ getBoundingClientRect: () => ({
60
+ top: 0,
61
+ left: 0,
62
+ width: window.innerWidth,
63
+ height: window.innerHeight,
64
+ }),
65
+ // Lenis drives the window, so the documentElement is always visible.
66
+ pinType: "fixed",
67
+ });
68
+ ScrollTrigger.defaults({ scroller: document.documentElement });
69
+ }
70
+ const onResize = () => {
71
+ lenis.resize();
72
+ ScrollTrigger.refresh();
73
+ };
74
+ window.addEventListener("resize", onResize);
75
+ // Fonts and late images change layout; refresh once they land.
76
+ const refresh = () => ScrollTrigger.refresh();
77
+ window.addEventListener("load", refresh);
78
+ lenis.resize();
79
+ ScrollTrigger.refresh();
80
+ const destroy = () => {
81
+ window.removeEventListener("resize", onResize);
82
+ window.removeEventListener("load", refresh);
83
+ gsap.ticker.remove(tick);
84
+ lenis.off("scroll", onScroll);
85
+ if (useScrollerProxy) {
86
+ ScrollTrigger.scrollerProxy(document.documentElement, {});
87
+ ScrollTrigger.defaults({ scroller: window });
88
+ }
89
+ lenis.destroy();
90
+ };
91
+ return {
92
+ lenis,
93
+ active: true,
94
+ scrollTo: (target, opts) => lenis.scrollTo(target, opts),
95
+ destroy,
96
+ };
97
+ }
98
+ //# sourceMappingURL=smooth-scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smooth-scroll.js","sourceRoot":"","sources":["../../src/core/smooth-scroll.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type SplitType = "chars" | "words" | "lines";
2
+ export interface SplitResult {
3
+ /** The elements that were produced (chars, words or lines). */
4
+ elements: HTMLElement[];
5
+ /** Undo the split and restore the original markup. */
6
+ revert: () => void;
7
+ }
8
+ export interface SplitOptions {
9
+ type: SplitType | Array<SplitType>;
10
+ /** Wrap each line in an overflow-hidden mask so it can slide up. */
11
+ mask?: boolean;
12
+ /** Class template for generated elements — `++` becomes the index. */
13
+ linesClass?: string;
14
+ wordsClass?: string;
15
+ charsClass?: string;
16
+ /** Ignore lines shorter than this fraction of the container. @default 0.05 */
17
+ lineThreshold?: number;
18
+ }
19
+ /**
20
+ * Split an element's text into chars/words/lines.
21
+ * Always returns a `revert()` that restores the original DOM.
22
+ */
23
+ export declare function split(target: Element | string, options: SplitOptions): SplitResult;
24
+ //# sourceMappingURL=split.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.d.ts","sourceRoot":"","sources":["../../src/core/split.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,+DAA+D;IAC/D,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,sDAAsD;IACtD,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IACnC,oEAAoE;IACpE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW,CAuClF"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Text splitting utilities.
3
+ *
4
+ * anim-kit prefers GSAP's SplitText when it is available (it ships with the
5
+ * free GSAP package), but keeps a dependency-free fallback so the library
6
+ * still works if SplitText is ever tree-shaken out or unavailable.
7
+ */
8
+ import { gsap, SplitText, initGSAP } from "./gsap.js";
9
+ /**
10
+ * Split an element's text into chars/words/lines.
11
+ * Always returns a `revert()` that restores the original DOM.
12
+ */
13
+ export function split(target, options) {
14
+ initGSAP();
15
+ const el = typeof target === "string"
16
+ ? (document.querySelector(target) ?? null)
17
+ : target;
18
+ if (!el)
19
+ return { elements: [], revert: () => { } };
20
+ // Prefer SplitText: it handles nested markup, <br> and font metrics properly.
21
+ if (typeof SplitText !== "undefined" && SplitText?.create) {
22
+ try {
23
+ const st = SplitText.create(el, {
24
+ type: options.type,
25
+ mask: options.mask ? "lines" : undefined,
26
+ linesClass: options.linesClass ?? "ak-line++",
27
+ wordsClass: options.wordsClass ?? "ak-word++",
28
+ charsClass: options.charsClass ?? "ak-char++",
29
+ lineThreshold: options.lineThreshold ?? 0.05,
30
+ });
31
+ const elements = collect(st, options.type);
32
+ return {
33
+ elements,
34
+ revert: () => {
35
+ try {
36
+ st.revert();
37
+ }
38
+ catch {
39
+ /* already reverted */
40
+ }
41
+ },
42
+ };
43
+ }
44
+ catch {
45
+ /* fall through to the manual splitter */
46
+ }
47
+ }
48
+ return manualSplit(el, options);
49
+ }
50
+ function collect(st, type) {
51
+ const wanted = Array.isArray(type) ? type : [type];
52
+ const out = [];
53
+ if (wanted.includes("lines") && st.lines)
54
+ out.push(...st.lines);
55
+ else if (wanted.includes("words") && st.words)
56
+ out.push(...st.words);
57
+ else if (wanted.includes("chars") && st.chars)
58
+ out.push(...st.chars);
59
+ return out;
60
+ }
61
+ /* ------------------------------------------------------------------ */
62
+ /* Fallback: char / word splitting only (line detection is best-effort) */
63
+ /* ------------------------------------------------------------------ */
64
+ function manualSplit(el, options) {
65
+ const original = el.innerHTML;
66
+ const type = Array.isArray(options.type) ? options.type[0] : options.type;
67
+ const nodes = Array.from(el.childNodes);
68
+ const generated = [];
69
+ const wrap = (text, cls, i) => {
70
+ const span = document.createElement("span");
71
+ span.className = cls.replace("++", String(i));
72
+ span.textContent = text;
73
+ generated.push(span);
74
+ return span;
75
+ };
76
+ const frag = document.createDocumentFragment();
77
+ let index = 0;
78
+ for (const node of nodes) {
79
+ if (node.nodeType === Node.TEXT_NODE) {
80
+ const text = node.textContent ?? "";
81
+ if (type === "chars") {
82
+ for (const ch of text) {
83
+ frag.appendChild(ch === " "
84
+ ? document.createTextNode(" ")
85
+ : wrap(ch, options.charsClass ?? "ak-char++", index++));
86
+ }
87
+ }
88
+ else {
89
+ const parts = text.split(/(\s+)/);
90
+ for (const part of parts) {
91
+ if (!part)
92
+ continue;
93
+ if (/^\s+$/.test(part))
94
+ frag.appendChild(document.createTextNode(part));
95
+ else
96
+ frag.appendChild(wrap(part, options.wordsClass ?? "ak-word++", index++));
97
+ }
98
+ }
99
+ }
100
+ else if (node.nodeType === Node.ELEMENT_NODE) {
101
+ frag.appendChild(node.cloneNode(true));
102
+ }
103
+ }
104
+ el.innerHTML = "";
105
+ el.appendChild(frag);
106
+ if (options.mask) {
107
+ gsap.set(generated, { display: "inline-block" });
108
+ }
109
+ return {
110
+ elements: generated,
111
+ revert: () => {
112
+ el.innerHTML = original;
113
+ generated.length = 0;
114
+ },
115
+ };
116
+ }
117
+ //# sourceMappingURL=split.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.js","sourceRoot":"","sources":["../../src/core/split.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Shared types for anim-kit.
3
+ *
4
+ * Every effect in this library follows the same contract:
5
+ * effect(target, options) => destroy
6
+ * so effects can be composed, torn down and re-created safely.
7
+ */
8
+ /** Anything that can be resolved to a list of elements. */
9
+ export type TargetLike = string | Element | Element[] | NodeListOf<Element> | null | undefined;
10
+ /** Dispose function returned by every effect. */
11
+ export type Destroy = () => void;
12
+ export interface CommonOptions {
13
+ /**
14
+ * Run the effect even when the user has `prefers-reduced-motion: reduce`.
15
+ * @default false
16
+ */
17
+ force?: boolean;
18
+ }
19
+ /** The animation state an effect should snap to when motion is reduced. */
20
+ export type ReducedState = Record<string, string | number>;
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2DAA2D;AAC3D,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,OAAO,GACP,OAAO,EAAE,GACT,UAAU,CAAC,OAAO,CAAC,GACnB,IAAI,GACJ,SAAS,CAAC;AAEd,iDAAiD;AACjD,MAAM,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;AAEjC,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,2EAA2E;AAC3E,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Shared types for anim-kit.
3
+ *
4
+ * Every effect in this library follows the same contract:
5
+ * effect(target, options) => destroy
6
+ * so effects can be composed, torn down and re-created safely.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,19 @@
1
+ import type { Destroy, TargetLike } from "./types.js";
2
+ /**
3
+ * Resolve a selector / element / list into a real array of elements.
4
+ *
5
+ * When `scope` is given, string targets are queried inside it — this is what
6
+ * lets effects take both `".card"` and `".card" within container`.
7
+ */
8
+ export declare function toArray<T extends Element = HTMLElement>(target: TargetLike, scope?: ParentNode | null): T[];
9
+ /** Resolve to a single element, or null. */
10
+ export declare function one<T extends Element = HTMLElement>(target: TargetLike, scope?: ParentNode | null): T | null;
11
+ /** Run `fn` once the DOM is ready (no-op if it is already interactive/complete). */
12
+ export declare function onReady(fn: () => void): void;
13
+ /** Compose several destroy functions into one. */
14
+ export declare function compose(...fns: Array<Destroy | undefined | null>): Destroy;
15
+ /** Schedule a callback on the next animation frame; returns a cancel fn. */
16
+ export declare function raf(fn: () => void): () => void;
17
+ /** Read the user's motion preference (safe outside the browser). */
18
+ export declare function prefersReducedMotion(): boolean;
19
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/core/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,OAAO,GAAG,WAAW,EACrD,MAAM,EAAE,UAAU,EAClB,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI,GACxB,CAAC,EAAE,CAWL;AAED,4CAA4C;AAC5C,wBAAgB,GAAG,CAAC,CAAC,SAAS,OAAO,GAAG,WAAW,EACjD,MAAM,EAAE,UAAU,EAClB,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI,GACxB,CAAC,GAAG,IAAI,CAEV;AAED,oFAAoF;AACpF,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAO5C;AAED,kDAAkD;AAClD,wBAAgB,OAAO,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,OAAO,CAU1E;AAED,4EAA4E;AAC5E,wBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAc9C;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,IAAI,OAAO,CAK9C"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Resolve a selector / element / list into a real array of elements.
3
+ *
4
+ * When `scope` is given, string targets are queried inside it — this is what
5
+ * lets effects take both `".card"` and `".card" within container`.
6
+ */
7
+ export function toArray(target, scope) {
8
+ if (!target)
9
+ return [];
10
+ if (typeof target === "string") {
11
+ const root = scope ?? document;
12
+ return Array.from(root.querySelectorAll(target));
13
+ }
14
+ if (target instanceof Element)
15
+ return [target];
16
+ if (target instanceof NodeList || Array.isArray(target)) {
17
+ return Array.from(target);
18
+ }
19
+ return [];
20
+ }
21
+ /** Resolve to a single element, or null. */
22
+ export function one(target, scope) {
23
+ return toArray(target, scope)[0] ?? null;
24
+ }
25
+ /** Run `fn` once the DOM is ready (no-op if it is already interactive/complete). */
26
+ export function onReady(fn) {
27
+ if (typeof document === "undefined")
28
+ return;
29
+ if (document.readyState === "loading") {
30
+ document.addEventListener("DOMContentLoaded", fn, { once: true });
31
+ }
32
+ else {
33
+ fn();
34
+ }
35
+ }
36
+ /** Compose several destroy functions into one. */
37
+ export function compose(...fns) {
38
+ return () => {
39
+ for (let i = fns.length - 1; i >= 0; i--) {
40
+ try {
41
+ fns[i]?.();
42
+ }
43
+ catch {
44
+ /* destroying twice must never throw */
45
+ }
46
+ }
47
+ };
48
+ }
49
+ /** Schedule a callback on the next animation frame; returns a cancel fn. */
50
+ export function raf(fn) {
51
+ let id = 0;
52
+ let pending = false;
53
+ const run = () => {
54
+ pending = false;
55
+ fn();
56
+ };
57
+ const schedule = () => {
58
+ if (pending)
59
+ return;
60
+ pending = true;
61
+ id = requestAnimationFrame(run);
62
+ };
63
+ schedule();
64
+ return () => cancelAnimationFrame(id);
65
+ }
66
+ /** Read the user's motion preference (safe outside the browser). */
67
+ export function prefersReducedMotion() {
68
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
69
+ return false;
70
+ }
71
+ return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
72
+ }
73
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/core/util.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CACrB,MAAkB,EAClB,KAAyB;IAEzB,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAe,KAAK,IAAI,QAAQ,CAAC;QAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAI,MAAM,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,MAAM,YAAY,OAAO;QAAE,OAAO,CAAC,MAAW,CAAC,CAAC;IACpD,IAAI,MAAM,YAAY,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAQ,CAAC;IACnC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,GAAG,CACjB,MAAkB,EAClB,KAAyB;IAEzB,OAAO,OAAO,CAAI,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC9C,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,OAAO,CAAC,EAAc;IACpC,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC5C,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACtC,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,EAAE,EAAE,CAAC;IACP,CAAC;AACH,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,OAAO,CAAC,GAAG,GAAsC;IAC/D,OAAO,GAAG,EAAE;QACV,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,uCAAuC;YACzC,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,GAAG,CAAC,EAAc;IAChC,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,GAAG,GAAG,GAAG,EAAE;QACf,OAAO,GAAG,KAAK,CAAC;QAChB,EAAE,EAAE,CAAC;IACP,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,EAAE,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC,CAAC;IACF,QAAQ,EAAE,CAAC;IACX,OAAO,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,oBAAoB;IAClC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC7E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC,OAAO,CAAC;AACvE,CAAC"}