@ncdai/react-wheel-picker 1.0.7 → 1.0.8

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/README.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  iOS-like wheel picker for React with smooth inertia scrolling and infinite loop support.
4
4
 
5
+ - 📱 Natural touch scrolling with smooth inertia effect
6
+ - 🖱️ Mouse drag and scroll support for desktop
7
+ - 🔄 Infinite loop scrolling
8
+ - 🎨 Unstyled components for complete style customization
9
+ - ⚡️ Easy installation via shadcn CLI
10
+
5
11
  Check out the live demo: https://chanhdai.com/blog/react-wheel-picker
6
12
 
7
13
  ## Usage
@@ -24,7 +30,7 @@ Add the core CSS to your app's entry point (e.g., `src/app/layout.tsx`, `src/mai
24
30
  import "@ncdai/react-wheel-picker/style.css";
25
31
  ```
26
32
 
27
- > This CSS includes only basic layout. Use classNames to customize visuals (see below).
33
+ > This CSS includes only basic layout. Use `classNames` to customize visuals (see below).
28
34
 
29
35
  Use the component in your app:
30
36
 
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";"use client";var vt=Object.create;var C=Object.defineProperty;var wt=Object.getOwnPropertyDescriptor;var yt=Object.getOwnPropertyNames;var Et=Object.getPrototypeOf,Tt=Object.prototype.hasOwnProperty;var Dt=(s,i)=>{for(var d in i)C(s,d,{get:i[d],enumerable:!0})},et=(s,i,d,h)=>{if(i&&typeof i=="object"||typeof i=="function")for(let l of yt(i))!Tt.call(s,l)&&l!==d&&C(s,l,{get:()=>i[l],enumerable:!(h=wt(i,l))||h.enumerable});return s};var nt=(s,i,d)=>(d=s!=null?vt(Et(s)):{},et(i||!s||!s.__esModule?C(d,"default",{value:s,enumerable:!0}):d,s)),Mt=s=>et(C({},"__esModule",{value:!0}),s);var Ct={};Dt(Ct,{WheelPicker:()=>xt,WheelPickerWrapper:()=>Wt});module.exports=Mt(Ct);var T=nt(require("react")),u=require("react");var E=nt(require("react"));function rt(s){let i=E.default.useRef(s);return E.default.useEffect(()=>{i.current=s}),E.default.useMemo(()=>(...d)=>{var h;return(h=i.current)==null?void 0:h.call(i,...d)},[])}function St({defaultProp:s,onChange:i}){let d=E.default.useState(s),[h]=d,l=E.default.useRef(h),w=rt(i);return E.default.useEffect(()=>{l.current!==h&&(w(h),l.current=h)},[h,l,w]),d}function ot({prop:s,defaultProp:i,onChange:d=()=>{}}){let[h,l]=St({defaultProp:i,onChange:d}),w=s!==void 0,Y=w?s:h,f=rt(d),L=E.default.useCallback(D=>{if(w){let p=typeof D=="function"?D(s):D;p!==s&&f(p)}else l(D)},[w,s,l,f]);return[Y,L]}var kt=150,st=.3,Lt=30,It=s=>Math.pow(s-1,3)+1,Wt=({className:s,children:i})=>T.default.createElement("div",{className:s,"data-rwp-wrapper":!0},i),xt=({defaultValue:s,value:i,onValueChange:d,options:h,infinite:l=!1,visibleCount:w=20,dragSensitivity:Y=3,classNames:f})=>{var Q,V;let[L=(V=(Q=h[0])==null?void 0:Q.value)!=null?V:"",D]=ot({defaultProp:s,prop:i,onChange:d}),a=(0,u.useMemo)(()=>{if(!l)return h;let t=[],e=Math.ceil(w/2);if(h.length===0)return t;for(;t.length<e;)t.push(...h);return t},[w,h,l]),p=28,q=p*.5,M=360/w,I=p/Math.tan(M*Math.PI/180),at=Math.round(I*2+p*.25),A=w>>2,B=Y*10,ct=10,b=(0,u.useRef)(null),W=(0,u.useRef)(null),R=(0,u.useRef)(null),v=(0,u.useRef)(0),X=(0,u.useRef)(0),S=(0,u.useRef)(!1),j=(0,u.useRef)(0),H=(0,u.useRef)({startY:0,yList:[]}),O=(0,u.useRef)(null),it=(0,u.useMemo)(()=>{let t=(n,r,o)=>T.default.createElement("li",{key:r,className:f==null?void 0:f.optionItem,"data-rwp-option":!0,"data-index":r,style:{top:-q,height:p,lineHeight:`${p}px`,transform:`rotateX(${o}deg) translateZ(${I}px)`,visibility:"hidden"}},n.label),e=a.map((n,r)=>t(n,r,-M*r));if(l)for(let n=0;n<A;++n){let r=-n-1,o=n+a.length;e.unshift(t(a[a.length-n-1],r,M*(n+1))),e.push(t(a[n],o,-M*o))}return e},[q,l,M,a,A,I,f==null?void 0:f.optionItem]),lt=(0,u.useMemo)(()=>{let t=(n,r)=>T.default.createElement("li",{key:r,"data-slot":"highlight-item",className:f==null?void 0:f.highlightItem,style:{height:p}},n.label),e=a.map((n,r)=>t(n,r));if(l){let n=a[0],r=a[a.length-1];e.unshift(t(r,"infinite-start")),e.push(t(n,"infinite-end"))}return e},[f==null?void 0:f.highlightItem,l,a]),z=t=>(t%a.length+a.length)%a.length,k=t=>{let e=l?z(t):t;if(W.current){let n=`translateZ(${-I}px) rotateX(${M*e}deg)`;W.current.style.transform=n,W.current.childNodes.forEach(r=>{let o=r,m=Math.abs(Number(o.dataset.index)-e);o.style.visibility=m>A?"hidden":"visible"})}return R.current&&(R.current.style.transform=`translateY(${-e*p}px)`),e},F=()=>{cancelAnimationFrame(X.current)},ut=(t,e,n,r)=>{if(t===e||n===0){k(t);return}let o=performance.now(),m=e-t,c=g=>{let y=(g-o)/1e3;if(y<n){let $=It(y/n);v.current=k(t+$*m),X.current=requestAnimationFrame(c)}else F(),v.current=k(e),r==null||r()};requestAnimationFrame(c)},x=t=>{let e=z(t)|0,n=l?e:Math.min(Math.max(e,0),a.length-1);if(!l&&n!==t)return;v.current=k(n);let r=a[v.current];D(r.value)},ht=t=>{let e=a.findIndex(n=>n.value===t);if(e===-1){console.error("Invalid value selected:",t);return}F(),x(e)},dt=t=>{var e,n;try{let r=(t instanceof MouseEvent?t.clientY:(n=(e=t.touches)==null?void 0:e[0])==null?void 0:n.clientY)||0,o=H.current;o.yList.push([r,Date.now()]),o.yList.length>5&&o.yList.shift();let m=(o.startY-r)/p,c=v.current+m;if(l)c=z(c);else{let g=a.length;c<0?c*=st:c>g&&(c=g+(c-g)*st)}o.touchScroll=k(c)}catch(r){console.error("Error in updateScrollDuringDrag:",r)}},G=t=>{!S.current&&!b.current.contains(t.target)&&t.target!==b.current||(t.cancelable&&t.preventDefault(),a.length&&dt(t))},Z=t=>{var e,n,r;try{S.current=!0;let o=new AbortController,{signal:m}=o;O.current=o;let c={signal:m,passive:!1};(e=b.current)==null||e.addEventListener("touchmove",G,c),document.addEventListener("mousemove",G,c);let g=(t instanceof MouseEvent?t.clientY:(r=(n=t.touches)==null?void 0:n[0])==null?void 0:r.clientY)||0,y=H.current;y.startY=g,y.yList=[[g,Date.now()]],y.touchScroll=v.current,F()}catch(o){console.error("Error in initiateDragGesture:",o)}},P=(0,u.useCallback)(t=>{let e=S.current,n=b.current.contains(t.target)||t.target===b.current;(e||n)&&t.cancelable&&(t.preventDefault(),a.length&&Z(t))},[Z]),ft=t=>{let e=v.current,n=e,r=t>0?-B:B,o=0,m=(c,g,y)=>Math.max(g,Math.min(c,y));if(l){o=Math.abs(t/r);let c=t*o+.5*r*o*o;n=Math.round(e+c)}else if(e<0||e>a.length-1){let c=m(e,0,a.length-1),g=e-c;r=ct,o=Math.sqrt(Math.abs(g/r)),t=r*o,t=e>0?-t:t,n=c}else{o=Math.abs(t/r);let c=t*o+.5*r*o*o;n=Math.round(e+c),n=m(n,0,a.length-1);let g=n-e;o=Math.sqrt(Math.abs(g/r))}ut(e,n,o,()=>{x(v.current)}),x(v.current)},_=()=>{var t,e,n,r;try{(t=O.current)==null||t.abort(),O.current=null;let o=H.current,m=o.yList,c=0;if(m.length>1){let g=m.length,[y,$]=(e=m[g-2])!=null?e:[0,0],[gt,pt]=(n=m[g-1])!=null?n:[0,0],N=pt-$;if(N>0){let tt=(y-gt)/p*1e3/N,mt=Lt,bt=tt>0?1:-1;c=Math.min(Math.abs(tt),mt)*bt}}v.current=(r=o.touchScroll)!=null?r:v.current,ft(c)}catch(o){console.error("Error in finalizeDragAndStartInertiaScroll:",o)}finally{S.current=!1}},U=(0,u.useCallback)(t=>{if(!a.length)return;let e=S.current,n=b.current.contains(t.target)||t.target===b.current;(e||n)&&t.cancelable&&(t.preventDefault(),_())},[_]),K=t=>{t.preventDefault();let e=Date.now();if(e-j.current<kt)return;let n=Math.sign(t.deltaY);n!==0&&(x(v.current+n),j.current=e)},J=(0,u.useCallback)(t=>{if(!a.length||!b.current)return;let e=S.current,n=b.current.contains(t.target)||t.target===b.current;(e||n)&&t.cancelable&&(t.preventDefault(),K(t))},[K]);return(0,u.useEffect)(()=>{let t=b.current;if(!t)return;let e=new AbortController,{signal:n}=e,r={signal:n,passive:!1};return t.addEventListener("touchstart",P,r),t.addEventListener("touchend",U,r),t.addEventListener("wheel",J,r),document.addEventListener("mousedown",P,r),document.addEventListener("mouseup",U,r),()=>e.abort()},[U,P,J]),(0,u.useEffect)(()=>{ht(L)},[L,i]),T.default.createElement("div",{ref:b,"data-rwp":!0,style:{height:at}},T.default.createElement("ul",{ref:W,"data-rwp-options":!0},it),T.default.createElement("div",{className:f==null?void 0:f.highlightWrapper,"data-rwp-highlight-wrapper":!0,style:{height:p,lineHeight:p+"px"}},T.default.createElement("ul",{ref:R,"data-rwp-highlight-list":!0,style:{top:l?-p:void 0}},lt)))};0&&(module.exports={WheelPicker,WheelPickerWrapper});
1
+ "use strict";"use client";var wt=Object.create;var C=Object.defineProperty;var yt=Object.getOwnPropertyDescriptor;var Et=Object.getOwnPropertyNames;var Mt=Object.getPrototypeOf,Tt=Object.prototype.hasOwnProperty;var Dt=(s,a)=>{for(var d in a)C(s,d,{get:a[d],enumerable:!0})},rt=(s,a,d,f)=>{if(a&&typeof a=="object"||typeof a=="function")for(let i of Et(a))!Tt.call(s,i)&&i!==d&&C(s,i,{get:()=>a[i],enumerable:!(f=yt(a,i))||f.enumerable});return s};var ot=(s,a,d)=>(d=s!=null?wt(Mt(s)):{},rt(a||!s||!s.__esModule?C(d,"default",{value:s,enumerable:!0}):d,s)),St=s=>rt(C({},"__esModule",{value:!0}),s);var Ct={};Dt(Ct,{WheelPicker:()=>xt,WheelPickerWrapper:()=>Wt});module.exports=St(Ct);var M=ot(require("react")),h=require("react");var E=ot(require("react"));function st(s){let a=E.default.useRef(s);return E.default.useEffect(()=>{a.current=s}),E.default.useMemo(()=>(...d)=>{var f;return(f=a.current)==null?void 0:f.call(a,...d)},[])}function kt({defaultProp:s,onChange:a}){let d=E.default.useState(s),[f]=d,i=E.default.useRef(f),v=st(a);return E.default.useEffect(()=>{i.current!==f&&(v(f),i.current=f)},[f,i,v]),d}function at({prop:s,defaultProp:a,onChange:d=()=>{}}){let[f,i]=kt({defaultProp:a,onChange:d}),v=s!==void 0,Y=v?s:f,g=st(d),I=E.default.useCallback(T=>{if(v){let p=typeof T=="function"?T(s):T;p!==s&&g(p)}else i(T)},[v,s,i,g]);return[Y,I]}var ct=.3,It=30,Lt=s=>Math.pow(s-1,3)+1,B=(s,a,d)=>Math.max(a,Math.min(s,d)),Wt=({className:s,children:a})=>M.default.createElement("div",{className:s,"data-rwp-wrapper":!0},a),xt=({defaultValue:s,value:a,onValueChange:d,options:f,infinite:i=!1,visibleCount:v=20,dragSensitivity:Y=3,classNames:g})=>{var N,tt;let[I=(tt=(N=f[0])==null?void 0:N.value)!=null?tt:"",T]=at({defaultProp:s,prop:a,onChange:d}),c=(0,h.useMemo)(()=>{if(!i)return f;let t=[],e=Math.ceil(v/2);if(f.length===0)return t;for(;t.length<e;)t.push(...f);return t},[v,f,i]),p=30,X=p*.5,D=360/v,L=p/Math.tan(D*Math.PI/180),it=Math.round(L*2+p*.25),A=v>>2,R=Y*10,lt=10,m=(0,h.useRef)(null),W=(0,h.useRef)(null),H=(0,h.useRef)(null),b=(0,h.useRef)(0),j=(0,h.useRef)(0),S=(0,h.useRef)(!1),G=(0,h.useRef)(0),O=(0,h.useRef)({startY:0,yList:[]}),z=(0,h.useRef)(null),ut=(0,h.useMemo)(()=>{let t=(n,r,o)=>M.default.createElement("li",{key:r,className:g==null?void 0:g.optionItem,"data-rwp-option":!0,"data-index":r,style:{top:-X,height:p,lineHeight:`${p}px`,transform:`rotateX(${o}deg) translateZ(${L}px)`,visibility:"hidden"}},n.label),e=c.map((n,r)=>t(n,r,-D*r));if(i)for(let n=0;n<A;++n){let r=-n-1,o=n+c.length;e.unshift(t(c[c.length-n-1],r,D*(n+1))),e.push(t(c[n],o,-D*o))}return e},[X,i,D,c,A,L,g==null?void 0:g.optionItem]),ht=(0,h.useMemo)(()=>{let t=(n,r)=>M.default.createElement("li",{key:r,"data-slot":"highlight-item",className:g==null?void 0:g.highlightItem,style:{height:p}},n.label),e=c.map((n,r)=>t(n,r));if(i){let n=c[0],r=c[c.length-1];e.unshift(t(r,"infinite-start")),e.push(t(n,"infinite-end"))}return e},[g==null?void 0:g.highlightItem,i,c]),F=t=>(t%c.length+c.length)%c.length,k=t=>{let e=i?F(t):t;if(W.current){let n=`translateZ(${-L}px) rotateX(${D*e}deg)`;W.current.style.transform=n,W.current.childNodes.forEach(r=>{let o=r,u=Math.abs(Number(o.dataset.index)-e);o.style.visibility=u>A?"hidden":"visible"})}return H.current&&(H.current.style.transform=`translateY(${-e*p}px)`),e},x=()=>{cancelAnimationFrame(j.current)},Z=(t,e,n,r)=>{if(t===e||n===0){k(t);return}let o=performance.now(),u=e-t,l=w=>{let y=(w-o)/1e3;if(y<n){let $=Lt(y/n);b.current=k(t+$*u),j.current=requestAnimationFrame(l)}else x(),b.current=k(e),r==null||r()};requestAnimationFrame(l)},U=t=>{let e=F(t)|0,n=i?e:Math.min(Math.max(e,0),c.length-1);if(!i&&n!==t)return;b.current=k(n);let r=c[b.current];T(r.value)},dt=t=>{let e=c.findIndex(n=>n.value===t);if(e===-1){console.error("Invalid value selected:",t);return}x(),U(e)},ft=t=>{var e,n;try{let r=(t instanceof MouseEvent?t.clientY:(n=(e=t.touches)==null?void 0:e[0])==null?void 0:n.clientY)||0,o=O.current;o.yList.push([r,Date.now()]),o.yList.length>5&&o.yList.shift();let u=(o.startY-r)/p,l=b.current+u;if(i)l=F(l);else{let w=c.length;l<0?l*=ct:l>w&&(l=w+(l-w)*ct)}o.touchScroll=k(l)}catch(r){console.error("Error in updateScrollDuringDrag:",r)}},K=t=>{!S.current&&!m.current.contains(t.target)&&t.target!==m.current||(t.cancelable&&t.preventDefault(),c.length&&ft(t))},_=t=>{var e,n,r;try{S.current=!0;let o=new AbortController,{signal:u}=o;z.current=o;let l={signal:u,passive:!1};(e=m.current)==null||e.addEventListener("touchmove",K,l),document.addEventListener("mousemove",K,l);let w=(t instanceof MouseEvent?t.clientY:(r=(n=t.touches)==null?void 0:n[0])==null?void 0:r.clientY)||0,y=O.current;y.startY=w,y.yList=[[w,Date.now()]],y.touchScroll=b.current,x()}catch(o){console.error("Error in initiateDragGesture:",o)}},q=(0,h.useCallback)(t=>{let e=S.current,n=m.current.contains(t.target)||t.target===m.current;(e||n)&&t.cancelable&&(t.preventDefault(),c.length&&_(t))},[_]),gt=t=>{let e=b.current,n=e,r=t>0?-R:R,o=0;if(i){o=Math.abs(t/r);let u=t*o+.5*r*o*o;n=Math.round(e+u)}else if(e<0||e>c.length-1){let u=B(e,0,c.length-1),l=e-u;r=lt,o=Math.sqrt(Math.abs(l/r)),t=r*o,t=e>0?-t:t,n=u}else{o=Math.abs(t/r);let u=t*o+.5*r*o*o;n=Math.round(e+u),n=B(n,0,c.length-1);let l=n-e;o=Math.sqrt(Math.abs(l/r))}Z(e,n,o,()=>{U(b.current)})},J=()=>{var t,e,n,r;try{(t=z.current)==null||t.abort(),z.current=null;let o=O.current,u=o.yList,l=0;if(u.length>1){let w=u.length,[y,$]=(e=u[w-2])!=null?e:[0,0],[pt,mt]=(n=u[w-1])!=null?n:[0,0],et=mt-$;if(et>0){let nt=(y-pt)/p*1e3/et,bt=It,vt=nt>0?1:-1;l=Math.min(Math.abs(nt),bt)*vt}}b.current=(r=o.touchScroll)!=null?r:b.current,gt(l)}catch(o){console.error("Error in finalizeDragAndStartInertiaScroll:",o)}finally{S.current=!1}},P=(0,h.useCallback)(t=>{if(!c.length)return;let e=S.current,n=m.current.contains(t.target)||t.target===m.current;(e||n)&&t.cancelable&&(t.preventDefault(),J())},[J]),Q=t=>{t.preventDefault();let e=Date.now();if(e-G.current<100)return;let n=Math.sign(t.deltaY);if(!n)return;G.current=e;let r=b.current,o=r+n;i?o=Math.round(o):o=B(Math.round(o),0,c.length-1);let u=Math.abs(o-r);if(u===0)return;let l=Math.sqrt(u/R);x(),Z(r,o,l,()=>{U(b.current)})},V=(0,h.useCallback)(t=>{if(!c.length||!m.current)return;let e=S.current,n=m.current.contains(t.target)||t.target===m.current;(e||n)&&t.cancelable&&(t.preventDefault(),Q(t))},[Q]);return(0,h.useEffect)(()=>{let t=m.current;if(!t)return;let e=new AbortController,{signal:n}=e,r={signal:n,passive:!1};return t.addEventListener("touchstart",q,r),t.addEventListener("touchend",P,r),t.addEventListener("wheel",V,r),document.addEventListener("mousedown",q,r),document.addEventListener("mouseup",P,r),()=>e.abort()},[P,q,V]),(0,h.useEffect)(()=>{dt(I)},[I,a]),M.default.createElement("div",{ref:m,"data-rwp":!0,style:{height:it}},M.default.createElement("ul",{ref:W,"data-rwp-options":!0},ut),M.default.createElement("div",{className:g==null?void 0:g.highlightWrapper,"data-rwp-highlight-wrapper":!0,style:{height:p,lineHeight:p+"px"}},M.default.createElement("ul",{ref:H,"data-rwp-highlight-list":!0,style:{top:i?-p:void 0}},ht)))};0&&(module.exports={WheelPicker,WheelPickerWrapper});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- "use client";import T from"react";import{useCallback as $,useEffect as ot,useMemo as q,useRef as y}from"react";import E from"react";function nt(u){let g=E.useRef(u);return E.useEffect(()=>{g.current=u}),E.useMemo(()=>(...w)=>{var h;return(h=g.current)==null?void 0:h.call(g,...w)},[])}function vt({defaultProp:u,onChange:g}){let w=E.useState(u),[h]=w,c=E.useRef(h),b=nt(g);return E.useEffect(()=>{c.current!==h&&(b(h),c.current=h)},[h,c,b]),w}function rt({prop:u,defaultProp:g,onChange:w=()=>{}}){let[h,c]=vt({defaultProp:g,onChange:w}),b=u!==void 0,C=b?u:h,i=nt(w),L=E.useCallback(D=>{if(b){let d=typeof D=="function"?D(u):D;d!==u&&i(d)}else c(D)},[b,u,c,i]);return[C,L]}var wt=150,st=.3,yt=30,Et=u=>Math.pow(u-1,3)+1,Yt=({className:u,children:g})=>T.createElement("div",{className:u,"data-rwp-wrapper":!0},g),At=({defaultValue:u,value:g,onValueChange:w,options:h,infinite:c=!1,visibleCount:b=20,dragSensitivity:C=3,classNames:i})=>{var V,N;let[L=(N=(V=h[0])==null?void 0:V.value)!=null?N:"",D]=rt({defaultProp:u,prop:g,onChange:w}),s=q(()=>{if(!c)return h;let t=[],e=Math.ceil(b/2);if(h.length===0)return t;for(;t.length<e;)t.push(...h);return t},[b,h,c]),d=28,B=d*.5,M=360/b,I=d/Math.tan(M*Math.PI/180),at=Math.round(I*2+d*.25),Y=b>>2,X=C*10,ct=10,p=y(null),W=y(null),A=y(null),m=y(0),j=y(0),S=y(!1),G=y(0),R=y({startY:0,yList:[]}),H=y(null),it=q(()=>{let t=(n,r,o)=>T.createElement("li",{key:r,className:i==null?void 0:i.optionItem,"data-rwp-option":!0,"data-index":r,style:{top:-B,height:d,lineHeight:`${d}px`,transform:`rotateX(${o}deg) translateZ(${I}px)`,visibility:"hidden"}},n.label),e=s.map((n,r)=>t(n,r,-M*r));if(c)for(let n=0;n<Y;++n){let r=-n-1,o=n+s.length;e.unshift(t(s[s.length-n-1],r,M*(n+1))),e.push(t(s[n],o,-M*o))}return e},[B,c,M,s,Y,I,i==null?void 0:i.optionItem]),lt=q(()=>{let t=(n,r)=>T.createElement("li",{key:r,"data-slot":"highlight-item",className:i==null?void 0:i.highlightItem,style:{height:d}},n.label),e=s.map((n,r)=>t(n,r));if(c){let n=s[0],r=s[s.length-1];e.unshift(t(r,"infinite-start")),e.push(t(n,"infinite-end"))}return e},[i==null?void 0:i.highlightItem,c,s]),O=t=>(t%s.length+s.length)%s.length,k=t=>{let e=c?O(t):t;if(W.current){let n=`translateZ(${-I}px) rotateX(${M*e}deg)`;W.current.style.transform=n,W.current.childNodes.forEach(r=>{let o=r,f=Math.abs(Number(o.dataset.index)-e);o.style.visibility=f>Y?"hidden":"visible"})}return A.current&&(A.current.style.transform=`translateY(${-e*d}px)`),e},z=()=>{cancelAnimationFrame(j.current)},ut=(t,e,n,r)=>{if(t===e||n===0){k(t);return}let o=performance.now(),f=e-t,a=l=>{let v=(l-o)/1e3;if(v<n){let U=Et(v/n);m.current=k(t+U*f),j.current=requestAnimationFrame(a)}else z(),m.current=k(e),r==null||r()};requestAnimationFrame(a)},x=t=>{let e=O(t)|0,n=c?e:Math.min(Math.max(e,0),s.length-1);if(!c&&n!==t)return;m.current=k(n);let r=s[m.current];D(r.value)},ht=t=>{let e=s.findIndex(n=>n.value===t);if(e===-1){console.error("Invalid value selected:",t);return}z(),x(e)},dt=t=>{var e,n;try{let r=(t instanceof MouseEvent?t.clientY:(n=(e=t.touches)==null?void 0:e[0])==null?void 0:n.clientY)||0,o=R.current;o.yList.push([r,Date.now()]),o.yList.length>5&&o.yList.shift();let f=(o.startY-r)/d,a=m.current+f;if(c)a=O(a);else{let l=s.length;a<0?a*=st:a>l&&(a=l+(a-l)*st)}o.touchScroll=k(a)}catch(r){console.error("Error in updateScrollDuringDrag:",r)}},Z=t=>{!S.current&&!p.current.contains(t.target)&&t.target!==p.current||(t.cancelable&&t.preventDefault(),s.length&&dt(t))},_=t=>{var e,n,r;try{S.current=!0;let o=new AbortController,{signal:f}=o;H.current=o;let a={signal:f,passive:!1};(e=p.current)==null||e.addEventListener("touchmove",Z,a),document.addEventListener("mousemove",Z,a);let l=(t instanceof MouseEvent?t.clientY:(r=(n=t.touches)==null?void 0:n[0])==null?void 0:r.clientY)||0,v=R.current;v.startY=l,v.yList=[[l,Date.now()]],v.touchScroll=m.current,z()}catch(o){console.error("Error in initiateDragGesture:",o)}},F=$(t=>{let e=S.current,n=p.current.contains(t.target)||t.target===p.current;(e||n)&&t.cancelable&&(t.preventDefault(),s.length&&_(t))},[_]),ft=t=>{let e=m.current,n=e,r=t>0?-X:X,o=0,f=(a,l,v)=>Math.max(l,Math.min(a,v));if(c){o=Math.abs(t/r);let a=t*o+.5*r*o*o;n=Math.round(e+a)}else if(e<0||e>s.length-1){let a=f(e,0,s.length-1),l=e-a;r=ct,o=Math.sqrt(Math.abs(l/r)),t=r*o,t=e>0?-t:t,n=a}else{o=Math.abs(t/r);let a=t*o+.5*r*o*o;n=Math.round(e+a),n=f(n,0,s.length-1);let l=n-e;o=Math.sqrt(Math.abs(l/r))}ut(e,n,o,()=>{x(m.current)}),x(m.current)},K=()=>{var t,e,n,r;try{(t=H.current)==null||t.abort(),H.current=null;let o=R.current,f=o.yList,a=0;if(f.length>1){let l=f.length,[v,U]=(e=f[l-2])!=null?e:[0,0],[gt,pt]=(n=f[l-1])!=null?n:[0,0],tt=pt-U;if(tt>0){let et=(v-gt)/d*1e3/tt,mt=yt,bt=et>0?1:-1;a=Math.min(Math.abs(et),mt)*bt}}m.current=(r=o.touchScroll)!=null?r:m.current,ft(a)}catch(o){console.error("Error in finalizeDragAndStartInertiaScroll:",o)}finally{S.current=!1}},P=$(t=>{if(!s.length)return;let e=S.current,n=p.current.contains(t.target)||t.target===p.current;(e||n)&&t.cancelable&&(t.preventDefault(),K())},[K]),J=t=>{t.preventDefault();let e=Date.now();if(e-G.current<wt)return;let n=Math.sign(t.deltaY);n!==0&&(x(m.current+n),G.current=e)},Q=$(t=>{if(!s.length||!p.current)return;let e=S.current,n=p.current.contains(t.target)||t.target===p.current;(e||n)&&t.cancelable&&(t.preventDefault(),J(t))},[J]);return ot(()=>{let t=p.current;if(!t)return;let e=new AbortController,{signal:n}=e,r={signal:n,passive:!1};return t.addEventListener("touchstart",F,r),t.addEventListener("touchend",P,r),t.addEventListener("wheel",Q,r),document.addEventListener("mousedown",F,r),document.addEventListener("mouseup",P,r),()=>e.abort()},[P,F,Q]),ot(()=>{ht(L)},[L,g]),T.createElement("div",{ref:p,"data-rwp":!0,style:{height:at}},T.createElement("ul",{ref:W,"data-rwp-options":!0},it),T.createElement("div",{className:i==null?void 0:i.highlightWrapper,"data-rwp-highlight-wrapper":!0,style:{height:d,lineHeight:d+"px"}},T.createElement("ul",{ref:A,"data-rwp-highlight-list":!0,style:{top:c?-d:void 0}},lt)))};export{At as WheelPicker,Yt as WheelPickerWrapper};
1
+ "use client";import M from"react";import{useCallback as $,useEffect as at,useMemo as B,useRef as w}from"react";import E from"react";function ot(l){let d=E.useRef(l);return E.useEffect(()=>{d.current=l}),E.useMemo(()=>(...m)=>{var h;return(h=d.current)==null?void 0:h.call(d,...m)},[])}function wt({defaultProp:l,onChange:d}){let m=E.useState(l),[h]=m,i=E.useRef(h),b=ot(d);return E.useEffect(()=>{i.current!==h&&(b(h),i.current=h)},[h,i,b]),m}function st({prop:l,defaultProp:d,onChange:m=()=>{}}){let[h,i]=wt({defaultProp:d,onChange:m}),b=l!==void 0,C=b?l:h,u=ot(m),I=E.useCallback(T=>{if(b){let f=typeof T=="function"?T(l):T;f!==l&&u(f)}else i(T)},[b,l,i,u]);return[C,I]}var ct=.3,yt=30,Et=l=>Math.pow(l-1,3)+1,X=(l,d,m)=>Math.max(d,Math.min(l,m)),Yt=({className:l,children:d})=>M.createElement("div",{className:l,"data-rwp-wrapper":!0},d),At=({defaultValue:l,value:d,onValueChange:m,options:h,infinite:i=!1,visibleCount:b=20,dragSensitivity:C=3,classNames:u})=>{var tt,et;let[I=(et=(tt=h[0])==null?void 0:tt.value)!=null?et:"",T]=st({defaultProp:l,prop:d,onChange:m}),s=B(()=>{if(!i)return h;let t=[],e=Math.ceil(b/2);if(h.length===0)return t;for(;t.length<e;)t.push(...h);return t},[b,h,i]),f=30,j=f*.5,D=360/b,L=f/Math.tan(D*Math.PI/180),it=Math.round(L*2+f*.25),Y=b>>2,A=C*10,lt=10,g=w(null),W=w(null),R=w(null),p=w(0),G=w(0),S=w(!1),Z=w(0),H=w({startY:0,yList:[]}),O=w(null),ut=B(()=>{let t=(n,r,o)=>M.createElement("li",{key:r,className:u==null?void 0:u.optionItem,"data-rwp-option":!0,"data-index":r,style:{top:-j,height:f,lineHeight:`${f}px`,transform:`rotateX(${o}deg) translateZ(${L}px)`,visibility:"hidden"}},n.label),e=s.map((n,r)=>t(n,r,-D*r));if(i)for(let n=0;n<Y;++n){let r=-n-1,o=n+s.length;e.unshift(t(s[s.length-n-1],r,D*(n+1))),e.push(t(s[n],o,-D*o))}return e},[j,i,D,s,Y,L,u==null?void 0:u.optionItem]),ht=B(()=>{let t=(n,r)=>M.createElement("li",{key:r,"data-slot":"highlight-item",className:u==null?void 0:u.highlightItem,style:{height:f}},n.label),e=s.map((n,r)=>t(n,r));if(i){let n=s[0],r=s[s.length-1];e.unshift(t(r,"infinite-start")),e.push(t(n,"infinite-end"))}return e},[u==null?void 0:u.highlightItem,i,s]),z=t=>(t%s.length+s.length)%s.length,k=t=>{let e=i?z(t):t;if(W.current){let n=`translateZ(${-L}px) rotateX(${D*e}deg)`;W.current.style.transform=n,W.current.childNodes.forEach(r=>{let o=r,c=Math.abs(Number(o.dataset.index)-e);o.style.visibility=c>Y?"hidden":"visible"})}return R.current&&(R.current.style.transform=`translateY(${-e*f}px)`),e},x=()=>{cancelAnimationFrame(G.current)},K=(t,e,n,r)=>{if(t===e||n===0){k(t);return}let o=performance.now(),c=e-t,a=v=>{let y=(v-o)/1e3;if(y<n){let P=Et(y/n);p.current=k(t+P*c),G.current=requestAnimationFrame(a)}else x(),p.current=k(e),r==null||r()};requestAnimationFrame(a)},F=t=>{let e=z(t)|0,n=i?e:Math.min(Math.max(e,0),s.length-1);if(!i&&n!==t)return;p.current=k(n);let r=s[p.current];T(r.value)},dt=t=>{let e=s.findIndex(n=>n.value===t);if(e===-1){console.error("Invalid value selected:",t);return}x(),F(e)},ft=t=>{var e,n;try{let r=(t instanceof MouseEvent?t.clientY:(n=(e=t.touches)==null?void 0:e[0])==null?void 0:n.clientY)||0,o=H.current;o.yList.push([r,Date.now()]),o.yList.length>5&&o.yList.shift();let c=(o.startY-r)/f,a=p.current+c;if(i)a=z(a);else{let v=s.length;a<0?a*=ct:a>v&&(a=v+(a-v)*ct)}o.touchScroll=k(a)}catch(r){console.error("Error in updateScrollDuringDrag:",r)}},_=t=>{!S.current&&!g.current.contains(t.target)&&t.target!==g.current||(t.cancelable&&t.preventDefault(),s.length&&ft(t))},J=t=>{var e,n,r;try{S.current=!0;let o=new AbortController,{signal:c}=o;O.current=o;let a={signal:c,passive:!1};(e=g.current)==null||e.addEventListener("touchmove",_,a),document.addEventListener("mousemove",_,a);let v=(t instanceof MouseEvent?t.clientY:(r=(n=t.touches)==null?void 0:n[0])==null?void 0:r.clientY)||0,y=H.current;y.startY=v,y.yList=[[v,Date.now()]],y.touchScroll=p.current,x()}catch(o){console.error("Error in initiateDragGesture:",o)}},U=$(t=>{let e=S.current,n=g.current.contains(t.target)||t.target===g.current;(e||n)&&t.cancelable&&(t.preventDefault(),s.length&&J(t))},[J]),gt=t=>{let e=p.current,n=e,r=t>0?-A:A,o=0;if(i){o=Math.abs(t/r);let c=t*o+.5*r*o*o;n=Math.round(e+c)}else if(e<0||e>s.length-1){let c=X(e,0,s.length-1),a=e-c;r=lt,o=Math.sqrt(Math.abs(a/r)),t=r*o,t=e>0?-t:t,n=c}else{o=Math.abs(t/r);let c=t*o+.5*r*o*o;n=Math.round(e+c),n=X(n,0,s.length-1);let a=n-e;o=Math.sqrt(Math.abs(a/r))}K(e,n,o,()=>{F(p.current)})},Q=()=>{var t,e,n,r;try{(t=O.current)==null||t.abort(),O.current=null;let o=H.current,c=o.yList,a=0;if(c.length>1){let v=c.length,[y,P]=(e=c[v-2])!=null?e:[0,0],[pt,mt]=(n=c[v-1])!=null?n:[0,0],nt=mt-P;if(nt>0){let rt=(y-pt)/f*1e3/nt,bt=yt,vt=rt>0?1:-1;a=Math.min(Math.abs(rt),bt)*vt}}p.current=(r=o.touchScroll)!=null?r:p.current,gt(a)}catch(o){console.error("Error in finalizeDragAndStartInertiaScroll:",o)}finally{S.current=!1}},q=$(t=>{if(!s.length)return;let e=S.current,n=g.current.contains(t.target)||t.target===g.current;(e||n)&&t.cancelable&&(t.preventDefault(),Q())},[Q]),V=t=>{t.preventDefault();let e=Date.now();if(e-Z.current<100)return;let n=Math.sign(t.deltaY);if(!n)return;Z.current=e;let r=p.current,o=r+n;i?o=Math.round(o):o=X(Math.round(o),0,s.length-1);let c=Math.abs(o-r);if(c===0)return;let a=Math.sqrt(c/A);x(),K(r,o,a,()=>{F(p.current)})},N=$(t=>{if(!s.length||!g.current)return;let e=S.current,n=g.current.contains(t.target)||t.target===g.current;(e||n)&&t.cancelable&&(t.preventDefault(),V(t))},[V]);return at(()=>{let t=g.current;if(!t)return;let e=new AbortController,{signal:n}=e,r={signal:n,passive:!1};return t.addEventListener("touchstart",U,r),t.addEventListener("touchend",q,r),t.addEventListener("wheel",N,r),document.addEventListener("mousedown",U,r),document.addEventListener("mouseup",q,r),()=>e.abort()},[q,U,N]),at(()=>{dt(I)},[I,d]),M.createElement("div",{ref:g,"data-rwp":!0,style:{height:it}},M.createElement("ul",{ref:W,"data-rwp-options":!0},ut),M.createElement("div",{className:u==null?void 0:u.highlightWrapper,"data-rwp-highlight-wrapper":!0,style:{height:f,lineHeight:f+"px"}},M.createElement("ul",{ref:R,"data-rwp-highlight-list":!0,style:{top:i?-f:void 0}},ht)))};export{At as WheelPicker,Yt as WheelPickerWrapper};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ncdai/react-wheel-picker",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "iOS-like wheel picker for React with smooth inertia scrolling and infinite loop support.",
5
5
  "publishConfig": {
6
6
  "access": "public"