@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,102 @@
1
+ /**
2
+ * Mask reveal — the inline `overflow:hidden` + `y:100%` heading reveal.
3
+ *
4
+ * This is the studio's lighter alternative to `lineReveal`: you write
5
+ * `overflow-hidden` wrappers yourself and animate the inner spans.
6
+ *
7
+ * <h1>
8
+ * <span class="ak-mask"><span class="ak-mask__inner">Se</span></span>
9
+ * </h1>
10
+ *
11
+ * maskReveal("h1 .ak-mask__inner", { start: "top 90%" })
12
+ *
13
+ * On the site it runs at `duration:.5, ease:[.165,.84,.44,1]` (their `ak-reveal`)
14
+ * and the second line settles at `y:"-8%"` rather than 0 — configurable here.
15
+ */
16
+ import { gsap, ScrollTrigger, initGSAP, EASES } from "../core/gsap.js";
17
+ import { guard } from "../core/guard.js";
18
+ import { toArray } from "../core/util.js";
19
+ export function maskReveal(target, options = {}) {
20
+ initGSAP();
21
+ const els = toArray(target);
22
+ if (!els.length)
23
+ return () => { };
24
+ const { from = "100%", to = "0%", duration = 0.5, ease = EASES.reveal, stagger = 0.1, delay = 0, start = "top 90%", end = "bottom 10%", mode = "scroll", } = options;
25
+ return guard(options, run);
26
+ function run() {
27
+ // Group by parent so siblings stagger together rather than individually.
28
+ const groups = new Map();
29
+ els.forEach((el) => {
30
+ const parent = el.parentElement ?? el;
31
+ const list = groups.get(parent) ?? [];
32
+ list.push(el);
33
+ groups.set(parent, list);
34
+ });
35
+ const tweens = [];
36
+ gsap.set(els, { y: from });
37
+ groups.forEach((members) => {
38
+ const vars = {
39
+ y: to,
40
+ duration,
41
+ stagger,
42
+ delay,
43
+ ease,
44
+ overwrite: "auto",
45
+ };
46
+ if (mode === "scroll") {
47
+ vars.scrollTrigger = {
48
+ trigger: members[0].parentElement ?? members[0],
49
+ start,
50
+ end,
51
+ toggleActions: "play reverse play reverse",
52
+ };
53
+ }
54
+ tweens.push(gsap.to(members, vars));
55
+ });
56
+ ScrollTrigger.refresh();
57
+ return () => {
58
+ tweens.forEach((t) => {
59
+ t.scrollTrigger?.kill();
60
+ t.kill();
61
+ });
62
+ gsap.set(els, { clearProps: "transform" });
63
+ ScrollTrigger.refresh();
64
+ };
65
+ }
66
+ }
67
+ /**
68
+ * Rule reveal — the thin line that draws itself out to full width.
69
+ *
70
+ * <div class="ak-rule"></div>
71
+ * revealRule(".ak-rule")
72
+ *
73
+ * `initial:{width:0}` → `whileInView:{width:"100%"}`, duration 1s, same ease.
74
+ */
75
+ export function revealRule(target, options = {}) {
76
+ initGSAP();
77
+ const els = toArray(target);
78
+ if (!els.length)
79
+ return () => { };
80
+ const { duration = 1, delay = 0, ease = EASES.reveal } = options;
81
+ return guard(options, () => {
82
+ gsap.set(els, { width: 0 });
83
+ const tween = gsap.to(els, {
84
+ width: "100%",
85
+ duration,
86
+ delay,
87
+ ease,
88
+ stagger: 0.1,
89
+ scrollTrigger: {
90
+ trigger: els[0],
91
+ start: "top 92%",
92
+ toggleActions: "play none none reverse",
93
+ },
94
+ });
95
+ return () => {
96
+ tween.scrollTrigger?.kill();
97
+ tween.kill();
98
+ gsap.set(els, { clearProps: "width" });
99
+ };
100
+ });
101
+ }
102
+ //# sourceMappingURL=mask-reveal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mask-reveal.js","sourceRoot":"","sources":["../../src/effects/mask-reveal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { CommonOptions, Destroy, TargetLike } from "../core/types.js";
2
+ export interface MenuOverlayOptions extends CommonOptions {
3
+ /** The fixed full-screen panel. */
4
+ overlay: TargetLike;
5
+ /** Element that opens the menu (or a boolean-ish toggle target). */
6
+ openTrigger?: TargetLike;
7
+ /** Element that closes the menu. */
8
+ closeTrigger?: TargetLike;
9
+ /** Nav bar that slides away while the menu is open. */
10
+ nav?: TargetLike;
11
+ /** Selector for the menu links inside `overlay`. @default ".menu-link a" */
12
+ link?: string;
13
+ /** Elements in the overlay chrome that rise into view. @default "[data-menu-chrome]" */
14
+ chrome?: string;
15
+ /** Duration of the curtain, seconds. @default 1 */
16
+ duration?: number;
17
+ /** Stagger between links, seconds. @default 0.1 */
18
+ stagger?: number;
19
+ /** Start open. @default false */
20
+ initialOpen?: boolean;
21
+ onOpen?: () => void;
22
+ onClose?: () => void;
23
+ }
24
+ export interface MenuOverlayHandle {
25
+ open: () => void;
26
+ close: () => void;
27
+ toggle: () => void;
28
+ isOpen: () => boolean;
29
+ destroy: Destroy;
30
+ }
31
+ export declare function menuOverlay(options: MenuOverlayOptions): MenuOverlayHandle;
32
+ //# sourceMappingURL=menu-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-overlay.d.ts","sourceRoot":"","sources":["../../src/effects/menu-overlay.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3E,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,mCAAmC;IACnC,OAAO,EAAE,UAAU,CAAC;IACpB,oEAAoE;IACpE,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,oCAAoC;IACpC,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,uDAAuD;IACvD,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAMD,wBAAgB,WAAW,CACzB,OAAO,EAAE,kBAAkB,GAC1B,iBAAiB,CAmKnB"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Menu overlay — the full-screen curtain menu.
3
+ *
4
+ * The panel is a `position:fixed` layer whose `clip-path` polygon animates
5
+ * between collapsed-at-bottom and fully-open, using the studio's `ak-curtain`
6
+ * ease (`.76,0,.2,1`). Menu links slide in/out of their own masks with a
7
+ * stagger, and the nav logo + toggle lift out of the way first.
8
+ *
9
+ * menuOverlay({ overlay: ".menu-overlay", open: ".menu-toggle-open", close: … })
10
+ *
11
+ * Requires the markup contract in styles/anim-kit.css (`.menu-overlay`,
12
+ * `.menu-link`, `.menu-overlay-bar`).
13
+ */
14
+ import { gsap, ScrollTrigger, initGSAP, EASES } from "../core/gsap.js";
15
+ import { one, toArray, prefersReducedMotion } from "../core/util.js";
16
+ const COLLAPSED_BOTTOM = "polygon(0% 100%, 100% 100%, 100% 100%, 0% 100%)";
17
+ const COLLAPSED_TOP = "polygon(0% 0%, 100% 0%, 100% 0%, 0% 0%)";
18
+ const OPEN = "polygon(0% 0%, 100% 0%, 100% 100%, 0% 100%)";
19
+ export function menuOverlay(options) {
20
+ initGSAP();
21
+ const { overlay: overlayTarget, openTrigger, closeTrigger, nav: navTarget, link = ".menu-link a", chrome = "[data-menu-chrome]", duration = 1, stagger = 0.1, initialOpen = false, onOpen, onClose, } = options;
22
+ const noop = { open: () => { }, close: () => { }, toggle: () => { }, isOpen: () => false, destroy: () => { } };
23
+ const overlay = one(overlayTarget);
24
+ if (!overlay)
25
+ return noop;
26
+ const nav = navTarget ? one(navTarget) : null;
27
+ const openBtns = toArray(openTrigger);
28
+ const closeBtns = toArray(closeTrigger);
29
+ const links = toArray(link, overlay);
30
+ const chromeEls = toArray(chrome, overlay);
31
+ // Reduced motion: leave the overlay collapsed and expose inert controls.
32
+ if (prefersReducedMotion() && !options.force) {
33
+ gsap.set(overlay, { clipPath: COLLAPSED_BOTTOM, pointerEvents: "none" });
34
+ return noop;
35
+ }
36
+ return setup();
37
+ function setup() {
38
+ let open = initialOpen;
39
+ const ease = EASES.curtain;
40
+ // Initial state: curtain collapsed at the bottom edge, links waiting below.
41
+ gsap.set(overlay, {
42
+ clipPath: COLLAPSED_BOTTOM,
43
+ pointerEvents: "none",
44
+ });
45
+ if (links.length)
46
+ gsap.set(links, { y: "100%" });
47
+ if (chromeEls.length)
48
+ gsap.set(chromeEls, { y: 20 });
49
+ const tweens = [];
50
+ const openMenu = () => {
51
+ if (open)
52
+ return;
53
+ open = true;
54
+ const tl = gsap.timeline({ onComplete: () => onOpen?.() });
55
+ // Curtain sweeps up to fill the viewport.
56
+ tl.to(overlay, {
57
+ clipPath: OPEN,
58
+ duration,
59
+ ease,
60
+ onStart: () => {
61
+ gsap.set(overlay, { pointerEvents: "all" });
62
+ if (nav)
63
+ gsap.set(nav, { pointerEvents: "none" });
64
+ },
65
+ }, 0);
66
+ // Nav chrome lifts out of the way ahead of the curtain.
67
+ if (nav) {
68
+ const navBits = toArray("a, p", nav);
69
+ if (navBits.length) {
70
+ gsap.set(navBits, { y: 0 });
71
+ tl.to(navBits, { y: -20, duration, stagger, ease }, 0);
72
+ }
73
+ }
74
+ // Links slide up into place.
75
+ if (links.length) {
76
+ tl.fromTo(links, { y: "100%" }, { y: "0%", duration, stagger: stagger / 2, ease: "power3.out" }, duration * 0.5);
77
+ }
78
+ if (chromeEls.length) {
79
+ tl.to(chromeEls, { y: 0, duration, stagger, ease }, duration * 0.5);
80
+ }
81
+ tweens.push(tl);
82
+ };
83
+ const closeMenu = () => {
84
+ if (!open)
85
+ return;
86
+ open = false;
87
+ const tl = gsap.timeline({ onComplete: () => onClose?.() });
88
+ if (chromeEls.length) {
89
+ tl.to(chromeEls, { y: -20, duration: duration * 0.75, stagger: stagger / 2, ease }, 0);
90
+ }
91
+ if (links.length) {
92
+ tl.to(links, {
93
+ y: "100%",
94
+ duration: duration * 0.75,
95
+ stagger: 0.05,
96
+ ease: "power4.in",
97
+ }, 0);
98
+ }
99
+ tl.to(overlay, {
100
+ clipPath: COLLAPSED_TOP,
101
+ duration,
102
+ delay: 0.5,
103
+ ease,
104
+ onComplete: () => {
105
+ gsap.set(overlay, { pointerEvents: "none" });
106
+ if (nav)
107
+ gsap.set(nav, { pointerEvents: "all" });
108
+ // Reset for next open so the curtain always starts at the bottom.
109
+ gsap.set(overlay, { clipPath: COLLAPSED_BOTTOM });
110
+ if (links.length)
111
+ gsap.set(links, { y: "100%" });
112
+ if (chromeEls.length)
113
+ gsap.set(chromeEls, { y: 20 });
114
+ },
115
+ }, 0);
116
+ if (nav) {
117
+ const navBits = toArray("a, p", nav);
118
+ if (navBits.length)
119
+ tl.to(navBits, { y: 0, duration, stagger, ease }, duration * 0.5);
120
+ }
121
+ tweens.push(tl);
122
+ };
123
+ const toggle = () => (open ? closeMenu() : openMenu());
124
+ const listeners = [];
125
+ openBtns.forEach((el) => {
126
+ el.addEventListener("click", openMenu);
127
+ listeners.push([el, "click", openMenu]);
128
+ });
129
+ closeBtns.forEach((el) => {
130
+ el.addEventListener("click", closeMenu);
131
+ listeners.push([el, "click", closeMenu]);
132
+ });
133
+ if (initialOpen)
134
+ openMenu();
135
+ return {
136
+ open: openMenu,
137
+ close: closeMenu,
138
+ toggle,
139
+ isOpen: () => open,
140
+ destroy: () => {
141
+ listeners.forEach(([el, type, fn]) => el.removeEventListener(type, fn));
142
+ tweens.forEach((t) => t.kill());
143
+ gsap.set(overlay, { clearProps: "all" });
144
+ gsap.set([...links, ...chromeEls], { clearProps: "all" });
145
+ void ScrollTrigger;
146
+ },
147
+ };
148
+ }
149
+ }
150
+ //# sourceMappingURL=menu-overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-overlay.js","sourceRoot":"","sources":["../../src/effects/menu-overlay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { CommonOptions, Destroy, TargetLike } from "../core/types.js";
2
+ export interface NavHideOptions extends CommonOptions {
3
+ /** Distance from the top under which the nav is hidden. @default 200 */
4
+ threshold?: number;
5
+ /** Hide offset in px. @default -100 */
6
+ hideY?: number;
7
+ /** Below this width the nav is pinned visible. @default 768 */
8
+ mobileBreakpoint?: number;
9
+ /** Start hidden. @default true */
10
+ startHidden?: boolean;
11
+ }
12
+ export declare function navHide(target: TargetLike, options?: NavHideOptions): Destroy;
13
+ //# sourceMappingURL=nav-hide.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-hide.d.ts","sourceRoot":"","sources":["../../src/effects/nav-hide.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3E,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kCAAkC;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CA+DjF"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Hide-on-scroll nav — the header that slides away when you scroll down and
3
+ * snaps back when you scroll up.
4
+ *
5
+ * Their exact rules:
6
+ * - within `threshold` px of the top → hide (slow, 1s power2.out)
7
+ * - scrolling down → hide (fast, 0.3s)
8
+ * - scrolling up → show (fast, 0.3s)
9
+ * On viewports under 768px the nav is always visible.
10
+ */
11
+ import { gsap, initGSAP, killTweens } from "../core/gsap.js";
12
+ import { guard } from "../core/guard.js";
13
+ import { one } from "../core/util.js";
14
+ export function navHide(target, options = {}) {
15
+ initGSAP();
16
+ const nav = one(target);
17
+ if (!nav)
18
+ return () => { };
19
+ const { threshold = 200, hideY = -100, mobileBreakpoint = 768, startHidden = true, } = options;
20
+ return guard(options, () => {
21
+ let last = window.scrollY;
22
+ let visible = !startHidden;
23
+ const isMobile = () => window.innerWidth < mobileBreakpoint;
24
+ const setHidden = (hidden, duration) => {
25
+ if (hidden === !visible)
26
+ return;
27
+ visible = !hidden;
28
+ gsap.to(nav, {
29
+ y: hidden ? hideY : 0,
30
+ duration,
31
+ ease: "power2.out",
32
+ overwrite: "auto",
33
+ });
34
+ };
35
+ // Initial placement — no animation, just the right resting state.
36
+ gsap.set(nav, { y: isMobile() || !startHidden ? 0 : hideY });
37
+ visible = !isMobile() && !startHidden ? true : startHidden ? false : true;
38
+ const onScroll = () => {
39
+ const y = window.scrollY;
40
+ if (isMobile()) {
41
+ setHidden(false, 0.3);
42
+ }
43
+ else if (y <= threshold) {
44
+ // Near the top: park the nav out of the way.
45
+ if (visible)
46
+ setHidden(true, 1);
47
+ }
48
+ else if (y > last) {
49
+ setHidden(true, 0.3);
50
+ }
51
+ else if (y < last) {
52
+ setHidden(false, 0.3);
53
+ }
54
+ last = y;
55
+ };
56
+ window.addEventListener("scroll", onScroll, { passive: true });
57
+ onScroll();
58
+ return () => {
59
+ window.removeEventListener("scroll", onScroll);
60
+ // A destroy() must not leave new work behind: kill any in-flight slide
61
+ // and drop the transform we own instead of tweening back (the old code
62
+ // started a fresh 0.3s tween *from* destroy, which also survived it).
63
+ killTweens(nav);
64
+ gsap.set(nav, { clearProps: "transform" });
65
+ };
66
+ });
67
+ }
68
+ //# sourceMappingURL=nav-hide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav-hide.js","sourceRoot":"","sources":["../../src/effects/nav-hide.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { CommonOptions, Destroy, TargetLike } from "../core/types.js";
2
+ export interface ParallaxOptions extends CommonOptions {
3
+ /** Attribute holding the speed multiplier. @default "data-speed" */
4
+ attribute?: string;
5
+ /** Multiplier applied to the attribute value. @default 50 */
6
+ scale?: number;
7
+ start?: string;
8
+ end?: string;
9
+ }
10
+ export declare function parallax(target: TargetLike, options?: ParallaxOptions): Destroy;
11
+ //# sourceMappingURL=parallax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallax.d.ts","sourceRoot":"","sources":["../../src/effects/parallax.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3E,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CA4CnF"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Parallax — the studio's `data-speed` utility.
3
+ *
4
+ * <img data-speed="-0.4" />
5
+ *
6
+ * Each matching element is tweened `yPercent: 50 * speed` across
7
+ * `start:"50% bottom"` → `end:"bottom top"` with `scrub:true`, so negative
8
+ * speeds drift up and positive speeds lag down. Pure `ease:"none"`.
9
+ */
10
+ import { gsap, ScrollTrigger, initGSAP } from "../core/gsap.js";
11
+ import { guard } from "../core/guard.js";
12
+ import { one } from "../core/util.js";
13
+ export function parallax(target, options = {}) {
14
+ initGSAP();
15
+ const root = one(target);
16
+ if (!root)
17
+ return () => { };
18
+ const { attribute = "data-speed", scale = 50, start = "50% bottom", end = "bottom top", } = options;
19
+ return guard(options, () => {
20
+ const items = [];
21
+ root.querySelectorAll(`[${attribute}]`).forEach((el) => {
22
+ const raw = parseFloat(el.getAttribute(attribute) || "0");
23
+ if (Number.isNaN(raw))
24
+ return;
25
+ const speed = raw * scale;
26
+ const tw = gsap.to(el, {
27
+ yPercent: speed,
28
+ ease: "none",
29
+ scrollTrigger: { trigger: el, start, end, scrub: true },
30
+ });
31
+ items.push({ el, st: tw.scrollTrigger });
32
+ // Track tweens for cleanup via a WeakMap-free trick: kill through ST.
33
+ el.__akParallax = tw;
34
+ });
35
+ ScrollTrigger.refresh();
36
+ return () => {
37
+ items.forEach(({ el, st }) => {
38
+ st?.kill();
39
+ const tw = el.__akParallax;
40
+ tw?.kill();
41
+ delete el.__akParallax;
42
+ gsap.set(el, { clearProps: "transform" });
43
+ });
44
+ ScrollTrigger.refresh();
45
+ };
46
+ });
47
+ }
48
+ //# sourceMappingURL=parallax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallax.js","sourceRoot":"","sources":["../../src/effects/parallax.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;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,MAAM,iBAAiB,CAAC;AAYtC,MAAM,UAAU,QAAQ,CAAC,MAAkB,EAAE,UAA2B,EAAE;IACxE,QAAQ,EAAE,CAAC;IAEX,MAAM,IAAI,GAAG,GAAG,CAAc,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAE3B,MAAM,EACJ,SAAS,GAAG,YAAY,EACxB,KAAK,GAAG,EAAE,EACV,KAAK,GAAG,YAAY,EACpB,GAAG,GAAG,YAAY,GACnB,GAAG,OAAO,CAAC;IAEZ,OAAO,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE;QACzB,MAAM,KAAK,GAAmD,EAAE,CAAC;QAEjE,IAAI,CAAC,gBAAgB,CAAc,IAAI,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YAClE,MAAM,GAAG,GAAG,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC;YAC1D,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;gBAAE,OAAO;YAC9B,MAAM,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC;YAE1B,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;gBACrB,QAAQ,EAAE,KAAK;gBACf,IAAI,EAAE,MAAM;gBACZ,aAAa,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE;aACxD,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;YACzC,sEAAsE;YACrE,EAAyC,CAAC,YAAY,GAAG,EAAE,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,OAAO,EAAE,CAAC;QAExB,OAAO,GAAG,EAAE;YACV,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;gBAC3B,EAAE,EAAE,IAAI,EAAE,CAAC;gBACX,MAAM,EAAE,GAAI,EAAoD,CAAC,YAAY,CAAC;gBAC9E,EAAE,EAAE,IAAI,EAAE,CAAC;gBACX,OAAQ,EAAyC,CAAC,YAAY,CAAC;gBAC/D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;YACH,aAAa,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { CommonOptions, Destroy, TargetLike } from "../core/types.js";
2
+ export interface PreloaderOptions extends CommonOptions {
3
+ /** Root overlay element. */
4
+ root: string | HTMLElement;
5
+ /** The SVG glyph that fills up. Defaults to the first svg inside `root`. */
6
+ glyph?: string | HTMLElement;
7
+ /** Element receiving the 0→100 number. Defaults to first element with `[data-counter]`. */
8
+ counter?: string | HTMLElement;
9
+ /** Solid backdrop behind the glyph. Defaults to `[data-backdrop]`. */
10
+ backdrop?: string | HTMLElement;
11
+ /** Total counter duration in seconds. @default 4 */
12
+ duration?: number;
13
+ /** Counter increment per tick. @default 5 */
14
+ step?: number;
15
+ /** Interval between ticks in ms. @default 200 */
16
+ interval?: number;
17
+ /** Hide when already shown this session. @default true */
18
+ sessionGuard?: boolean;
19
+ /** sessionStorage key. @default "ak-preloader-shown" */
20
+ storageKey?: string;
21
+ /** Called once the overlay has finished and should be removed. */
22
+ onComplete?: () => void;
23
+ }
24
+ /**
25
+ * Intro preloader — 0→100 counter, glyph `inset()` fill, scale-out exit.
26
+ *
27
+ * Accepts the library's standard positional form **or** an options object:
28
+ * preloader("#preloader", { duration: 4 })
29
+ * preloader({ root: "#preloader", duration: 4 })
30
+ */
31
+ export declare function preloader(options: PreloaderOptions): Destroy;
32
+ export declare function preloader(target: TargetLike, options?: Partial<PreloaderOptions>): Destroy;
33
+ //# sourceMappingURL=preloader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preloader.d.ts","sourceRoot":"","sources":["../../src/effects/preloader.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3E,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,4BAA4B;IAC5B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC7B,2FAA2F;IAC3F,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC/B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAChC,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC;AAC9D,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Preloader — the full-screen intro from dzinrstudio.com.
3
+ *
4
+ * What it does on the real site:
5
+ * 1. A big number counts 0 → 100 in the bottom-left corner (steps of 5,
6
+ * every 200ms — i.e. a 4s counter), sliding in from x:-100px.
7
+ * 2. An SVG "!" glyph is revealed bottom-up via `clip-path: inset(N% 0 0 0)`
8
+ * driven by the same progress.
9
+ * 3. When the count hits 100 the glyph scales to 35x and fades out with the
10
+ * `ak-preload-out` ease (delay 5s), then the backdrop fades (delay 5.5s).
11
+ * 4. The whole overlay unmounts ~1s later. A `sessionStorage` flag skips the
12
+ * preloader on subsequent visits within the session.
13
+ */
14
+ import { gsap, initGSAP, EASES, killTweens } from "../core/gsap.js";
15
+ import { guard } from "../core/guard.js";
16
+ import { one, prefersReducedMotion } from "../core/util.js";
17
+ export function preloader(targetOrOptions, maybeOptions = {}) {
18
+ initGSAP();
19
+ const options = isTargetArg(targetOrOptions)
20
+ ? { ...maybeOptions, root: (targetOrOptions ?? maybeOptions.root) }
21
+ : targetOrOptions;
22
+ const { duration = 4, step = 5, interval = 200, sessionGuard = true, storageKey = "ak-preloader-shown", onComplete, } = options;
23
+ const root = one(options.root);
24
+ if (!root)
25
+ return () => { };
26
+ const overlay = root;
27
+ const glyph = options.glyph ? one(options.glyph) : root.querySelector("svg");
28
+ const counterEl = options.counter
29
+ ? one(options.counter)
30
+ : root.querySelector("[data-counter]");
31
+ const backdrop = options.backdrop
32
+ ? one(options.backdrop)
33
+ : root.querySelector("[data-backdrop]");
34
+ if (sessionGuard && sessionStorage.getItem(storageKey)) {
35
+ overlay.style.display = "none";
36
+ onComplete?.();
37
+ return () => { };
38
+ }
39
+ // Reduced motion: never block the page behind a counting intro.
40
+ if (prefersReducedMotion() && !options.force) {
41
+ overlay.style.display = "none";
42
+ onComplete?.();
43
+ return () => { };
44
+ }
45
+ return guard(options, () => run());
46
+ function run() {
47
+ const timers = [];
48
+ let value = 0;
49
+ let done = false;
50
+ // Entrance: number slides in from the left.
51
+ if (counterEl) {
52
+ gsap.fromTo(counterEl, { opacity: 0, x: -100 }, { opacity: 1, x: 0, duration: 0.5, ease: "power2.out" });
53
+ }
54
+ // Glyph fills bottom → top, tied to the counter.
55
+ if (glyph) {
56
+ gsap.set(glyph, { clipPath: "inset(100% 0px 0px 0px)" });
57
+ gsap.to(glyph, {
58
+ clipPath: "inset(0% 0px 0px 0px)",
59
+ duration,
60
+ ease: "power1.inOut",
61
+ });
62
+ }
63
+ const tick = () => {
64
+ value = Math.min(100, value + step);
65
+ if (counterEl)
66
+ counterEl.textContent = String(value);
67
+ if (value >= 100) {
68
+ finish();
69
+ return;
70
+ }
71
+ timers.push(window.setTimeout(tick, interval));
72
+ };
73
+ timers.push(window.setTimeout(tick, interval));
74
+ function finish() {
75
+ if (done)
76
+ return;
77
+ done = true;
78
+ const tl = gsap.timeline({
79
+ onComplete: () => {
80
+ sessionStorage.setItem(storageKey, "true");
81
+ overlay.style.display = "none";
82
+ onComplete?.();
83
+ },
84
+ });
85
+ // Glyph blows up and dissolves…
86
+ if (glyph) {
87
+ tl.to(glyph, {
88
+ scale: 35,
89
+ opacity: 0,
90
+ duration: 0.6,
91
+ ease: EASES.preloadOut,
92
+ transformOrigin: "center 50%",
93
+ }, 1);
94
+ }
95
+ // …the number exits, …
96
+ if (counterEl) {
97
+ tl.to(counterEl, { opacity: 0, x: -40, duration: 0.35, ease: "power2.in" }, 1.15);
98
+ }
99
+ // …then the backdrop fades to reveal the page.
100
+ if (backdrop) {
101
+ tl.to(backdrop, { opacity: 0, duration: 0.5, ease: "power2.out" }, 1.5);
102
+ }
103
+ else {
104
+ tl.to(root, { opacity: 0, duration: 0.5 }, 1.5);
105
+ }
106
+ tl.set(root, { pointerEvents: "none" }, 1.6);
107
+ tl.call(() => onComplete?.(), undefined, ">-0.1");
108
+ }
109
+ return () => {
110
+ timers.forEach(clearTimeout);
111
+ killTweens([root, glyph, counterEl, backdrop]);
112
+ };
113
+ }
114
+ }
115
+ /** Distinguish a positional DOM target from an options object. */
116
+ function isTargetArg(v) {
117
+ if (typeof v === "string" || v == null)
118
+ return true;
119
+ if (typeof v !== "object")
120
+ return false;
121
+ if (Array.isArray(v))
122
+ return true;
123
+ const rec = v;
124
+ if ("nodeType" in rec)
125
+ return true; // Element / Node
126
+ return typeof rec.length === "number" && "item" in rec; // NodeList
127
+ }
128
+ //# sourceMappingURL=preloader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preloader.js","sourceRoot":"","sources":["../../src/effects/preloader.ts"],"names":[],"mappings":"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"}