@kurocado-studio/systemhaus-motion-react 1.4.0-develop.1 → 1.7.0-develop.1
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/Mona-Sans.var-G7Q5JD7I.woff2 +0 -0
- package/dist/exports.js +7 -1
- package/dist/exports.js.map +1 -1
- package/dist/index.d.ts +88 -1
- package/package.json +2 -1
|
Binary file
|
package/dist/exports.js
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
import{get as
|
|
1
|
+
"use client";import{get as oe}from"lodash-es";function ie(e,o,t,i){let r=e.getBoundingClientRect(),l=r.left+r.width/2,s=r.top+r.height/2,n=o-l,u=t-s,{magneticModeActivationRadius:c}=i,g=oe(i,["maxDistance"],3e3),p=oe(i,["intensity"],.1);if(globalThis.matchMedia("(prefers-reduced-motion: reduce)").matches)return{x:0,y:0};if(typeof c=="number"){let m=Math.hypot(n**2+u**2);if(m>g)return{x:0,y:0};let f=0;return m<c&&(f=1-m/c),{x:n*f*p,y:u*f*p}}if(Math.abs(n)<g&&Math.abs(u)<g){let m=1-Math.max(Math.abs(n),Math.abs(u))/g;return{x:n*m*p,y:u*m*p}}return{x:0,y:0}}var d=(e=>(e.TOP="TOP",e.BOTTOM="BOTTOM",e.LEFT="LEFT",e.RIGHT="RIGHT",e.DEFAULT="DEFAULT",e))(d||{});function re(e){let o=e.frequency??15,t=e.visibleFor??1.5,i=200,r=i-1,l=i-(o-1)*r/49,s={active:[],index:0,lastX:0,lastY:0,imagesLoaded:!1,imageSizes:[]};async function n(){s.imageSizes=await Promise.all(e.images.map(p=>new Promise((m,f)=>{let a=new Image,y=()=>{a.removeEventListener("load",y),a.removeEventListener("error",M),m({width:a.width,height:a.height})},M=D=>{a.removeEventListener("load",y),a.removeEventListener("error",M),f(D)};a.addEventListener("load",y),a.addEventListener("error",M),a.src=p}))),s.imagesLoaded=!0}function u(p,m){let f=p-s.lastX,a=m-s.lastY;return Math.hypot(f,a)>=l}function c(p,m){let f=s.index,a=e.images[f]||"",y=s.imageSizes[f]||{width:100,height:100},M=e.maxWidth?Math.min(y.width,e.maxWidth):y.width,D=e.maxHeight?Math.min(y.height,e.maxHeight):y.height,P={key:Math.random().toString(36),src:a,x:p-M/2,y:m-D/2,width:M,height:D,createdAt:performance.now(),shouldHide:!1};return s.active.push(P),s.index=(s.index+1)%e.images.length,s.lastX=p,s.lastY=m,P}function g(p){let m=t*1e3;s.active=s.active.map(f=>(!f.shouldHide&&p-f.createdAt>=m&&(f.shouldHide=!0),f))}return{state:s,loadImages:n,shouldTrigger:u,pushFrame:c,updateVisibility:g}}var ne=(e,o)=>{let t=o.x-e.x,i=o.y-e.y;return Math.hypot(t,i)},Z=(e,o,t,i)=>{let r=i-Math.abs(i*e/o);return Math.max(t,r+t)},ae=(e,o)=>{let t;return(...i)=>{clearTimeout(t),t=setTimeout(()=>{e.apply(void 0,i)},o)}},se=e=>Array.from({length:e.length},(o,t)=>e.charAt(t)),le=e=>e===" "?"\xA0":e;var me=(e,o)=>{if(o<=0)return{scaleYFactor:1,lineHeightScale:1};let t=e/o;return{scaleYFactor:t,lineHeightScale:t}},ce=e=>e.map(o=>{if(!o)return null;let t=o.getBoundingClientRect();return{x:t.x+t.width/2,y:t.y+t.height/2}}),pe=({distance:e,maxDistance:o,minWidth:t,maxWidth:i,widthEnabled:r,weightEnabled:l,italicEnabled:s,minWeight:n,maxWeight:u})=>{let c=r?Math.floor(Z(e,o,t??5,i??200)):100,g=l?Math.floor(Z(e,o,n??100,u??900)):400,p=s?Z(e,o,0,1).toFixed(2):"0";return{widthAxisValue:c,weightAxisValue:g,italicAxisValue:p}},ue=(e,o,t)=>`'wght' ${e}, 'wdth' ${o}, 'ital' ${t}`;var Xe="easeInOut",O=12;var z={isStatic:!1,fadeInSpeed:12,fadeDistance:12,transition:{duration:.4,ease:Xe},reducedMotion:"user"};import{get as W}from"lodash-es";import ge,{createContext as je,useContext as qe,useMemo as Ke}from"react";import{stagger as fe,useIsPresent as ut,useMotionValue as _,useSpring as G,MotionConfig as ye,AnimatePresence as de,motion as he}from"framer-motion";var Y={...z,fadeInDirection:d.TOP,fadeInDistance:O,viewport:{once:!1,amount:.2}},Me=je(Y),gt=({children:e,motionOverrides:o})=>{let t=Ke(()=>({...z,...o,viewport:W(o,["viewport"],Y.viewport),fadeInDistance:W(o,["fadeInDistance"],Y.fadeInDistance),fadeInDirection:W(o,["fadeInDirection"],Y.fadeInDirection)}),[o]);return ge.createElement(Me.Provider,{value:t},ge.createElement(ye,{...t},e))},C=()=>qe(Me);import Q from"react";function Et({children:e,isVisible:o,mode:t,initial:i}){return Q.createElement(de,{mode:t,initial:i},o&&Q.Children.toArray(e).map((r,l)=>Q.isValidElement(r)?Q.cloneElement(r,{key:r.key??`motion-child-${l}`}):r))}import{cancelFrame as Ze,frame as ze}from"framer-motion";import{ReactLenis as xe}from"lenis/react";import{useEffect as _e,useRef as De}from"react";function Ee(e){_e(()=>{function o(t){let i=t.timestamp;e.current?.lenis?.raf(i)}return ze.update(o,!0),()=>Ze(o)},[e])}function Ct({options:e,...o}){let t=De(null);return Ee(t),React.createElement(xe,{...o,ref:t,root:!0,options:{autoRaf:!1,orientation:"horizontal",...e}})}function It({options:e,...o}){let t=De(null);return Ee(t),React.createElement(xe,{...o,ref:t,root:!0,options:{autoRaf:!1,orientation:"vertical",...e}})}import Ge from"react";function Lt(e){let{as:o,...t}=e,i=he[o??"div"];return Ge.createElement(i,{...t})}var Te="./Mona-Sans.var-G7Q5JD7I.woff2";import{useMotionValue as ve,useSpring as Pe}from"framer-motion";import I,{useCallback as Se,useEffect as N,useMemo as Je,useRef as L,useState as J}from"react";var Ft=({children:e,className:o="",fontFamily:t="Mona-Sans",fontUrl:i=Te,italic:r=!0,maxWeight:l=900,maxWidth:s,minWeight:n=100,minWidth:u,weight:c=!0,width:g=!0})=>{let p=L(null),m=L(null),f=L(null),a=L([]),y=L([]),M=L(0),D=ve(0),P=ve(0),R=Pe(D,{stiffness:240,damping:28}),h=Pe(P,{stiffness:240,damping:28}),[b,V]=J(1),[B,U]=J(1),[j,q]=J(()=>typeof e=="string"||typeof e=="number"?String(e):""),ke=se(j),ee={position:"absolute",width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:0};N(()=>{if(!e){q("");return}if(typeof e=="string"||typeof e=="number"){q(String(e));return}let x=f.current?.textContent??"";q(x)},[e]),N(()=>{let x=E=>{D.set(E.clientX),P.set(E.clientY)},S=E=>{let T=E.touches[0];T&&(D.set(T.clientX),P.set(T.clientY))};if(globalThis.addEventListener("mousemove",x),globalThis.addEventListener("touchmove",S,{passive:!0}),p.current){let{left:E,top:T,width:w,height:A}=p.current.getBoundingClientRect(),F=E+w/2,K=T+A/2;D.set(F),P.set(K)}return()=>{globalThis.removeEventListener("mousemove",x),globalThis.removeEventListener("touchmove",S)}},[]);let k=Se(()=>{if(!m.current)return;let x=m.current.getBoundingClientRect();M.current=x.width/2,y.current=ce(a.current)},[]),H=Se(()=>{if(!p.current||!m.current)return;let{height:x}=p.current.getBoundingClientRect();V(1),U(1),requestAnimationFrame(()=>{if(!m.current)return;let S=m.current.getBoundingClientRect(),{scaleYFactor:E,lineHeightScale:T}=me(x,S.height);V(E),U(T),k()})},[k]);N(()=>{let x=ae(H,100);return x(),window.addEventListener("resize",x),()=>window.removeEventListener("resize",x)},[H]),N(()=>{H()},[j,H]),N(()=>{let x,S=()=>{let E={x:R.get(),y:h.get()};if(m.current){let T=M.current;if(!Number.isFinite(T)||T<=0){k(),x=requestAnimationFrame(S);return}for(let w=0;w<a.current.length;w+=1){let A=a.current[w];if(!A)continue;let F=y.current[w];if(!F)continue;let K=ne(E,F),{widthAxisValue:Oe,weightAxisValue:Qe,italicAxisValue:$e}=pe({distance:K,maxDistance:T,minWidth:u,maxWidth:s,minWeight:n,maxWeight:l,widthEnabled:g,weightEnabled:c,italicEnabled:r}),te=ue(Qe,Oe,$e);A.style.fontVariationSettings!==te&&(A.style.fontVariationSettings=te)}}x=requestAnimationFrame(S)};return S(),()=>cancelAnimationFrame(x)},[k,r,s,l,u,n,R,h,c,g]);let He=Je(()=>i?I.createElement("style",null,`
|
|
2
|
+
@font-face {
|
|
3
|
+
font-family: '${t}';
|
|
4
|
+
src: url('${i}');
|
|
5
|
+
font-style: normal;
|
|
6
|
+
}
|
|
7
|
+
`):null,[t,i]),Fe={fontFamily:t,display:"inline-block",lineHeight:B,transform:`scale(1, ${b})`,transformOrigin:"center top",margin:0,fontWeight:400};return I.createElement(I.Fragment,null,e?I.createElement("div",{ref:f,style:ee},e):I.createElement("span",{style:ee},j),I.createElement("div",{"aria-hidden":"true",ref:p},He,I.createElement("p",{"aria-hidden":"true",ref:m,className:o,style:Fe},ke.map((x,S)=>{let E=le(x);return I.createElement("span",{"aria-hidden":"true",key:S,ref:T=>{a.current[S]=T},"data-char":E,className:"inline-block"},E)}))))};import{set as Ue}from"lodash-es";import et from"react";import{cloneDeep as Ce,merge as Ie}from"lodash-es";import Re from"react";function Xt(...e){return Re.useMemo(()=>{let o=e.map(t=>Ce(t));return Ie({},...o)},e)}function be(){return{handleDeepMergeMotionProperties:Re.useCallback((...o)=>{let t=o.map(i=>Ce(i));return Ie({},...t)},[])}}var _t=()=>{let{handleDeepMergeMotionProperties:e}=be();return{composeStagger:et.useCallback(({payload:t,staggerPayload:i})=>{let r={...t},l=fe(...i),s=t.custom==null?i[0]??0:l;return Ue(r,["transition","delay"],s),e(t,r)},[e])}};import{get as Ve}from"lodash-es";import{useEffect as tt,useRef as ot}from"react";function to(e,o){let t=Ve(e,["damping"],100),i=Ve(e,["stiffness"],600),r=_(0),l=_(0),s=ot(null),n=o??s,u=G(r,{damping:t,stiffness:i}),c=G(l,{damping:t,stiffness:i});return tt(()=>{let g=p=>{let m=n.current;if(!m)return;let{x:f,y:a}=ie(m,p.clientX,p.clientY,e);r.set(f),l.set(a)};return document.addEventListener("mousemove",g),()=>document.removeEventListener("mousemove",g)},[e,n,r,l]),{ref:n,x:u,y:c}}import v from"react";function ro({itemCount:e,scrollBehavior:o="smooth"}){let t=v.useRef(null),i=v.useRef([]),[r,l]=v.useState(0);v.useEffect(()=>{l(a=>Math.min(a,Math.max(e-1,0)))},[e]);let s=v.useCallback(()=>i.current.map(a=>a?a.offsetLeft:0),[]),n=v.useCallback(a=>{let y=s(),M=0,D=Number.POSITIVE_INFINITY;for(let[P,R]of y.entries()){let h=Math.abs(R-a);h<D&&(D=h,M=P)}return M},[s]),u=v.useCallback(a=>{let y=n(a.currentTarget.scrollLeft);y!==r&&l(y)},[r,n]),c=v.useCallback(a=>{if(!t.current)return;let y=Math.max(0,Math.min(a,e-1)),M=i.current[y];M&&(t.current.scrollTo({left:M.offsetLeft,behavior:o}),l(y))},[e,o]),g=v.useMemo(()=>({type:"button",onClick:()=>c(r-1),disabled:r<=0}),[r,c]),p=v.useMemo(()=>({type:"button",onClick:()=>c(r+1),disabled:r>=e-1}),[r,e,c]),m=v.useMemo(()=>({ref:t,onScroll:u,style:{overflowX:"auto",scrollSnapType:"x mandatory",scrollBehavior:o}}),[u,o]),f=v.useCallback(a=>({ref:y=>{i.current[a]=y},style:{flex:"0 0 auto",scrollSnapAlign:"start"}}),[]);return{activeIndex:r,containerProps:m,getItemProps:f,nextButtonProps:p,prevButtonProps:g,scrollToIndex:c}}import{get as we}from"lodash-es";import Le from"react";var co=({onEnterDirection:e,onExitDirection:o}={})=>{let{viewport:t,transition:i,fadeInDistance:r=O}=C(),l=Math.abs(r),n=Le.useCallback(c=>({[d.DEFAULT]:{hidden:{opacity:0,y:0},visible:{opacity:1,y:0},exit:{opacity:0,y:0}},[d.TOP]:{hidden:{opacity:0,y:-c},visible:{opacity:1,y:0},exit:{opacity:0,y:-c}},[d.BOTTOM]:{hidden:{opacity:0,y:c},visible:{opacity:1,y:0},exit:{opacity:0,y:c}},[d.LEFT]:{hidden:{opacity:0,x:-c},visible:{opacity:1,x:0},exit:{opacity:0,x:-c}},[d.RIGHT]:{hidden:{opacity:0,x:c},visible:{opacity:1,x:0},exit:{opacity:0,x:c}}}),[])(l),u=we(n,[o??d.BOTTOM,"exit"],n[d.BOTTOM].exit);return Le.useMemo(()=>({initial:"hidden",animate:"visible",exit:"exit",variants:{...we(n,[e??d.TOP],n[d.TOP]),exit:u},transition:i,viewport:t}),[n,u,e,i,t])};import{useEffect as Be,useMemo as it,useRef as rt,useState as $}from"react";var nt={hidden:{opacity:0,scale:.8},visible:{opacity:1,scale:1},exit:{opacity:0,scale:.8}};function go({images:e,frequency:o=15,visibleFor:t=1.5,maxWidth:i,maxHeight:r,animation:l}){let s=rt(null),n=it(()=>re({images:e,frequency:o,visibleFor:t,maxWidth:i,maxHeight:r}),[e,o,t,i,r]),[u,c]=$({x:0,y:0}),[g,p]=$(!1),[m,f]=$([]),[a,y]=$(!1),{transition:M}=C();Be(()=>{let h=!0;return y(!1),n.loadImages().then(()=>{h&&y(n.state.imagesLoaded)}),()=>{h=!1}},[n]);let D=h=>{let b=h.currentTarget.getBoundingClientRect();c({x:h.clientX-b.left,y:h.clientY-b.top})},P=()=>p(!0),R=()=>p(!1);return Be(()=>{if(!g||e.length===0||!a||!n.shouldTrigger(u.x,u.y))return;let h=n.pushFrame(u.x,u.y),b={imageTrailKey:h.key,style:{width:h.width,height:h.height,position:"absolute",backgroundImage:`url(${h.src})`,backgroundSize:"auto",backgroundPosition:"center",pointerEvents:"none",left:h.x,top:h.y},initial:"hidden",animate:"visible",exit:"exit",variants:nt,transition:M};f(V=>[...V,b]),setTimeout(()=>{f(V=>V.map(B=>B.imageTrailKey===h.key?{...B,animate:"exit"}:B))},t*1e3)},[u,g,e,a,t,l,n,M]),{componentRef:s,componentProps:{onMouseMove:D,onMouseEnter:P,onMouseLeave:R},activeImages:m,imagesPreloaded:a}}import{get as X}from"lodash-es";import Ae from"react";function To(e={}){let{transition:t}=C(),r=Ae.useCallback(()=>({default:{hidden:{opacity:0,scale:X(e,["initialScale"],1.1)},visible:{opacity:1,scale:1},exit:{opacity:0,scale:X(e,["exitScale"],1.1)}}}),[])(),l=X(r,["default","exit"],r.default.exit);return Ae.useMemo(()=>({initial:"hidden",animate:"visible",exit:"exit",variants:{...r.default,exit:l},transition:{duration:X(t,["duration"],1.2),...t}}),[r,l,t])}import{get as Ye}from"lodash-es";import Ne from"react";function Ro({onEnterDirection:e=d.RIGHT,onExitDirection:o=d.RIGHT,distance:t="100%"}={}){let{transition:i}=C(),l=Ne.useCallback(n=>({[d.DEFAULT]:{hidden:{opacity:0},visible:{opacity:1},exit:{opacity:0}},[d.TOP]:{hidden:{opacity:0,y:`-${n}`},visible:{opacity:1,y:0},exit:{opacity:0,y:`-${n}`}},[d.BOTTOM]:{hidden:{opacity:0,y:n},visible:{opacity:1,y:0},exit:{opacity:0,y:n}},[d.LEFT]:{hidden:{opacity:0,x:`-${n}`},visible:{opacity:1,x:0},exit:{opacity:0,x:`-${n}`}},[d.RIGHT]:{hidden:{opacity:0,x:n},visible:{opacity:1,x:0},exit:{opacity:0,x:n}}}),[])(t),s=Ye(l,[o,"exit"],l[d.RIGHT].exit);return Ne.useMemo(()=>({initial:"hidden",animate:"visible",exit:"exit",variants:{...Ye(l,[e],l[d.RIGHT]),exit:s},transition:{...i}}),[l,s,e,i])}import{cloneDeep as at,merge as st}from"lodash-es";function wo(...e){let o=e.map(t=>at(t));return st({},...o)}export*from"framer-motion";export{Et as AnimateMotionPresence,d as DirectionEnum,Ct as LenisHorizontal,It as LenisVertical,gt as MotionProvider,Lt as PolymorphicMotionElement,Ft as TextPressure,wo as mergeMotionProperties,Y as systemHausMotionConfiguration,ro as useCardCarousel,_t as useComposeStagger,to as useCursorFollow,Xt as useDeepMergeMotionProperties,co as useFadeIn,go as useImageTrail,be as useMergeMotionProperties,To as useScale,Ro as useSlideOut,C as useSystemHausMotionProvider};
|
|
2
8
|
//# sourceMappingURL=exports.js.map
|
package/dist/exports.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../domains/systemhaus-motion/src/calculateCursorOffset.ts","../../../domains/systemhaus-motion/src/enums/direction.enum.ts","../../../domains/systemhaus-motion/src/composeCursorImageTrail.ts","../../../domains/systemhaus-motion/src/cursorImageTrailController.ts","../../../domains/systemhaus-motion/src/constants.ts","../../../domains/systemhaus-motion/src/motionContextDefaultConfig.ts","../src/provider/MotionProvider.tsx","../src/lib/motion.ts","../src/components/AnimateMotionPresence.tsx","../src/components/PolymorphicMotionElement.tsx","../src/hooks/useComposeStagger.ts","../src/hooks/useMergeMotionProperties.ts","../src/hooks/useCursorFollow.ts","../src/hooks/useFadeIn.ts","../src/hooks/useImageTrail.ts","../src/hooks/useScale.ts","../src/hooks/useSlideOut.ts","../src/utils/mergeMotionProperties.ts","../src/exports.ts"],"sourcesContent":["import { get } from 'lodash-es';\n\nimport { CursorFollowSettings } from './types';\n\nexport type CalculateCursorOffsetController = CursorFollowSettings;\n\nexport function calculateCursorOffset(\n element: HTMLElement,\n mouseX: number,\n mouseY: number,\n settings: CalculateCursorOffsetController,\n): { x: number; y: number } {\n const elementRect = element.getBoundingClientRect();\n const elementCenterX = elementRect.left + elementRect.width / 2;\n const elementCenterY = elementRect.top + elementRect.height / 2;\n\n const offsetXFromCenter = mouseX - elementCenterX;\n const offsetYFromCenter = mouseY - elementCenterY;\n\n const { magneticModeActivationRadius } = settings;\n const maxDistance = get(settings, ['maxDistance'], 3000);\n const intensity = get(settings, ['intensity'], 0.1);\n\n if (globalThis.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n return { x: 0, y: 0 };\n }\n\n if (typeof magneticModeActivationRadius === 'number') {\n const distanceToCursor = Math.hypot(\n offsetXFromCenter ** 2 + offsetYFromCenter ** 2,\n );\n\n if (distanceToCursor > maxDistance) {\n return { x: 0, y: 0 };\n }\n\n let proximityStrength = 0;\n if (distanceToCursor < magneticModeActivationRadius) {\n proximityStrength = 1 - distanceToCursor / magneticModeActivationRadius;\n }\n\n return {\n x: offsetXFromCenter * proximityStrength * intensity,\n y: offsetYFromCenter * proximityStrength * intensity,\n };\n }\n\n // Smooth follow mode\n if (\n Math.abs(offsetXFromCenter) < maxDistance &&\n Math.abs(offsetYFromCenter) < maxDistance\n ) {\n const proximityStrength =\n 1 -\n Math.max(Math.abs(offsetXFromCenter), Math.abs(offsetYFromCenter)) /\n maxDistance;\n\n return {\n x: offsetXFromCenter * proximityStrength * intensity,\n y: offsetYFromCenter * proximityStrength * intensity,\n };\n }\n\n return { x: 0, y: 0 };\n}\n","export enum DirectionEnum {\n TOP = 'TOP',\n BOTTOM = 'BOTTOM',\n LEFT = 'LEFT',\n RIGHT = 'RIGHT',\n DEFAULT = 'DEFAULT',\n}\n","export interface ImageTrailCoreOptions {\n images: string[];\n frequency?: number;\n visibleFor?: number;\n}\n\nexport interface ImageTrailFrame {\n key: string;\n src: string;\n x: number;\n y: number;\n width: number;\n height: number;\n createdAt: number;\n shouldHide: boolean;\n}\n\nexport interface ImageDimensions {\n width: number;\n height: number;\n}\n\nexport interface ImageTrailCoreState {\n active: ImageTrailFrame[];\n index: number;\n lastX: number;\n lastY: number;\n imagesLoaded: boolean;\n imageSizes: ImageDimensions[];\n}\n\nexport interface ComposedCursorImageTrail {\n state: ImageTrailCoreState;\n loadImages: () => Promise<void>;\n shouldTrigger: (x: number, y: number) => boolean;\n pushFrame: (x: number, y: number) => ImageTrailFrame;\n updateVisibility: (now: number) => void;\n}\n\nexport function composeCursorImageTrail(\n options: ImageTrailCoreOptions,\n): ComposedCursorImageTrail {\n const frequency = options.frequency ?? 15;\n const visibleFor = options.visibleFor ?? 1.5;\n\n const MAX = 200;\n const MIN = 1;\n const RANGE = MAX - MIN;\n const threshold = MAX - ((frequency - 1) * RANGE) / 49;\n\n const state: ImageTrailCoreState = {\n active: [],\n index: 0,\n lastX: 0,\n lastY: 0,\n imagesLoaded: false,\n imageSizes: [],\n };\n\n async function loadImages() {\n state.imageSizes = await Promise.all(\n options.images.map(\n (source) =>\n new Promise<ImageDimensions>((resolve, reject) => {\n const img = new Image();\n\n const handleLoad = () => {\n img.removeEventListener('load', handleLoad);\n img.removeEventListener('error', handleError);\n resolve({ width: img.width, height: img.height });\n };\n\n const handleError = (event: Event) => {\n img.removeEventListener('load', handleLoad);\n img.removeEventListener('error', handleError);\n reject(event);\n };\n\n img.addEventListener('load', handleLoad);\n img.addEventListener('error', handleError);\n\n img.src = source;\n }),\n ),\n );\n\n state.imagesLoaded = true;\n }\n\n function shouldTrigger(x: number, y: number) {\n const dx = x - state.lastX;\n const dy = y - state.lastY;\n return Math.hypot(dx, dy) >= threshold;\n }\n\n function pushFrame(x: number, y: number) {\n const index = state.index;\n const source = options.images[index] || '';\n const size = state.imageSizes[index] || { width: 100, height: 100 };\n\n const frame: ImageTrailFrame = {\n key: Math.random().toString(36),\n src: source,\n x: x - size.width / 2,\n y: y - size.height / 2,\n width: size.width,\n height: size.height,\n createdAt: performance.now(),\n shouldHide: false,\n };\n\n state.active.push(frame);\n state.index = (state.index + 1) % options.images.length;\n state.lastX = x;\n state.lastY = y;\n\n return frame;\n }\n\n function updateVisibility(now: number) {\n const ms = visibleFor * 1000;\n state.active = state.active.map((f) => {\n if (!f.shouldHide && now - f.createdAt >= ms) f.shouldHide = true;\n return f;\n });\n }\n\n return {\n state,\n loadImages,\n shouldTrigger,\n pushFrame,\n updateVisibility,\n };\n}\n","import { type MotionProps, type Variants } from 'framer-motion';\n\ntype ImageDimensions = { width: number; height: number };\n\nexport type ImageTrailItem = {\n imageTrailItemKey: string;\n src: string;\n style: Record<string, unknown>;\n variants: Variants;\n initial: string;\n animate: string;\n exit: string;\n transition?: MotionProps['transition'];\n};\n\ninterface ImageTrailOptions {\n images: string[];\n frequency?: number; // 1 - 50 (higher = more frequent)\n visibleFor?: number; // seconds\n transition?: MotionProps['transition'];\n}\n\nexport class ImageTrailController {\n options: ImageTrailOptions;\n state: {\n imageSizes: ImageDimensions[];\n imagesLoaded: boolean;\n activeImages: ImageTrailItem[];\n };\n private timeouts: ReturnType<typeof setTimeout>[];\n private lastTriggerPos: { x: number; y: number };\n\n constructor(options: ImageTrailOptions) {\n this.options = options;\n this.state = {\n imageSizes: [],\n imagesLoaded: false,\n activeImages: [],\n };\n this.timeouts = [];\n this.lastTriggerPos = { x: 0, y: 0 };\n }\n\n clearTimeouts() {\n for (const t of this.timeouts) {\n clearTimeout(t);\n }\n this.timeouts = [];\n }\n\n async loadImages() {\n this.clearTimeouts();\n this.state.imageSizes = await Promise.all(\n this.options.images.map(\n (source) =>\n new Promise<ImageDimensions>((resolve, reject) => {\n const img = new Image();\n img.addEventListener('load', () =>\n resolve({ width: img.width, height: img.height }),\n );\n img.addEventListener('error', reject);\n img.src = source;\n }),\n ),\n );\n this.state.imagesLoaded = true;\n }\n\n shouldTrigger(x: number, y: number) {\n const frequency = this.options.frequency ?? 5;\n const MAX_THRESHOLD = 20;\n const MIN_THRESHOLD = 1;\n const THRESHOLD_RANGE = MAX_THRESHOLD - MIN_THRESHOLD;\n const threshold = MAX_THRESHOLD - ((frequency - 1) * THRESHOLD_RANGE) / 49;\n\n const distance = Math.hypot(\n x - this.lastTriggerPos.x,\n y - this.lastTriggerPos.y,\n );\n if (distance < threshold) return false;\n\n this.lastTriggerPos = { x, y };\n return true;\n }\n\n triggerImage(x: number, y: number, index: number) {\n if (!this.state.imagesLoaded) return;\n\n const visibleFor = this.options.visibleFor ?? 1.5;\n const naturalSize = this.state.imageSizes[index] || {\n width: 100,\n height: 100,\n };\n const key = Math.random().toString();\n\n const newImage: ImageTrailItem = {\n imageTrailItemKey: key,\n src: this.options.images[index] || '',\n style: {\n position: 'absolute',\n width: naturalSize.width,\n height: naturalSize.height,\n left: x - naturalSize.width / 2,\n top: y - naturalSize.height / 2,\n pointerEvents: 'none',\n backgroundImage: `url(${this.options.images[index]})`,\n backgroundSize: 'auto',\n backgroundPosition: 'center',\n },\n variants: {\n hidden: { opacity: 0, scale: 0.6 },\n visible: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.4 },\n },\n initial: 'hidden',\n animate: 'visible',\n exit: 'exit',\n transition: this.options.transition,\n };\n\n this.state.activeImages.push(newImage);\n\n // Schedule exit\n const hideTimeout = setTimeout(() => {\n const imageIndex = this.state.activeImages.findIndex(\n (img) => img.imageTrailItemKey === key,\n );\n if (imageIndex !== -1) {\n const old = this.state.activeImages[imageIndex];\n // @ts-expect-error while we debug this\n this.state.activeImages[imageIndex] = { ...old, animate: 'exit' };\n }\n }, visibleFor * 1000);\n\n // Schedule removal\n const removeTimeout = setTimeout(\n () => {\n this.state.activeImages = this.state.activeImages.filter(\n (img) => img.imageTrailItemKey !== key,\n );\n },\n visibleFor * 1000 + 1000,\n );\n\n this.timeouts.push(hideTimeout, removeTimeout);\n }\n}\n","export const DEFAULT_TRANSITION_DURATION = 0.4;\nexport const DEFAULT_TRANSITION_TYPE = 'tween';\nexport const DEFAULT_TRANSITION_EASE = 'easeInOut';\nexport const DEFAULT_FADE_DISTANCE = 12;\nexport const LONG_FADE_DISTANCE = 24;\nexport const SHORT_FADE_DISTANCE = 8;\nexport const DEFAULT_STAGGER_SPEED = 0.2;\nexport const DEFAULT_FADE_IN_SPEED = 12;\n","import {\n DEFAULT_FADE_DISTANCE,\n DEFAULT_FADE_IN_SPEED,\n DEFAULT_TRANSITION_DURATION,\n DEFAULT_TRANSITION_EASE,\n} from './constants';\nimport { SystemHausMotionProviderConfig } from './types';\n\nexport const motionContextDefaultConfig: SystemHausMotionProviderConfig = {\n isStatic: false,\n fadeInSpeed: DEFAULT_FADE_IN_SPEED,\n fadeDistance: DEFAULT_FADE_DISTANCE,\n transition: {\n duration: DEFAULT_TRANSITION_DURATION,\n ease: DEFAULT_TRANSITION_EASE,\n },\n reducedMotion: 'user',\n};\n","'use client';\n\nimport {\n DEFAULT_FADE_DISTANCE,\n DirectionEnum,\n motionContextDefaultConfig,\n} from '@kurocado-studio/systemhaus-motion';\nimport { get } from 'lodash-es';\nimport React, { createContext, useContext, useMemo } from 'react';\n\nimport { MotionConfig } from '../lib/motion';\nimport { SystemHausMotionProvider } from '../types';\n\nexport const systemHausMotionConfiguration: SystemHausMotionProvider = {\n ...motionContextDefaultConfig,\n fadeInDirection: DirectionEnum.TOP,\n fadeInDistance: DEFAULT_FADE_DISTANCE,\n viewport: {\n once: false,\n amount: 0.2,\n },\n};\n\nconst MotionContext = createContext<SystemHausMotionProvider>(\n systemHausMotionConfiguration,\n);\n\ninterface SystemHausMotionProviderProperties {\n children?: React.ReactNode;\n motionOverrides?: Partial<SystemHausMotionProvider>;\n}\n\nexport const MotionProvider: React.FC<SystemHausMotionProviderProperties> = ({\n children,\n motionOverrides,\n}) => {\n const motionContextConfig: SystemHausMotionProvider = useMemo(\n () => ({\n ...motionContextDefaultConfig,\n ...motionOverrides,\n viewport: get(\n motionOverrides,\n ['viewport'],\n systemHausMotionConfiguration.viewport,\n ),\n fadeInDistance: get(\n motionOverrides,\n ['fadeInDistance'],\n systemHausMotionConfiguration.fadeInDistance,\n ),\n fadeInDirection: get(\n motionOverrides,\n ['fadeInDirection'],\n systemHausMotionConfiguration.fadeInDirection,\n ),\n }),\n [motionOverrides],\n );\n\n return (\n <MotionContext.Provider value={motionContextConfig}>\n <MotionConfig {...motionContextConfig}>{children}</MotionConfig>\n </MotionContext.Provider>\n );\n};\n\nexport const useSystemHausMotionProvider = () => {\n return useContext(MotionContext);\n};\n","import type * as Library from 'framer-motion';\n\nexport type * as MotionLibrary from 'framer-motion';\n\nexport type MotionProperties = Library.MotionProps;\nexport type MotionStaggerOptions = Library.StaggerOptions;\nexport type MotionVariant = Library.Variant;\nexport type MotionVariants = Library.Variants;\nexport type MotionViewportOptions = Library.ViewportOptions;\nexport {\n stagger,\n useMotionValue,\n useSpring,\n MotionConfig,\n AnimatePresence,\n motion,\n} from 'framer-motion';\n","import React from 'react';\n\nimport { AnimatePresence } from '../lib/motion';\nimport { AnimateMotionPresenceProperties } from '../types';\n\nexport function AnimateMotionPresence({\n children,\n isVisible,\n mode,\n initial,\n}: React.PropsWithChildren<AnimateMotionPresenceProperties>): React.ReactNode {\n return (\n <AnimatePresence mode={mode} initial={initial}>\n {isVisible &&\n React.Children.toArray(children).map((child, index) => {\n if (!React.isValidElement(child)) return child;\n return React.cloneElement(child, {\n key: child.key ?? `motion-child-${index}`,\n });\n })}\n </AnimatePresence>\n );\n}\n","import React, { JSX } from 'react';\n\nimport { motion } from '../lib/motion';\nimport { type PolymorphicMotionProperties } from '../types';\n\nexport function PolymorphicMotionElement<\n T extends keyof JSX.IntrinsicElements = 'div',\n K extends Record<string, unknown> = Record<string, unknown>,\n>(properties: PolymorphicMotionProperties<T> & K): React.ReactNode {\n const { as, ...rest } = properties;\n\n const Component: React.ElementType =\n motion[(as as keyof typeof motion) ?? 'div'];\n\n return <Component {...rest} />;\n}\n","'use client';\n\nimport { set } from 'lodash-es';\nimport React from 'react';\n\nimport { stagger } from '../lib/motion';\nimport {\n PolymorphicMotionElementMap,\n PolymorphicMotionProperties,\n} from '../types';\nimport { useMergeMotionProperties } from './useMergeMotionProperties';\n\nexport type ComposeStagger = <\n T extends PolymorphicMotionElementMap = 'div',\n>(payload: {\n payload: PolymorphicMotionProperties<T>;\n staggerPayload: Parameters<typeof stagger>;\n}) => PolymorphicMotionProperties<T>;\n\nexport type UseComposeStagger = () => {\n composeStagger: ComposeStagger;\n};\nexport const useComposeStagger = () => {\n const { handleDeepMergeMotionProperties } = useMergeMotionProperties();\n\n const composeStagger: <\n T extends PolymorphicMotionElementMap = 'div',\n >(payload: {\n payload: PolymorphicMotionProperties<T>;\n staggerPayload: Parameters<typeof stagger>;\n }) => PolymorphicMotionProperties<T> = React.useCallback(\n ({ payload, staggerPayload }) => {\n const updatedPayload = { ...payload };\n const staggerDelay = stagger(...staggerPayload);\n const delay =\n payload.custom == undefined ? (staggerPayload[0] ?? 0) : staggerDelay;\n\n set(updatedPayload, ['transition', 'delay'], delay);\n\n return handleDeepMergeMotionProperties(payload, updatedPayload);\n },\n [handleDeepMergeMotionProperties],\n );\n\n return { composeStagger };\n};\n","'use client';\n\nimport { cloneDeep, merge } from 'lodash-es';\nimport React from 'react';\n\nimport type { MotionProperties } from '../lib/motion';\nimport {\n PolymorphicMotionElementMap,\n PolymorphicMotionProperties,\n} from '../types';\n\nexport function useDeepMergeMotionProperties(\n ...motionProperties: MotionProperties[]\n): MotionProperties {\n return React.useMemo(() => {\n const safeCopies = motionProperties.map((mappedObject) =>\n cloneDeep(mappedObject),\n );\n return merge({}, ...safeCopies);\n }, motionProperties);\n}\n\nexport type DeepMergeMotionProperties = <T extends PolymorphicMotionElementMap>(\n ...motionProperties: PolymorphicMotionProperties<T>[]\n) => PolymorphicMotionProperties<T>;\n\nexport function useMergeMotionProperties() {\n const handleDeepMergeMotionProperties: DeepMergeMotionProperties =\n React.useCallback((...payload) => {\n const safeCopies = payload.map((mappedObject) => cloneDeep(mappedObject));\n return merge({}, ...safeCopies);\n }, []);\n\n return { handleDeepMergeMotionProperties };\n}\n","'use client';\n\nimport {\n type CalculateCursorOffsetController,\n calculateCursorOffset,\n} from '@kurocado-studio/systemhaus-motion';\nimport { get } from 'lodash-es';\nimport { type RefObject, useEffect, useRef } from 'react';\n\nimport { useMotionValue, useSpring } from '../lib/motion';\n\nexport function useCursorFollow(\n settings: CalculateCursorOffsetController,\n elementReference?: RefObject<HTMLDivElement | null>,\n) {\n const damping = get(settings, ['damping'], 100);\n const stiffness = get(settings, ['stiffness'], 600);\n\n const x = useMotionValue(0);\n const y = useMotionValue(0);\n const localReference = useRef<HTMLDivElement | null>(null);\n const targetReference = elementReference ?? localReference;\n\n const springX = useSpring(x, {\n damping,\n stiffness,\n });\n\n const springY = useSpring(y, {\n damping,\n stiffness,\n });\n\n useEffect(() => {\n const handleMouseMove = (mouseEvent: MouseEvent) => {\n const element = targetReference.current;\n if (!element) return;\n const { x: newX, y: newY } = calculateCursorOffset(\n element,\n mouseEvent.clientX,\n mouseEvent.clientY,\n settings,\n );\n x.set(newX);\n y.set(newY);\n };\n document.addEventListener('mousemove', handleMouseMove);\n return () => document.removeEventListener('mousemove', handleMouseMove);\n }, [settings, targetReference, x, y]);\n\n return { ref: targetReference, x: springX, y: springY };\n}\n","'use client';\n\nimport {\n DEFAULT_FADE_DISTANCE,\n DirectionEnum,\n type UseFadeInProperties,\n} from '@kurocado-studio/systemhaus-motion';\nimport { get } from 'lodash-es';\nimport React from 'react';\n\nimport type { MotionVariant, MotionVariants } from '../lib/motion';\nimport { useSystemHausMotionProvider } from '../provider/MotionProvider';\nimport {\n PolymorphicMotionElementMap,\n PolymorphicMotionProperties,\n} from '../types';\n\nexport const useFadeIn = <T extends PolymorphicMotionElementMap = 'div'>({\n onEnterDirection,\n onExitDirection,\n}: UseFadeInProperties = {}): PolymorphicMotionProperties<T> => {\n const {\n viewport,\n transition,\n fadeInDistance = DEFAULT_FADE_DISTANCE,\n } = useSystemHausMotionProvider();\n\n const fadeDistance = Math.abs(fadeInDistance);\n\n const getVariantMap = React.useCallback(\n (distance: number): Record<DirectionEnum, Required<MotionVariants>> => ({\n [DirectionEnum.DEFAULT]: {\n hidden: { opacity: 0, y: 0 },\n visible: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: 0 },\n },\n [DirectionEnum.TOP]: {\n hidden: { opacity: 0, y: -distance },\n visible: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: -distance },\n },\n [DirectionEnum.BOTTOM]: {\n hidden: { opacity: 0, y: distance },\n visible: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: distance },\n },\n [DirectionEnum.LEFT]: {\n hidden: { opacity: 0, x: -distance },\n visible: { opacity: 1, x: 0 },\n exit: { opacity: 0, x: -distance },\n },\n [DirectionEnum.RIGHT]: {\n hidden: { opacity: 0, x: distance },\n visible: { opacity: 1, x: 0 },\n exit: { opacity: 0, x: distance },\n },\n }),\n [],\n );\n\n const variantMap = getVariantMap(fadeDistance);\n\n const exitVariant = get(\n variantMap,\n [onExitDirection ?? DirectionEnum.BOTTOM, 'exit'],\n variantMap[DirectionEnum.BOTTOM]['exit'],\n );\n\n return React.useMemo(\n () => ({\n initial: 'hidden',\n animate: 'visible',\n exit: 'exit',\n variants: {\n ...get(\n variantMap,\n [onEnterDirection ?? DirectionEnum.TOP],\n variantMap[DirectionEnum.TOP],\n ),\n exit: exitVariant as MotionVariant,\n },\n transition,\n viewport,\n }),\n [variantMap, exitVariant, onEnterDirection, transition, viewport],\n // TODO: type this better\n ) as unknown as PolymorphicMotionProperties<T>;\n};\n","import React, { useEffect, useRef, useState } from 'react';\n\nimport type { MotionProperties, MotionVariants } from '../lib/motion';\nimport { useSystemHausMotionProvider } from '../provider/MotionProvider';\nimport { PolymorphicMotionProperties } from '../types';\n\ninterface CursorImageTrailOptions {\n images: string[];\n frequency?: number;\n visibleFor?: number;\n animation?: {\n in?: MotionProperties;\n out?: MotionProperties;\n };\n}\n\ntype PolymorphicActiveMotionProperties<\n T extends keyof React.JSX.IntrinsicElements = 'img',\n> = PolymorphicMotionProperties<T> & {\n imageTrailKey?: string;\n};\n\nconst imageVariants: MotionVariants = {\n hidden: { opacity: 0, scale: 0.8 },\n visible: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.8 },\n};\n\nexport function useImageTrail({\n images,\n frequency = 15,\n visibleFor = 1.5,\n animation,\n}: CursorImageTrailOptions) {\n const componentReference = useRef<HTMLDivElement | null>(null);\n const [mousePos, setMousePos] = useState({ x: 0, y: 0 });\n const [isHovering, setIsHovering] = useState(false);\n const [lastTriggerPos, setLastTriggerPos] = useState({ x: 0, y: 0 });\n const [currentImageIndex, setCurrentImageIndex] = useState(0);\n const [activeImages, setActiveImages] = useState<\n PolymorphicActiveMotionProperties[]\n >([]);\n const [imagesPreloaded, setImagesPreloaded] = useState(false);\n const [imageSizes, setImageSizes] = useState<\n { width: number; height: number }[]\n >([]);\n\n const { transition } = useSystemHausMotionProvider();\n\n const MAX_THRESHOLD = 200;\n const MIN_THRESHOLD = 1;\n const THRESHOLD_RANGE = MAX_THRESHOLD - MIN_THRESHOLD;\n\n const threshold = MAX_THRESHOLD - ((frequency - 1) * THRESHOLD_RANGE) / 49;\n\n useEffect(() => {\n let isMounted = true;\n const listeners: {\n img: HTMLImageElement;\n onLoad: () => void;\n onError: (error: Event) => void;\n }[] = [];\n\n const preload = async () => {\n const sizes: { width: number; height: number }[] = [];\n\n await Promise.all(\n images.map(\n (source) =>\n new Promise<void>((resolve, reject) => {\n const img = new Image();\n\n const onLoad = () => {\n sizes.push({ width: img.width, height: img.height });\n cleanup();\n resolve();\n };\n\n const onError = (error: Event) => {\n cleanup();\n reject(error);\n };\n\n const cleanup = () => {\n img.removeEventListener('load', onLoad);\n img.removeEventListener('error', onError);\n };\n\n img.addEventListener('load', onLoad);\n img.addEventListener('error', onError);\n\n listeners.push({ img, onLoad, onError });\n img.src = source;\n }),\n ),\n );\n\n if (isMounted) {\n setImageSizes(sizes);\n setImagesPreloaded(true);\n }\n };\n\n preload().then();\n\n return () => {\n isMounted = false;\n for (const { img, onLoad, onError } of listeners) {\n img.removeEventListener('load', onLoad);\n img.removeEventListener('error', onError);\n }\n };\n }, [images]);\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const rect = event.currentTarget.getBoundingClientRect();\n setMousePos({ x: event.clientX - rect.left, y: event.clientY - rect.top });\n };\n const handleMouseEnter = () => setIsHovering(true);\n const handleMouseLeave = () => setIsHovering(false);\n\n useEffect(() => {\n if (!isHovering || images.length === 0 || !imagesPreloaded) return;\n\n const distance = Math.hypot(\n mousePos.x - lastTriggerPos.x,\n mousePos.y - lastTriggerPos.y,\n );\n if (distance < threshold) return;\n\n const naturalSize = imageSizes[currentImageIndex] || {\n width: 100,\n height: 100,\n };\n\n const imgWidth = naturalSize.width;\n const imgHeight = naturalSize.height;\n\n const newImage: PolymorphicActiveMotionProperties<'img'> = {\n imageTrailKey: Math.random().toString(),\n style: {\n width: imgWidth,\n height: imgHeight,\n position: 'absolute',\n backgroundImage: `url(${images[currentImageIndex]})`,\n backgroundSize: 'auto',\n backgroundPosition: 'center',\n pointerEvents: 'none',\n left: mousePos.x - imgWidth / 2,\n top: mousePos.y - imgHeight / 2,\n },\n initial: 'hidden',\n animate: 'visible',\n exit: 'exit',\n variants: imageVariants,\n transition,\n };\n\n setActiveImages((previous) => [...previous, newImage]);\n setCurrentImageIndex((previous) => (previous + 1) % images.length);\n setLastTriggerPos(mousePos);\n\n setTimeout(() => {\n setActiveImages((previous) =>\n previous.map((img) =>\n img.imageTrailKey === newImage.imageTrailKey\n ? { ...img, animate: 'exit' }\n : img,\n ),\n );\n }, visibleFor * 1000);\n }, [\n mousePos,\n isHovering,\n lastTriggerPos,\n images,\n imagesPreloaded,\n imageSizes,\n threshold,\n currentImageIndex,\n visibleFor,\n animation,\n ]);\n\n return {\n componentRef: componentReference,\n componentProps: {\n onMouseMove: handleMouseMove,\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n },\n activeImages,\n imagesPreloaded,\n };\n}\n","'use client';\n\nimport { get } from 'lodash-es';\nimport React from 'react';\n\nimport type { MotionVariant, MotionVariants } from '../lib/motion';\nimport { useSystemHausMotionProvider } from '../provider/MotionProvider';\nimport { PolymorphicMotionProperties } from '../types';\n\n/**\n * Scale motion hook — animates an element scaling in/out.\n * Default scale range: visible = 1, hidden = 1.2 (slightly zoomed in).\n */\nexport function useScale(\n payload: {\n initialScale?: number;\n exitScale?: number;\n } = {},\n): PolymorphicMotionProperties {\n const fallbackInitialScale = 1.1;\n\n const { transition } = useSystemHausMotionProvider();\n\n const getVariantMap = React.useCallback(\n (): Record<'default', Required<MotionVariants>> => ({\n default: {\n hidden: {\n opacity: 0,\n scale: get(payload, ['initialScale'], fallbackInitialScale),\n },\n visible: { opacity: 1, scale: 1 },\n exit: {\n opacity: 0,\n scale: get(payload, ['exitScale'], fallbackInitialScale),\n },\n },\n }),\n [],\n );\n\n const variantMap = getVariantMap();\n\n const exitVariant = get(\n variantMap,\n ['default', 'exit'],\n variantMap['default']['exit'],\n );\n\n return React.useMemo(\n () => ({\n initial: 'hidden',\n animate: 'visible',\n exit: 'exit',\n variants: {\n ...variantMap['default'],\n exit: exitVariant as MotionVariant,\n },\n transition: {\n duration: get(transition, ['duration'], 1.2),\n ...transition,\n },\n }),\n [variantMap, exitVariant, transition],\n );\n}\n","'use client';\n\nimport { DirectionEnum } from '@kurocado-studio/systemhaus-motion';\nimport { get } from 'lodash-es';\nimport React from 'react';\n\nimport type { MotionVariant, MotionVariants } from '../lib/motion';\nimport { useSystemHausMotionProvider } from '../provider/MotionProvider';\nimport { PolymorphicMotionProperties } from '../types';\n\n/**\n * Slide-out motion hook — animates an element in/out based on direction.\n * Default distance: \"100%\" (full travel).\n */\nexport function useSlideOut({\n onEnterDirection = DirectionEnum.RIGHT,\n onExitDirection = DirectionEnum.RIGHT,\n distance = '100%',\n}: {\n onEnterDirection?: DirectionEnum;\n onExitDirection?: DirectionEnum;\n distance?: string | number;\n} = {}): PolymorphicMotionProperties {\n const { transition } = useSystemHausMotionProvider();\n\n const getVariantMap = React.useCallback(\n (\n distance: string | number,\n ): Record<DirectionEnum, Required<MotionVariants>> => ({\n [DirectionEnum.DEFAULT]: {\n hidden: { opacity: 0 },\n visible: { opacity: 1 },\n exit: { opacity: 0 },\n },\n [DirectionEnum.TOP]: {\n hidden: { opacity: 0, y: `-${distance}` },\n visible: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: `-${distance}` },\n },\n [DirectionEnum.BOTTOM]: {\n hidden: { opacity: 0, y: distance },\n visible: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: distance },\n },\n [DirectionEnum.LEFT]: {\n hidden: { opacity: 0, x: `-${distance}` },\n visible: { opacity: 1, x: 0 },\n exit: { opacity: 0, x: `-${distance}` },\n },\n [DirectionEnum.RIGHT]: {\n hidden: { opacity: 0, x: distance },\n visible: { opacity: 1, x: 0 },\n exit: { opacity: 0, x: distance },\n },\n }),\n [],\n );\n\n const variantMap = getVariantMap(distance);\n\n const exitVariant = get(\n variantMap,\n [onExitDirection, 'exit'],\n variantMap[DirectionEnum.RIGHT]['exit'],\n );\n\n return React.useMemo(\n () => ({\n initial: 'hidden',\n animate: 'visible',\n exit: 'exit',\n variants: {\n ...get(variantMap, [onEnterDirection], variantMap[DirectionEnum.RIGHT]),\n exit: exitVariant as MotionVariant,\n },\n transition: {\n ...transition,\n },\n }),\n [variantMap, exitVariant, onEnterDirection, transition],\n );\n}\n","import { cloneDeep, merge } from 'lodash-es';\n\nimport type { MotionProperties } from '../lib/motion';\n\nexport function mergeMotionProperties(\n ...motionProperties: MotionProperties[]\n): MotionProperties {\n const safeCopies = motionProperties.map((mappedObject) =>\n cloneDeep(mappedObject),\n );\n return merge({}, ...safeCopies);\n}\n","export { DirectionEnum } from '@kurocado-studio/systemhaus-motion';\nexport { systemHausMotionConfiguration } from './provider/MotionProvider';\n\nexport * from './components/AnimateMotionPresence';\nexport * from './components/PolymorphicMotionElement';\nexport * from './hooks/useComposeStagger';\nexport * from './hooks/useCursorFollow';\nexport * from './hooks/useFadeIn';\nexport * from './hooks/useImageTrail';\nexport * from './hooks/useMergeMotionProperties';\nexport * from './hooks/useScale';\nexport * from './hooks/useSlideOut';\nexport * from './provider/MotionProvider';\nexport * from './utils/mergeMotionProperties';\nexport * from 'framer-motion';\nexport type * from './lib/motion';\nexport type * from './types';\n\nexport type { PolymorphicMotionProperties } from './types';\n"],"mappings":"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","names":["calculateCursorOffset","element","mouseX","mouseY","settings","elementRect","elementCenterX","elementCenterY","offsetXFromCenter","offsetYFromCenter","magneticModeActivationRadius","maxDistance","get","intensity","distanceToCursor","proximityStrength","DirectionEnum","DEFAULT_TRANSITION_EASE","DEFAULT_FADE_DISTANCE","motionContextDefaultConfig","DEFAULT_TRANSITION_EASE","get","React","createContext","useContext","useMemo","stagger","useMotionValue","useSpring","MotionConfig","AnimatePresence","motion","systemHausMotionConfiguration","z","A","E","MotionContext","createContext","MotionProvider","children","motionOverrides","motionContextConfig","useMemo","get","React","MotionConfig","useSystemHausMotionProvider","useContext","React","AnimateMotionPresence","children","isVisible","mode","initial","React","AnimatePresence","child","index","React","PolymorphicMotionElement","properties","as","rest","Component","motion","React","set","React","cloneDeep","merge","React","useDeepMergeMotionProperties","motionProperties","safeCopies","mappedObject","useMergeMotionProperties","payload","useComposeStagger","handleDeepMergeMotionProperties","useMergeMotionProperties","React","payload","staggerPayload","updatedPayload","staggerDelay","stagger","delay","set","get","useEffect","useRef","useCursorFollow","settings","elementReference","damping","get","stiffness","x","useMotionValue","y","localReference","useRef","targetReference","springX","useSpring","springY","useEffect","handleMouseMove","mouseEvent","element","newX","newY","D","get","React","useFadeIn","onEnterDirection","onExitDirection","viewport","transition","fadeInDistance","E","useSystemHausMotionProvider","fadeDistance","variantMap","React","distance","A","exitVariant","get","useEffect","useRef","useState","imageVariants","useImageTrail","images","frequency","visibleFor","animation","componentReference","useRef","mousePos","setMousePos","useState","isHovering","setIsHovering","lastTriggerPos","setLastTriggerPos","currentImageIndex","setCurrentImageIndex","activeImages","setActiveImages","imagesPreloaded","setImagesPreloaded","imageSizes","setImageSizes","transition","useSystemHausMotionProvider","MAX_THRESHOLD","THRESHOLD_RANGE","threshold","useEffect","isMounted","listeners","sizes","source","resolve","reject","img","onLoad","cleanup","onError","error","handleMouseMove","event","rect","handleMouseEnter","handleMouseLeave","naturalSize","imgWidth","imgHeight","newImage","previous","get","React","useScale","payload","transition","useSystemHausMotionProvider","variantMap","React","get","exitVariant","get","React","useSlideOut","onEnterDirection","A","onExitDirection","distance","transition","useSystemHausMotionProvider","variantMap","React","exitVariant","get","cloneDeep","merge","mergeMotionProperties","motionProperties","safeCopies","mappedObject"]}
|
|
1
|
+
{"version":3,"sources":["../../../domains/systemhaus-motion/src/calculateCursorOffset.ts","../../../domains/systemhaus-motion/src/enums/direction.enum.ts","../../../domains/systemhaus-motion/src/composeCursorImageTrail.ts","../../../domains/systemhaus-motion/src/cursorImageTrailController.ts","../../../domains/systemhaus-motion/src/textPressure.ts","../../../domains/systemhaus-motion/src/constants.ts","../../../domains/systemhaus-motion/src/motionContextDefaultConfig.ts","../src/provider/MotionProvider.tsx","../src/lib/motion.ts","../src/components/AnimateMotionPresence.tsx","../src/components/Lenis.tsx","../src/components/PolymorphicMotionElement.tsx","../src/components/TextPressure.tsx","../src/hooks/useComposeStagger.ts","../src/hooks/useMergeMotionProperties.ts","../src/hooks/useCursorFollow.ts","../src/hooks/useCardCarousel.ts","../src/hooks/useFadeIn.ts","../src/hooks/useImageTrail.ts","../src/hooks/useScale.ts","../src/hooks/useSlideOut.ts","../src/utils/mergeMotionProperties.ts","../src/exports.ts"],"sourcesContent":["import { get } from 'lodash-es';\n\nimport { CursorFollowSettings } from './types';\n\nexport type CalculateCursorOffsetController = CursorFollowSettings;\n\nexport function calculateCursorOffset(\n element: HTMLElement,\n mouseX: number,\n mouseY: number,\n settings: CalculateCursorOffsetController,\n): { x: number; y: number } {\n const elementRect = element.getBoundingClientRect();\n const elementCenterX = elementRect.left + elementRect.width / 2;\n const elementCenterY = elementRect.top + elementRect.height / 2;\n\n const offsetXFromCenter = mouseX - elementCenterX;\n const offsetYFromCenter = mouseY - elementCenterY;\n\n const { magneticModeActivationRadius } = settings;\n const maxDistance = get(settings, ['maxDistance'], 3000);\n const intensity = get(settings, ['intensity'], 0.1);\n\n if (globalThis.matchMedia('(prefers-reduced-motion: reduce)').matches) {\n return { x: 0, y: 0 };\n }\n\n if (typeof magneticModeActivationRadius === 'number') {\n const distanceToCursor = Math.hypot(\n offsetXFromCenter ** 2 + offsetYFromCenter ** 2,\n );\n\n if (distanceToCursor > maxDistance) {\n return { x: 0, y: 0 };\n }\n\n let proximityStrength = 0;\n if (distanceToCursor < magneticModeActivationRadius) {\n proximityStrength = 1 - distanceToCursor / magneticModeActivationRadius;\n }\n\n return {\n x: offsetXFromCenter * proximityStrength * intensity,\n y: offsetYFromCenter * proximityStrength * intensity,\n };\n }\n\n // Smooth follow mode\n if (\n Math.abs(offsetXFromCenter) < maxDistance &&\n Math.abs(offsetYFromCenter) < maxDistance\n ) {\n const proximityStrength =\n 1 -\n Math.max(Math.abs(offsetXFromCenter), Math.abs(offsetYFromCenter)) /\n maxDistance;\n\n return {\n x: offsetXFromCenter * proximityStrength * intensity,\n y: offsetYFromCenter * proximityStrength * intensity,\n };\n }\n\n return { x: 0, y: 0 };\n}\n","export enum DirectionEnum {\n TOP = 'TOP',\n BOTTOM = 'BOTTOM',\n LEFT = 'LEFT',\n RIGHT = 'RIGHT',\n DEFAULT = 'DEFAULT',\n}\n","export interface ImageTrailCoreOptions {\n images: string[];\n frequency?: number;\n visibleFor?: number;\n maxWidth?: number;\n maxHeight?: number;\n}\n\nexport interface ImageTrailFrame {\n key: string;\n src: string;\n x: number;\n y: number;\n width: number;\n height: number;\n createdAt: number;\n shouldHide: boolean;\n}\n\nexport interface ImageDimensions {\n width: number;\n height: number;\n}\n\nexport interface ImageTrailCoreState {\n active: ImageTrailFrame[];\n index: number;\n lastX: number;\n lastY: number;\n imagesLoaded: boolean;\n imageSizes: ImageDimensions[];\n}\n\nexport interface ComposedCursorImageTrail {\n state: ImageTrailCoreState;\n loadImages: () => Promise<void>;\n shouldTrigger: (x: number, y: number) => boolean;\n pushFrame: (x: number, y: number) => ImageTrailFrame;\n updateVisibility: (now: number) => void;\n}\n\nexport function composeCursorImageTrail(\n options: ImageTrailCoreOptions,\n): ComposedCursorImageTrail {\n const frequency = options.frequency ?? 15;\n const visibleFor = options.visibleFor ?? 1.5;\n\n const MAX = 200;\n const MIN = 1;\n const RANGE = MAX - MIN;\n const threshold = MAX - ((frequency - 1) * RANGE) / 49;\n\n const state: ImageTrailCoreState = {\n active: [],\n index: 0,\n lastX: 0,\n lastY: 0,\n imagesLoaded: false,\n imageSizes: [],\n };\n\n async function loadImages() {\n state.imageSizes = await Promise.all(\n options.images.map(\n (source) =>\n new Promise<ImageDimensions>((resolve, reject) => {\n const img = new Image();\n\n const handleLoad = () => {\n img.removeEventListener('load', handleLoad);\n img.removeEventListener('error', handleError);\n resolve({ width: img.width, height: img.height });\n };\n\n const handleError = (event: Event) => {\n img.removeEventListener('load', handleLoad);\n img.removeEventListener('error', handleError);\n reject(event);\n };\n\n img.addEventListener('load', handleLoad);\n img.addEventListener('error', handleError);\n\n img.src = source;\n }),\n ),\n );\n\n state.imagesLoaded = true;\n }\n\n function shouldTrigger(x: number, y: number) {\n const dx = x - state.lastX;\n const dy = y - state.lastY;\n return Math.hypot(dx, dy) >= threshold;\n }\n\n function pushFrame(x: number, y: number) {\n const index = state.index;\n const source = options.images[index] || '';\n const size = state.imageSizes[index] || { width: 100, height: 100 };\n\n const width = options.maxWidth\n ? Math.min(size.width, options.maxWidth)\n : size.width;\n const height = options.maxHeight\n ? Math.min(size.height, options.maxHeight)\n : size.height;\n\n const frame: ImageTrailFrame = {\n key: Math.random().toString(36),\n src: source,\n x: x - width / 2,\n y: y - height / 2,\n width,\n height,\n createdAt: performance.now(),\n shouldHide: false,\n };\n\n state.active.push(frame);\n state.index = (state.index + 1) % options.images.length;\n state.lastX = x;\n state.lastY = y;\n\n return frame;\n }\n\n function updateVisibility(now: number) {\n const ms = visibleFor * 1000;\n state.active = state.active.map((frame) => {\n if (!frame.shouldHide && now - frame.createdAt >= ms) {\n frame.shouldHide = true;\n }\n return frame;\n });\n }\n\n return {\n state,\n loadImages,\n shouldTrigger,\n pushFrame,\n updateVisibility,\n };\n}\n","import { type MotionProps, type Variants } from 'framer-motion';\n\ntype ImageDimensions = { width: number; height: number };\n\nexport type ImageTrailItem = {\n imageTrailItemKey: string;\n src: string;\n style: Record<string, unknown>;\n variants: Variants;\n initial: string;\n animate: string;\n exit: string;\n transition?: MotionProps['transition'];\n};\n\ninterface ImageTrailOptions {\n images: string[];\n frequency?: number; // 1 - 50 (higher = more frequent)\n visibleFor?: number; // seconds\n transition?: MotionProps['transition'];\n}\n\nexport class ImageTrailController {\n options: ImageTrailOptions;\n state: {\n imageSizes: ImageDimensions[];\n imagesLoaded: boolean;\n activeImages: ImageTrailItem[];\n };\n private timeouts: ReturnType<typeof setTimeout>[];\n private lastTriggerPos: { x: number; y: number };\n\n constructor(options: ImageTrailOptions) {\n this.options = options;\n this.state = {\n imageSizes: [],\n imagesLoaded: false,\n activeImages: [],\n };\n this.timeouts = [];\n this.lastTriggerPos = { x: 0, y: 0 };\n }\n\n clearTimeouts() {\n for (const t of this.timeouts) {\n clearTimeout(t);\n }\n this.timeouts = [];\n }\n\n async loadImages() {\n this.clearTimeouts();\n this.state.imageSizes = await Promise.all(\n this.options.images.map(\n (source) =>\n new Promise<ImageDimensions>((resolve, reject) => {\n const img = new Image();\n img.addEventListener('load', () =>\n resolve({ width: img.width, height: img.height }),\n );\n img.addEventListener('error', reject);\n img.src = source;\n }),\n ),\n );\n this.state.imagesLoaded = true;\n }\n\n shouldTrigger(x: number, y: number) {\n const frequency = this.options.frequency ?? 5;\n const MAX_THRESHOLD = 20;\n const MIN_THRESHOLD = 1;\n const THRESHOLD_RANGE = MAX_THRESHOLD - MIN_THRESHOLD;\n const threshold = MAX_THRESHOLD - ((frequency - 1) * THRESHOLD_RANGE) / 49;\n\n const distance = Math.hypot(\n x - this.lastTriggerPos.x,\n y - this.lastTriggerPos.y,\n );\n if (distance < threshold) return false;\n\n this.lastTriggerPos = { x, y };\n return true;\n }\n\n triggerImage(x: number, y: number, index: number) {\n if (!this.state.imagesLoaded) return;\n\n const visibleFor = this.options.visibleFor ?? 1.5;\n const naturalSize = this.state.imageSizes[index] || {\n width: 100,\n height: 100,\n };\n const key = Math.random().toString();\n\n const newImage: ImageTrailItem = {\n imageTrailItemKey: key,\n src: this.options.images[index] || '',\n style: {\n position: 'absolute',\n width: naturalSize.width,\n height: naturalSize.height,\n left: x - naturalSize.width / 2,\n top: y - naturalSize.height / 2,\n pointerEvents: 'none',\n backgroundImage: `url(${this.options.images[index]})`,\n backgroundSize: 'auto',\n backgroundPosition: 'center',\n },\n variants: {\n hidden: { opacity: 0, scale: 0.6 },\n visible: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.4 },\n },\n initial: 'hidden',\n animate: 'visible',\n exit: 'exit',\n transition: this.options.transition,\n };\n\n this.state.activeImages.push(newImage);\n\n // Schedule exit\n const hideTimeout = setTimeout(() => {\n const imageIndex = this.state.activeImages.findIndex(\n (img) => img.imageTrailItemKey === key,\n );\n if (imageIndex !== -1) {\n const old = this.state.activeImages[imageIndex];\n // @ts-expect-error while we debug this\n this.state.activeImages[imageIndex] = { ...old, animate: 'exit' };\n }\n }, visibleFor * 1000);\n\n // Schedule removal\n const removeTimeout = setTimeout(\n () => {\n this.state.activeImages = this.state.activeImages.filter(\n (img) => img.imageTrailItemKey !== key,\n );\n },\n visibleFor * 1000 + 1000,\n );\n\n this.timeouts.push(hideTimeout, removeTimeout);\n }\n}\n","export type TextPressurePoint = { x: number; y: number };\n\nexport const distanceBetweenPoints = (\n a: TextPressurePoint,\n b: TextPressurePoint,\n) => {\n const deltaX = b.x - a.x;\n const deltaY = b.y - a.y;\n return Math.hypot(deltaX, deltaY);\n};\n\nexport const valueByDistance = (\n distance: number,\n maxDistance: number,\n minValue: number,\n maxValue: number,\n) => {\n const falloffValue = maxValue - Math.abs((maxValue * distance) / maxDistance);\n return Math.max(minValue, falloffValue + minValue);\n};\n\nexport const createDebounce = <Arguments extends unknown[]>(\n function_: (...arguments_: Arguments) => void,\n delay: number,\n) => {\n let timeoutId: ReturnType<typeof setTimeout>;\n return (...arguments_: Arguments) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n function_.apply(this, arguments_);\n }, delay);\n };\n};\n\nexport const splitTextToChars = (text: string) =>\n Array.from({ length: text.length }, (_, index) => text.charAt(index));\n\nexport const getDisplayChar = (char: string) =>\n char === ' ' ? '\\u00A0' : char;\n\nexport const calculateFontSize = (\n containerWidth: number,\n charCount: number,\n minFontSize: number,\n) => Math.max(containerWidth / (charCount / 2), minFontSize);\n\nexport const calculateScaleFactors = (\n containerHeight: number,\n textHeight: number,\n) => {\n if (textHeight <= 0) {\n return { scaleYFactor: 1, lineHeightScale: 1 };\n }\n\n const yRatio = containerHeight / textHeight;\n return { scaleYFactor: yRatio, lineHeightScale: yRatio };\n};\n\nexport const calculateSpanCenters = (spans: Array<HTMLElement | null>) =>\n spans.map((span) => {\n // eslint-disable-next-line unicorn/no-null\n if (!span) return null;\n const spanRect = span.getBoundingClientRect();\n return {\n x: spanRect.x + spanRect.width / 2,\n y: spanRect.y + spanRect.height / 2,\n };\n });\n\nexport interface TextPressureAxisOptions {\n distance: number;\n maxDistance: number;\n minWidth?: number;\n maxWidth?: number;\n widthEnabled: boolean;\n weightEnabled: boolean;\n minWeight?: number;\n maxWeight?: number;\n italicEnabled: boolean;\n}\n\nexport const calculateAxisValues = ({\n distance,\n maxDistance,\n minWidth,\n maxWidth,\n widthEnabled,\n weightEnabled,\n italicEnabled,\n minWeight,\n maxWeight,\n}: TextPressureAxisOptions) => {\n const resolvedMinWidth = minWidth ?? 5;\n const resolvedMaxWidth = maxWidth ?? 200;\n const widthAxisValue = widthEnabled\n ? Math.floor(\n valueByDistance(\n distance,\n maxDistance,\n resolvedMinWidth,\n resolvedMaxWidth,\n ),\n )\n : 100;\n const weightAxisValue = weightEnabled\n ? Math.floor(\n valueByDistance(\n distance,\n maxDistance,\n minWeight ?? 100,\n maxWeight ?? 900,\n ),\n )\n : 400;\n const italicAxisValue = italicEnabled\n ? valueByDistance(distance, maxDistance, 0, 1).toFixed(2)\n : '0';\n return {\n widthAxisValue,\n weightAxisValue,\n italicAxisValue,\n };\n};\n\nexport const buildFontVariationSettings = (\n weightAxisValue: number,\n widthAxisValue: number,\n italicAxisValue: string,\n) =>\n `'wght' ${weightAxisValue}, 'wdth' ${widthAxisValue}, 'ital' ${italicAxisValue}`;\n","export const DEFAULT_TRANSITION_DURATION = 0.4;\nexport const DEFAULT_TRANSITION_TYPE = 'tween';\nexport const DEFAULT_TRANSITION_EASE = 'easeInOut';\nexport const DEFAULT_FADE_DISTANCE = 12;\nexport const LONG_FADE_DISTANCE = 24;\nexport const SHORT_FADE_DISTANCE = 8;\nexport const DEFAULT_STAGGER_SPEED = 0.2;\nexport const DEFAULT_FADE_IN_SPEED = 12;\n","import {\n DEFAULT_FADE_DISTANCE,\n DEFAULT_FADE_IN_SPEED,\n DEFAULT_TRANSITION_DURATION,\n DEFAULT_TRANSITION_EASE,\n} from './constants';\nimport { SystemHausMotionProviderConfig } from './types';\n\nexport const motionContextDefaultConfig: SystemHausMotionProviderConfig = {\n isStatic: false,\n fadeInSpeed: DEFAULT_FADE_IN_SPEED,\n fadeDistance: DEFAULT_FADE_DISTANCE,\n transition: {\n duration: DEFAULT_TRANSITION_DURATION,\n ease: DEFAULT_TRANSITION_EASE,\n },\n reducedMotion: 'user',\n};\n","'use client';\n\nimport {\n DEFAULT_FADE_DISTANCE,\n DirectionEnum,\n motionContextDefaultConfig,\n} from '@kurocado-studio/systemhaus-motion';\nimport { get } from 'lodash-es';\nimport React, { createContext, useContext, useMemo } from 'react';\n\nimport { MotionConfig } from '../lib/motion';\nimport { SystemHausMotionProvider } from '../types';\n\nexport const systemHausMotionConfiguration: SystemHausMotionProvider = {\n ...motionContextDefaultConfig,\n fadeInDirection: DirectionEnum.TOP,\n fadeInDistance: DEFAULT_FADE_DISTANCE,\n viewport: {\n once: false,\n amount: 0.2,\n },\n};\n\nconst MotionContext = createContext<SystemHausMotionProvider>(\n systemHausMotionConfiguration,\n);\n\ninterface SystemHausMotionProviderProperties {\n children?: React.ReactNode;\n motionOverrides?: Partial<SystemHausMotionProvider>;\n}\n\nexport const MotionProvider: React.FC<SystemHausMotionProviderProperties> = ({\n children,\n motionOverrides,\n}) => {\n const motionContextConfig: SystemHausMotionProvider = useMemo(\n () => ({\n ...motionContextDefaultConfig,\n ...motionOverrides,\n viewport: get(\n motionOverrides,\n ['viewport'],\n systemHausMotionConfiguration.viewport,\n ),\n fadeInDistance: get(\n motionOverrides,\n ['fadeInDistance'],\n systemHausMotionConfiguration.fadeInDistance,\n ),\n fadeInDirection: get(\n motionOverrides,\n ['fadeInDirection'],\n systemHausMotionConfiguration.fadeInDirection,\n ),\n }),\n [motionOverrides],\n );\n\n return (\n <MotionContext.Provider value={motionContextConfig}>\n <MotionConfig {...motionContextConfig}>{children}</MotionConfig>\n </MotionContext.Provider>\n );\n};\n\nexport const useSystemHausMotionProvider = () => {\n return useContext(MotionContext);\n};\n","import type * as Library from 'framer-motion';\n\nexport type * as MotionLibrary from 'framer-motion';\n\nexport type MotionProperties = Library.MotionProps;\nexport type MotionStaggerOptions = Library.StaggerOptions;\nexport type MotionVariant = Library.Variant;\nexport type MotionVariants = Library.Variants;\nexport type MotionViewportOptions = Library.ViewportOptions;\nexport {\n stagger,\n useIsPresent,\n useMotionValue,\n useSpring,\n MotionConfig,\n AnimatePresence,\n motion,\n} from 'framer-motion';\n","import React from 'react';\n\nimport { AnimatePresence } from '../lib/motion';\nimport { AnimateMotionPresenceProperties } from '../types';\n\nexport function AnimateMotionPresence({\n children,\n isVisible,\n mode,\n initial,\n}: React.PropsWithChildren<AnimateMotionPresenceProperties>): React.ReactNode {\n return (\n <AnimatePresence mode={mode} initial={initial}>\n {isVisible &&\n React.Children.toArray(children).map((child, index) => {\n if (!React.isValidElement(child)) return child;\n return React.cloneElement(child, {\n key: child.key ?? `motion-child-${index}`,\n });\n })}\n </AnimatePresence>\n );\n}\n","import { cancelFrame, frame } from 'framer-motion';\nimport { ReactLenis } from 'lenis/react';\nimport type { LenisRef } from 'lenis/react';\nimport {\n type ComponentProps,\n type ReactElement,\n type RefObject,\n useEffect,\n useRef,\n} from 'react';\n\ntype ReactLenisProperties = ComponentProps<typeof ReactLenis>;\n\nfunction useLenisRaf(lenisReference: RefObject<LenisRef | null>) {\n useEffect(() => {\n function update(data: { timestamp: number }) {\n const time = data.timestamp;\n lenisReference.current?.lenis?.raf(time);\n }\n\n frame.update(update, true);\n\n return () => cancelFrame(update);\n }, [lenisReference]);\n}\n\nexport function LenisHorizontal({\n options,\n ...properties\n}: ReactLenisProperties): ReactElement {\n const lenisReference = useRef<LenisRef>(null);\n\n useLenisRaf(lenisReference);\n\n return (\n <ReactLenis\n {...properties}\n ref={lenisReference}\n root\n options={{\n autoRaf: false,\n orientation: 'horizontal',\n ...options,\n }}\n />\n );\n}\n\nexport function LenisVertical({\n options,\n ...properties\n}: ReactLenisProperties): ReactElement {\n const lenisReference = useRef<LenisRef>(null);\n\n useLenisRaf(lenisReference as unknown as RefObject<LenisRef>);\n\n return (\n <ReactLenis\n {...properties}\n ref={lenisReference}\n root\n options={{\n autoRaf: false,\n orientation: 'vertical',\n ...options,\n }}\n />\n );\n}\n","import React, { JSX } from 'react';\n\nimport { motion } from '../lib/motion';\nimport { type PolymorphicMotionProperties } from '../types';\n\nexport function PolymorphicMotionElement<\n T extends keyof JSX.IntrinsicElements = 'div',\n K extends Record<string, unknown> = Record<string, unknown>,\n>(properties: PolymorphicMotionProperties<T> & K): React.ReactNode {\n const { as, ...rest } = properties;\n\n const Component: React.ElementType =\n motion[(as as keyof typeof motion) ?? 'div'];\n\n return <Component {...rest} />;\n}\n","'use client';\n\nimport {\n buildFontVariationSettings,\n calculateAxisValues,\n calculateScaleFactors,\n calculateSpanCenters,\n createDebounce,\n distanceBetweenPoints,\n getDisplayChar,\n splitTextToChars,\n} from '@kurocado-studio/systemhaus-motion';\nimport monaSansFont from '@kurocado-studio/systemhaus-ui/Mona-Sans.var.woff2';\nimport { useMotionValue, useSpring } from 'framer-motion';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nexport interface TextPressureProperties {\n /**\n * Optional React node to be rendered; text content is extracted for animation.\n */\n children?: React.ReactNode;\n /**\n * Custom font-family name to apply to the animated text.\n */\n fontFamily?: string;\n /**\n * URL to a font file (e.g. .woff2) to load via @font-face.\n */\n fontUrl?: string;\n /**\n * Enable width axis animation (wdth).\n */\n width?: boolean;\n /**\n * Minimum width axis value when animating.\n */\n minWidth?: number;\n /**\n * Maximum width axis value when animating.\n */\n maxWidth?: number;\n /**\n * Enable weight axis animation (wght).\n */\n weight?: boolean;\n /**\n * Enable italic axis animation (ital).\n */\n italic?: boolean;\n /**\n * Minimum weight axis value when animating.\n */\n minWeight?: number;\n /**\n * Maximum weight axis value when animating.\n */\n maxWeight?: number;\n /**\n * Optional className applied to the animated text wrapper.\n */\n className?: string;\n}\n\nexport const TextPressure: React.FC<TextPressureProperties> = ({\n children,\n className = '',\n fontFamily = 'Mona-Sans',\n fontUrl = monaSansFont,\n italic = true,\n maxWeight = 900,\n maxWidth,\n minWeight = 100,\n minWidth,\n weight = true,\n width = true,\n}) => {\n const containerReference = useRef<HTMLDivElement | null>(null);\n const titleReference = useRef<HTMLHeadingElement | null>(null);\n const hiddenTextReference = useRef<HTMLDivElement | null>(null);\n const spansReference = useRef<(HTMLSpanElement | null)[]>([]);\n const spanCentersReference = useRef<Array<{ x: number; y: number } | null>>(\n [],\n );\n const maxDistanceReference = useRef(0);\n const pointerX = useMotionValue(0);\n const pointerY = useMotionValue(0);\n const smoothPointerX = useSpring(pointerX, { stiffness: 240, damping: 28 });\n const smoothPointerY = useSpring(pointerY, { stiffness: 240, damping: 28 });\n\n const [scaleYFactor, setScaleYFactor] = useState(1);\n const [lineHeightScale, setLineHeightScale] = useState(1);\n\n const [resolvedText, setResolvedText] = useState(() => {\n if (typeof children === 'string' || typeof children === 'number') {\n return String(children);\n }\n return '';\n });\n const chars = splitTextToChars(resolvedText);\n const srOnlyStyle: React.CSSProperties = {\n position: 'absolute',\n width: 1,\n height: 1,\n padding: 0,\n margin: -1,\n overflow: 'hidden',\n clip: 'rect(0, 0, 0, 0)',\n whiteSpace: 'nowrap',\n border: 0,\n };\n\n useEffect(() => {\n if (!children) {\n setResolvedText('');\n return;\n }\n\n if (typeof children === 'string' || typeof children === 'number') {\n setResolvedText(String(children));\n return;\n }\n\n const nextText = hiddenTextReference.current?.textContent ?? '';\n setResolvedText(nextText);\n }, [children]);\n\n useEffect(() => {\n const handleMouseMove = (mouseEvent: MouseEvent) => {\n pointerX.set(mouseEvent.clientX);\n pointerY.set(mouseEvent.clientY);\n };\n const handleTouchMove = (touchEvent: TouchEvent) => {\n const touch = touchEvent.touches[0];\n if (!touch) return;\n pointerX.set(touch.clientX);\n pointerY.set(touch.clientY);\n };\n\n globalThis.addEventListener('mousemove', handleMouseMove);\n globalThis.addEventListener('touchmove', handleTouchMove, {\n passive: true,\n });\n\n if (containerReference.current) {\n const { left, top, width, height } =\n containerReference.current.getBoundingClientRect();\n const initialX = left + width / 2;\n const initialY = top + height / 2;\n pointerX.set(initialX);\n pointerY.set(initialY);\n }\n\n return () => {\n globalThis.removeEventListener('mousemove', handleMouseMove);\n globalThis.removeEventListener('touchmove', handleTouchMove);\n };\n }, []);\n\n const cacheSpanCenters = useCallback(() => {\n if (!titleReference.current) return;\n\n const titleRect = titleReference.current.getBoundingClientRect();\n maxDistanceReference.current = titleRect.width / 2;\n\n spanCentersReference.current = calculateSpanCenters(spansReference.current);\n }, []);\n\n const updateLayoutMetrics = useCallback(() => {\n if (!containerReference.current || !titleReference.current) return;\n\n const { height: containerHeight } =\n containerReference.current.getBoundingClientRect();\n setScaleYFactor(1);\n setLineHeightScale(1);\n\n requestAnimationFrame(() => {\n if (!titleReference.current) return;\n const textRect = titleReference.current.getBoundingClientRect();\n\n const {\n scaleYFactor: nextScaleYFactor,\n lineHeightScale: nextLineHeight,\n } = calculateScaleFactors(containerHeight, textRect.height);\n setScaleYFactor(nextScaleYFactor);\n setLineHeightScale(nextLineHeight);\n\n cacheSpanCenters();\n });\n }, [cacheSpanCenters]);\n\n useEffect(() => {\n const debouncedUpdateLayout = createDebounce(updateLayoutMetrics, 100);\n debouncedUpdateLayout();\n window.addEventListener('resize', debouncedUpdateLayout);\n return () => window.removeEventListener('resize', debouncedUpdateLayout);\n }, [updateLayoutMetrics]);\n\n useEffect(() => {\n updateLayoutMetrics();\n }, [resolvedText, updateLayoutMetrics]);\n\n useEffect(() => {\n let animationFrameId: number;\n const animate = () => {\n const smoothPointer = {\n x: smoothPointerX.get(),\n y: smoothPointerY.get(),\n };\n\n if (titleReference.current) {\n const maxDistance = maxDistanceReference.current;\n if (!Number.isFinite(maxDistance) || maxDistance <= 0) {\n cacheSpanCenters();\n animationFrameId = requestAnimationFrame(animate);\n return;\n }\n\n for (let index = 0; index < spansReference.current.length; index += 1) {\n const span = spansReference.current[index];\n if (!span) continue;\n\n const cachedCenter = spanCentersReference.current[index];\n if (!cachedCenter) continue;\n\n const distance = distanceBetweenPoints(smoothPointer, cachedCenter);\n\n const { widthAxisValue, weightAxisValue, italicAxisValue } =\n calculateAxisValues({\n distance,\n maxDistance,\n minWidth,\n maxWidth,\n minWeight,\n maxWeight,\n widthEnabled: width,\n weightEnabled: weight,\n italicEnabled: italic,\n });\n\n const nextFontVariationSettings = buildFontVariationSettings(\n weightAxisValue,\n widthAxisValue,\n italicAxisValue,\n );\n\n if (span.style.fontVariationSettings !== nextFontVariationSettings) {\n span.style.fontVariationSettings = nextFontVariationSettings;\n }\n }\n }\n\n animationFrameId = requestAnimationFrame(animate);\n };\n\n animate();\n return () => cancelAnimationFrame(animationFrameId);\n }, [\n cacheSpanCenters,\n italic,\n maxWidth,\n maxWeight,\n minWidth,\n minWeight,\n smoothPointerX,\n smoothPointerY,\n weight,\n width,\n ]);\n\n const styleElement = useMemo(() => {\n if (!fontUrl) return null;\n\n return (\n <style>{`\n @font-face {\n font-family: '${fontFamily}';\n src: url('${fontUrl}');\n font-style: normal;\n }\n `}</style>\n );\n }, [fontFamily, fontUrl]);\n\n const textStyle: React.CSSProperties = {\n fontFamily,\n display: 'inline-block',\n lineHeight: lineHeightScale,\n transform: `scale(1, ${scaleYFactor})`,\n transformOrigin: 'center top',\n margin: 0,\n fontWeight: 400,\n };\n\n return (\n <>\n {children ? (\n <div ref={hiddenTextReference} style={srOnlyStyle}>\n {children}\n </div>\n ) : (\n <span style={srOnlyStyle}>{resolvedText}</span>\n )}\n <div aria-hidden='true' ref={containerReference}>\n {styleElement}\n <p\n aria-hidden='true'\n ref={titleReference}\n className={className}\n style={textStyle}\n >\n {chars.map((char, index) => {\n const displayChar = getDisplayChar(char);\n return (\n <span\n aria-hidden='true'\n key={index}\n ref={(element) => {\n spansReference.current[index] = element;\n }}\n data-char={displayChar}\n className='inline-block'\n >\n {displayChar}\n </span>\n );\n })}\n </p>\n </div>\n </>\n );\n};\n","'use client';\n\nimport { set } from 'lodash-es';\nimport React from 'react';\n\nimport { stagger } from '../lib/motion';\nimport {\n PolymorphicMotionElementMap,\n PolymorphicMotionProperties,\n} from '../types';\nimport { useMergeMotionProperties } from './useMergeMotionProperties';\n\nexport type ComposeStagger = <\n T extends PolymorphicMotionElementMap = 'div',\n>(payload: {\n payload: PolymorphicMotionProperties<T>;\n staggerPayload: Parameters<typeof stagger>;\n}) => PolymorphicMotionProperties<T>;\n\nexport type UseComposeStagger = () => {\n composeStagger: ComposeStagger;\n};\nexport const useComposeStagger = () => {\n const { handleDeepMergeMotionProperties } = useMergeMotionProperties();\n\n const composeStagger: <\n T extends PolymorphicMotionElementMap = 'div',\n >(payload: {\n payload: PolymorphicMotionProperties<T>;\n staggerPayload: Parameters<typeof stagger>;\n }) => PolymorphicMotionProperties<T> = React.useCallback(\n ({ payload, staggerPayload }) => {\n const updatedPayload = { ...payload };\n const staggerDelay = stagger(...staggerPayload);\n const delay =\n payload.custom == undefined ? (staggerPayload[0] ?? 0) : staggerDelay;\n\n set(updatedPayload, ['transition', 'delay'], delay);\n\n return handleDeepMergeMotionProperties(payload, updatedPayload);\n },\n [handleDeepMergeMotionProperties],\n );\n\n return { composeStagger };\n};\n","'use client';\n\nimport { cloneDeep, merge } from 'lodash-es';\nimport React from 'react';\n\nimport type { MotionProperties } from '../lib/motion';\nimport {\n PolymorphicMotionElementMap,\n PolymorphicMotionProperties,\n} from '../types';\n\nexport function useDeepMergeMotionProperties(\n ...motionProperties: MotionProperties[]\n): MotionProperties {\n return React.useMemo(() => {\n const safeCopies = motionProperties.map((mappedObject) =>\n cloneDeep(mappedObject),\n );\n return merge({}, ...safeCopies);\n }, motionProperties);\n}\n\nexport type DeepMergeMotionProperties = <T extends PolymorphicMotionElementMap>(\n ...motionProperties: PolymorphicMotionProperties<T>[]\n) => PolymorphicMotionProperties<T>;\n\nexport function useMergeMotionProperties() {\n const handleDeepMergeMotionProperties: DeepMergeMotionProperties =\n React.useCallback((...payload) => {\n const safeCopies = payload.map((mappedObject) => cloneDeep(mappedObject));\n return merge({}, ...safeCopies);\n }, []);\n\n return { handleDeepMergeMotionProperties };\n}\n","'use client';\n\nimport {\n type CalculateCursorOffsetController,\n calculateCursorOffset,\n} from '@kurocado-studio/systemhaus-motion';\nimport { get } from 'lodash-es';\nimport { type RefObject, useEffect, useRef } from 'react';\n\nimport { useMotionValue, useSpring } from '../lib/motion';\n\nexport function useCursorFollow(\n settings: CalculateCursorOffsetController,\n elementReference?: RefObject<HTMLDivElement | null>,\n) {\n const damping = get(settings, ['damping'], 100);\n const stiffness = get(settings, ['stiffness'], 600);\n\n const x = useMotionValue(0);\n const y = useMotionValue(0);\n const localReference = useRef<HTMLDivElement | null>(null);\n const targetReference = elementReference ?? localReference;\n\n const springX = useSpring(x, {\n damping,\n stiffness,\n });\n\n const springY = useSpring(y, {\n damping,\n stiffness,\n });\n\n useEffect(() => {\n const handleMouseMove = (mouseEvent: MouseEvent) => {\n const element = targetReference.current;\n if (!element) return;\n const { x: newX, y: newY } = calculateCursorOffset(\n element,\n mouseEvent.clientX,\n mouseEvent.clientY,\n settings,\n );\n x.set(newX);\n y.set(newY);\n };\n document.addEventListener('mousemove', handleMouseMove);\n return () => document.removeEventListener('mousemove', handleMouseMove);\n }, [settings, targetReference, x, y]);\n\n return { ref: targetReference, x: springX, y: springY };\n}\n","'use client';\n\nimport React from 'react';\n\ntype UseCardCarouselOptions = {\n itemCount: number;\n scrollBehavior?: ScrollBehavior;\n};\n\ntype CardCarouselContainerProperties = React.HTMLAttributes<HTMLDivElement> & {\n ref: React.Ref<HTMLDivElement>;\n};\n\ntype CardCarouselItemProperties = React.HTMLAttributes<HTMLLIElement> & {\n ref: React.Ref<HTMLLIElement>;\n};\n\ntype UseCardCarouselReturn = {\n activeIndex: number;\n containerProps: CardCarouselContainerProperties;\n getItemProps: (index: number) => CardCarouselItemProperties;\n nextButtonProps: React.ButtonHTMLAttributes<HTMLButtonElement>;\n prevButtonProps: React.ButtonHTMLAttributes<HTMLButtonElement>;\n scrollToIndex: (index: number) => void;\n};\n\nexport function useCardCarousel({\n itemCount,\n scrollBehavior = 'smooth',\n}: UseCardCarouselOptions): UseCardCarouselReturn {\n const containerReference = React.useRef<HTMLDivElement>(null);\n const itemsReference = React.useRef<(HTMLLIElement | null)[]>([]);\n const [activeIndex, setActiveIndex] = React.useState(0);\n\n React.useEffect(() => {\n setActiveIndex((previous) =>\n Math.min(previous, Math.max(itemCount - 1, 0)),\n );\n }, [itemCount]);\n\n const getOffsets = React.useCallback(() => {\n return itemsReference.current.map((item) => (item ? item.offsetLeft : 0));\n }, []);\n\n const getClosestIndex = React.useCallback(\n (scrollLeft: number) => {\n const offsets = getOffsets();\n let closestIndex = 0;\n let closestDistance = Number.POSITIVE_INFINITY;\n for (const [index, offset] of offsets.entries()) {\n const distance = Math.abs(offset - scrollLeft);\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = index;\n }\n }\n return closestIndex;\n },\n [getOffsets],\n );\n\n const onScroll = React.useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n const nextIndex = getClosestIndex(event.currentTarget.scrollLeft);\n if (nextIndex !== activeIndex) setActiveIndex(nextIndex);\n },\n [activeIndex, getClosestIndex],\n );\n\n const scrollToIndex = React.useCallback(\n (index: number) => {\n if (!containerReference.current) return;\n const clampedIndex = Math.max(0, Math.min(index, itemCount - 1));\n const target = itemsReference.current[clampedIndex];\n if (!target) return;\n containerReference.current.scrollTo({\n left: target.offsetLeft,\n behavior: scrollBehavior,\n });\n setActiveIndex(clampedIndex);\n },\n [itemCount, scrollBehavior],\n );\n\n const previousButtonProperties = React.useMemo(\n () => ({\n type: 'button' as const,\n onClick: () => scrollToIndex(activeIndex - 1),\n disabled: activeIndex <= 0,\n }),\n [activeIndex, scrollToIndex],\n );\n\n const nextButtonProperties = React.useMemo(\n () => ({\n type: 'button' as const,\n onClick: () => scrollToIndex(activeIndex + 1),\n disabled: activeIndex >= itemCount - 1,\n }),\n [activeIndex, itemCount, scrollToIndex],\n );\n\n const containerProperties = React.useMemo<CardCarouselContainerProperties>(\n () => ({\n ref: containerReference,\n onScroll,\n style: {\n overflowX: 'auto',\n scrollSnapType: 'x mandatory',\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Type 'ScrollBehavior'\n scrollBehavior,\n },\n }),\n [onScroll, scrollBehavior],\n );\n\n const getItemProperties = React.useCallback(\n (index: number): CardCarouselItemProperties => ({\n ref: (element) => {\n itemsReference.current[index] = element;\n },\n style: {\n flex: '0 0 auto',\n scrollSnapAlign: 'start',\n },\n }),\n [],\n );\n\n return {\n activeIndex,\n containerProps: containerProperties,\n getItemProps: getItemProperties,\n nextButtonProps: nextButtonProperties,\n prevButtonProps: previousButtonProperties,\n scrollToIndex,\n };\n}\n","'use client';\n\nimport {\n DEFAULT_FADE_DISTANCE,\n DirectionEnum,\n type UseFadeInProperties,\n} from '@kurocado-studio/systemhaus-motion';\nimport { get } from 'lodash-es';\nimport React from 'react';\n\nimport type { MotionVariant, MotionVariants } from '../lib/motion';\nimport { useSystemHausMotionProvider } from '../provider/MotionProvider';\nimport {\n PolymorphicMotionElementMap,\n PolymorphicMotionProperties,\n} from '../types';\n\nexport const useFadeIn = <T extends PolymorphicMotionElementMap = 'div'>({\n onEnterDirection,\n onExitDirection,\n}: UseFadeInProperties = {}): PolymorphicMotionProperties<T> => {\n const {\n viewport,\n transition,\n fadeInDistance = DEFAULT_FADE_DISTANCE,\n } = useSystemHausMotionProvider();\n\n const fadeDistance = Math.abs(fadeInDistance);\n\n const getVariantMap = React.useCallback(\n (distance: number): Record<DirectionEnum, Required<MotionVariants>> => ({\n [DirectionEnum.DEFAULT]: {\n hidden: { opacity: 0, y: 0 },\n visible: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: 0 },\n },\n [DirectionEnum.TOP]: {\n hidden: { opacity: 0, y: -distance },\n visible: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: -distance },\n },\n [DirectionEnum.BOTTOM]: {\n hidden: { opacity: 0, y: distance },\n visible: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: distance },\n },\n [DirectionEnum.LEFT]: {\n hidden: { opacity: 0, x: -distance },\n visible: { opacity: 1, x: 0 },\n exit: { opacity: 0, x: -distance },\n },\n [DirectionEnum.RIGHT]: {\n hidden: { opacity: 0, x: distance },\n visible: { opacity: 1, x: 0 },\n exit: { opacity: 0, x: distance },\n },\n }),\n [],\n );\n\n const variantMap = getVariantMap(fadeDistance);\n\n const exitVariant = get(\n variantMap,\n [onExitDirection ?? DirectionEnum.BOTTOM, 'exit'],\n variantMap[DirectionEnum.BOTTOM]['exit'],\n );\n\n return React.useMemo(\n () => ({\n initial: 'hidden',\n animate: 'visible',\n exit: 'exit',\n variants: {\n ...get(\n variantMap,\n [onEnterDirection ?? DirectionEnum.TOP],\n variantMap[DirectionEnum.TOP],\n ),\n exit: exitVariant as MotionVariant,\n },\n transition,\n viewport,\n }),\n [variantMap, exitVariant, onEnterDirection, transition, viewport],\n // TODO: type this better\n ) as unknown as PolymorphicMotionProperties<T>;\n};\n","import { composeCursorImageTrail } from '@kurocado-studio/systemhaus-motion';\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\n\nimport type { MotionProperties, MotionVariants } from '../lib/motion';\nimport { useSystemHausMotionProvider } from '../provider/MotionProvider';\nimport { PolymorphicMotionProperties } from '../types';\n\ninterface CursorImageTrailOptions {\n images: string[];\n frequency?: number;\n visibleFor?: number;\n maxWidth?: number;\n maxHeight?: number;\n animation?: {\n in?: MotionProperties;\n out?: MotionProperties;\n };\n}\n\ntype PolymorphicActiveMotionProperties<\n T extends keyof React.JSX.IntrinsicElements = 'img',\n> = PolymorphicMotionProperties<T> & {\n imageTrailKey?: string;\n};\n\nconst imageVariants: MotionVariants = {\n hidden: { opacity: 0, scale: 0.8 },\n visible: { opacity: 1, scale: 1 },\n exit: { opacity: 0, scale: 0.8 },\n};\n\nexport function useImageTrail({\n images,\n frequency = 15,\n visibleFor = 1.5,\n maxWidth,\n maxHeight,\n animation,\n}: CursorImageTrailOptions) {\n const componentReference = useRef<HTMLDivElement | null>(null);\n const imageTrailCore = useMemo(\n () =>\n composeCursorImageTrail({\n images,\n frequency,\n visibleFor,\n maxWidth,\n maxHeight,\n }),\n [images, frequency, visibleFor, maxWidth, maxHeight],\n );\n const [mousePos, setMousePos] = useState({ x: 0, y: 0 });\n const [isHovering, setIsHovering] = useState(false);\n const [activeImages, setActiveImages] = useState<\n PolymorphicActiveMotionProperties[]\n >([]);\n const [imagesPreloaded, setImagesPreloaded] = useState(false);\n\n const { transition } = useSystemHausMotionProvider();\n\n useEffect(() => {\n let isMounted = true;\n setImagesPreloaded(false);\n imageTrailCore.loadImages().then(() => {\n if (isMounted) {\n setImagesPreloaded(imageTrailCore.state.imagesLoaded);\n }\n });\n\n return () => {\n isMounted = false;\n };\n }, [imageTrailCore]);\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const rect = event.currentTarget.getBoundingClientRect();\n setMousePos({ x: event.clientX - rect.left, y: event.clientY - rect.top });\n };\n const handleMouseEnter = () => setIsHovering(true);\n const handleMouseLeave = () => setIsHovering(false);\n\n useEffect(() => {\n if (!isHovering || images.length === 0 || !imagesPreloaded) return;\n\n if (!imageTrailCore.shouldTrigger(mousePos.x, mousePos.y)) return;\n\n const frame = imageTrailCore.pushFrame(mousePos.x, mousePos.y);\n\n const newImage: PolymorphicActiveMotionProperties<'img'> = {\n imageTrailKey: frame.key,\n style: {\n width: frame.width,\n height: frame.height,\n position: 'absolute',\n backgroundImage: `url(${frame.src})`,\n backgroundSize: 'auto',\n backgroundPosition: 'center',\n pointerEvents: 'none',\n left: frame.x,\n top: frame.y,\n },\n initial: 'hidden',\n animate: 'visible',\n exit: 'exit',\n variants: imageVariants,\n transition,\n };\n\n setActiveImages((previous) => [...previous, newImage]);\n\n setTimeout(() => {\n setActiveImages((previous) =>\n previous.map((img) =>\n img.imageTrailKey === frame.key ? { ...img, animate: 'exit' } : img,\n ),\n );\n }, visibleFor * 1000);\n }, [\n mousePos,\n isHovering,\n images,\n imagesPreloaded,\n visibleFor,\n animation,\n imageTrailCore,\n transition,\n ]);\n\n return {\n componentRef: componentReference,\n componentProps: {\n onMouseMove: handleMouseMove,\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n },\n activeImages,\n imagesPreloaded,\n };\n}\n","'use client';\n\nimport { get } from 'lodash-es';\nimport React from 'react';\n\nimport type { MotionVariant, MotionVariants } from '../lib/motion';\nimport { useSystemHausMotionProvider } from '../provider/MotionProvider';\nimport { PolymorphicMotionProperties } from '../types';\n\n/**\n * Scale motion hook — animates an element scaling in/out.\n * Default scale range: visible = 1, hidden = 1.2 (slightly zoomed in).\n */\nexport function useScale(\n payload: {\n initialScale?: number;\n exitScale?: number;\n } = {},\n): PolymorphicMotionProperties {\n const fallbackInitialScale = 1.1;\n\n const { transition } = useSystemHausMotionProvider();\n\n const getVariantMap = React.useCallback(\n (): Record<'default', Required<MotionVariants>> => ({\n default: {\n hidden: {\n opacity: 0,\n scale: get(payload, ['initialScale'], fallbackInitialScale),\n },\n visible: { opacity: 1, scale: 1 },\n exit: {\n opacity: 0,\n scale: get(payload, ['exitScale'], fallbackInitialScale),\n },\n },\n }),\n [],\n );\n\n const variantMap = getVariantMap();\n\n const exitVariant = get(\n variantMap,\n ['default', 'exit'],\n variantMap['default']['exit'],\n );\n\n return React.useMemo(\n () => ({\n initial: 'hidden',\n animate: 'visible',\n exit: 'exit',\n variants: {\n ...variantMap['default'],\n exit: exitVariant as MotionVariant,\n },\n transition: {\n duration: get(transition, ['duration'], 1.2),\n ...transition,\n },\n }),\n [variantMap, exitVariant, transition],\n );\n}\n","'use client';\n\nimport { DirectionEnum } from '@kurocado-studio/systemhaus-motion';\nimport { get } from 'lodash-es';\nimport React from 'react';\n\nimport type { MotionVariant, MotionVariants } from '../lib/motion';\nimport { useSystemHausMotionProvider } from '../provider/MotionProvider';\nimport { PolymorphicMotionProperties } from '../types';\n\n/**\n * Slide-out motion hook — animates an element in/out based on direction.\n * Default distance: \"100%\" (full travel).\n */\nexport function useSlideOut({\n onEnterDirection = DirectionEnum.RIGHT,\n onExitDirection = DirectionEnum.RIGHT,\n distance = '100%',\n}: {\n onEnterDirection?: DirectionEnum;\n onExitDirection?: DirectionEnum;\n distance?: string | number;\n} = {}): PolymorphicMotionProperties {\n const { transition } = useSystemHausMotionProvider();\n\n const getVariantMap = React.useCallback(\n (\n distance: string | number,\n ): Record<DirectionEnum, Required<MotionVariants>> => ({\n [DirectionEnum.DEFAULT]: {\n hidden: { opacity: 0 },\n visible: { opacity: 1 },\n exit: { opacity: 0 },\n },\n [DirectionEnum.TOP]: {\n hidden: { opacity: 0, y: `-${distance}` },\n visible: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: `-${distance}` },\n },\n [DirectionEnum.BOTTOM]: {\n hidden: { opacity: 0, y: distance },\n visible: { opacity: 1, y: 0 },\n exit: { opacity: 0, y: distance },\n },\n [DirectionEnum.LEFT]: {\n hidden: { opacity: 0, x: `-${distance}` },\n visible: { opacity: 1, x: 0 },\n exit: { opacity: 0, x: `-${distance}` },\n },\n [DirectionEnum.RIGHT]: {\n hidden: { opacity: 0, x: distance },\n visible: { opacity: 1, x: 0 },\n exit: { opacity: 0, x: distance },\n },\n }),\n [],\n );\n\n const variantMap = getVariantMap(distance);\n\n const exitVariant = get(\n variantMap,\n [onExitDirection, 'exit'],\n variantMap[DirectionEnum.RIGHT]['exit'],\n );\n\n return React.useMemo(\n () => ({\n initial: 'hidden',\n animate: 'visible',\n exit: 'exit',\n variants: {\n ...get(variantMap, [onEnterDirection], variantMap[DirectionEnum.RIGHT]),\n exit: exitVariant as MotionVariant,\n },\n transition: {\n ...transition,\n },\n }),\n [variantMap, exitVariant, onEnterDirection, transition],\n );\n}\n","import { cloneDeep, merge } from 'lodash-es';\n\nimport type { MotionProperties } from '../lib/motion';\n\nexport function mergeMotionProperties(\n ...motionProperties: MotionProperties[]\n): MotionProperties {\n const safeCopies = motionProperties.map((mappedObject) =>\n cloneDeep(mappedObject),\n );\n return merge({}, ...safeCopies);\n}\n","'use client';\n\nexport { DirectionEnum } from '@kurocado-studio/systemhaus-motion';\nexport { systemHausMotionConfiguration } from './provider/MotionProvider';\n\nexport * from './components/AnimateMotionPresence';\nexport * from './components/Lenis';\nexport * from './components/PolymorphicMotionElement';\nexport * from './components/TextPressure';\nexport * from './hooks/useComposeStagger';\nexport * from './hooks/useCursorFollow';\nexport * from './hooks/useCardCarousel';\nexport * from './hooks/useFadeIn';\nexport * from './hooks/useImageTrail';\nexport * from './hooks/useMergeMotionProperties';\nexport * from './hooks/useScale';\nexport * from './hooks/useSlideOut';\nexport * from './provider/MotionProvider';\nexport * from './utils/mergeMotionProperties';\nexport * from 'framer-motion';\nexport type * from './lib/motion';\nexport type * from './types';\n\nexport type { PolymorphicMotionProperties } from './types';\n"],"mappings":"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","names":["calculateCursorOffset","element","mouseX","mouseY","settings","elementRect","elementCenterX","elementCenterY","offsetXFromCenter","offsetYFromCenter","magneticModeActivationRadius","maxDistance","get","intensity","distanceToCursor","proximityStrength","DirectionEnum","composeCursorImageTrail","options","frequency","visibleFor","MAX","RANGE","threshold","state","loadImages","source","resolve","reject","img","handleLoad","handleError","event","shouldTrigger","x","y","dx","dy","pushFrame","index","size","width","height","frame","updateVisibility","now","ms","distanceBetweenPoints","a","b","deltaX","deltaY","valueByDistance","distance","maxDistance","minValue","maxValue","falloffValue","createDebounce","function_","delay","timeoutId","arguments_","splitTextToChars","text","_","index","getDisplayChar","char","calculateScaleFactors","containerHeight","textHeight","yRatio","calculateSpanCenters","spans","span","spanRect","calculateAxisValues","distance","maxDistance","minWidth","maxWidth","widthEnabled","weightEnabled","italicEnabled","minWeight","maxWeight","widthAxisValue","valueByDistance","weightAxisValue","italicAxisValue","buildFontVariationSettings","DEFAULT_TRANSITION_EASE","DEFAULT_FADE_DISTANCE","motionContextDefaultConfig","DEFAULT_TRANSITION_EASE","get","React","createContext","useContext","useMemo","stagger","useIsPresent","useMotionValue","useSpring","MotionConfig","AnimatePresence","motion","systemHausMotionConfiguration","Z","C","S","MotionContext","createContext","MotionProvider","children","motionOverrides","motionContextConfig","useMemo","get","React","MotionConfig","useSystemHausMotionProvider","useContext","React","AnimateMotionPresence","children","isVisible","mode","initial","React","AnimatePresence","child","index","cancelFrame","frame","ReactLenis","useEffect","useRef","useLenisRaf","lenisReference","update","data","time","LenisHorizontal","options","properties","LenisVertical","React","PolymorphicMotionElement","properties","as","rest","Component","motion","React","useMotionValue","useSpring","React","useCallback","useEffect","useMemo","useRef","useState","TextPressure","children","className","fontFamily","fontUrl","Mona_Sans_var_default","italic","maxWeight","maxWidth","minWeight","minWidth","weight","width","containerReference","titleReference","hiddenTextReference","spansReference","spanCentersReference","maxDistanceReference","pointerX","pointerY","smoothPointerX","smoothPointerY","scaleYFactor","setScaleYFactor","lineHeightScale","setLineHeightScale","resolvedText","setResolvedText","chars","z","srOnlyStyle","nextText","handleMouseMove","mouseEvent","handleTouchMove","touchEvent","touch","left","top","height","initialX","initialY","cacheSpanCenters","titleRect","k","updateLayoutMetrics","containerHeight","textRect","nextScaleYFactor","nextLineHeight","X","debouncedUpdateLayout","U","animationFrameId","animate","smoothPointer","maxDistance","index","span","cachedCenter","distance","H","widthAxisValue","weightAxisValue","italicAxisValue","G","nextFontVariationSettings","V","styleElement","textStyle","char","displayChar","W","element","set","React","cloneDeep","merge","React","useDeepMergeMotionProperties","motionProperties","safeCopies","mappedObject","useMergeMotionProperties","payload","useComposeStagger","handleDeepMergeMotionProperties","useMergeMotionProperties","React","payload","staggerPayload","updatedPayload","staggerDelay","stagger","delay","set","get","useEffect","useRef","useCursorFollow","settings","elementReference","damping","get","stiffness","x","useMotionValue","y","localReference","useRef","targetReference","springX","useSpring","springY","useEffect","handleMouseMove","mouseEvent","element","newX","newY","D","React","useCardCarousel","itemCount","scrollBehavior","containerReference","itemsReference","activeIndex","setActiveIndex","previous","getOffsets","item","getClosestIndex","scrollLeft","offsets","closestIndex","closestDistance","index","offset","distance","onScroll","event","nextIndex","scrollToIndex","clampedIndex","target","previousButtonProperties","nextButtonProperties","containerProperties","getItemProperties","element","get","React","useFadeIn","onEnterDirection","onExitDirection","viewport","transition","fadeInDistance","S","useSystemHausMotionProvider","fadeDistance","variantMap","React","distance","C","exitVariant","get","useEffect","useMemo","useRef","useState","imageVariants","useImageTrail","images","frequency","visibleFor","maxWidth","maxHeight","animation","componentReference","useRef","imageTrailCore","useMemo","M","mousePos","setMousePos","useState","isHovering","setIsHovering","activeImages","setActiveImages","imagesPreloaded","setImagesPreloaded","transition","useSystemHausMotionProvider","useEffect","isMounted","handleMouseMove","event","rect","handleMouseEnter","handleMouseLeave","frame","newImage","previous","img","get","React","useScale","payload","transition","useSystemHausMotionProvider","variantMap","React","get","exitVariant","get","React","useSlideOut","onEnterDirection","C","onExitDirection","distance","transition","useSystemHausMotionProvider","variantMap","React","exitVariant","get","cloneDeep","merge","mergeMotionProperties","motionProperties","safeCopies","mappedObject"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AnimatePresence } from 'framer-motion';
|
|
2
2
|
import { CalculateCursorOffsetController } from '@kurocado-studio/systemhaus-motion';
|
|
3
|
+
import { ComponentProps } from 'react';
|
|
3
4
|
import { ComponentPropsWithoutRef } from 'react';
|
|
4
5
|
import { DirectionEnum } from '@kurocado-studio/systemhaus-motion';
|
|
5
6
|
import { ElementType } from 'react';
|
|
@@ -9,10 +10,13 @@ import * as motion_dom from 'motion-dom';
|
|
|
9
10
|
import { MotionConfig } from 'framer-motion';
|
|
10
11
|
import * as MotionLibrary from 'framer-motion';
|
|
11
12
|
import { default as React_2 } from 'react';
|
|
13
|
+
import { ReactElement } from 'react';
|
|
14
|
+
import { ReactLenis } from 'lenis/react';
|
|
12
15
|
import { RefObject } from 'react';
|
|
13
16
|
import { stagger } from 'framer-motion';
|
|
14
17
|
import { SystemHausMotionProviderConfig } from '@kurocado-studio/systemhaus-motion';
|
|
15
18
|
import { UseFadeInProperties } from '@kurocado-studio/systemhaus-motion';
|
|
19
|
+
import { useIsPresent } from 'framer-motion';
|
|
16
20
|
import { useMotionValue } from 'framer-motion';
|
|
17
21
|
import { useSpring } from 'framer-motion';
|
|
18
22
|
|
|
@@ -27,6 +31,14 @@ export declare interface AnimateMotionPresenceProperties {
|
|
|
27
31
|
|
|
28
32
|
export { AnimatePresence }
|
|
29
33
|
|
|
34
|
+
declare type CardCarouselContainerProperties = React_2.HTMLAttributes<HTMLDivElement> & {
|
|
35
|
+
ref: React_2.Ref<HTMLDivElement>;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
declare type CardCarouselItemProperties = React_2.HTMLAttributes<HTMLLIElement> & {
|
|
39
|
+
ref: React_2.Ref<HTMLLIElement>;
|
|
40
|
+
};
|
|
41
|
+
|
|
30
42
|
export declare type ComposeStagger = <T extends PolymorphicMotionElementMap = 'div'>(payload: {
|
|
31
43
|
payload: PolymorphicMotionProperties<T>;
|
|
32
44
|
staggerPayload: Parameters<typeof stagger>;
|
|
@@ -36,6 +48,8 @@ declare interface CursorImageTrailOptions {
|
|
|
36
48
|
images: string[];
|
|
37
49
|
frequency?: number;
|
|
38
50
|
visibleFor?: number;
|
|
51
|
+
maxWidth?: number;
|
|
52
|
+
maxHeight?: number;
|
|
39
53
|
animation?: {
|
|
40
54
|
in?: MotionProperties;
|
|
41
55
|
out?: MotionProperties;
|
|
@@ -46,6 +60,10 @@ export declare type DeepMergeMotionProperties = <T extends PolymorphicMotionElem
|
|
|
46
60
|
|
|
47
61
|
export { DirectionEnum }
|
|
48
62
|
|
|
63
|
+
export declare function LenisHorizontal({ options, ...properties }: ReactLenisProperties): ReactElement;
|
|
64
|
+
|
|
65
|
+
export declare function LenisVertical({ options, ...properties }: ReactLenisProperties): ReactElement;
|
|
66
|
+
|
|
49
67
|
export declare function mergeMotionProperties(...motionProperties: MotionProperties[]): MotionProperties;
|
|
50
68
|
|
|
51
69
|
export { motion }
|
|
@@ -88,6 +106,8 @@ export declare type PolymorphicMotionProperties<T extends ElementType = 'div'> =
|
|
|
88
106
|
exit?: MotionVariant | string;
|
|
89
107
|
};
|
|
90
108
|
|
|
109
|
+
declare type ReactLenisProperties = ComponentProps<typeof ReactLenis>;
|
|
110
|
+
|
|
91
111
|
export { stagger }
|
|
92
112
|
|
|
93
113
|
export declare const systemHausMotionConfiguration: SystemHausMotionProvider;
|
|
@@ -103,6 +123,71 @@ declare interface SystemHausMotionProviderProperties {
|
|
|
103
123
|
motionOverrides?: Partial<SystemHausMotionProvider>;
|
|
104
124
|
}
|
|
105
125
|
|
|
126
|
+
export declare const TextPressure: React_2.FC<TextPressureProperties>;
|
|
127
|
+
|
|
128
|
+
export declare interface TextPressureProperties {
|
|
129
|
+
/**
|
|
130
|
+
* Optional React node to be rendered; text content is extracted for animation.
|
|
131
|
+
*/
|
|
132
|
+
children?: React_2.ReactNode;
|
|
133
|
+
/**
|
|
134
|
+
* Custom font-family name to apply to the animated text.
|
|
135
|
+
*/
|
|
136
|
+
fontFamily?: string;
|
|
137
|
+
/**
|
|
138
|
+
* URL to a font file (e.g. .woff2) to load via @font-face.
|
|
139
|
+
*/
|
|
140
|
+
fontUrl?: string;
|
|
141
|
+
/**
|
|
142
|
+
* Enable width axis animation (wdth).
|
|
143
|
+
*/
|
|
144
|
+
width?: boolean;
|
|
145
|
+
/**
|
|
146
|
+
* Minimum width axis value when animating.
|
|
147
|
+
*/
|
|
148
|
+
minWidth?: number;
|
|
149
|
+
/**
|
|
150
|
+
* Maximum width axis value when animating.
|
|
151
|
+
*/
|
|
152
|
+
maxWidth?: number;
|
|
153
|
+
/**
|
|
154
|
+
* Enable weight axis animation (wght).
|
|
155
|
+
*/
|
|
156
|
+
weight?: boolean;
|
|
157
|
+
/**
|
|
158
|
+
* Enable italic axis animation (ital).
|
|
159
|
+
*/
|
|
160
|
+
italic?: boolean;
|
|
161
|
+
/**
|
|
162
|
+
* Minimum weight axis value when animating.
|
|
163
|
+
*/
|
|
164
|
+
minWeight?: number;
|
|
165
|
+
/**
|
|
166
|
+
* Maximum weight axis value when animating.
|
|
167
|
+
*/
|
|
168
|
+
maxWeight?: number;
|
|
169
|
+
/**
|
|
170
|
+
* Optional className applied to the animated text wrapper.
|
|
171
|
+
*/
|
|
172
|
+
className?: string;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export declare function useCardCarousel({ itemCount, scrollBehavior, }: UseCardCarouselOptions): UseCardCarouselReturn;
|
|
176
|
+
|
|
177
|
+
declare type UseCardCarouselOptions = {
|
|
178
|
+
itemCount: number;
|
|
179
|
+
scrollBehavior?: ScrollBehavior;
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
declare type UseCardCarouselReturn = {
|
|
183
|
+
activeIndex: number;
|
|
184
|
+
containerProps: CardCarouselContainerProperties;
|
|
185
|
+
getItemProps: (index: number) => CardCarouselItemProperties;
|
|
186
|
+
nextButtonProps: React_2.ButtonHTMLAttributes<HTMLButtonElement>;
|
|
187
|
+
prevButtonProps: React_2.ButtonHTMLAttributes<HTMLButtonElement>;
|
|
188
|
+
scrollToIndex: (index: number) => void;
|
|
189
|
+
};
|
|
190
|
+
|
|
106
191
|
export declare type UseComposeStagger = () => {
|
|
107
192
|
composeStagger: ComposeStagger;
|
|
108
193
|
};
|
|
@@ -124,7 +209,7 @@ export declare function useDeepMergeMotionProperties(...motionProperties: Motion
|
|
|
124
209
|
|
|
125
210
|
export declare const useFadeIn: <T extends PolymorphicMotionElementMap = "div">({ onEnterDirection, onExitDirection, }?: UseFadeInProperties) => PolymorphicMotionProperties<T>;
|
|
126
211
|
|
|
127
|
-
export declare function useImageTrail({ images, frequency, visibleFor, animation, }: CursorImageTrailOptions): {
|
|
212
|
+
export declare function useImageTrail({ images, frequency, visibleFor, maxWidth, maxHeight, animation, }: CursorImageTrailOptions): {
|
|
128
213
|
componentRef: React_2.RefObject<HTMLDivElement | null>;
|
|
129
214
|
componentProps: {
|
|
130
215
|
onMouseMove: (event: React_2.MouseEvent<HTMLDivElement>) => void;
|
|
@@ -135,6 +220,8 @@ export declare function useImageTrail({ images, frequency, visibleFor, animation
|
|
|
135
220
|
imagesPreloaded: boolean;
|
|
136
221
|
};
|
|
137
222
|
|
|
223
|
+
export { useIsPresent }
|
|
224
|
+
|
|
138
225
|
export declare function useMergeMotionProperties(): {
|
|
139
226
|
handleDeepMergeMotionProperties: DeepMergeMotionProperties;
|
|
140
227
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kurocado-studio/systemhaus-motion-react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0-develop.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"framer-motion": "^12.23.26",
|
|
42
|
+
"lenis": "^1.3.17",
|
|
42
43
|
"lodash-es": "^4.17.21",
|
|
43
44
|
"motion": "^12.11.0",
|
|
44
45
|
"react": "^19.2.0",
|