@kurocado-studio/systemhaus-motion-react 1.0.0-develop.1 → 1.0.0-develop.11

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/exports.js CHANGED
@@ -1 +1 @@
1
- import{get as z}from"lodash-es";var B=Symbol("ThemeProvider");var p="@kurocado:color-scheme",w="ph ph-moon-stars",x="ph ph-sun";var s=(function(r){return r.DARK="dark",r.LIGHT="light",r.SYSTEM="system",r})(s||{});function h(){return globalThis.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function T(){var r;return(r=localStorage.getItem(p))!==null&&r!==void 0?r:void 0}function _(r){var o=document.documentElement,e=s.DARK;r===e?o.classList.add(e):o.classList.remove(e)}function y(){var r=T();return r==="system"||!r?h():r}function k(r){localStorage.setItem(p,r),_(r==="system"?h():r)}function V(){var r=y(),o=r==="dark"?"light":"dark";return k(o),o}function A(){return y()==="dark"}var c={getStoredTheme:T,getSystemTheme:h,resolveEffectiveTheme:y,applyTheme:_,setTheme:k,toggleTheme:V,isDarkMode:A};import{useEffect as D,useState as I}from"react";function Y(){let[r,o]=I(()=>globalThis.window===void 0?s.LIGHT:c.resolveEffectiveTheme());D(()=>{if(globalThis.window===void 0)return;c.applyTheme(r);let n=globalThis.matchMedia("(prefers-color-scheme: dark)"),l=()=>{let i=c.getStoredTheme();if(i===s.SYSTEM||!i){let v=c.getSystemTheme();c.applyTheme(v),o(v)}};return n.addEventListener("change",l),()=>{n.removeEventListener("change",l)}},[r]);let e=()=>{let n=c.toggleTheme();o(n)},t=n=>{c.setTheme(n),o(c.resolveEffectiveTheme())},a=r===s.DARK?w:x;return{isDark:r===s.DARK,theme:r,toggle:e,iconSettings:a,setTheme:t}}import{get as M}from"lodash-es";function G(r,o,e,t){var a=r.getBoundingClientRect(),m=a.left+a.width/2,n=a.top+a.height/2,l=o-m,i=e-n,v=t.magneticModeActivationRadius,d=M(t,["maxDistance"],3e3),u=M(t,["intensity"],.1);if(globalThis.matchMedia("(prefers-reduced-motion: reduce)").matches)return{x:0,y:0};if(typeof v=="number"){var f=Math.hypot(Math.pow(l,2)+Math.pow(i,2));if(f>d)return{x:0,y:0};var g=0;return f<v&&(g=1-f/v),{x:l*g*u,y:i*g*u}}if(Math.abs(l)<d&&Math.abs(i)<d){var b=1-Math.max(Math.abs(l),Math.abs(i))/d;return{x:l*b*u,y:i*b*u}}return{x:0,y:0}}import{useMotionValue as E,useSpring as S}from"framer-motion";import{get as C}from"lodash-es";import{useEffect as O,useState as R}from"react";function $(r){let o=C(r,["damping"],100),e=C(r,["stiffness"],600),t=E(0),a=E(0),[m,n]=R(),l=S(t,{damping:o,stiffness:e}),i=S(a,{damping:o,stiffness:e});return O(()=>{let v=d=>{if(!m)return;let{x:u,y:f}=G(m,d.clientX,d.clientY,r);t.set(u),a.set(f)};return document.addEventListener("mousemove",v),()=>document.removeEventListener("mousemove",v)},[m,r,t,a]),{ref:n,x:l,y:i}}export{s as ThemeEnum,$ as useCursorFollow,Y as useDarkMode};
1
+ import{get as z}from"lodash-es";function X(e,i,r,a){var n=e.getBoundingClientRect(),t=n.left+n.width/2,l=n.top+n.height/2,o=i-t,c=r-l,s=a.magneticModeActivationRadius,m=z(a,["maxDistance"],3e3),u=z(a,["intensity"],.1);if(globalThis.matchMedia("(prefers-reduced-motion: reduce)").matches)return{x:0,y:0};if(typeof s=="number"){var y=Math.hypot(Math.pow(o,2)+Math.pow(c,2));if(y>m)return{x:0,y:0};var P=0;return y<s&&(P=1-y/s),{x:o*P*u,y:c*P*u}}if(Math.abs(o)<m&&Math.abs(c)<m){var b=1-Math.max(Math.abs(o),Math.abs(c))/m;return{x:o*b*u,y:c*b*u}}return{x:0,y:0}}var ue=.4;var le="easeInOut",E=12;var me=12,A={isStatic:!1,fadeInSpeed:me,fadeDistance:E,transition:{duration:ue,ease:le},reducedMotion:"user"};import{get as V}from"lodash-es";import Y,{createContext as fe,useContext as pe,useMemo as de}from"react";var I=(t=>(t.TOP="TOP",t.BOTTOM="BOTTOM",t.LEFT="LEFT",t.RIGHT="RIGHT",t.DEFAULT="DEFAULT",t))(I||{});import{useMotionValue as C,useSpring as H,MotionConfig as j,AnimatePresence as q,motion as F}from"framer-motion";var S={...A,fadeInDirection:"TOP",fadeInDistance:E,viewport:{once:!1,amount:.2}},B=fe(S),Ve=({children:e,motionOverrides:i})=>{let r=de(()=>({...A,...i,viewport:V(i,["viewport"],S.viewport),fadeInDistance:V(i,["fadeInDistance"],S.fadeInDistance),fadeInDirection:V(i,["fadeInDirection"],S.fadeInDirection)}),[i]);return Y.createElement(B.Provider,{value:r},Y.createElement(j,{...r},e))},v=()=>pe(B);import{get as K}from"lodash-es";import{useEffect as he,useState as ve}from"react";function Xe(e){let i=K(e,["damping"],100),r=K(e,["stiffness"],600),a=C(0),n=C(0),[t,l]=ve(),o=H(a,{damping:i,stiffness:r}),c=H(n,{damping:i,stiffness:r});return he(()=>{let s=m=>{if(!t)return;let{x:u,y}=X(t,m.clientX,m.clientY,e);a.set(u),n.set(y)};return document.addEventListener("mousemove",s),()=>document.removeEventListener("mousemove",s)},[t,e,a,n]),{ref:l,x:o,y:c}}import{get as $}from"lodash-es";import W from"react";var We=({onEnterDirection:e,onExitDirection:i}={})=>{let{viewport:r,transition:a,fadeInDistance:n=E}=v(),t=Math.abs(n),o=W.useCallback(s=>({DEFAULT:{hidden:{opacity:0,y:0},visible:{opacity:1,y:0},exit:{opacity:0,y:0}},TOP:{hidden:{opacity:0,y:-s},visible:{opacity:1,y:0},exit:{opacity:0,y:-s}},BOTTOM:{hidden:{opacity:0,y:s},visible:{opacity:1,y:0},exit:{opacity:0,y:s}},LEFT:{hidden:{opacity:0,x:-s},visible:{opacity:1,x:0},exit:{opacity:0,x:-s}},RIGHT:{hidden:{opacity:0,x:s},visible:{opacity:1,x:0},exit:{opacity:0,x:s}}}),[])(t),c=$(o,[i??"BOTTOM","exit"],o.BOTTOM.exit);return W.useMemo(()=>({initial:"hidden",animate:"visible",exit:"exit",variants:{...$(o,[e??"TOP"],o.TOP),exit:c},transition:a,viewport:r}),[o,c,e,a,r])};import{cloneDeep as ye,merge as ge}from"lodash-es";import xe from"react";function et(...e){return xe.useMemo(()=>{let i=e.map(r=>ye(r));return ge({},...i)},e)}import{useEffect as J,useRef as Me,useState as x}from"react";var Pe={hidden:{opacity:0,scale:.8},visible:{opacity:1,scale:1},exit:{opacity:0,scale:.8}};function nt({images:e,frequency:i=15,visibleFor:r=1.5,animation:a}){let n=Me(null),[t,l]=x({x:0,y:0}),[o,c]=x(!1),[s,m]=x({x:0,y:0}),[u,y]=x(0),[P,b]=x([]),[O,te]=x(!1),[N,re]=x([]),{transition:ie}=v(),k=200,oe=k-1,G=k-(i-1)*oe/49;J(()=>{let g=!0,p=[];return(async()=>{let d=[];await Promise.all(e.map(M=>new Promise((f,T)=>{let h=new Image,L=()=>{d.push({width:h.width,height:h.height}),U(),f()},R=ce=>{U(),T(ce)},U=()=>{h.removeEventListener("load",L),h.removeEventListener("error",R)};h.addEventListener("load",L),h.addEventListener("error",R),p.push({img:h,onLoad:L,onError:R}),h.src=M}))),g&&(re(d),te(!0))})().then(),()=>{g=!1;for(let{img:d,onLoad:M,onError:f}of p)d.removeEventListener("load",M),d.removeEventListener("error",f)}},[e]);let ne=g=>{let p=g.currentTarget.getBoundingClientRect();l({x:g.clientX-p.left,y:g.clientY-p.top})},ae=()=>c(!0),se=()=>c(!1);return J(()=>{if(!o||e.length===0||!O||Math.hypot(t.x-s.x,t.y-s.y)<G)return;let p=N[u]||{width:100,height:100},D=p.width,d=p.height,M={imageTrailKey:Math.random().toString(),style:{width:D,height:d,position:"absolute",backgroundImage:`url(${e[u]})`,backgroundSize:"auto",backgroundPosition:"center",pointerEvents:"none",left:t.x-D/2,top:t.y-d/2},initial:"hidden",animate:"visible",exit:"exit",variants:Pe,transition:ie};b(f=>[...f,M]),y(f=>(f+1)%e.length),m(t),setTimeout(()=>{b(f=>f.map(T=>T.imageTrailKey===M.imageTrailKey?{...T,animate:"exit"}:T))},r*1e3)},[t,o,s,e,O,N,G,u,r,a]),{componentRef:n,componentProps:{onMouseMove:ne,onMouseEnter:ae,onMouseLeave:se},activeImages:P,imagesPreloaded:O}}import{get as w}from"lodash-es";import Q from"react";function lt(e={}){let{transition:r}=v(),n=Q.useCallback(()=>({default:{hidden:{opacity:0,scale:w(e,["initialScale"],1.1)},visible:{opacity:1,scale:1},exit:{opacity:0,scale:w(e,["exitScale"],1.1)}}}),[])(),t=w(n,["default","exit"],n.default.exit);return Q.useMemo(()=>({initial:"hidden",animate:"visible",exit:"exit",variants:{...n.default,exit:t},transition:{duration:w(r,["duration"],1.2),...r}}),[n,t,r])}import{get as Z}from"lodash-es";import ee from"react";function vt({onEnterDirection:e="RIGHT",onExitDirection:i="RIGHT",distance:r="100%"}={}){let{transition:a}=v(),t=ee.useCallback(o=>({DEFAULT:{hidden:{opacity:0},visible:{opacity:1},exit:{opacity:0}},TOP:{hidden:{opacity:0,y:`-${o}`},visible:{opacity:1,y:0},exit:{opacity:0,y:`-${o}`}},BOTTOM:{hidden:{opacity:0,y:o},visible:{opacity:1,y:0},exit:{opacity:0,y:o}},LEFT:{hidden:{opacity:0,x:`-${o}`},visible:{opacity:1,x:0},exit:{opacity:0,x:`-${o}`}},RIGHT:{hidden:{opacity:0,x:o},visible:{opacity:1,x:0},exit:{opacity:0,x:o}}}),[])(r),l=Z(t,[i,"exit"],t.RIGHT.exit);return ee.useMemo(()=>({initial:"hidden",animate:"visible",exit:"exit",variants:{...Z(t,[e],t.RIGHT),exit:l},transition:{...a}}),[t,l,e,a])}import{get as be}from"lodash-es";import Te from"react";function Pt(e){let{as:i,...r}=e,a=be(F,[i??"div"],F.div);return Te.createElement(a,{...r})}import _ from"react";function It({children:e,isVisible:i,mode:r,initial:a}){return _.createElement(q,{mode:r,initial:a},i&&_.Children.toArray(e).map((n,t)=>_.isValidElement(n)?_.cloneElement(n,{key:n.key??`motion-child-${t}`}):n))}import{cloneDeep as Ee,merge as Ie}from"lodash-es";function _t(...e){let i=e.map(r=>Ee(r));return Ie({},...i)}export{It as AnimateMotionPresence,I as DirectionEnum,Ve as MotionProvider,Pt as PolymorphicMotionElement,_t as mergeMotionProperties,S as systemHausMotionConfiguration,Xe as useCursorFollow,et as useDeepMergeMotionProperties,We as useFadeIn,nt as useImageTrail,lt as useScale,vt as useSlideOut,v as useSystemHausMotionProvider};
package/dist/index.d.ts CHANGED
@@ -1,5 +1,26 @@
1
- import * as framer_motion from 'framer-motion';
2
- import * as react from 'react';
1
+ import { AnimatePresence } from 'framer-motion';
2
+ import * as Motion from 'framer-motion';
3
+ import { motion } from 'framer-motion';
4
+ import { MotionConfig } from 'framer-motion';
5
+ import { MotionProps } from 'framer-motion';
6
+ import * as React_2 from 'react';
7
+ import React__default from 'react';
8
+ import { useMotionValue } from 'framer-motion';
9
+ import { useSpring } from 'framer-motion';
10
+ import { Variant } from 'framer-motion';
11
+ import { Variants } from 'framer-motion';
12
+ import { ViewportOptions } from 'framer-motion';
13
+
14
+ export declare function AnimateMotionPresence({ children, isVisible, mode, initial, }: React__default.PropsWithChildren<AnimateMotionPresenceProperties>): React__default.ReactNode;
15
+
16
+ export declare interface AnimateMotionPresenceProperties {
17
+ isVisible?: boolean;
18
+ initial?: boolean;
19
+ children?: React__default.ReactNode;
20
+ mode?: 'wait' | 'sync' | 'popLayout';
21
+ }
22
+
23
+ export { AnimatePresence }
3
24
 
4
25
  declare type CalculateCursorOffsetController = CursorFollowSettings;
5
26
 
@@ -11,26 +32,123 @@ declare interface CursorFollowSettings {
11
32
  magneticModeActivationRadius?: number;
12
33
  }
13
34
 
14
- export declare interface DarkModeController {
15
- isDark: boolean;
16
- theme: ThemeEnum;
17
- toggle: () => void;
18
- iconSettings: string;
19
- setTheme: (newTheme: ThemeEnum) => void;
35
+ declare interface CursorImageTrailOptions {
36
+ images: string[];
37
+ frequency?: number;
38
+ visibleFor?: number;
39
+ animation?: {
40
+ in?: MotionProps;
41
+ out?: MotionProps;
42
+ };
43
+ }
44
+
45
+ export declare enum DirectionEnum {
46
+ TOP = "TOP",
47
+ BOTTOM = "BOTTOM",
48
+ LEFT = "LEFT",
49
+ RIGHT = "RIGHT",
50
+ DEFAULT = "DEFAULT"
51
+ }
52
+
53
+ export declare function mergeMotionProperties(...motionProperties: MotionProps[]): MotionProps;
54
+
55
+ export { motion }
56
+
57
+ export { MotionConfig }
58
+
59
+ export { MotionProps }
60
+
61
+ export declare const MotionProvider: React__default.FC<SystemHausMotionProviderProperties>;
62
+
63
+ declare type PolymorphicActiveMotionProperties<T extends keyof React__default.JSX.IntrinsicElements = 'img'> = PolymorphicMotionProperties<T> & {
64
+ imageTrailKey?: string;
65
+ };
66
+
67
+ export declare function PolymorphicMotionElement<T extends keyof React__default.JSX.IntrinsicElements = 'div'>(properties: React__default.PropsWithChildren<PolymorphicMotionProperties<T>>): React__default.ReactNode;
68
+
69
+ export declare type PolymorphicMotionProperties<T extends keyof React__default.JSX.IntrinsicElements = 'div'> = Omit<React__default.JSX.IntrinsicElements[T], keyof MotionProps | 'ref'> & MotionProps & {
70
+ as?: T;
71
+ isVisible?: boolean;
72
+ style?: React__default.CSSProperties & Record<string, unknown>;
73
+ };
74
+
75
+ declare type ProvidedConfig = {
76
+ fadeInSpeed: number;
77
+ fadeDistance: number;
78
+ };
79
+
80
+ export declare const systemHausMotionConfiguration: SystemHausMotionProvider;
81
+
82
+ export declare interface SystemHausMotionProvider extends SystemHausMotionProviderConfig {
83
+ fadeInDistance: number;
84
+ fadeInDirection: DirectionEnum;
85
+ viewport: ViewportOptions;
20
86
  }
21
87
 
22
- export declare enum ThemeEnum {
23
- DARK = "dark",
24
- LIGHT = "light",
25
- SYSTEM = "system"
88
+ declare type SystemHausMotionProviderConfig = ProvidedConfig & {
89
+ [K in keyof Motion.MotionConfigProps as Motion.MotionConfigProps[K] extends (...unknowns: unknown[]) => unknown ? never : K]: Motion.MotionConfigProps[K];
90
+ };
91
+
92
+ declare interface SystemHausMotionProviderProperties {
93
+ children?: React__default.ReactNode;
94
+ motionOverrides?: Partial<SystemHausMotionProvider>;
26
95
  }
27
96
 
28
97
  export declare function useCursorFollow(settings: CalculateCursorOffsetController): {
29
- ref: react.Dispatch<react.SetStateAction<HTMLDivElement | undefined>>;
30
- x: framer_motion.MotionValue<number>;
31
- y: framer_motion.MotionValue<number>;
98
+ ref: React_2.Dispatch<React_2.SetStateAction<HTMLDivElement | undefined>>;
99
+ x: Motion.MotionValue<number>;
100
+ y: Motion.MotionValue<number>;
101
+ };
102
+
103
+ export declare function useDeepMergeMotionProperties(...motionProperties: MotionProps[]): MotionProps;
104
+
105
+ export declare const useFadeIn: ({ onEnterDirection, onExitDirection, }?: UseFadeInProperties) => PolymorphicMotionProperties;
106
+
107
+ export declare interface UseFadeInProperties {
108
+ onEnterDirection?: DirectionEnum;
109
+ onExitDirection?: DirectionEnum;
110
+ }
111
+
112
+ export declare function useImageTrail({ images, frequency, visibleFor, animation, }: CursorImageTrailOptions): {
113
+ componentRef: React__default.RefObject<HTMLDivElement | null>;
114
+ componentProps: {
115
+ onMouseMove: (event: React__default.MouseEvent<HTMLDivElement>) => void;
116
+ onMouseEnter: () => void;
117
+ onMouseLeave: () => void;
118
+ };
119
+ activeImages: PolymorphicActiveMotionProperties<"img">[];
120
+ imagesPreloaded: boolean;
32
121
  };
33
122
 
34
- export declare function useDarkMode(): DarkModeController;
123
+ export { useMotionValue }
124
+
125
+ /**
126
+ * Scale motion hook — animates an element scaling in/out.
127
+ * Default scale range: visible = 1, hidden = 1.2 (slightly zoomed in).
128
+ */
129
+ export declare function useScale(payload?: {
130
+ initialScale?: number;
131
+ exitScale?: number;
132
+ }): PolymorphicMotionProperties;
133
+
134
+ /**
135
+ * Slide-out motion hook — animates an element in/out based on direction.
136
+ * Default distance: "100%" (full travel).
137
+ */
138
+ export declare function useSlideOut({ onEnterDirection, onExitDirection, distance, }?: {
139
+ onEnterDirection?: DirectionEnum;
140
+ onExitDirection?: DirectionEnum;
141
+ distance?: string | number;
142
+ }): PolymorphicMotionProperties;
143
+
144
+ export { useSpring }
145
+
146
+ export declare const useSystemHausMotionProvider: () => SystemHausMotionProvider;
147
+
148
+ export { Variant }
149
+
150
+ export { Variants }
151
+
152
+ export { ViewportOptions }
35
153
 
36
154
  export { }
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.53.1"
8
+ "packageVersion": "7.55.0"
9
9
  }
10
10
  ]
11
11
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kurocado-studio/systemhaus-motion-react",
3
- "version": "1.0.0-develop.1",
3
+ "version": "1.0.0-develop.11",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -17,10 +17,6 @@
17
17
  "import": "./dist/exports.js",
18
18
  "types": "./dist/index.d.ts",
19
19
  "default": "./dist/exports.js"
20
- },
21
- "./tailwind.css": {
22
- "import": "./dist/exports.css",
23
- "default": "./dist/exports.css"
24
20
  }
