@mappoh/nova 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation/parallax.d.ts +23 -0
- package/dist/animation/parallax.d.ts.map +1 -0
- package/dist/animation/parallax.js +96 -0
- package/dist/animation/parallax.js.map +1 -0
- package/dist/animation/scroll-animate.d.ts +30 -0
- package/dist/animation/scroll-animate.d.ts.map +1 -0
- package/dist/animation/scroll-animate.js +65 -0
- package/dist/animation/scroll-animate.js.map +1 -0
- package/dist/animation/scroll-observer.d.ts +32 -0
- package/dist/animation/scroll-observer.d.ts.map +1 -0
- package/dist/animation/scroll-observer.js +63 -0
- package/dist/animation/scroll-observer.js.map +1 -0
- package/dist/animation/smooth-scroll.d.ts +47 -0
- package/dist/animation/smooth-scroll.d.ts.map +1 -0
- package/dist/animation/smooth-scroll.js +169 -0
- package/dist/animation/smooth-scroll.js.map +1 -0
- package/dist/animation/text-reveal.d.ts +30 -0
- package/dist/animation/text-reveal.d.ts.map +1 -0
- package/dist/animation/text-reveal.js +164 -0
- package/dist/animation/text-reveal.js.map +1 -0
- package/dist/animation/ticker.d.ts +32 -0
- package/dist/animation/ticker.d.ts.map +1 -0
- package/dist/animation/ticker.js +62 -0
- package/dist/animation/ticker.js.map +1 -0
- package/dist/canvas/dot-grid.d.ts +50 -0
- package/dist/canvas/dot-grid.d.ts.map +1 -0
- package/dist/canvas/dot-grid.js +123 -0
- package/dist/canvas/dot-grid.js.map +1 -0
- package/dist/canvas/noise.d.ts +33 -0
- package/dist/canvas/noise.d.ts.map +1 -0
- package/dist/canvas/noise.js +241 -0
- package/dist/canvas/noise.js.map +1 -0
- package/dist/canvas/particles.d.ts +44 -0
- package/dist/canvas/particles.d.ts.map +1 -0
- package/dist/canvas/particles.js +138 -0
- package/dist/canvas/particles.js.map +1 -0
- package/dist/canvas/sequence.d.ts +43 -0
- package/dist/canvas/sequence.d.ts.map +1 -0
- package/dist/canvas/sequence.js +162 -0
- package/dist/canvas/sequence.js.map +1 -0
- package/dist/component/bind.d.ts +25 -0
- package/dist/component/bind.d.ts.map +1 -0
- package/dist/component/bind.js +28 -0
- package/dist/component/bind.js.map +1 -0
- package/dist/component/component.d.ts +76 -0
- package/dist/component/component.d.ts.map +1 -0
- package/dist/component/component.js +219 -0
- package/dist/component/component.js.map +1 -0
- package/dist/component/connect.d.ts +60 -0
- package/dist/component/connect.d.ts.map +1 -0
- package/dist/component/connect.js +115 -0
- package/dist/component/connect.js.map +1 -0
- package/dist/component/html.d.ts +35 -0
- package/dist/component/html.d.ts.map +1 -0
- package/dist/component/html.js +51 -0
- package/dist/component/html.js.map +1 -0
- package/dist/component/hydrate.d.ts +37 -0
- package/dist/component/hydrate.d.ts.map +1 -0
- package/dist/component/hydrate.js +242 -0
- package/dist/component/hydrate.js.map +1 -0
- package/dist/component/index.d.ts +9 -0
- package/dist/component/index.d.ts.map +1 -0
- package/dist/component/index.js +6 -0
- package/dist/component/index.js.map +1 -0
- package/dist/component/template.d.ts +30 -0
- package/dist/component/template.d.ts.map +1 -0
- package/dist/component/template.js +469 -0
- package/dist/component/template.js.map +1 -0
- package/dist/css/gradient-text.d.ts +40 -0
- package/dist/css/gradient-text.d.ts.map +1 -0
- package/dist/css/gradient-text.js +90 -0
- package/dist/css/gradient-text.js.map +1 -0
- package/dist/css/index.d.ts +3 -0
- package/dist/css/index.d.ts.map +1 -0
- package/dist/css/index.js +2 -0
- package/dist/css/index.js.map +1 -0
- package/dist/devtools/devtools.d.ts +27 -0
- package/dist/devtools/devtools.d.ts.map +1 -0
- package/dist/devtools/devtools.js +237 -0
- package/dist/devtools/devtools.js.map +1 -0
- package/dist/devtools/index.d.ts +3 -0
- package/dist/devtools/index.d.ts.map +1 -0
- package/dist/devtools/index.js +2 -0
- package/dist/devtools/index.js.map +1 -0
- package/dist/drag/drag.d.ts +38 -0
- package/dist/drag/drag.d.ts.map +1 -0
- package/dist/drag/drag.js +181 -0
- package/dist/drag/drag.js.map +1 -0
- package/dist/drag/index.d.ts +3 -0
- package/dist/drag/index.d.ts.map +1 -0
- package/dist/drag/index.js +2 -0
- package/dist/drag/index.js.map +1 -0
- package/dist/dropdown/dropdown.d.ts +55 -0
- package/dist/dropdown/dropdown.d.ts.map +1 -0
- package/dist/dropdown/dropdown.js +314 -0
- package/dist/dropdown/dropdown.js.map +1 -0
- package/dist/dropdown/group.d.ts +18 -0
- package/dist/dropdown/group.d.ts.map +1 -0
- package/dist/dropdown/group.js +119 -0
- package/dist/dropdown/group.js.map +1 -0
- package/dist/dropdown/index.d.ts +5 -0
- package/dist/dropdown/index.d.ts.map +1 -0
- package/dist/dropdown/index.js +3 -0
- package/dist/dropdown/index.js.map +1 -0
- package/dist/forms/form-engine.d.ts +91 -0
- package/dist/forms/form-engine.d.ts.map +1 -0
- package/dist/forms/form-engine.js +228 -0
- package/dist/forms/form-engine.js.map +1 -0
- package/dist/forms/index.d.ts +3 -0
- package/dist/forms/index.d.ts.map +1 -0
- package/dist/forms/index.js +2 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/forms/validators.d.ts +20 -0
- package/dist/forms/validators.d.ts.map +1 -0
- package/dist/forms/validators.js +82 -0
- package/dist/forms/validators.js.map +1 -0
- package/dist/gallery/gallery.d.ts +66 -0
- package/dist/gallery/gallery.d.ts.map +1 -0
- package/dist/gallery/gallery.js +347 -0
- package/dist/gallery/gallery.js.map +1 -0
- package/dist/gallery/index.d.ts +3 -0
- package/dist/gallery/index.d.ts.map +1 -0
- package/dist/gallery/index.js +2 -0
- package/dist/gallery/index.js.map +1 -0
- package/dist/gesture/gesture.d.ts +44 -0
- package/dist/gesture/gesture.d.ts.map +1 -0
- package/dist/gesture/gesture.js +152 -0
- package/dist/gesture/gesture.js.map +1 -0
- package/dist/gesture/index.d.ts +3 -0
- package/dist/gesture/index.d.ts.map +1 -0
- package/dist/gesture/index.js +2 -0
- package/dist/gesture/index.js.map +1 -0
- package/dist/http/http.d.ts +44 -0
- package/dist/http/http.d.ts.map +1 -0
- package/dist/http/http.js +135 -0
- package/dist/http/http.js.map +1 -0
- package/dist/http/index.d.ts +3 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +2 -0
- package/dist/http/index.js.map +1 -0
- package/dist/i18n/i18n.d.ts +28 -0
- package/dist/i18n/i18n.d.ts.map +1 -0
- package/dist/i18n/i18n.js +84 -0
- package/dist/i18n/i18n.js.map +1 -0
- package/dist/i18n/index.d.ts +3 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +2 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/image/effects.d.ts +33 -0
- package/dist/image/effects.d.ts.map +1 -0
- package/dist/image/effects.js +236 -0
- package/dist/image/effects.js.map +1 -0
- package/dist/image/image.d.ts +83 -0
- package/dist/image/image.d.ts.map +1 -0
- package/dist/image/image.js +236 -0
- package/dist/image/image.js.map +1 -0
- package/dist/image/index.d.ts +5 -0
- package/dist/image/index.d.ts.map +1 -0
- package/dist/image/index.js +3 -0
- package/dist/image/index.js.map +1 -0
- package/dist/interaction/index.d.ts +3 -0
- package/dist/interaction/index.d.ts.map +1 -0
- package/dist/interaction/index.js +2 -0
- package/dist/interaction/index.js.map +1 -0
- package/dist/interaction/tilt.d.ts +30 -0
- package/dist/interaction/tilt.d.ts.map +1 -0
- package/dist/interaction/tilt.js +131 -0
- package/dist/interaction/tilt.js.map +1 -0
- package/dist/lazy/index.d.ts +3 -0
- package/dist/lazy/index.d.ts.map +1 -0
- package/dist/lazy/index.js +2 -0
- package/dist/lazy/index.js.map +1 -0
- package/dist/lazy/lazy.d.ts +42 -0
- package/dist/lazy/lazy.d.ts.map +1 -0
- package/dist/lazy/lazy.js +80 -0
- package/dist/lazy/lazy.js.map +1 -0
- package/dist/modal/index.d.ts +3 -0
- package/dist/modal/index.d.ts.map +1 -0
- package/dist/modal/index.js +2 -0
- package/dist/modal/index.js.map +1 -0
- package/dist/modal/modal.d.ts +39 -0
- package/dist/modal/modal.d.ts.map +1 -0
- package/dist/modal/modal.js +174 -0
- package/dist/modal/modal.js.map +1 -0
- package/dist/router/index.d.ts +3 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +2 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/router.d.ts +80 -0
- package/dist/router/router.d.ts.map +1 -0
- package/dist/router/router.js +256 -0
- package/dist/router/router.js.map +1 -0
- package/dist/router/speculate.d.ts +28 -0
- package/dist/router/speculate.d.ts.map +1 -0
- package/dist/router/speculate.js +36 -0
- package/dist/router/speculate.js.map +1 -0
- package/dist/search/fuzzy.d.ts +16 -0
- package/dist/search/fuzzy.d.ts.map +1 -0
- package/dist/search/fuzzy.js +77 -0
- package/dist/search/fuzzy.js.map +1 -0
- package/dist/search/index.d.ts +5 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +3 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/search.d.ts +56 -0
- package/dist/search/search.d.ts.map +1 -0
- package/dist/search/search.js +540 -0
- package/dist/search/search.js.map +1 -0
- package/dist/search/wasm.d.ts +35 -0
- package/dist/search/wasm.d.ts.map +1 -0
- package/dist/search/wasm.js +51 -0
- package/dist/search/wasm.js.map +1 -0
- package/dist/security/cors.d.ts +61 -0
- package/dist/security/cors.d.ts.map +1 -0
- package/dist/security/cors.js +174 -0
- package/dist/security/cors.js.map +1 -0
- package/dist/security/csp.d.ts +49 -0
- package/dist/security/csp.d.ts.map +1 -0
- package/dist/security/csp.js +143 -0
- package/dist/security/csp.js.map +1 -0
- package/dist/security/csrf.d.ts +47 -0
- package/dist/security/csrf.d.ts.map +1 -0
- package/dist/security/csrf.js +122 -0
- package/dist/security/csrf.js.map +1 -0
- package/dist/security/encrypt.d.ts +64 -0
- package/dist/security/encrypt.d.ts.map +1 -0
- package/dist/security/encrypt.js +129 -0
- package/dist/security/encrypt.js.map +1 -0
- package/dist/security/index.d.ts +21 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +11 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/rate-limit.d.ts +57 -0
- package/dist/security/rate-limit.d.ts.map +1 -0
- package/dist/security/rate-limit.js +222 -0
- package/dist/security/rate-limit.js.map +1 -0
- package/dist/security/rbac.d.ts +84 -0
- package/dist/security/rbac.d.ts.map +1 -0
- package/dist/security/rbac.js +164 -0
- package/dist/security/rbac.js.map +1 -0
- package/dist/security/sanitize.d.ts +44 -0
- package/dist/security/sanitize.d.ts.map +1 -0
- package/dist/security/sanitize.js +230 -0
- package/dist/security/sanitize.js.map +1 -0
- package/dist/security/secure-store.d.ts +44 -0
- package/dist/security/secure-store.d.ts.map +1 -0
- package/dist/security/secure-store.js +164 -0
- package/dist/security/secure-store.js.map +1 -0
- package/dist/security/session.d.ts +76 -0
- package/dist/security/session.d.ts.map +1 -0
- package/dist/security/session.js +251 -0
- package/dist/security/session.js.map +1 -0
- package/dist/security/sri.d.ts +66 -0
- package/dist/security/sri.d.ts.map +1 -0
- package/dist/security/sri.js +159 -0
- package/dist/security/sri.js.map +1 -0
- package/dist/shortcuts/index.d.ts +3 -0
- package/dist/shortcuts/index.d.ts.map +1 -0
- package/dist/shortcuts/index.js +2 -0
- package/dist/shortcuts/index.js.map +1 -0
- package/dist/shortcuts/shortcuts.d.ts +43 -0
- package/dist/shortcuts/shortcuts.d.ts.map +1 -0
- package/dist/shortcuts/shortcuts.js +141 -0
- package/dist/shortcuts/shortcuts.js.map +1 -0
- package/dist/ssr/index.d.ts +3 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +2 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/ssr/ssr.d.ts +62 -0
- package/dist/ssr/ssr.d.ts.map +1 -0
- package/dist/ssr/ssr.js +132 -0
- package/dist/ssr/ssr.js.map +1 -0
- package/dist/state/index.d.ts +5 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +3 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/persistent.d.ts +31 -0
- package/dist/state/persistent.d.ts.map +1 -0
- package/dist/state/persistent.js +132 -0
- package/dist/state/persistent.js.map +1 -0
- package/dist/state/store.d.ts +31 -0
- package/dist/state/store.d.ts.map +1 -0
- package/dist/state/store.js +107 -0
- package/dist/state/store.js.map +1 -0
- package/dist/store/index.d.ts +3 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +2 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/store.d.ts +36 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/store/store.js +175 -0
- package/dist/store/store.js.map +1 -0
- package/dist/supabase/auth.d.ts +28 -0
- package/dist/supabase/auth.d.ts.map +1 -0
- package/dist/supabase/auth.js +47 -0
- package/dist/supabase/auth.js.map +1 -0
- package/dist/supabase/client.d.ts +18 -0
- package/dist/supabase/client.d.ts.map +1 -0
- package/dist/supabase/client.js +36 -0
- package/dist/supabase/client.js.map +1 -0
- package/dist/supabase/realtime.d.ts +22 -0
- package/dist/supabase/realtime.d.ts.map +1 -0
- package/dist/supabase/realtime.js +51 -0
- package/dist/supabase/realtime.js.map +1 -0
- package/dist/sw/index.d.ts +3 -0
- package/dist/sw/index.d.ts.map +1 -0
- package/dist/sw/index.js +2 -0
- package/dist/sw/index.js.map +1 -0
- package/dist/sw/sw.d.ts +49 -0
- package/dist/sw/sw.d.ts.map +1 -0
- package/dist/sw/sw.js +125 -0
- package/dist/sw/sw.js.map +1 -0
- package/dist/tabs/index.d.ts +3 -0
- package/dist/tabs/index.d.ts.map +1 -0
- package/dist/tabs/index.js +2 -0
- package/dist/tabs/index.js.map +1 -0
- package/dist/tabs/tabs.d.ts +34 -0
- package/dist/tabs/tabs.d.ts.map +1 -0
- package/dist/tabs/tabs.js +173 -0
- package/dist/tabs/tabs.js.map +1 -0
- package/dist/test/index.d.ts +3 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +2 -0
- package/dist/test/index.js.map +1 -0
- package/dist/test/test.d.ts +37 -0
- package/dist/test/test.d.ts.map +1 -0
- package/dist/test/test.js +108 -0
- package/dist/test/test.js.map +1 -0
- package/dist/theme/index.d.ts +3 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +2 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/theme.d.ts +40 -0
- package/dist/theme/theme.d.ts.map +1 -0
- package/dist/theme/theme.js +142 -0
- package/dist/theme/theme.js.map +1 -0
- package/dist/timeline/index.d.ts +3 -0
- package/dist/timeline/index.d.ts.map +1 -0
- package/dist/timeline/index.js +2 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/timeline/timeline.d.ts +44 -0
- package/dist/timeline/timeline.d.ts.map +1 -0
- package/dist/timeline/timeline.js +196 -0
- package/dist/timeline/timeline.js.map +1 -0
- package/dist/toast/index.d.ts +3 -0
- package/dist/toast/index.d.ts.map +1 -0
- package/dist/toast/index.js +2 -0
- package/dist/toast/index.js.map +1 -0
- package/dist/toast/toast.d.ts +31 -0
- package/dist/toast/toast.d.ts.map +1 -0
- package/dist/toast/toast.js +198 -0
- package/dist/toast/toast.js.map +1 -0
- package/dist/tooltip/index.d.ts +3 -0
- package/dist/tooltip/index.d.ts.map +1 -0
- package/dist/tooltip/index.js +2 -0
- package/dist/tooltip/index.js.map +1 -0
- package/dist/tooltip/tooltip.d.ts +27 -0
- package/dist/tooltip/tooltip.d.ts.map +1 -0
- package/dist/tooltip/tooltip.js +229 -0
- package/dist/tooltip/tooltip.js.map +1 -0
- package/dist/transition/index.d.ts +3 -0
- package/dist/transition/index.d.ts.map +1 -0
- package/dist/transition/index.js +2 -0
- package/dist/transition/index.js.map +1 -0
- package/dist/transition/transition.d.ts +31 -0
- package/dist/transition/transition.d.ts.map +1 -0
- package/dist/transition/transition.js +95 -0
- package/dist/transition/transition.js.map +1 -0
- package/dist/webgl/index.d.ts +3 -0
- package/dist/webgl/index.d.ts.map +1 -0
- package/dist/webgl/index.js +2 -0
- package/dist/webgl/index.js.map +1 -0
- package/dist/webgl/webgl.d.ts +49 -0
- package/dist/webgl/webgl.d.ts.map +1 -0
- package/dist/webgl/webgl.js +401 -0
- package/dist/webgl/webgl.js.map +1 -0
- package/package.json +269 -0
- package/styles/base/global.css +47 -0
- package/styles/base/reset.css +73 -0
- package/styles/tokens/colors.css +50 -0
- package/styles/tokens/spacing.css +46 -0
- package/styles/tokens/typography.css +37 -0
- package/styles/utilities/layout.css +46 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Parallax
|
|
3
|
+
*
|
|
4
|
+
* Scroll-linked transform effects. Elements move at different speeds
|
|
5
|
+
* relative to scroll position, creating depth.
|
|
6
|
+
*/
|
|
7
|
+
interface ParallaxOptions {
|
|
8
|
+
/** Speed multiplier: 0.5 = half scroll speed, -0.5 = opposite direction. Default: 0.5 */
|
|
9
|
+
speed?: number;
|
|
10
|
+
/** Axis of movement. Default: 'y' */
|
|
11
|
+
direction?: 'x' | 'y';
|
|
12
|
+
/** Only animate when element is in viewport. Default: true */
|
|
13
|
+
inViewOnly?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Apply parallax effect to elements matching a selector.
|
|
17
|
+
* Returns a cleanup function.
|
|
18
|
+
*/
|
|
19
|
+
export declare function parallax(selector: string | HTMLElement | HTMLElement[], options?: ParallaxOptions): () => void;
|
|
20
|
+
/** Remove all parallax effects */
|
|
21
|
+
export declare function destroyParallax(): void;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=parallax.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallax.d.ts","sourceRoot":"","sources":["../../src/animation/parallax.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,UAAU,eAAe;IACvB,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,SAAS,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;IACtB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AA0DD;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,EAAE,EAC9C,OAAO,GAAE,eAAoB,GAC5B,MAAM,IAAI,CAiCZ;AAED,kCAAkC;AAClC,wBAAgB,eAAe,IAAI,IAAI,CAStC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Parallax
|
|
3
|
+
*
|
|
4
|
+
* Scroll-linked transform effects. Elements move at different speeds
|
|
5
|
+
* relative to scroll position, creating depth.
|
|
6
|
+
*/
|
|
7
|
+
import { ticker } from './ticker';
|
|
8
|
+
const items = [];
|
|
9
|
+
let observer = null;
|
|
10
|
+
let active = false;
|
|
11
|
+
function ensureObserver() {
|
|
12
|
+
if (!observer) {
|
|
13
|
+
observer = new IntersectionObserver((entries) => {
|
|
14
|
+
for (const entry of entries) {
|
|
15
|
+
const item = items.find((i) => i.element === entry.target);
|
|
16
|
+
if (item)
|
|
17
|
+
item.inView = entry.isIntersecting;
|
|
18
|
+
}
|
|
19
|
+
}, { rootMargin: '100px' });
|
|
20
|
+
}
|
|
21
|
+
return observer;
|
|
22
|
+
}
|
|
23
|
+
function update() {
|
|
24
|
+
for (const item of items) {
|
|
25
|
+
if (item.inViewOnly && !item.inView)
|
|
26
|
+
continue;
|
|
27
|
+
const rect = item.element.getBoundingClientRect();
|
|
28
|
+
const elementCenter = rect.top + rect.height / 2;
|
|
29
|
+
const viewportCenter = window.innerHeight / 2;
|
|
30
|
+
const offset = (elementCenter - viewportCenter) * item.speed;
|
|
31
|
+
if (item.direction === 'y') {
|
|
32
|
+
item.element.style.transform = `translate3d(0, ${offset}px, 0)`;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
item.element.style.transform = `translate3d(${offset}px, 0, 0)`;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function startTicker() {
|
|
40
|
+
if (active)
|
|
41
|
+
return;
|
|
42
|
+
active = true;
|
|
43
|
+
ticker.add('nova-parallax', () => update());
|
|
44
|
+
}
|
|
45
|
+
function stopTicker() {
|
|
46
|
+
if (!active)
|
|
47
|
+
return;
|
|
48
|
+
active = false;
|
|
49
|
+
ticker.remove('nova-parallax');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Apply parallax effect to elements matching a selector.
|
|
53
|
+
* Returns a cleanup function.
|
|
54
|
+
*/
|
|
55
|
+
export function parallax(selector, options = {}) {
|
|
56
|
+
const { speed = 0.5, direction = 'y', inViewOnly = true } = options;
|
|
57
|
+
const targets = typeof selector === 'string'
|
|
58
|
+
? Array.from(document.querySelectorAll(selector))
|
|
59
|
+
: selector instanceof HTMLElement
|
|
60
|
+
? [selector]
|
|
61
|
+
: selector;
|
|
62
|
+
const obs = inViewOnly ? ensureObserver() : null;
|
|
63
|
+
const newItems = [];
|
|
64
|
+
for (const el of targets) {
|
|
65
|
+
el.style.willChange = 'transform';
|
|
66
|
+
const item = { element: el, speed, direction, inViewOnly, inView: !inViewOnly };
|
|
67
|
+
items.push(item);
|
|
68
|
+
newItems.push(item);
|
|
69
|
+
obs?.observe(el);
|
|
70
|
+
}
|
|
71
|
+
startTicker();
|
|
72
|
+
return () => {
|
|
73
|
+
for (const item of newItems) {
|
|
74
|
+
const idx = items.indexOf(item);
|
|
75
|
+
if (idx !== -1)
|
|
76
|
+
items.splice(idx, 1);
|
|
77
|
+
item.element.style.willChange = '';
|
|
78
|
+
item.element.style.transform = '';
|
|
79
|
+
obs?.unobserve(item.element);
|
|
80
|
+
}
|
|
81
|
+
if (items.length === 0)
|
|
82
|
+
stopTicker();
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/** Remove all parallax effects */
|
|
86
|
+
export function destroyParallax() {
|
|
87
|
+
for (const item of items) {
|
|
88
|
+
item.element.style.willChange = '';
|
|
89
|
+
item.element.style.transform = '';
|
|
90
|
+
}
|
|
91
|
+
items.length = 0;
|
|
92
|
+
observer?.disconnect();
|
|
93
|
+
observer = null;
|
|
94
|
+
stopTicker();
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=parallax.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallax.js","sourceRoot":"","sources":["../../src/animation/parallax.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — CSS Scroll-Driven Animations
|
|
3
|
+
*
|
|
4
|
+
* Uses native CSS `animation-timeline: view()` when supported,
|
|
5
|
+
* falls back to IntersectionObserver + class toggle.
|
|
6
|
+
*/
|
|
7
|
+
export interface ScrollAnimateOptions {
|
|
8
|
+
/** CSS @keyframes animation name (must be defined in your stylesheet) */
|
|
9
|
+
animation: string;
|
|
10
|
+
/** Scroll timeline range. Default: 'entry 0% entry 100%' */
|
|
11
|
+
range?: string;
|
|
12
|
+
/** Animation fill mode. Default: 'forwards' */
|
|
13
|
+
fill?: string;
|
|
14
|
+
/** Fallback class added when element enters viewport. Default: 'is-visible' */
|
|
15
|
+
fallbackClass?: string;
|
|
16
|
+
/** IntersectionObserver root margin for fallback. Default: '0px 0px -10% 0px' */
|
|
17
|
+
rootMargin?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Apply scroll-driven animations to elements.
|
|
21
|
+
* Uses native CSS scroll-driven animations if supported, falls back to IntersectionObserver.
|
|
22
|
+
*
|
|
23
|
+
* @returns Cleanup function that removes animations/observers.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // In your CSS: @keyframes fade-in { from { opacity: 0 } to { opacity: 1 } }
|
|
27
|
+
* const cleanup = scrollAnimate('.reveal', { animation: 'fade-in' });
|
|
28
|
+
*/
|
|
29
|
+
export declare function scrollAnimate(target: string | Element | Element[], options: ScrollAnimateOptions): () => void;
|
|
30
|
+
//# sourceMappingURL=scroll-animate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-animate.d.ts","sourceRoot":"","sources":["../../src/animation/scroll-animate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAUD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,EACpC,OAAO,EAAE,oBAAoB,GAC5B,MAAM,IAAI,CAgDZ"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — CSS Scroll-Driven Animations
|
|
3
|
+
*
|
|
4
|
+
* Uses native CSS `animation-timeline: view()` when supported,
|
|
5
|
+
* falls back to IntersectionObserver + class toggle.
|
|
6
|
+
*/
|
|
7
|
+
function resolveElements(target) {
|
|
8
|
+
if (typeof target === 'string') {
|
|
9
|
+
return Array.from(document.querySelectorAll(target));
|
|
10
|
+
}
|
|
11
|
+
if (Array.isArray(target))
|
|
12
|
+
return target;
|
|
13
|
+
return [target];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Apply scroll-driven animations to elements.
|
|
17
|
+
* Uses native CSS scroll-driven animations if supported, falls back to IntersectionObserver.
|
|
18
|
+
*
|
|
19
|
+
* @returns Cleanup function that removes animations/observers.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* // In your CSS: @keyframes fade-in { from { opacity: 0 } to { opacity: 1 } }
|
|
23
|
+
* const cleanup = scrollAnimate('.reveal', { animation: 'fade-in' });
|
|
24
|
+
*/
|
|
25
|
+
export function scrollAnimate(target, options) {
|
|
26
|
+
const elements = resolveElements(target);
|
|
27
|
+
if (elements.length === 0)
|
|
28
|
+
return () => { };
|
|
29
|
+
const supportsScrollTimeline = CSS.supports('animation-timeline', 'view()');
|
|
30
|
+
if (supportsScrollTimeline) {
|
|
31
|
+
const range = options.range ?? 'entry 0% entry 100%';
|
|
32
|
+
const fill = options.fill ?? 'forwards';
|
|
33
|
+
for (const el of elements) {
|
|
34
|
+
const s = el.style;
|
|
35
|
+
s.animationName = options.animation;
|
|
36
|
+
s.setProperty('animation-timeline', 'view()');
|
|
37
|
+
s.setProperty('animation-range', range);
|
|
38
|
+
s.animationFillMode = fill;
|
|
39
|
+
}
|
|
40
|
+
return () => {
|
|
41
|
+
for (const el of elements) {
|
|
42
|
+
const s = el.style;
|
|
43
|
+
s.animationName = '';
|
|
44
|
+
s.removeProperty('animation-timeline');
|
|
45
|
+
s.removeProperty('animation-range');
|
|
46
|
+
s.animationFillMode = '';
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// Fallback: IntersectionObserver with class toggle
|
|
51
|
+
const className = options.fallbackClass ?? 'is-visible';
|
|
52
|
+
const rootMargin = options.rootMargin ?? '0px 0px -10% 0px';
|
|
53
|
+
const observer = new IntersectionObserver((entries) => {
|
|
54
|
+
for (const entry of entries) {
|
|
55
|
+
if (entry.isIntersecting) {
|
|
56
|
+
entry.target.classList.add(className);
|
|
57
|
+
observer.unobserve(entry.target);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}, { rootMargin });
|
|
61
|
+
for (const el of elements)
|
|
62
|
+
observer.observe(el);
|
|
63
|
+
return () => observer.disconnect();
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=scroll-animate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-animate.js","sourceRoot":"","sources":["../../src/animation/scroll-animate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,SAAS,eAAe,CAAC,MAAoC;IAC3D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,OAAO,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAoC,EACpC,OAA6B;IAE7B,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAE3C,MAAM,sBAAsB,GAAG,GAAG,CAAC,QAAQ,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAE5E,IAAI,sBAAsB,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,qBAAqB,CAAC;QACrD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;QAExC,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAI,EAAkB,CAAC,KAAK,CAAC;YACpC,CAAC,CAAC,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,CAAC,CAAC,WAAW,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;YAC9C,CAAC,CAAC,WAAW,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;YACxC,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,OAAO,GAAG,EAAE;YACV,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC1B,MAAM,CAAC,GAAI,EAAkB,CAAC,KAAK,CAAC;gBACpC,CAAC,CAAC,aAAa,GAAG,EAAE,CAAC;gBACrB,CAAC,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;gBACvC,CAAC,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;gBACpC,CAAC,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,mDAAmD;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,IAAI,YAAY,CAAC;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,CAAC;IAE5D,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CACvC,CAAC,OAAO,EAAE,EAAE;QACV,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;gBACzB,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACtC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC,EACD,EAAE,UAAU,EAAE,CACf,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,QAAQ;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAEhD,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Scroll Observer
|
|
3
|
+
*
|
|
4
|
+
* IntersectionObserver wrapper for scroll-triggered animations.
|
|
5
|
+
* Elements animate in as they enter the viewport.
|
|
6
|
+
*/
|
|
7
|
+
interface ObserveOptions {
|
|
8
|
+
/** Visibility threshold to trigger (0-1). Default: 0.15 */
|
|
9
|
+
threshold?: number;
|
|
10
|
+
/** Root margin for early/late trigger. Default: '0px' */
|
|
11
|
+
rootMargin?: string;
|
|
12
|
+
/** Callback when element enters viewport */
|
|
13
|
+
onEnter?: (el: Element) => void;
|
|
14
|
+
/** Callback when element leaves viewport */
|
|
15
|
+
onLeave?: (el: Element) => void;
|
|
16
|
+
/** Only trigger once (default: true) */
|
|
17
|
+
once?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Observe elements matching a selector for scroll-triggered animations.
|
|
21
|
+
* Returns an unsubscribe function.
|
|
22
|
+
*/
|
|
23
|
+
export declare function observe(selector: string | Element | Element[], options?: ObserveOptions): () => void;
|
|
24
|
+
/**
|
|
25
|
+
* Observe elements within a Shadow DOM root.
|
|
26
|
+
* Useful for components that need scroll animations internally.
|
|
27
|
+
*/
|
|
28
|
+
export declare function observeIn(root: ShadowRoot | HTMLElement, selector: string, options?: ObserveOptions): () => void;
|
|
29
|
+
/** Disconnect all observers */
|
|
30
|
+
export declare function disconnectAll(): void;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=scroll-observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-observer.d.ts","sourceRoot":"","sources":["../../src/animation/scroll-observer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,UAAU,cAAc;IACtB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;IAChC,4CAA4C;IAC5C,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;IAChC,wCAAwC;IACxC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAUD;;;GAGG;AACH,wBAAgB,OAAO,CACrB,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,EACtC,OAAO,GAAE,cAAmB,GAC3B,MAAM,IAAI,CAiDZ;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,UAAU,GAAG,WAAW,EAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,cAAmB,GAC3B,MAAM,IAAI,CAGZ;AAED,+BAA+B;AAC/B,wBAAgB,aAAa,IAAI,IAAI,CAKpC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Scroll Observer
|
|
3
|
+
*
|
|
4
|
+
* IntersectionObserver wrapper for scroll-triggered animations.
|
|
5
|
+
* Elements animate in as they enter the viewport.
|
|
6
|
+
*/
|
|
7
|
+
const observers = new Map();
|
|
8
|
+
let idCounter = 0;
|
|
9
|
+
/**
|
|
10
|
+
* Observe elements matching a selector for scroll-triggered animations.
|
|
11
|
+
* Returns an unsubscribe function.
|
|
12
|
+
*/
|
|
13
|
+
export function observe(selector, options = {}) {
|
|
14
|
+
const { threshold = 0.15, rootMargin = '0px', onEnter = (el) => el.classList.add('is-visible'), onLeave, once = true, } = options;
|
|
15
|
+
const id = `nova-scroll-${++idCounter}`;
|
|
16
|
+
const elements = new Set();
|
|
17
|
+
const observer = new IntersectionObserver((entries) => {
|
|
18
|
+
for (const entry of entries) {
|
|
19
|
+
if (entry.isIntersecting) {
|
|
20
|
+
onEnter(entry.target);
|
|
21
|
+
if (once) {
|
|
22
|
+
observer.unobserve(entry.target);
|
|
23
|
+
elements.delete(entry.target);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else if (onLeave) {
|
|
27
|
+
onLeave(entry.target);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}, { threshold, rootMargin });
|
|
31
|
+
// Resolve elements
|
|
32
|
+
const targets = typeof selector === 'string'
|
|
33
|
+
? document.querySelectorAll(selector)
|
|
34
|
+
: selector instanceof Element
|
|
35
|
+
? [selector]
|
|
36
|
+
: selector;
|
|
37
|
+
for (const el of targets) {
|
|
38
|
+
observer.observe(el);
|
|
39
|
+
elements.add(el);
|
|
40
|
+
}
|
|
41
|
+
observers.set(id, { observer, elements });
|
|
42
|
+
// Return cleanup function
|
|
43
|
+
return () => {
|
|
44
|
+
observer.disconnect();
|
|
45
|
+
observers.delete(id);
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Observe elements within a Shadow DOM root.
|
|
50
|
+
* Useful for components that need scroll animations internally.
|
|
51
|
+
*/
|
|
52
|
+
export function observeIn(root, selector, options = {}) {
|
|
53
|
+
const elements = Array.from(root.querySelectorAll(selector));
|
|
54
|
+
return observe(elements, options);
|
|
55
|
+
}
|
|
56
|
+
/** Disconnect all observers */
|
|
57
|
+
export function disconnectAll() {
|
|
58
|
+
for (const { observer } of observers.values()) {
|
|
59
|
+
observer.disconnect();
|
|
60
|
+
}
|
|
61
|
+
observers.clear();
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=scroll-observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-observer.js","sourceRoot":"","sources":["../../src/animation/scroll-observer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,MAAM,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;AACrD,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB;;;GAGG;AACH,MAAM,UAAU,OAAO,CACrB,QAAsC,EACtC,UAA0B,EAAE;IAE5B,MAAM,EACJ,SAAS,GAAG,IAAI,EAChB,UAAU,GAAG,KAAK,EAClB,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,EAChD,OAAO,EACP,IAAI,GAAG,IAAI,GACZ,GAAG,OAAO,CAAC;IAEZ,MAAM,EAAE,GAAG,eAAe,EAAE,SAAS,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAW,CAAC;IAEpC,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CACvC,CAAC,OAAO,EAAE,EAAE;QACV,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtB,IAAI,IAAI,EAAE,CAAC;oBACT,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACjC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC,EACD,EAAE,SAAS,EAAE,UAAU,EAAE,CAC1B,CAAC;IAEF,mBAAmB;IACnB,MAAM,OAAO,GACX,OAAO,QAAQ,KAAK,QAAQ;QAC1B,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QACrC,CAAC,CAAC,QAAQ,YAAY,OAAO;YAC3B,CAAC,CAAC,CAAC,QAAQ,CAAC;YACZ,CAAC,CAAC,QAAQ,CAAC;IAEjB,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IAED,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE1C,0BAA0B;IAC1B,OAAO,GAAG,EAAE;QACV,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtB,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,IAA8B,EAC9B,QAAgB,EAChB,UAA0B,EAAE;IAE5B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7D,OAAO,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,aAAa;IAC3B,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9C,QAAQ,CAAC,UAAU,EAAE,CAAC;IACxB,CAAC;IACD,SAAS,CAAC,KAAK,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Smooth Scroll
|
|
3
|
+
*
|
|
4
|
+
* Lerp-based smooth scrolling that overrides native scroll behavior.
|
|
5
|
+
* Creates the buttery feel seen on proto.xyz.
|
|
6
|
+
*/
|
|
7
|
+
interface SmoothScrollOptions {
|
|
8
|
+
/** Lerp factor: 0.05 = very smooth, 0.15 = snappy. Default: 0.08 */
|
|
9
|
+
lerp?: number;
|
|
10
|
+
/** Scroll container. Default: window/documentElement */
|
|
11
|
+
wrapper?: HTMLElement;
|
|
12
|
+
/** Enable/disable on touch devices. Default: false (disabled) */
|
|
13
|
+
touchEnabled?: boolean;
|
|
14
|
+
}
|
|
15
|
+
declare class NovaSmoothScroll {
|
|
16
|
+
private lerp;
|
|
17
|
+
private wrapper;
|
|
18
|
+
private targetScroll;
|
|
19
|
+
private currentScroll;
|
|
20
|
+
private active;
|
|
21
|
+
private isTouch;
|
|
22
|
+
private touchEnabled;
|
|
23
|
+
private _origScrollTo;
|
|
24
|
+
constructor(options?: SmoothScrollOptions);
|
|
25
|
+
/** Initialize smooth scrolling */
|
|
26
|
+
init(): void;
|
|
27
|
+
/** Destroy smooth scrolling */
|
|
28
|
+
destroy(): void;
|
|
29
|
+
/** Scroll to a specific position */
|
|
30
|
+
scrollTo(target: number, immediate?: boolean): void;
|
|
31
|
+
/** Get current interpolated scroll position */
|
|
32
|
+
get scroll(): number;
|
|
33
|
+
/** Get the target scroll position */
|
|
34
|
+
get target(): number;
|
|
35
|
+
/** Check if currently scrolling (lerp hasn't settled) */
|
|
36
|
+
get isScrolling(): boolean;
|
|
37
|
+
private getScroll;
|
|
38
|
+
private getMaxScroll;
|
|
39
|
+
private applyScroll;
|
|
40
|
+
private update;
|
|
41
|
+
private onWheel;
|
|
42
|
+
private onKeyDown;
|
|
43
|
+
}
|
|
44
|
+
export declare function createSmoothScroll(options?: SmoothScrollOptions): NovaSmoothScroll;
|
|
45
|
+
export declare function useSmoothScroll(): NovaSmoothScroll;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=smooth-scroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smooth-scroll.d.ts","sourceRoot":"","sources":["../../src/animation/smooth-scroll.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,UAAU,mBAAmB;IAC3B,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,iEAAiE;IACjE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,cAAM,gBAAgB;IACpB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,aAAa,CAA+C;gBAExD,OAAO,GAAE,mBAAwB;IAO7C,kCAAkC;IAClC,IAAI,IAAI,IAAI;IAwCZ,+BAA+B;IAC/B,OAAO,IAAI,IAAI;IAgBf,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,IAAI;IAQjD,+CAA+C;IAC/C,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,qCAAqC;IACrC,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,yDAAyD;IACzD,IAAI,WAAW,IAAI,OAAO,CAEzB;IAID,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,MAAM;IAad,OAAO,CAAC,OAAO,CAIb;IAEF,OAAO,CAAC,SAAS,CAyBf;CACH;AAID,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,gBAAgB,CAIlF;AAED,wBAAgB,eAAe,IAAI,gBAAgB,CAGlD"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Smooth Scroll
|
|
3
|
+
*
|
|
4
|
+
* Lerp-based smooth scrolling that overrides native scroll behavior.
|
|
5
|
+
* Creates the buttery feel seen on proto.xyz.
|
|
6
|
+
*/
|
|
7
|
+
import { ticker } from './ticker';
|
|
8
|
+
class NovaSmoothScroll {
|
|
9
|
+
lerp;
|
|
10
|
+
wrapper;
|
|
11
|
+
targetScroll = 0;
|
|
12
|
+
currentScroll = 0;
|
|
13
|
+
active = false;
|
|
14
|
+
isTouch = false;
|
|
15
|
+
touchEnabled;
|
|
16
|
+
_origScrollTo = null;
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
this.lerp = options.lerp ?? 0.08;
|
|
19
|
+
this.wrapper = options.wrapper ?? null;
|
|
20
|
+
this.touchEnabled = options.touchEnabled ?? false;
|
|
21
|
+
this.isTouch = 'ontouchstart' in window;
|
|
22
|
+
}
|
|
23
|
+
/** Initialize smooth scrolling */
|
|
24
|
+
init() {
|
|
25
|
+
if (this.active)
|
|
26
|
+
return;
|
|
27
|
+
if (this.isTouch && !this.touchEnabled)
|
|
28
|
+
return;
|
|
29
|
+
this.active = true;
|
|
30
|
+
this.currentScroll = this.getScroll();
|
|
31
|
+
this.targetScroll = this.currentScroll;
|
|
32
|
+
// Intercept wheel events
|
|
33
|
+
window.addEventListener('wheel', this.onWheel, { passive: false });
|
|
34
|
+
// Listen for keyboard scroll
|
|
35
|
+
window.addEventListener('keydown', this.onKeyDown);
|
|
36
|
+
// Override window.scrollTo so programmatic calls (router, scroll
|
|
37
|
+
// restoration) sync with our internal state instead of fighting it.
|
|
38
|
+
if (!this.wrapper) {
|
|
39
|
+
this._origScrollTo = window.scrollTo.bind(window);
|
|
40
|
+
const self = this;
|
|
41
|
+
window.scrollTo = function (...args) {
|
|
42
|
+
let y = 0;
|
|
43
|
+
if (typeof args[0] === 'number') {
|
|
44
|
+
// scrollTo(x, y)
|
|
45
|
+
y = args[1] ?? 0;
|
|
46
|
+
}
|
|
47
|
+
else if (args[0] && typeof args[0] === 'object') {
|
|
48
|
+
// scrollTo({ top, behavior })
|
|
49
|
+
const opts = args[0];
|
|
50
|
+
y = opts.top ?? 0;
|
|
51
|
+
}
|
|
52
|
+
self.scrollTo(y, true);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// Start the tick loop
|
|
56
|
+
ticker.add('nova-smooth-scroll', (delta) => this.update(delta));
|
|
57
|
+
// Apply styles to prevent native smooth behavior
|
|
58
|
+
document.documentElement.style.scrollBehavior = 'auto';
|
|
59
|
+
}
|
|
60
|
+
/** Destroy smooth scrolling */
|
|
61
|
+
destroy() {
|
|
62
|
+
if (!this.active)
|
|
63
|
+
return;
|
|
64
|
+
this.active = false;
|
|
65
|
+
window.removeEventListener('wheel', this.onWheel);
|
|
66
|
+
window.removeEventListener('keydown', this.onKeyDown);
|
|
67
|
+
ticker.remove('nova-smooth-scroll');
|
|
68
|
+
document.documentElement.style.scrollBehavior = '';
|
|
69
|
+
// Restore original window.scrollTo
|
|
70
|
+
if (this._origScrollTo) {
|
|
71
|
+
window.scrollTo = this._origScrollTo;
|
|
72
|
+
this._origScrollTo = null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Scroll to a specific position */
|
|
76
|
+
scrollTo(target, immediate = false) {
|
|
77
|
+
this.targetScroll = Math.max(0, Math.min(target, this.getMaxScroll()));
|
|
78
|
+
if (immediate) {
|
|
79
|
+
this.currentScroll = this.targetScroll;
|
|
80
|
+
this.applyScroll();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Get current interpolated scroll position */
|
|
84
|
+
get scroll() {
|
|
85
|
+
return this.currentScroll;
|
|
86
|
+
}
|
|
87
|
+
/** Get the target scroll position */
|
|
88
|
+
get target() {
|
|
89
|
+
return this.targetScroll;
|
|
90
|
+
}
|
|
91
|
+
/** Check if currently scrolling (lerp hasn't settled) */
|
|
92
|
+
get isScrolling() {
|
|
93
|
+
return Math.abs(this.targetScroll - this.currentScroll) > 0.5;
|
|
94
|
+
}
|
|
95
|
+
// --- Internal ---
|
|
96
|
+
getScroll() {
|
|
97
|
+
return this.wrapper ? this.wrapper.scrollTop : window.scrollY;
|
|
98
|
+
}
|
|
99
|
+
getMaxScroll() {
|
|
100
|
+
if (this.wrapper) {
|
|
101
|
+
return this.wrapper.scrollHeight - this.wrapper.clientHeight;
|
|
102
|
+
}
|
|
103
|
+
return document.documentElement.scrollHeight - window.innerHeight;
|
|
104
|
+
}
|
|
105
|
+
applyScroll() {
|
|
106
|
+
if (this.wrapper) {
|
|
107
|
+
this.wrapper.scrollTop = this.currentScroll;
|
|
108
|
+
}
|
|
109
|
+
else if (this._origScrollTo) {
|
|
110
|
+
this._origScrollTo(0, this.currentScroll);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
window.scrollTo(0, this.currentScroll);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
update(_delta) {
|
|
117
|
+
const diff = this.targetScroll - this.currentScroll;
|
|
118
|
+
// Stop updating if close enough (sub-pixel)
|
|
119
|
+
if (Math.abs(diff) < 0.5) {
|
|
120
|
+
this.currentScroll = this.targetScroll;
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
this.currentScroll += diff * this.lerp;
|
|
124
|
+
this.applyScroll();
|
|
125
|
+
}
|
|
126
|
+
onWheel = (e) => {
|
|
127
|
+
e.preventDefault();
|
|
128
|
+
this.targetScroll += e.deltaY;
|
|
129
|
+
this.targetScroll = Math.max(0, Math.min(this.targetScroll, this.getMaxScroll()));
|
|
130
|
+
};
|
|
131
|
+
onKeyDown = (e) => {
|
|
132
|
+
const scrollAmount = 100;
|
|
133
|
+
switch (e.key) {
|
|
134
|
+
case 'ArrowDown':
|
|
135
|
+
this.targetScroll += scrollAmount;
|
|
136
|
+
break;
|
|
137
|
+
case 'ArrowUp':
|
|
138
|
+
this.targetScroll -= scrollAmount;
|
|
139
|
+
break;
|
|
140
|
+
case 'PageDown':
|
|
141
|
+
this.targetScroll += window.innerHeight;
|
|
142
|
+
break;
|
|
143
|
+
case 'PageUp':
|
|
144
|
+
this.targetScroll -= window.innerHeight;
|
|
145
|
+
break;
|
|
146
|
+
case 'Home':
|
|
147
|
+
this.targetScroll = 0;
|
|
148
|
+
break;
|
|
149
|
+
case 'End':
|
|
150
|
+
this.targetScroll = this.getMaxScroll();
|
|
151
|
+
break;
|
|
152
|
+
default:
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
this.targetScroll = Math.max(0, Math.min(this.targetScroll, this.getMaxScroll()));
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
let instance = null;
|
|
159
|
+
export function createSmoothScroll(options) {
|
|
160
|
+
instance = new NovaSmoothScroll(options);
|
|
161
|
+
instance.init();
|
|
162
|
+
return instance;
|
|
163
|
+
}
|
|
164
|
+
export function useSmoothScroll() {
|
|
165
|
+
if (!instance)
|
|
166
|
+
throw new Error('[Nova] Smooth scroll not initialized.');
|
|
167
|
+
return instance;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=smooth-scroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smooth-scroll.js","sourceRoot":"","sources":["../../src/animation/smooth-scroll.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Text Reveal
|
|
3
|
+
*
|
|
4
|
+
* Scroll-triggered staggered text entrance — words or lines
|
|
5
|
+
* slide up one by one as the element enters the viewport.
|
|
6
|
+
*/
|
|
7
|
+
export interface TextRevealOptions {
|
|
8
|
+
/** Split mode: reveal per word or per line. Default: 'word' */
|
|
9
|
+
split?: 'word' | 'line';
|
|
10
|
+
/** Delay between each unit in ms. Default: 50 */
|
|
11
|
+
stagger?: number;
|
|
12
|
+
/** Y offset in px units start from. Default: 20 */
|
|
13
|
+
distance?: number;
|
|
14
|
+
/** Duration per unit in ms. Default: 600 */
|
|
15
|
+
duration?: number;
|
|
16
|
+
/** CSS easing function. Default: 'cubic-bezier(0.16, 1, 0.3, 1)' */
|
|
17
|
+
easing?: string;
|
|
18
|
+
/** IntersectionObserver threshold (0-1). Default: 0.15 */
|
|
19
|
+
threshold?: number;
|
|
20
|
+
/** IntersectionObserver rootMargin. Default: '0px' */
|
|
21
|
+
rootMargin?: string;
|
|
22
|
+
/** Only animate once. Default: true */
|
|
23
|
+
once?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Apply scroll-triggered staggered text reveal to elements.
|
|
27
|
+
* Returns a cleanup function that restores original DOM.
|
|
28
|
+
*/
|
|
29
|
+
export declare function textReveal(selector: string | Element | Element[], options?: TextRevealOptions): () => void;
|
|
30
|
+
//# sourceMappingURL=text-reveal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-reveal.d.ts","sourceRoot":"","sources":["../../src/animation/text-reveal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA8HD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,EACtC,OAAO,GAAE,iBAAsB,GAC9B,MAAM,IAAI,CAyDZ"}
|