@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,87 @@
1
+ /**
2
+ * Pinned horizontal scroll — the "our work" gallery.
3
+ *
4
+ * A tall section is pinned while an inner track slides left; images inside
5
+ * each panel get a secondary parallax driven by `containerAnimation`, so they
6
+ * settle as they cross the viewport *horizontally* rather than vertically.
7
+ *
8
+ * horizontalScroll(section, track, { panelImage: "img" })
9
+ *
10
+ * DOM contract:
11
+ * <section> ← pinned (trigger)
12
+ * <div class="track">← translated on X (track)
13
+ * <div class="panel">…<img>…</div> × N
14
+ */
15
+ import { gsap, ScrollTrigger, initGSAP } from "../core/gsap.js";
16
+ import { guard } from "../core/guard.js";
17
+ import { one } from "../core/util.js";
18
+ export function horizontalScroll(target, options = {}) {
19
+ initGSAP();
20
+ const track = one(target);
21
+ if (!track)
22
+ return () => { };
23
+ const section = (options.section ? one(options.section) : null) ??
24
+ track.closest("section") ??
25
+ track;
26
+ const { scrub = 0.5, imageScrub = 0.2, panelImage = "img", imageParallax = true, } = options;
27
+ return guard(options, () => {
28
+ const travel = () => options.travel
29
+ ? options.travel()
30
+ : Math.max(0, track.scrollWidth - window.innerWidth);
31
+ const tweens = [];
32
+ const triggers = [];
33
+ const main = gsap.to(track, {
34
+ x: () => -travel(),
35
+ ease: "none",
36
+ scrollTrigger: {
37
+ trigger: section,
38
+ pin: true,
39
+ scrub,
40
+ end: () => "+=" + travel(),
41
+ invalidateOnRefresh: true,
42
+ anticipatePin: 1,
43
+ },
44
+ });
45
+ tweens.push(main);
46
+ if (main.scrollTrigger)
47
+ triggers.push(main.scrollTrigger);
48
+ if (imageParallax && panelImage) {
49
+ const images = gsap.utils.toArray(panelImage, track);
50
+ images.forEach((img) => {
51
+ const t = gsap.fromTo(img, { scale: 0.9, yPercent: 30 }, {
52
+ scale: 1,
53
+ yPercent: 0,
54
+ ease: "power4.out",
55
+ scrollTrigger: {
56
+ trigger: img,
57
+ containerAnimation: main,
58
+ start: "left 100%",
59
+ end: "left 20%",
60
+ scrub: imageScrub,
61
+ },
62
+ });
63
+ tweens.push(t);
64
+ if (t.scrollTrigger)
65
+ triggers.push(t.scrollTrigger);
66
+ });
67
+ }
68
+ // Late-loading images change track width — refresh once they land.
69
+ const onLoad = () => ScrollTrigger.refresh();
70
+ const imgs = Array.from(track.querySelectorAll("img"));
71
+ imgs.forEach((img) => {
72
+ if (!img.complete)
73
+ img.addEventListener("load", onLoad, { once: true });
74
+ });
75
+ window.addEventListener("load", onLoad);
76
+ ScrollTrigger.refresh();
77
+ return () => {
78
+ window.removeEventListener("load", onLoad);
79
+ imgs.forEach((img) => img.removeEventListener("load", onLoad));
80
+ triggers.forEach((t) => t.kill());
81
+ tweens.forEach((t) => t.kill());
82
+ gsap.set(track, { clearProps: "transform" });
83
+ ScrollTrigger.refresh();
84
+ };
85
+ });
86
+ }
87
+ //# sourceMappingURL=horizontal-scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"horizontal-scroll.js","sourceRoot":"","sources":["../../src/effects/horizontal-scroll.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Line reveal — the masked, staggered text reveal used all over DZ!NR.
3
+ *
4
+ * Text is split into lines, each line gets an `overflow:hidden` mask, and the
5
+ * inner line slides up from `y:100%` to `y:0%`.
6
+ *
7
+ * Two modes:
8
+ * mode: "scroll" → plays when the element enters the viewport and reverses
9
+ * when it leaves (`toggleActions: "play reverse play reverse"`,
10
+ * start `top 90%` / end `bottom 10%`) — their default.
11
+ * mode: "immediate"→ plays right away (used above the fold with
12
+ * `animateOnScroll: false`).
13
+ */
14
+ import { EASES } from "../core/gsap.js";
15
+ import type { CommonOptions, Destroy, TargetLike } from "../core/types.js";
16
+ export interface LineRevealOptions extends CommonOptions {
17
+ /** "scroll" plays on enter/reverse on leave; "immediate" plays at once. */
18
+ mode?: "scroll" | "immediate";
19
+ /** Stagger between lines, seconds. @default 0.1 */
20
+ stagger?: number;
21
+ /** Animation duration, seconds. @default 1 */
22
+ duration?: number;
23
+ /** GSAP ease name. @default "power4.out" */
24
+ ease?: string;
25
+ /** Delay before playing, seconds. @default 0 */
26
+ delay?: number;
27
+ /** ScrollTrigger start position. @default "top 90%" */
28
+ start?: string;
29
+ /** ScrollTrigger end position. @default "bottom 10%" */
30
+ end?: string;
31
+ }
32
+ export declare function lineReveal(target: TargetLike, options?: LineRevealOptions): Destroy;
33
+ export { EASES };
34
+ //# sourceMappingURL=line-reveal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-reveal.d.ts","sourceRoot":"","sources":["../../src/effects/line-reveal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAiC,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAIvE,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3E,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,2EAA2E;IAC3E,IAAI,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC9B,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAsEvF;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Line reveal — the masked, staggered text reveal used all over DZ!NR.
3
+ *
4
+ * Text is split into lines, each line gets an `overflow:hidden` mask, and the
5
+ * inner line slides up from `y:100%` to `y:0%`.
6
+ *
7
+ * Two modes:
8
+ * mode: "scroll" → plays when the element enters the viewport and reverses
9
+ * when it leaves (`toggleActions: "play reverse play reverse"`,
10
+ * start `top 90%` / end `bottom 10%`) — their default.
11
+ * mode: "immediate"→ plays right away (used above the fold with
12
+ * `animateOnScroll: false`).
13
+ */
14
+ import { gsap, ScrollTrigger, initGSAP, EASES } from "../core/gsap.js";
15
+ import { guard } from "../core/guard.js";
16
+ import { split } from "../core/split.js";
17
+ import { toArray } from "../core/util.js";
18
+ export function lineReveal(target, options = {}) {
19
+ initGSAP();
20
+ const { mode = "scroll", stagger = 0.1, duration = 1, ease = "power4.out", delay = 0, start = "top 90%", end = "bottom 10%", } = options;
21
+ const els = toArray(target);
22
+ if (!els.length)
23
+ return () => { };
24
+ return guard(options, run);
25
+ function run() {
26
+ const splits = [];
27
+ const tweens = [];
28
+ els.forEach((el) => {
29
+ const res = split(el, {
30
+ type: "lines",
31
+ mask: true,
32
+ linesClass: "ak-line++",
33
+ lineThreshold: 0.05,
34
+ });
35
+ splits.push(res);
36
+ // SplitText copies aria-labels onto the fragments; drop them for a11y.
37
+ el.querySelectorAll("[aria-label]").forEach((n) => n.removeAttribute("aria-label"));
38
+ if (!res.elements.length)
39
+ return;
40
+ gsap.set(res.elements, { y: "100%" });
41
+ const vars = {
42
+ y: "0%",
43
+ duration,
44
+ stagger,
45
+ ease,
46
+ delay,
47
+ overwrite: "auto",
48
+ };
49
+ if (mode === "scroll") {
50
+ vars.scrollTrigger = {
51
+ trigger: el,
52
+ start,
53
+ end,
54
+ toggleActions: "play reverse play reverse",
55
+ };
56
+ }
57
+ tweens.push(gsap.to(res.elements, vars));
58
+ });
59
+ ScrollTrigger.refresh();
60
+ return () => {
61
+ tweens.forEach((t) => {
62
+ t.scrollTrigger?.kill();
63
+ t.kill();
64
+ });
65
+ splits.forEach((s) => s.revert());
66
+ ScrollTrigger.refresh();
67
+ };
68
+ }
69
+ }
70
+ export { EASES };
71
+ //# sourceMappingURL=line-reveal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-reveal.js","sourceRoot":"","sources":["../../src/effects/line-reveal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAoB,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAoB1C,MAAM,UAAU,UAAU,CAAC,MAAkB,EAAE,UAA6B,EAAE;IAC5E,QAAQ,EAAE,CAAC;IAEX,MAAM,EACJ,IAAI,GAAG,QAAQ,EACf,OAAO,GAAG,GAAG,EACb,QAAQ,GAAG,CAAC,EACZ,IAAI,GAAG,YAAY,EACnB,KAAK,GAAG,CAAC,EACT,KAAK,GAAG,SAAS,EACjB,GAAG,GAAG,YAAY,GACnB,GAAG,OAAO,CAAC;IAEZ,MAAM,GAAG,GAAG,OAAO,CAAc,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAEjC,OAAO,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAE3B,SAAS,GAAG;QACV,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,MAAM,MAAM,GAAsB,EAAE,CAAC;QAErC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YACjB,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,EAAE;gBACpB,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,IAAI;gBACV,UAAU,EAAE,WAAW;gBACvB,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEjB,uEAAuE;YACvE,EAAE,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC;YAEpF,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM;gBAAE,OAAO;YAEjC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAEtC,MAAM,IAAI,GAAmB;gBAC3B,CAAC,EAAE,IAAI;gBACP,QAAQ;gBACR,OAAO;gBACP,IAAI;gBACJ,KAAK;gBACL,SAAS,EAAE,MAAM;aAClB,CAAC;YAEF,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,IAAI,CAAC,aAAa,GAAG;oBACnB,OAAO,EAAE,EAAE;oBACX,KAAK;oBACL,GAAG;oBACH,aAAa,EAAE,2BAA2B;iBAC3C,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,OAAO,EAAE,CAAC;QAExB,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACnB,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;gBACxB,CAAC,CAAC,IAAI,EAAE,CAAC;YACX,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAClC,aAAa,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { CommonOptions, Destroy, TargetLike } from "../core/types.js";
2
+ export interface LiquidButtonOptions extends CommonOptions {
3
+ /** Wave travel time in ms. @default 900 */
4
+ duration?: number;
5
+ /** CSS colour for the wave fill. @default "var(--ak-primary, #6c5ce7)" */
6
+ fill?: string;
7
+ /** Which edge the liquid rises from. @default "up" */
8
+ direction?: "up" | "down";
9
+ /** Colour the label turns on hover. @default "#fff" */
10
+ labelColor?: string;
11
+ }
12
+ export declare function liquidButton(target: TargetLike, options?: LiquidButtonOptions): Destroy;
13
+ /**
14
+ * Underline sweep — the `after:` pseudo-element that wipes left→right on
15
+ * hover. Applied as a class so it works with zero JS; this helper exists so
16
+ * the same behaviour can be scoped programmatically.
17
+ */
18
+ export declare function underlineLink(target: TargetLike): Destroy;
19
+ //# sourceMappingURL=liquid-button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liquid-button.d.ts","sourceRoot":"","sources":["../../src/effects/liquid-button.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3E,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IAC1B,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CA0BT;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAIzD"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Liquid button — the SVG wave that floods a button from the bottom on hover.
3
+ *
4
+ * Pure CSS/SVG geometry + a transition, exactly as the studio does it: an
5
+ * oversized (`160%`) SVG sits below the button and translates up on hover with
6
+ * a curved top edge, so the fill looks like liquid rising rather than a flat
7
+ * rectangle. Text colour cross-fades on top of it.
8
+ *
9
+ * Usage:
10
+ * <button class="ak-liquid" data-ak-liquid>
11
+ * <svg class="ak-liquid__wave" viewBox="0 0 100 100" preserveAspectRatio="none">
12
+ * <path d="M0,30 Q50,-5 100,30 L100,100 L0,100 Z"/>
13
+ * </svg>
14
+ * <span class="ak-liquid__label">Lets Talk</span>
15
+ * </button>
16
+ *
17
+ * This module just wires the custom properties (`--ak-liquid-duration`,
18
+ * `--ak-liquid-fill`) from JS options onto the markup, so a single stylesheet
19
+ * drives every instance.
20
+ */
21
+ import { toArray } from "../core/util.js";
22
+ export function liquidButton(target, options = {}) {
23
+ const els = toArray(target);
24
+ if (!els.length)
25
+ return () => { };
26
+ const { duration = 900, fill = "var(--ak-primary, #6c5ce7)", direction = "up", labelColor = "#fff", } = options;
27
+ els.forEach((el) => {
28
+ el.dataset.akLiquid = direction;
29
+ el.style.setProperty("--ak-liquid-duration", `${duration}ms`);
30
+ el.style.setProperty("--ak-liquid-fill", fill);
31
+ el.style.setProperty("--ak-liquid-label", labelColor);
32
+ });
33
+ return () => {
34
+ els.forEach((el) => {
35
+ delete el.dataset.akLiquid;
36
+ el.style.removeProperty("--ak-liquid-duration");
37
+ el.style.removeProperty("--ak-liquid-fill");
38
+ el.style.removeProperty("--ak-liquid-label");
39
+ });
40
+ };
41
+ }
42
+ /**
43
+ * Underline sweep — the `after:` pseudo-element that wipes left→right on
44
+ * hover. Applied as a class so it works with zero JS; this helper exists so
45
+ * the same behaviour can be scoped programmatically.
46
+ */
47
+ export function underlineLink(target) {
48
+ const els = toArray(target);
49
+ els.forEach((el) => el.classList.add("ak-underline"));
50
+ return () => els.forEach((el) => el.classList.remove("ak-underline"));
51
+ }
52
+ //# sourceMappingURL=liquid-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liquid-button.js","sourceRoot":"","sources":["../../src/effects/liquid-button.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAc1C,MAAM,UAAU,YAAY,CAC1B,MAAkB,EAClB,UAA+B,EAAE;IAEjC,MAAM,GAAG,GAAG,OAAO,CAAc,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAEjC,MAAM,EACJ,QAAQ,GAAG,GAAG,EACd,IAAI,GAAG,4BAA4B,EACnC,SAAS,GAAG,IAAI,EAChB,UAAU,GAAG,MAAM,GACpB,GAAG,OAAO,CAAC;IAEZ,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACjB,EAAE,CAAC,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;QAChC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,sBAAsB,EAAE,GAAG,QAAQ,IAAI,CAAC,CAAC;QAC9D,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;QAC/C,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,EAAE;QACV,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YACjB,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC3B,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC;YAChD,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;YAC5C,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,MAAkB;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAc,MAAM,CAAC,CAAC;IACzC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;IACtD,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { CommonOptions, Destroy, TargetLike } from "../core/types.js";
2
+ export interface LogoRevealOptions extends CommonOptions {
3
+ /** Selector for the animatable paths inside the SVG. @default "[data-logo-path], .svg-anim-path" */
4
+ path?: string;
5
+ /** Stagger between paths, seconds. @default 0.05 */
6
+ stagger?: number;
7
+ duration?: number;
8
+ ease?: string;
9
+ start?: string;
10
+ end?: string;
11
+ /** Play once and never reverse. @default false */
12
+ once?: boolean;
13
+ }
14
+ export declare function logoReveal(target: TargetLike, options?: LogoRevealOptions): Destroy;
15
+ //# sourceMappingURL=logo-reveal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo-reveal.d.ts","sourceRoot":"","sources":["../../src/effects/logo-reveal.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3E,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,oGAAoG;IACpG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CA+CvF"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Logo reveal — the DZ!NR wordmark that assembles letter by letter.
3
+ *
4
+ * Every path inside the SVG gets class `svg-anim-path`, is pre-set to
5
+ * `y:-100%, opacity:0`, then slides down into place with a 0.05s stagger when
6
+ * the mark scrolls into view (reversing back out when it leaves).
7
+ *
8
+ * logoReveal(".logo svg") ← animates [data-logo-path] children
9
+ * logoReveal(el, { path: ".my-class" })
10
+ */
11
+ import { gsap, ScrollTrigger, initGSAP } from "../core/gsap.js";
12
+ import { guard } from "../core/guard.js";
13
+ import { one, toArray } from "../core/util.js";
14
+ export function logoReveal(target, options = {}) {
15
+ initGSAP();
16
+ const el = one(target);
17
+ if (!el)
18
+ return () => { };
19
+ const { path = "[data-logo-path], .svg-anim-path", stagger = 0.05, duration = 1, ease = "power2.out", start = "top 80%", end = "bottom top", once = false, } = options;
20
+ return guard(options, () => {
21
+ const paths = toArray(path, el);
22
+ if (!paths.length)
23
+ return () => { };
24
+ gsap.set(paths, { yPercent: -100, opacity: 0, willChange: "transform" });
25
+ const tween = gsap.to(paths, {
26
+ yPercent: 0,
27
+ opacity: 1,
28
+ duration,
29
+ delay: 0,
30
+ ease,
31
+ stagger,
32
+ scrollTrigger: {
33
+ trigger: el,
34
+ start,
35
+ end,
36
+ once,
37
+ toggleActions: once ? undefined : "play reverse play reverse",
38
+ },
39
+ });
40
+ ScrollTrigger.refresh();
41
+ return () => {
42
+ tween.scrollTrigger?.kill();
43
+ tween.kill();
44
+ gsap.set(paths, { clearProps: "all" });
45
+ ScrollTrigger.refresh();
46
+ };
47
+ });
48
+ }
49
+ //# sourceMappingURL=logo-reveal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo-reveal.js","sourceRoot":"","sources":["../../src/effects/logo-reveal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAgB/C,MAAM,UAAU,UAAU,CAAC,MAAkB,EAAE,UAA6B,EAAE;IAC5E,QAAQ,EAAE,CAAC;IAEX,MAAM,EAAE,GAAG,GAAG,CAAc,MAAM,CAAC,CAAC;IACpC,IAAI,CAAC,EAAE;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAEzB,MAAM,EACJ,IAAI,GAAG,kCAAkC,EACzC,OAAO,GAAG,IAAI,EACd,QAAQ,GAAG,CAAC,EACZ,IAAI,GAAG,YAAY,EACnB,KAAK,GAAG,SAAS,EACjB,GAAG,GAAG,YAAY,EAClB,IAAI,GAAG,KAAK,GACb,GAAG,OAAO,CAAC;IAEZ,OAAO,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE;QACzB,MAAM,KAAK,GAAG,OAAO,CAAU,IAAI,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;QAEnC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QAEzE,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;YAC3B,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;YACV,QAAQ;YACR,KAAK,EAAE,CAAC;YACR,IAAI;YACJ,OAAO;YACP,aAAa,EAAE;gBACb,OAAO,EAAE,EAAE;gBACX,KAAK;gBACL,GAAG;gBACH,IAAI;gBACJ,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,2BAA2B;aAC9D;SACF,CAAC,CAAC;QAEH,aAAa,CAAC,OAAO,EAAE,CAAC;QAExB,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;YACvC,aAAa,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { CommonOptions, Destroy, TargetLike } from "../core/types.js";
2
+ export interface MarqueeOptions extends CommonOptions {
3
+ /** Pixels per second. @default 40 (the studio's rate) */
4
+ speed?: number;
5
+ /** Force a direction for every track. Otherwise read `data-dir`. */
6
+ direction?: "left" | "right";
7
+ /** Duplicate the content automatically if it isn't already doubled. @default true */
8
+ clone?: boolean;
9
+ /** Pause the loop on pointer enter. @default false */
10
+ pauseOnHover?: boolean;
11
+ }
12
+ export declare function marquee(target: TargetLike, options?: MarqueeOptions): Destroy;
13
+ //# sourceMappingURL=marquee.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marquee.d.ts","sourceRoot":"","sources":["../../src/effects/marquee.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3E,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,qFAAqF;IACrF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sDAAsD;IACtD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAqGjF"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Marquee — the infinite, dual-row client-logo band.
3
+ *
4
+ * Two rows scroll in opposite directions at a constant px/s using a single
5
+ * rAF loop. Each row's content is duplicated once; when the offset passes one
6
+ * copy's width it wraps by exactly that width, so the seam is invisible.
7
+ *
8
+ * <div class="ak-marquee">
9
+ * <div class="ak-marquee__viewport">
10
+ * <div class="ak-marquee__track" data-dir="left">…items…</div>
11
+ * </div>
12
+ * </div>
13
+ *
14
+ * Call `marquee()` once per track, or pass a container with `[data-marquee]`.
15
+ */
16
+ import { gsap, initGSAP } from "../core/gsap.js";
17
+ import { guard } from "../core/guard.js";
18
+ import { toArray } from "../core/util.js";
19
+ export function marquee(target, options = {}) {
20
+ initGSAP();
21
+ const roots = toArray(target);
22
+ if (!roots.length)
23
+ return () => { };
24
+ const { speed = 40, clone = true, pauseOnHover = false } = options;
25
+ return guard(options, () => {
26
+ const tracks = [];
27
+ roots.forEach((root) => {
28
+ if (root.matches("[data-marquee-track]"))
29
+ tracks.push(root);
30
+ else
31
+ root.querySelectorAll("[data-marquee-track]").forEach((t) => tracks.push(t));
32
+ });
33
+ const states = tracks.map((track) => {
34
+ const originalCount = track.children.length;
35
+ if (clone)
36
+ duplicateOnce(track);
37
+ const dir = options.direction ?? (track.dataset.dir === "right" ? "right" : "left");
38
+ return {
39
+ track,
40
+ dir,
41
+ offset: 0,
42
+ width: 0,
43
+ hovering: false,
44
+ originalCount,
45
+ // Only OUR duplication gets removed on destroy — a consumer who
46
+ // pre-tiled the track (data-marquee-cloned) keeps their markup.
47
+ cloned: track.children.length > originalCount,
48
+ };
49
+ });
50
+ const measure = () => {
51
+ states.forEach((s) => {
52
+ s.width = measureCopy(s.track);
53
+ if (s.dir === "right" && s.offset === 0)
54
+ s.offset = -s.width;
55
+ });
56
+ };
57
+ measure();
58
+ let last = performance.now();
59
+ let rafId = 0;
60
+ let running = true;
61
+ const loop = (now) => {
62
+ if (!running)
63
+ return;
64
+ const dt = Math.min(64, now - last) / 1000;
65
+ last = now;
66
+ for (const s of states) {
67
+ if (!s.width)
68
+ continue;
69
+ if (pauseOnHover && s.hovering)
70
+ continue;
71
+ const delta = speed * dt * (s.dir === "right" ? 1 : -1);
72
+ s.offset += delta;
73
+ // Wrap by exactly one copy width — seamless.
74
+ if (s.offset <= -s.width)
75
+ s.offset += s.width;
76
+ if (s.offset >= 0)
77
+ s.offset -= s.width;
78
+ gsap.set(s.track, { x: s.offset });
79
+ }
80
+ rafId = requestAnimationFrame(loop);
81
+ };
82
+ rafId = requestAnimationFrame(loop);
83
+ const onResize = () => {
84
+ measure();
85
+ };
86
+ window.addEventListener("resize", onResize);
87
+ const cleanups = [];
88
+ if (pauseOnHover) {
89
+ states.forEach((s) => {
90
+ const enter = () => (s.hovering = true);
91
+ const leave = () => (s.hovering = false);
92
+ s.track.addEventListener("pointerenter", enter);
93
+ s.track.addEventListener("pointerleave", leave);
94
+ cleanups.push(() => {
95
+ s.track.removeEventListener("pointerenter", enter);
96
+ s.track.removeEventListener("pointerleave", leave);
97
+ });
98
+ });
99
+ }
100
+ return () => {
101
+ running = false;
102
+ cancelAnimationFrame(rafId);
103
+ window.removeEventListener("resize", onResize);
104
+ cleanups.forEach((fn) => fn());
105
+ states.forEach((s) => {
106
+ gsap.set(s.track, { clearProps: "transform" });
107
+ // Contract: destroy restores the original markup — drop our copy.
108
+ if (s.cloned) {
109
+ while (s.track.children.length > s.originalCount) {
110
+ s.track.removeChild(s.track.lastElementChild);
111
+ }
112
+ delete s.track.dataset.marqueeCloned;
113
+ }
114
+ });
115
+ };
116
+ });
117
+ }
118
+ function duplicateOnce(track) {
119
+ if (track.dataset.marqueeCloned === "true")
120
+ return;
121
+ const copy = track.innerHTML;
122
+ track.insertAdjacentHTML("beforeend", copy);
123
+ track.dataset.marqueeCloned = "true";
124
+ }
125
+ /** Width of a single copy of the track content, in px. */
126
+ function measureCopy(track) {
127
+ if (track.dataset.marqueeCloned !== "true")
128
+ return track.scrollWidth;
129
+ // Content was doubled, so one copy is half — but gaps can make it uneven,
130
+ // so measure the first half of the children instead.
131
+ const children = Array.from(track.children);
132
+ if (!children.length)
133
+ return track.scrollWidth / 2;
134
+ const half = Math.floor(children.length / 2);
135
+ let width = 0;
136
+ for (let i = 0; i < half; i++) {
137
+ const r = children[i].getBoundingClientRect();
138
+ const next = children[i + 1]?.getBoundingClientRect();
139
+ width += next ? next.left - r.left : r.width;
140
+ }
141
+ return width > 0 ? width : track.scrollWidth / 2;
142
+ }
143
+ //# sourceMappingURL=marquee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marquee.js","sourceRoot":"","sources":["../../src/effects/marquee.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { CommonOptions, Destroy, TargetLike } from "../core/types.js";
2
+ export interface MaskRevealOptions extends CommonOptions {
3
+ /** Where the inner span starts. @default "100%" (fully below the mask) */
4
+ from?: string;
5
+ /** Where it settles. @default "0%" */
6
+ to?: string;
7
+ /** Duration, seconds. @default 0.5 */
8
+ duration?: number;
9
+ /** Ease name. @default EASES.reveal (".165,.84,.44,1") */
10
+ ease?: string;
11
+ /** Stagger across matched elements, seconds. @default 0.1 */
12
+ stagger?: number;
13
+ /** Delay before playing, seconds. @default 0 */
14
+ delay?: number;
15
+ /** ScrollTrigger start. @default "top 90%" */
16
+ start?: string;
17
+ /** ScrollTrigger end. @default "bottom 10%" */
18
+ end?: string;
19
+ /** "scroll" reverses on leave; "immediate" plays at once. @default "scroll" */
20
+ mode?: "scroll" | "immediate";
21
+ }
22
+ export declare function maskReveal(target: TargetLike, options?: MaskRevealOptions): Destroy;
23
+ /**
24
+ * Rule reveal — the thin line that draws itself out to full width.
25
+ *
26
+ * <div class="ak-rule"></div>
27
+ * revealRule(".ak-rule")
28
+ *
29
+ * `initial:{width:0}` → `whileInView:{width:"100%"}`, duration 1s, same ease.
30
+ */
31
+ export declare function revealRule(target: TargetLike, options?: CommonOptions & {
32
+ duration?: number;
33
+ delay?: number;
34
+ ease?: string;
35
+ }): Destroy;
36
+ //# sourceMappingURL=mask-reveal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mask-reveal.d.ts","sourceRoot":"","sources":["../../src/effects/mask-reveal.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3E,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,IAAI,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;CAC/B;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAiEvF;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,aAAa,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACjF,OAAO,CA4BT"}