25
21
  },
26
22
  "files": [
@@ -28,13 +24,10 @@
28
24
  ],
29
25
  "scripts": {
30
26
  "build:typings": "api-extractor run --local",
31
- "build": "rm -rf dist && tsup && pnpm build:typings && rm -rf dist/exports.d.ts",
27
+ "build": "tsup && pnpm build:typings && rm -rf dist/exports.d.ts",
32
28
  "prepublishOnly": "node ../../scripts/strip-workspaces.js .",
33
29
  "clean": "rm -rf .turbo node_modules dist",
34
30
  "dev": "tsup --watch",
35
- "dev:vite": "vite build --watch --mode development",
36
- "vite:watch": "vite build --watch --mode development",
37
- "build:vite": "rm -rf dist && vite build --mode production",
38
31
  "lint": "eslint --max-warnings=0 --no-warn-ignored",
39
32
  "lint:fix": "eslint --max-warnings=0 --fix --no-warn-ignored",
40
33
  "prettier:fix": "prettier --write . --ignore-path ../../.prettierignore",
@@ -42,10 +35,8 @@
42
35
  "typecheck": "tsc --noEmit --pretty"
43
36
  },
44
37
  "dependencies": {
45
- "@emotion/is-prop-valid": "^1.3.1",
46
- "framer-motion": "^12.23.6",
38
+ "framer-motion": "^12.23.24",
47
39
  "lodash-es": "^4.17.21",
48
- "motion": "^12.11.0",
49
40
  "react": "19"
50
41
  },
51
42
  "devDependencies": {
@@ -57,17 +48,11 @@
57
48
  "@types/node": "^22.15.19",
58
49
  "@types/react": "^19.1.10",
59
50
  "@types/react-dom": "^19.1.4",
60
- "@vitejs/plugin-react": "^4.4.1",
61
51
  "@vitest/coverage-v8": "^3.1.3",
62
- "copyfiles": "^2.4.1",
63
52
  "eslint": "^9.28.0",
64
53
  "prettier": "3.5.3",
65
54
  "tsup": "^8.5.0",
66
55
  "typescript": "5.8.3",
67
- "vite": "^5.2.8",
68
- "vite-node": "3.2.4",
69
- "vite-plugin-dts": "^4.5.3",
70
- "vite-tsconfig-paths": "^5.1.4",
71
56
  "vitest": "^3.1.3"
72
57
  }
73
58
  }