@ncdai/react-wheel-picker 1.0.19 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,9 +6,10 @@ iOS-like wheel picker for React with smooth inertia scrolling and infinite loop
6
6
  - 🖱️ Mouse drag and scroll support for desktop
7
7
  - 🔄 Infinite loop scrolling
8
8
  - 🎨 Unstyled components for complete style customization
9
+ - ⌨️ Full keyboard navigation and type-ahead search
9
10
  - ⚡️ Easy installation via shadcn CLI
10
11
 
11
- Check out the live demo: https://react-wheel-picker.chanhdai.com
12
+ Check out the live demo: https://react-wheel-picker.chanhdai.com
12
13
 
13
14
  ## Documentation
14
15
 
@@ -22,6 +23,89 @@ Licensed under the [MIT license](./LICENSE).
22
23
 
23
24
  This project is proudly supported by:
24
25
 
25
- [![Vercel OSS Program](https://assets.chanhdai.com/images/vercel-oss-program-2025.svg?t=1762229330)](https://vercel.com/blog/summer-2025-oss-program#react-wheel-picker)
26
+ <table>
27
+ <tbody>
28
+ <tr>
29
+ <td>
30
+ <a href="https://vercel.com/blog/summer-2025-oss-program?utm_source=react-wheel-picker">
31
+ <img
32
+ src="https://assets.chanhdai.com/images/sponsors/vercel-oss-program-2025.svg?v=2"
33
+ alt="Vercel OSS Program"
34
+ />
35
+ </a>
36
+ </td>
37
+ <td></td>
38
+ </tr>
39
+ <tr>
40
+ <td>
41
+ <a href="https://shadcnstudio.com?utm_source=chanhdai.com&utm_medium=banner&utm_campaign=github">
42
+ <img src="https://assets.chanhdai.com/images/sponsors/shadcnstudio.svg?v=3" alt="shadcnstudio.com" />
43
+ </a>
44
+ </td>
45
+ <td>
46
+ <a href="https://shadcnspace.com">
47
+ <img
48
+ src="https://assets.chanhdai.com/images/sponsors/shadcnspace.svg?v=3"
49
+ alt="Shadcn Space"
50
+ />
51
+ </a>
52
+ </td>
53
+ </tr>
54
+ <tr>
55
+ <td>
56
+ <a href="https://shadcraft.com?utm_source=react-wheel-picker">
57
+ <img
58
+ src="https://assets.chanhdai.com/images/sponsors/shadcraft.svg?v=3"
59
+ alt="Shadcraft"
60
+ />
61
+ </a>
62
+ </td>
63
+ <td>
64
+ <a href="https://uirules.com?utm_source=react-wheel-picker">
65
+ <img
66
+ src="https://assets.chanhdai.com/images/sponsors/uirules.svg?v=1"
67
+ alt="UI Rules"
68
+ />
69
+ </a>
70
+ </td>
71
+ </tr>
72
+ <tr>
73
+ <td>
74
+ <a href="https://reactbits.dev?utm_source=react-wheel-picker">
75
+ <img
76
+ src="https://assets.chanhdai.com/images/sponsors/reactbits.svg?v=1"
77
+ alt="React Bits"
78
+ />
79
+ </a>
80
+ </td>
81
+ <td>
82
+ <a href="https://www.mintlify.com?utm_source=react-wheel-picker">
83
+ <img
84
+ src="https://assets.chanhdai.com/images/sponsors/mintlify.svg?v=1"
85
+ alt="Mintlify"
86
+ />
87
+ </a>
88
+ </td>
89
+ </tr>
90
+ <tr>
91
+ <td>
92
+ <a href="https://openpanel.dev?utm_source=react-wheel-picker">
93
+ <img
94
+ src="https://assets.chanhdai.com/images/sponsors/openpanel.svg?v=1"
95
+ alt="OpenPanel"
96
+ />
97
+ </a>
98
+ </td>
99
+ <td>
100
+ <a href="https://termius.com?utm_source=react-wheel-picker">
101
+ <img
102
+ src="https://assets.chanhdai.com/images/sponsors/termius.svg?v=3"
103
+ alt="Termius"
104
+ />
105
+ </a>
106
+ </td>
107
+ </tr>
108
+ </tbody>
109
+ </table>
26
110
 
27
111
  > Using this package at work? [Sponsor me](https://github.com/sponsors/ncdai) to help with support and maintenance.
package/dist/index.css CHANGED
@@ -1 +1 @@
1
- [data-rwp-wrapper] ul{margin:0;padding:0;list-style:none}[data-rwp-wrapper] li{margin:0;padding:0}[data-rwp-wrapper]{position:relative;overflow:hidden;display:flex;width:100%;align-items:stretch;justify-content:space-between;perspective:2000px;-webkit-user-select:none;-moz-user-select:none;user-select:none}[data-rwp]{position:relative;overflow:hidden;flex:1;cursor:default;-webkit-mask-image:linear-gradient(to bottom,transparent 0%,black 20%,black 80%,transparent 100%);mask-image:linear-gradient(to bottom,transparent 0%,black 20%,black 80%,transparent 100%)}[data-rwp-highlight-wrapper]{position:absolute;overflow:hidden;top:50%;width:100%;transform:translateY(-50%);font-size:1rem;font-weight:500}[data-rwp-highlight-list]{position:absolute;width:100%}[data-rwp-options]{position:absolute;top:50%;left:0;display:block;width:100%;height:0;margin:0 auto;-webkit-font-smoothing:subpixel-antialiased;will-change:transform;backface-visibility:hidden;transform-style:preserve-3d}[data-rwp-option]{position:absolute;top:0;left:0;width:100%;-webkit-font-smoothing:subpixel-antialiased;will-change:visibility;font-size:.875rem}[data-rwp-option],[data-rwp-highlight-item]{display:flex;align-items:center;justify-content:center}
1
+ [data-rwp-wrapper] ul{margin:0;padding:0;list-style:none}[data-rwp-wrapper] li{margin:0;padding:0}[data-rwp-wrapper]{position:relative;overflow:hidden;display:flex;width:100%;align-items:stretch;justify-content:space-between;perspective:2000px;-webkit-user-select:none;-moz-user-select:none;user-select:none}[data-rwp]{position:relative;overflow:hidden;flex:1;cursor:default;-webkit-mask-image:linear-gradient(to bottom,transparent 0%,black 20%,black 80%,transparent 100%);mask-image:linear-gradient(to bottom,transparent 0%,black 20%,black 80%,transparent 100%)}[data-rwp]:focus-visible{outline:none}[data-rwp-highlight-wrapper]{position:absolute;overflow:hidden;top:50%;width:100%;transform:translateY(-50%);font-size:1rem;font-weight:500}[data-rwp-highlight-list]{position:absolute;width:100%}[data-rwp-options]{position:absolute;top:50%;left:0;display:block;width:100%;height:0;margin:0 auto;-webkit-font-smoothing:subpixel-antialiased;will-change:transform;backface-visibility:hidden;transform-style:preserve-3d}[data-rwp-option]{position:absolute;top:0;left:0;width:100%;-webkit-font-smoothing:subpixel-antialiased;will-change:visibility;font-size:.875rem}[data-rwp-option],[data-rwp-highlight-item]{display:flex;align-items:center;justify-content:center}[data-rwp-option][data-disabled],[data-rwp-highlight-item][data-disabled]{pointer-events:none}
package/dist/index.d.mts CHANGED
@@ -12,6 +12,10 @@ type WheelPickerOption<T extends WheelPickerValue = string> = {
12
12
  value: T;
13
13
  /** The content displayed for this option */
14
14
  label: ReactNode;
15
+ /** Optional text for type-ahead search (useful when label is a ReactNode). Defaults to label if string, otherwise value. */
16
+ textValue?: string;
17
+ /** Whether this option is disabled and cannot be selected */
18
+ disabled?: boolean;
15
19
  };
16
20
  /**
17
21
  * Custom class names for styling different parts of the wheel picker
package/dist/index.d.ts CHANGED
@@ -12,6 +12,10 @@ type WheelPickerOption<T extends WheelPickerValue = string> = {
12
12
  value: T;
13
13
  /** The content displayed for this option */
14
14
  label: ReactNode;
15
+ /** Optional text for type-ahead search (useful when label is a ReactNode). Defaults to label if string, otherwise value. */
16
+ textValue?: string;
17
+ /** Whether this option is disabled and cannot be selected */
18
+ disabled?: boolean;
15
19
  };
16
20
  /**
17
21
  * Custom class names for styling different parts of the wheel picker
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";"use client";var kt=Object.create;var P=Object.defineProperty;var Mt=Object.getOwnPropertyDescriptor;var St=Object.getOwnPropertyNames;var Dt=Object.getPrototypeOf,Lt=Object.prototype.hasOwnProperty;var It=(s,a)=>{for(var d in a)P(s,d,{get:a[d],enumerable:!0})},st=(s,a,d,f)=>{if(a&&typeof a=="object"||typeof a=="function")for(let c of St(a))!Lt.call(s,c)&&c!==d&&P(s,c,{get:()=>a[c],enumerable:!(f=Mt(a,c))||f.enumerable});return s};var at=(s,a,d)=>(d=s!=null?kt(Dt(s)):{},st(a||!s||!s.__esModule?P(d,"default",{value:s,enumerable:!0}):d,s)),Wt=s=>st(P({},"__esModule",{value:!0}),s);var Pt={};It(Pt,{WheelPicker:()=>Rt,WheelPickerWrapper:()=>At});module.exports=Wt(Pt);var k=at(require("react")),h=require("react");var E=at(require("react"));function it(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 Ct({defaultProp:s,onChange:a}){let d=E.default.useState(s),[f]=d,c=E.default.useRef(f),w=it(a);return E.default.useEffect(()=>{c.current!==f&&(w(f),c.current=f)},[f,c,w]),d}function ct({prop:s,defaultProp:a,onChange:d=()=>{}}){let[f,c]=Ct({defaultProp:a,onChange:d}),w=s!==void 0,H=w?s:f,W=it(d),O=E.default.useCallback(g=>{if(w){let C=typeof g=="function"?g(s):g;C!==s&&W(C)}else c(g)},[w,s,c,W]);return[H,O]}var lt=.3,xt=30,Yt=s=>Math.pow(s-1,3)+1,V=(s,a,d)=>Math.max(a,Math.min(s,d)),At=({className:s,children:a})=>k.default.createElement("div",{className:s,"data-rwp-wrapper":!0},a);function Rt({defaultValue:s,value:a,onValueChange:d,options:f,infinite:c=!1,visibleCount:w=20,dragSensitivity:H=3,scrollSensitivity:W=5,optionItemHeight:O=30,classNames:g}){var nt;let[z=(nt=f[0])==null?void 0:nt.value,C]=ct({defaultProp:s,prop:a,onChange:d}),i=(0,h.useMemo)(()=>{if(!c)return f;let t=[],e=Math.ceil(w/2);if(f.length===0)return t;for(;t.length<e;)t.push(...f);return t},[w,f,c]),p=O,X=p*.5,y=360/w,x=p/Math.tan(y*Math.PI/180),ut=Math.round(x*2+p*.25),M=w>>2,G=H*10,ht=10,b=(0,h.useRef)(null),Y=(0,h.useRef)(null),U=(0,h.useRef)(null),v=(0,h.useRef)(0),Z=(0,h.useRef)(0),S=(0,h.useRef)(!1),K=(0,h.useRef)(0),$=(0,h.useRef)({startY:0,yList:[],touchScroll:0,isClick:!0}),q=(0,h.useRef)(null),dt=(0,h.useMemo)(()=>{let t=(n,r,o)=>k.default.createElement("li",{key:r,className:g==null?void 0:g.optionItem,"data-slot":"option-item","data-rwp-option":!0,"data-index":r,style:{top:-X,height:p,lineHeight:`${p}px`,transform:`rotateX(${o}deg) translateZ(${x}px)`,visibility:"hidden"}},n.label),e=i.map((n,r)=>t(n,r,-y*r));if(c)for(let n=0;n<M;++n){let r=-n-1,o=n+i.length;e.unshift(t(i[i.length-n-1],r,y*(n+1))),e.push(t(i[n],o,-y*o))}return e},[p,X,c,y,i,M,x,g==null?void 0:g.optionItem]),gt=(0,h.useMemo)(()=>{let t=(n,r)=>k.default.createElement("li",{key:r,className:g==null?void 0:g.highlightItem,"data-slot":"highlight-item","data-rwp-highlight-item":!0,style:{height:p}},n.label),e=i.map((n,r)=>t(n,r));if(c){let n=i[0],r=i[i.length-1];e.unshift(t(r,"infinite-start")),e.push(t(n,"infinite-end"))}return e},[g==null?void 0:g.highlightItem,p,c,i]),ft=(0,h.useMemo)(()=>{let t=0,e=Math.PI/180,n=[];for(let r=M-1;r>=-M+1;--r){let o=r*y,u=p*Math.cos(o*e),l=t;t+=u,n.push([l,t])}return n},[y,p,M]),B=t=>(t%i.length+i.length)%i.length,D=t=>{let e=c?B(t):t;if(Y.current){let n=`translateZ(${-x}px) rotateX(${y*e}deg)`;Y.current.style.transform=n,Y.current.childNodes.forEach(r=>{let o=r,u=Math.abs(Number(o.dataset.index)-e);o.style.visibility=u>M?"hidden":"visible"})}return U.current&&(U.current.style.transform=`translateY(${-e*p}px)`),e},A=()=>{cancelAnimationFrame(Z.current)},_=(t,e,n,r)=>{if(t===e||n===0){D(t);return}let o=performance.now(),u=e-t,l=m=>{let T=(m-o)/1e3;if(T<n){let j=Yt(T/n);v.current=D(t+j*u),Z.current=requestAnimationFrame(l)}else A(),v.current=D(e),r==null||r()};requestAnimationFrame(l)},R=t=>{let e=B(t)|0,n=c?e:Math.min(Math.max(e,0),i.length-1);if(!c&&n!==t)return;v.current=D(n);let r=i[v.current];C(r.value)},pt=t=>{let e=i.findIndex(n=>n.value===t);if(e===-1){console.error("Invalid value selected:",t);return}A(),R(e)},J=t=>{let e=v.current,n=e+t;c?n=Math.round(n):n=V(Math.round(n),0,i.length-1);let r=Math.abs(n-e);if(r===0)return;let o=Math.sqrt(r/W);A(),_(e,n,o,()=>{R(v.current)})},mt=t=>{let e=b.current;if(!e){console.error("Container reference is not set.");return}let{top:n}=e.getBoundingClientRect(),r=t-n,o=ft.findIndex(([l,m])=>r>=l&&r<=m);if(o===-1){console.error("No item found for click position:",r);return}let u=(M-o-1)*-1;J(u)},bt=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=$.current;o.isClick&&Math.abs(r-o.startY)>5&&(o.isClick=!1),o.yList.push([r,Date.now()]),o.yList.length>5&&o.yList.shift();let u=(o.startY-r)/p,l=v.current+u;if(c)l=B(l);else{let m=i.length;l<0?l*=lt:l>m&&(l=m+(l-m)*lt)}o.touchScroll=D(l)}catch(r){console.error("Error in updateScrollDuringDrag:",r)}},Q=t=>{var e;!S.current&&!((e=b.current)!=null&&e.contains(t.target))&&t.target!==b.current||(t.cancelable&&t.preventDefault(),i.length&&bt(t))},N=t=>{var e,n,r;try{S.current=!0;let o=new AbortController,{signal:u}=o;q.current=o;let l={signal:u,passive:!1};(e=b.current)==null||e.addEventListener("touchmove",Q,l),document.addEventListener("mousemove",Q,l);let m=(t instanceof MouseEvent?t.clientY:(r=(n=t.touches)==null?void 0:n[0])==null?void 0:r.clientY)||0,T=$.current;T.startY=m,T.yList=[[m,Date.now()]],T.touchScroll=v.current,T.isClick=!0,A()}catch(o){console.error("Error in initiateDragGesture:",o)}},L=(0,h.useCallback)(t=>{var r;let e=S.current,n=!!((r=b.current)!=null&&r.contains(t.target))||t.target===b.current;(e||n)&&t.cancelable&&(t.preventDefault(),i.length&&N(t))},[N]),vt=t=>{let e=v.current,n=e,r=t>0?-G:G,o=0;if(c){o=Math.abs(t/r);let u=t*o+.5*r*o*o;n=Math.round(e+u)}else if(e<0||e>i.length-1){let u=V(e,0,i.length-1),l=e-u;r=ht,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=V(n,0,i.length-1);let l=n-e;o=Math.sqrt(Math.abs(l/r))}_(e,n,o,()=>{R(v.current)}),R(v.current)},tt=()=>{var t,e,n,r;try{(t=q.current)==null||t.abort(),q.current=null;let o=$.current;if(o.isClick){mt(o.startY);return}let u=o.yList,l=0;if(u.length>1){let m=u.length,[T,j]=(e=u[m-2])!=null?e:[0,0],[wt,Tt]=(n=u[m-1])!=null?n:[0,0],rt=Tt-j;if(rt>0){let ot=(T-wt)/p*1e3/rt,yt=xt,Et=ot>0?1:-1;l=Math.min(Math.abs(ot),yt)*Et}}v.current=(r=o.touchScroll)!=null?r:v.current,vt(l)}catch(o){console.error("Error in finalizeDragAndStartInertiaScroll:",o)}finally{S.current=!1}},I=(0,h.useCallback)(t=>{var r;if(!i.length)return;let e=S.current,n=!!((r=b.current)!=null&&r.contains(t.target))||t.target===b.current;(e||n)&&t.cancelable&&(t.preventDefault(),tt())},[tt]),et=t=>{t.preventDefault();let e=Date.now();if(e-K.current<100)return;let n=Math.sign(t.deltaY);n&&(K.current=e,J(n))},F=(0,h.useCallback)(t=>{if(!i.length||!b.current)return;let e=S.current,n=b.current.contains(t.target)||t.target===b.current;(e||n)&&t.cancelable&&(t.preventDefault(),et(t))},[et]);return(0,h.useEffect)(()=>{let t=b.current;if(!t)return;let e={passive:!1};return t.addEventListener("touchstart",L,e),t.addEventListener("touchend",I,e),t.addEventListener("wheel",F,e),document.addEventListener("mousedown",L,e),document.addEventListener("mouseup",I,e),()=>{t.removeEventListener("touchstart",L),t.removeEventListener("touchend",I),t.removeEventListener("wheel",F),document.removeEventListener("mousedown",L),document.removeEventListener("mouseup",I)}},[I,L,F]),(0,h.useEffect)(()=>{pt(z)},[z,a,i]),k.default.createElement("div",{ref:b,"data-rwp":!0,style:{height:ut}},k.default.createElement("ul",{ref:Y,"data-rwp-options":!0},dt),k.default.createElement("div",{className:g==null?void 0:g.highlightWrapper,"data-rwp-highlight-wrapper":!0,"data-slot":"highlight-wrapper",style:{height:p,lineHeight:`${p}px`}},k.default.createElement("ul",{ref:U,"data-rwp-highlight-list":!0,style:{top:c?-p:void 0}},gt)))}0&&(module.exports={WheelPicker,WheelPickerWrapper});
1
+ "use strict";"use client";var je=Object.create;var N=Object.defineProperty;var Xe=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var Ze=Object.getPrototypeOf,Je=Object.prototype.hasOwnProperty;var Qe=(o,l)=>{for(var d in l)N(o,d,{get:l[d],enumerable:!0})},ye=(o,l,d,p)=>{if(l&&typeof l=="object"||typeof l=="function")for(let c of _e(l))!Je.call(o,c)&&c!==d&&N(o,c,{get:()=>l[c],enumerable:!(p=Xe(l,c))||p.enumerable});return o};var oe=(o,l,d)=>(d=o!=null?je(Ze(o)):{},ye(l||!o||!o.__esModule?N(d,"default",{value:o,enumerable:!0}):d,o)),Ne=o=>ye(N({},"__esModule",{value:!0}),o);var ct={};Qe(ct,{WheelPicker:()=>at,WheelPickerWrapper:()=>ot});module.exports=Ne(ct);var L=oe(require("react")),f=require("react");var k=oe(require("react")),we=(0,k.createContext)(null);function Ie(){return(0,k.useContext)(we)}function Ee({children:o}){let[l,d]=(0,k.useState)(-1),p=(0,k.useRef)(0),c=(0,k.useRef)(new Map),m=(0,k.useCallback)((h,D)=>{let w=h!==null?h:p.current++;return c.current.set(w,D),d(O=>O===-1?w:O),w},[]),M=(0,k.useCallback)(h=>{var D;return(D=c.current.get(h))!=null?D:null},[]),S=(0,k.useCallback)(()=>Array.from(c.current.keys()).sort((h,D)=>h-D),[]),y=(0,k.useMemo)(()=>({activeIndex:l,setActiveIndex:d,register:m,getPickerRef:M,getPickerIndices:S}),[l,d,m,M,S]);return k.default.createElement(we.Provider,{value:y},o)}var R=oe(require("react"));function Me(o){let l=R.default.useRef(o);return R.default.useEffect(()=>{l.current=o}),R.default.useMemo(()=>(...d)=>{var p;return(p=l.current)==null?void 0:p.call(l,...d)},[])}function et({defaultProp:o,onChange:l}){let d=R.default.useState(o),[p]=d,c=R.default.useRef(p),m=Me(l);return R.default.useEffect(()=>{c.current!==p&&(m(p),c.current=p)},[p,c,m]),d}function Se({prop:o,defaultProp:l,onChange:d=()=>{}}){let[p,c]=et({defaultProp:l,onChange:d}),m=o!==void 0,M=m?o:p,S=Me(d),y=R.default.useCallback(h=>{if(m){let w=typeof h=="function"?h(o):h;w!==o&&S(w)}else c(h)},[m,o,c,S]);return[M,y]}var z=require("react"),tt=500;function De(o,{getTextValue:l,getCurrentIndex:d,onMatch:p}){let c=(0,z.useRef)(""),m=(0,z.useRef)(null),M=(0,z.useCallback)(()=>{c.current="",m.current&&(clearTimeout(m.current),m.current=null)},[]);return{handleTypeaheadSearch:(0,z.useCallback)(y=>{m.current&&clearTimeout(m.current),c.current+=y.toLowerCase();let h=c.current,w=h.length>1&&Array.from(h).every(C=>C===h[0])?h[0]:h,O=d(),a=w.length===1,v=-1;if(a)for(let C=1;C<=o.length;C++){let W=(O+C)%o.length;if(l(o[W]).toLowerCase().startsWith(w)){v=W;break}}else v=o.findIndex(C=>l(C).toLowerCase().startsWith(w));v!==-1&&p(v),m.current=setTimeout(()=>{c.current="",m.current=null},tt)},[o,l,d,p]),resetTypeahead:M}}var We=.3,nt=30,rt=o=>Math.pow(o-1,3)+1,ae=(o,l,d)=>Math.max(l,Math.min(o,d)),st=o=>{var l;return(l=o.textValue)!=null?l:typeof o.label=="string"?o.label:String(o.value)},q=(o,l,d,p)=>{if(d.length===0||!d.some(S=>!S.disabled))return o;let m=S=>{var w;let y=o,h=0,D=d.length;for(;h<D;){if(y=y+S,p)y=(y%d.length+d.length)%d.length;else if(y<0||y>=d.length)return-1;if(!((w=d[y])!=null&&w.disabled))return y;h++}return-1},M=m(l);return M===-1&&(M=m(l*-1)),M===-1?o:M},ot=({className:o,children:l})=>L.default.createElement(Ee,null,L.default.createElement("div",{className:o,"data-rwp-wrapper":!0},l));function at({defaultValue:o,value:l,onValueChange:d,options:p,infinite:c=!1,visibleCount:m=20,dragSensitivity:M=3,scrollSensitivity:S=5,optionItemHeight:y=30,classNames:h}){var Te;let D=(0,f.useMemo)(()=>{var t,n;let e=p.find(r=>!r.disabled);return(n=e==null?void 0:e.value)!=null?n:(t=p[0])==null?void 0:t.value},[p]),[w=D,O]=Se({defaultProp:o,prop:l,onChange:d}),a=(0,f.useMemo)(()=>{if(!c)return p;let e=[],t=Math.ceil(m/2);if(p.length===0)return e;for(;e.length<t;)e.push(...p);return e},[m,p,c]),v=y,C=v*.5,W=360/m,U=v/Math.tan(W*Math.PI/180),Ce=Math.round(U*2+v*.25),P=m>>2,ce=M*10,Le=10,E=(0,f.useRef)(null),j=(0,f.useRef)(null),ee=(0,f.useRef)(null),T=(0,f.useRef)(0),le=(0,f.useRef)(0),Y=(0,f.useRef)(!1),ie=(0,f.useRef)(0),[Re,ue]=(0,f.useState)(!1),G=(0,f.useRef)(-1),I=Ie(),Pe=(0,f.useCallback)(e=>{if(E.current=e,e&&I){let t=G.current===-1?null:G.current;G.current=I.register(t,e)}},[I]),te=(0,f.useRef)({startY:0,yList:[],touchScroll:0,isClick:!0}),ne=(0,f.useRef)(null),Ae=(0,f.useMemo)(()=>{let e=(n,r,s)=>L.default.createElement("li",{key:r,className:h==null?void 0:h.optionItem,"data-slot":"option-item","data-rwp-option":!0,"data-index":r,"data-disabled":n.disabled||void 0,style:{top:-C,height:v,lineHeight:`${v}px`,transform:`rotateX(${s}deg) translateZ(${U}px)`,visibility:"hidden"}},n.label),t=a.map((n,r)=>e(n,r,-W*r));if(c)for(let n=0;n<P;++n){let r=-n-1,s=n+a.length;t.unshift(e(a[a.length-n-1],r,W*(n+1))),t.push(e(a[n],s,-W*s))}return t},[v,C,c,W,a,P,U,h==null?void 0:h.optionItem]),He=(0,f.useMemo)(()=>{let e=(n,r)=>L.default.createElement("li",{key:r,className:h==null?void 0:h.highlightItem,"data-slot":"highlight-item","data-rwp-highlight-item":!0,"data-disabled":n.disabled||void 0,style:{height:v}},n.label),t=a.map((n,r)=>e(n,r));if(c){let n=a[0],r=a[a.length-1];t.unshift(e(r,"infinite-start")),t.push(e(n,"infinite-end"))}return t},[h==null?void 0:h.highlightItem,v,c,a]),Oe=(0,f.useMemo)(()=>{let e=0,t=Math.PI/180,n=[];for(let r=P-1;r>=-P+1;--r){let s=r*W,g=v*Math.cos(s*t),i=e;e+=g,n.push([i,e])}return n},[W,v,P]),X=e=>(e%a.length+a.length)%a.length,V=e=>{let t=c?X(e):e;if(j.current){let n=`translateZ(${-U}px) rotateX(${W*t}deg)`;j.current.style.transform=n,j.current.childNodes.forEach(r=>{let s=r,g=Math.abs(Number(s.dataset.index)-t);s.style.visibility=g>P?"hidden":"visible"})}return ee.current&&(ee.current.style.transform=`translateY(${-t*v}px)`),t},_=()=>{cancelAnimationFrame(le.current)},de=(e,t,n,r)=>{if(e===t||n===0){V(e);return}let s=performance.now(),g=t-e,i=u=>{let b=(u-s)/1e3;if(b<n){let x=rt(b/n);T.current=V(e+x*g),le.current=requestAnimationFrame(i)}else _(),T.current=V(t),r==null||r()};requestAnimationFrame(i)},Z=(0,f.useRef)(1),J=(e,t)=>{var g;let n=X(e)|0,r=c?n:Math.min(Math.max(n,0),a.length-1);if(!c&&r!==e)return;if((g=a[r])!=null&&g.disabled){let i=t!=null?t:Z.current,b=q(r,i,a,c)-T.current;if(b!==0){A(b);return}}T.current=V(r);let s=a[T.current];s&&!s.disabled&&O(s.value)},Ye=e=>{var n;let t=a.findIndex(r=>r.value===e);if(t===-1){console.error("Invalid value selected:",e);return}(n=a[t])!=null&&n.disabled&&(t=q(t,1,a,c)),_(),J(t)},A=e=>{let t=T.current,n=t+e;c?n=Math.round(n):n=ae(Math.round(n),0,a.length-1);let r=Math.abs(n-t);if(r===0)return;let s=e>0?1:-1;Z.current=s;let g=Math.sqrt(r/S);_(),de(t,n,g,()=>{J(T.current,s)})},Ge=e=>{var b;let t=E.current;if(!t){console.error("Container reference is not set.");return}let{top:n}=t.getBoundingClientRect(),r=e-n,s=Oe.findIndex(([x,H])=>r>=x&&r<=H);if(s===-1){console.error("No item found for click position:",r);return}let g=(P-s-1)*-1,i=T.current+g,u=c?X(i):Math.max(0,Math.min(i,a.length-1));(b=a[u])!=null&&b.disabled||A(g)},ze=e=>{var t,n;try{let r=(e instanceof MouseEvent?e.clientY:(n=(t=e.touches)==null?void 0:t[0])==null?void 0:n.clientY)||0,s=te.current;s.isClick&&Math.abs(r-s.startY)>5&&(s.isClick=!1),s.yList.push([r,Date.now()]),s.yList.length>5&&s.yList.shift();let g=(s.startY-r)/v,i=T.current+g;if(c)i=X(i);else{let u=a.length;i<0?i*=We:i>u&&(i=u+(i-u)*We)}s.touchScroll=V(i)}catch(r){console.error("Error in updateScrollDuringDrag:",r)}},he=e=>{var t;!Y.current&&!((t=E.current)!=null&&t.contains(e.target))&&e.target!==E.current||(e.cancelable&&e.preventDefault(),a.length&&ze(e))},fe=e=>{var t,n,r;try{Y.current=!0;let s=new AbortController,{signal:g}=s;ne.current=s;let i={signal:g,passive:!1};(t=E.current)==null||t.addEventListener("touchmove",he,i),document.addEventListener("mousemove",he,i);let u=(e instanceof MouseEvent?e.clientY:(r=(n=e.touches)==null?void 0:n[0])==null?void 0:r.clientY)||0,b=te.current;b.startY=u,b.yList=[[u,Date.now()]],b.touchScroll=T.current,b.isClick=!0,_()}catch(s){console.error("Error in initiateDragGesture:",s)}},F=(0,f.useCallback)(e=>{var r;let t=Y.current,n=!!((r=E.current)!=null&&r.contains(e.target))||e.target===E.current;(t||n)&&e.cancelable&&(e.preventDefault(),a.length&&fe(e))},[fe]),Ue=e=>{let t=T.current,n=t,r=e>0?-ce:ce,s=0,g=e>0?1:-1;if(Z.current=g,c){s=Math.abs(e/r);let i=e*s+.5*r*s*s;n=Math.round(t+i)}else if(t<0||t>a.length-1){let i=ae(t,0,a.length-1),u=t-i;r=Le,s=Math.sqrt(Math.abs(u/r)),e=r*s,e=t>0?-e:e,n=i}else{s=Math.abs(e/r);let i=e*s+.5*r*s*s;n=Math.round(t+i),n=ae(n,0,a.length-1);let u=n-t;s=Math.sqrt(Math.abs(u/r))}de(t,n,s,()=>{J(T.current,g)}),J(T.current,g)},ge=()=>{var e,t,n,r;try{(e=ne.current)==null||e.abort(),ne.current=null;let s=te.current;if(s.isClick){Ge(s.startY);return}let g=s.yList,i=0;if(g.length>1){let u=g.length,[b,x]=(t=g[u-2])!=null?t:[0,0],[H,Q]=(n=g[u-1])!=null?n:[0,0],$=Q-x;if($>0){let ke=(b-H)/v*1e3/$,$e=nt,qe=ke>0?1:-1;i=Math.min(Math.abs(ke),$e)*qe}}T.current=(r=s.touchScroll)!=null?r:T.current,Ue(i)}catch(s){console.error("Error in finalizeDragAndStartInertiaScroll:",s)}finally{Y.current=!1}},B=(0,f.useCallback)(e=>{var r;if(!a.length)return;let t=Y.current,n=!!((r=E.current)!=null&&r.contains(e.target))||e.target===E.current;(t||n)&&e.cancelable&&(e.preventDefault(),ge())},[ge]),pe=e=>{e.preventDefault();let t=Date.now();if(t-ie.current<100)return;let n=Math.sign(e.deltaY);n&&(ie.current=t,Z.current=n,A(n))},re=(0,f.useCallback)(e=>{if(!a.length||!E.current)return;let t=Y.current,n=E.current.contains(e.target)||e.target===E.current;(t||n)&&e.cancelable&&(e.preventDefault(),pe(e))},[pe]),se=(0,f.useCallback)(e=>{let t=G.current;if(!I||t===-1)return;let n=I.getPickerIndices(),r=n.indexOf(t);if(r===-1)return;let s;e==="prev"?s=r>0?r-1:n.length-1:s=r<n.length-1?r+1:0;let g=n[s],i=I.getPickerRef(g);if(i){let u=E.current;u&&(u.tabIndex=-1),i.tabIndex=0,I.setActiveIndex(g),i.focus()}},[I]),K=(0,f.useMemo)(()=>{let e=new Map,t=new Map,n=[];return a.forEach((r,s)=>{if(!r.disabled){let g=n.length;e.set(g,s),t.set(s,g),n.push(r)}}),{enabled:n,map:e,reverseMap:t}},[a]),{handleTypeaheadSearch:me,resetTypeahead:be}=De(K.enabled,{getTextValue:st,getCurrentIndex:(0,f.useCallback)(()=>{var t;let e=Math.round(T.current);return(t=K.reverseMap.get(e))!=null?t:0},[K]),onMatch:(0,f.useCallback)(e=>{let t=K.map.get(e);if(t!==void 0){let n=t-Math.round(T.current);A(n)}},[K])}),Ve=(0,f.useCallback)(e=>{if(!a.length)return;let t=u=>{var $;e.preventDefault();let b=Math.round(T.current),x=b+u;if(!c&&(u===-1&&x<0||u===1&&x>=a.length))return;let H=c?u===-1?(x%a.length+a.length)%a.length:x%a.length:x;if(($=a[H])!=null&&$.disabled){let xe=q(H,u,a,c);x=b+u+(xe-H)}let Q=x-b;Q!==0&&A(Q)},n=()=>{var x;if(c)return;e.preventDefault();let u=0;(x=a[0])!=null&&x.disabled&&(u=q(0,1,a,!1));let b=u-T.current;b!==0&&A(b)},r=()=>{var x;if(c)return;e.preventDefault();let u=a.length-1;(x=a[u])!=null&&x.disabled&&(u=q(u,-1,a,!1));let b=u-T.current;b!==0&&A(b)},s=()=>{e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),me(e.key))},i={ArrowUp:()=>t(-1),ArrowDown:()=>t(1),ArrowLeft:()=>{e.preventDefault(),se("prev")},ArrowRight:()=>{e.preventDefault(),se("next")},Home:n,End:r}[e.key];i?i():s()},[a.length,c,se,me]),Fe=(0,f.useCallback)(()=>{ue(!0);let e=G.current;I&&e!==-1&&I.setActiveIndex(e)},[I]),Be=(0,f.useCallback)(()=>{ue(!1),be()},[be]);(0,f.useEffect)(()=>{let e=E.current;if(!e)return;let t={passive:!1};return e.addEventListener("touchstart",F,t),e.addEventListener("touchend",B,t),e.addEventListener("wheel",re,t),document.addEventListener("mousedown",F,t),document.addEventListener("mouseup",B,t),()=>{e.removeEventListener("touchstart",F),e.removeEventListener("touchend",B),e.removeEventListener("wheel",re),document.removeEventListener("mousedown",F),document.removeEventListener("mouseup",B)}},[B,F,re]),(0,f.useEffect)(()=>{Ye(w)},[w,l,a]);let ve=G.current,Ke=(Te=I==null?void 0:I.activeIndex)!=null?Te:-1;return L.default.createElement("div",{ref:Pe,"data-rwp":!0,tabIndex:I&&ve!==-1?Ke===ve?0:-1:0,onKeyDown:Ve,onFocus:Fe,onBlur:Be,style:{height:Ce}},L.default.createElement("ul",{ref:j,"data-rwp-options":!0},Ae),L.default.createElement("div",{className:h==null?void 0:h.highlightWrapper,"data-rwp-highlight-wrapper":!0,"data-rwp-focused":Re||void 0,"data-slot":"highlight-wrapper",style:{height:v,lineHeight:`${v}px`}},L.default.createElement("ul",{ref:ee,"data-rwp-highlight-list":!0,style:{top:c?-v:void 0}},He)))}0&&(module.exports={WheelPicker,WheelPickerWrapper});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- "use client";import M from"react";import{useCallback as V,useEffect as ct,useMemo as P,useRef as T}from"react";import k from"react";function at(u){let g=k.useRef(u);return k.useEffect(()=>{g.current=u}),k.useMemo(()=>(...b)=>{var h;return(h=g.current)==null?void 0:h.call(g,...b)},[])}function kt({defaultProp:u,onChange:g}){let b=k.useState(u),[h]=b,c=k.useRef(h),v=at(g);return k.useEffect(()=>{c.current!==h&&(v(h),c.current=h)},[h,c,v]),b}function it({prop:u,defaultProp:g,onChange:b=()=>{}}){let[h,c]=kt({defaultProp:g,onChange:b}),v=u!==void 0,H=v?u:h,W=at(b),O=k.useCallback(l=>{if(v){let C=typeof l=="function"?l(u):l;C!==u&&W(C)}else c(l)},[v,u,c,W]);return[H,O]}var lt=.3,Mt=30,St=u=>Math.pow(u-1,3)+1,X=(u,g,b)=>Math.max(g,Math.min(u,b)),Ht=({className:u,children:g})=>M.createElement("div",{className:u,"data-rwp-wrapper":!0},g);function Ot({defaultValue:u,value:g,onValueChange:b,options:h,infinite:c=!1,visibleCount:v=20,dragSensitivity:H=3,scrollSensitivity:W=5,optionItemHeight:O=30,classNames:l}){var rt;let[z=(rt=h[0])==null?void 0:rt.value,C]=it({defaultProp:u,prop:g,onChange:b}),s=P(()=>{if(!c)return h;let t=[],e=Math.ceil(v/2);if(h.length===0)return t;for(;t.length<e;)t.push(...h);return t},[v,h,c]),d=O,G=d*.5,y=360/v,x=d/Math.tan(y*Math.PI/180),ut=Math.round(x*2+d*.25),E=v>>2,Z=H*10,ht=10,p=T(null),Y=T(null),U=T(null),m=T(0),K=T(0),S=T(!1),_=T(0),$=T({startY:0,yList:[],touchScroll:0,isClick:!0}),q=T(null),dt=P(()=>{let t=(n,r,o)=>M.createElement("li",{key:r,className:l==null?void 0:l.optionItem,"data-slot":"option-item","data-rwp-option":!0,"data-index":r,style:{top:-G,height:d,lineHeight:`${d}px`,transform:`rotateX(${o}deg) translateZ(${x}px)`,visibility:"hidden"}},n.label),e=s.map((n,r)=>t(n,r,-y*r));if(c)for(let n=0;n<E;++n){let r=-n-1,o=n+s.length;e.unshift(t(s[s.length-n-1],r,y*(n+1))),e.push(t(s[n],o,-y*o))}return e},[d,G,c,y,s,E,x,l==null?void 0:l.optionItem]),gt=P(()=>{let t=(n,r)=>M.createElement("li",{key:r,className:l==null?void 0:l.highlightItem,"data-slot":"highlight-item","data-rwp-highlight-item":!0,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},[l==null?void 0:l.highlightItem,d,c,s]),ft=P(()=>{let t=0,e=Math.PI/180,n=[];for(let r=E-1;r>=-E+1;--r){let o=r*y,i=d*Math.cos(o*e),a=t;t+=i,n.push([a,t])}return n},[y,d,E]),B=t=>(t%s.length+s.length)%s.length,D=t=>{let e=c?B(t):t;if(Y.current){let n=`translateZ(${-x}px) rotateX(${y*e}deg)`;Y.current.style.transform=n,Y.current.childNodes.forEach(r=>{let o=r,i=Math.abs(Number(o.dataset.index)-e);o.style.visibility=i>E?"hidden":"visible"})}return U.current&&(U.current.style.transform=`translateY(${-e*d}px)`),e},A=()=>{cancelAnimationFrame(K.current)},J=(t,e,n,r)=>{if(t===e||n===0){D(t);return}let o=performance.now(),i=e-t,a=f=>{let w=(f-o)/1e3;if(w<n){let j=St(w/n);m.current=D(t+j*i),K.current=requestAnimationFrame(a)}else A(),m.current=D(e),r==null||r()};requestAnimationFrame(a)},R=t=>{let e=B(t)|0,n=c?e:Math.min(Math.max(e,0),s.length-1);if(!c&&n!==t)return;m.current=D(n);let r=s[m.current];C(r.value)},pt=t=>{let e=s.findIndex(n=>n.value===t);if(e===-1){console.error("Invalid value selected:",t);return}A(),R(e)},Q=t=>{let e=m.current,n=e+t;c?n=Math.round(n):n=X(Math.round(n),0,s.length-1);let r=Math.abs(n-e);if(r===0)return;let o=Math.sqrt(r/W);A(),J(e,n,o,()=>{R(m.current)})},mt=t=>{let e=p.current;if(!e){console.error("Container reference is not set.");return}let{top:n}=e.getBoundingClientRect(),r=t-n,o=ft.findIndex(([a,f])=>r>=a&&r<=f);if(o===-1){console.error("No item found for click position:",r);return}let i=(E-o-1)*-1;Q(i)},bt=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=$.current;o.isClick&&Math.abs(r-o.startY)>5&&(o.isClick=!1),o.yList.push([r,Date.now()]),o.yList.length>5&&o.yList.shift();let i=(o.startY-r)/d,a=m.current+i;if(c)a=B(a);else{let f=s.length;a<0?a*=lt:a>f&&(a=f+(a-f)*lt)}o.touchScroll=D(a)}catch(r){console.error("Error in updateScrollDuringDrag:",r)}},N=t=>{var e;!S.current&&!((e=p.current)!=null&&e.contains(t.target))&&t.target!==p.current||(t.cancelable&&t.preventDefault(),s.length&&bt(t))},tt=t=>{var e,n,r;try{S.current=!0;let o=new AbortController,{signal:i}=o;q.current=o;let a={signal:i,passive:!1};(e=p.current)==null||e.addEventListener("touchmove",N,a),document.addEventListener("mousemove",N,a);let f=(t instanceof MouseEvent?t.clientY:(r=(n=t.touches)==null?void 0:n[0])==null?void 0:r.clientY)||0,w=$.current;w.startY=f,w.yList=[[f,Date.now()]],w.touchScroll=m.current,w.isClick=!0,A()}catch(o){console.error("Error in initiateDragGesture:",o)}},L=V(t=>{var r;let e=S.current,n=!!((r=p.current)!=null&&r.contains(t.target))||t.target===p.current;(e||n)&&t.cancelable&&(t.preventDefault(),s.length&&tt(t))},[tt]),vt=t=>{let e=m.current,n=e,r=t>0?-Z:Z,o=0;if(c){o=Math.abs(t/r);let i=t*o+.5*r*o*o;n=Math.round(e+i)}else if(e<0||e>s.length-1){let i=X(e,0,s.length-1),a=e-i;r=ht,o=Math.sqrt(Math.abs(a/r)),t=r*o,t=e>0?-t:t,n=i}else{o=Math.abs(t/r);let i=t*o+.5*r*o*o;n=Math.round(e+i),n=X(n,0,s.length-1);let a=n-e;o=Math.sqrt(Math.abs(a/r))}J(e,n,o,()=>{R(m.current)}),R(m.current)},et=()=>{var t,e,n,r;try{(t=q.current)==null||t.abort(),q.current=null;let o=$.current;if(o.isClick){mt(o.startY);return}let i=o.yList,a=0;if(i.length>1){let f=i.length,[w,j]=(e=i[f-2])!=null?e:[0,0],[wt,Tt]=(n=i[f-1])!=null?n:[0,0],ot=Tt-j;if(ot>0){let st=(w-wt)/d*1e3/ot,yt=Mt,Et=st>0?1:-1;a=Math.min(Math.abs(st),yt)*Et}}m.current=(r=o.touchScroll)!=null?r:m.current,vt(a)}catch(o){console.error("Error in finalizeDragAndStartInertiaScroll:",o)}finally{S.current=!1}},I=V(t=>{var r;if(!s.length)return;let e=S.current,n=!!((r=p.current)!=null&&r.contains(t.target))||t.target===p.current;(e||n)&&t.cancelable&&(t.preventDefault(),et())},[et]),nt=t=>{t.preventDefault();let e=Date.now();if(e-_.current<100)return;let n=Math.sign(t.deltaY);n&&(_.current=e,Q(n))},F=V(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(),nt(t))},[nt]);return ct(()=>{let t=p.current;if(!t)return;let e={passive:!1};return t.addEventListener("touchstart",L,e),t.addEventListener("touchend",I,e),t.addEventListener("wheel",F,e),document.addEventListener("mousedown",L,e),document.addEventListener("mouseup",I,e),()=>{t.removeEventListener("touchstart",L),t.removeEventListener("touchend",I),t.removeEventListener("wheel",F),document.removeEventListener("mousedown",L),document.removeEventListener("mouseup",I)}},[I,L,F]),ct(()=>{pt(z)},[z,g,s]),M.createElement("div",{ref:p,"data-rwp":!0,style:{height:ut}},M.createElement("ul",{ref:Y,"data-rwp-options":!0},dt),M.createElement("div",{className:l==null?void 0:l.highlightWrapper,"data-rwp-highlight-wrapper":!0,"data-slot":"highlight-wrapper",style:{height:d,lineHeight:`${d}px`}},M.createElement("ul",{ref:U,"data-rwp-highlight-list":!0,style:{top:c?-d:void 0}},gt)))}export{Ot as WheelPicker,Ht as WheelPickerWrapper};
1
+ "use client";import L from"react";import{useCallback as C,useEffect as Ce,useMemo as z,useRef as D,useState as nt}from"react";import _e,{createContext as Ze,useCallback as se,useContext as Je,useMemo as Qe,useRef as ke,useState as Ne}from"react";var ye=Ze(null);function we(){return Je(ye)}function Ie({children:i}){let[h,f]=Ne(-1),g=ke(0),a=ke(new Map),p=se((u,M)=>{let k=u!==null?u:g.current++;return a.current.set(k,M),f(O=>O===-1?k:O),k},[]),I=se(u=>{var M;return(M=a.current.get(u))!=null?M:null},[]),E=se(()=>Array.from(a.current.keys()).sort((u,M)=>u-M),[]),x=Qe(()=>({activeIndex:h,setActiveIndex:f,register:p,getPickerRef:I,getPickerIndices:E}),[h,f,p,I,E]);return _e.createElement(ye.Provider,{value:x},i)}import H from"react";function Ee(i){let h=H.useRef(i);return H.useEffect(()=>{h.current=i}),H.useMemo(()=>(...f)=>{var g;return(g=h.current)==null?void 0:g.call(h,...f)},[])}function et({defaultProp:i,onChange:h}){let f=H.useState(i),[g]=f,a=H.useRef(g),p=Ee(h);return H.useEffect(()=>{a.current!==g&&(p(g),a.current=g)},[g,a,p]),f}function Me({prop:i,defaultProp:h,onChange:f=()=>{}}){let[g,a]=et({defaultProp:h,onChange:f}),p=i!==void 0,I=p?i:g,E=Ee(f),x=H.useCallback(u=>{if(p){let k=typeof u=="function"?u(i):u;k!==i&&E(k)}else a(u)},[p,i,a,E]);return[I,x]}import{useCallback as Se,useRef as De}from"react";var tt=500;function We(i,{getTextValue:h,getCurrentIndex:f,onMatch:g}){let a=De(""),p=De(null),I=Se(()=>{a.current="",p.current&&(clearTimeout(p.current),p.current=null)},[]);return{handleTypeaheadSearch:Se(x=>{p.current&&clearTimeout(p.current),a.current+=x.toLowerCase();let u=a.current,k=u.length>1&&Array.from(u).every(W=>W===u[0])?u[0]:u,O=f(),o=k.length===1,b=-1;if(o)for(let W=1;W<=i.length;W++){let S=(O+W)%i.length;if(h(i[S]).toLowerCase().startsWith(k)){b=S;break}}else b=i.findIndex(W=>h(W).toLowerCase().startsWith(k));b!==-1&&g(b),p.current=setTimeout(()=>{a.current="",p.current=null},tt)},[i,h,f,g]),resetTypeahead:I}}var Le=.3,rt=30,st=i=>Math.pow(i-1,3)+1,oe=(i,h,f)=>Math.max(h,Math.min(i,f)),ot=i=>{var h;return(h=i.textValue)!=null?h:typeof i.label=="string"?i.label:String(i.value)},q=(i,h,f,g)=>{if(f.length===0||!f.some(E=>!E.disabled))return i;let p=E=>{var k;let x=i,u=0,M=f.length;for(;u<M;){if(x=x+E,g)x=(x%f.length+f.length)%f.length;else if(x<0||x>=f.length)return-1;if(!((k=f[x])!=null&&k.disabled))return x;u++}return-1},I=p(h);return I===-1&&(I=p(h*-1)),I===-1?i:I},yt=({className:i,children:h})=>L.createElement(Ie,null,L.createElement("div",{className:i,"data-rwp-wrapper":!0},h));function wt({defaultValue:i,value:h,onValueChange:f,options:g,infinite:a=!1,visibleCount:p=20,dragSensitivity:I=3,scrollSensitivity:E=5,optionItemHeight:x=30,classNames:u}){var ve;let M=z(()=>{var t,n;let e=g.find(r=>!r.disabled);return(n=e==null?void 0:e.value)!=null?n:(t=g[0])==null?void 0:t.value},[g]),[k=M,O]=Me({defaultProp:i,prop:h,onChange:f}),o=z(()=>{if(!a)return g;let e=[],t=Math.ceil(p/2);if(g.length===0)return e;for(;e.length<t;)e.push(...g);return e},[p,g,a]),b=x,W=b*.5,S=360/p,U=b/Math.tan(S*Math.PI/180),Re=Math.round(U*2+b*.25),R=p>>2,ae=I*10,Pe=10,w=D(null),j=D(null),N=D(null),v=D(0),ce=D(0),Y=D(!1),le=D(0),[Ae,ie]=nt(!1),G=D(-1),y=we(),He=C(e=>{if(w.current=e,e&&y){let t=G.current===-1?null:G.current;G.current=y.register(t,e)}},[y]),ee=D({startY:0,yList:[],touchScroll:0,isClick:!0}),te=D(null),Oe=z(()=>{let e=(n,r,s)=>L.createElement("li",{key:r,className:u==null?void 0:u.optionItem,"data-slot":"option-item","data-rwp-option":!0,"data-index":r,"data-disabled":n.disabled||void 0,style:{top:-W,height:b,lineHeight:`${b}px`,transform:`rotateX(${s}deg) translateZ(${U}px)`,visibility:"hidden"}},n.label),t=o.map((n,r)=>e(n,r,-S*r));if(a)for(let n=0;n<R;++n){let r=-n-1,s=n+o.length;t.unshift(e(o[o.length-n-1],r,S*(n+1))),t.push(e(o[n],s,-S*s))}return t},[b,W,a,S,o,R,U,u==null?void 0:u.optionItem]),Ye=z(()=>{let e=(n,r)=>L.createElement("li",{key:r,className:u==null?void 0:u.highlightItem,"data-slot":"highlight-item","data-rwp-highlight-item":!0,"data-disabled":n.disabled||void 0,style:{height:b}},n.label),t=o.map((n,r)=>e(n,r));if(a){let n=o[0],r=o[o.length-1];t.unshift(e(r,"infinite-start")),t.push(e(n,"infinite-end"))}return t},[u==null?void 0:u.highlightItem,b,a,o]),Ge=z(()=>{let e=0,t=Math.PI/180,n=[];for(let r=R-1;r>=-R+1;--r){let s=r*S,d=b*Math.cos(s*t),c=e;e+=d,n.push([c,e])}return n},[S,b,R]),X=e=>(e%o.length+o.length)%o.length,V=e=>{let t=a?X(e):e;if(j.current){let n=`translateZ(${-U}px) rotateX(${S*t}deg)`;j.current.style.transform=n,j.current.childNodes.forEach(r=>{let s=r,d=Math.abs(Number(s.dataset.index)-t);s.style.visibility=d>R?"hidden":"visible"})}return N.current&&(N.current.style.transform=`translateY(${-t*b}px)`),t},_=()=>{cancelAnimationFrame(ce.current)},ue=(e,t,n,r)=>{if(e===t||n===0){V(e);return}let s=performance.now(),d=t-e,c=l=>{let m=(l-s)/1e3;if(m<n){let T=st(m/n);v.current=V(e+T*d),ce.current=requestAnimationFrame(c)}else _(),v.current=V(t),r==null||r()};requestAnimationFrame(c)},Z=D(1),J=(e,t)=>{var d;let n=X(e)|0,r=a?n:Math.min(Math.max(n,0),o.length-1);if(!a&&r!==e)return;if((d=o[r])!=null&&d.disabled){let c=t!=null?t:Z.current,m=q(r,c,o,a)-v.current;if(m!==0){P(m);return}}v.current=V(r);let s=o[v.current];s&&!s.disabled&&O(s.value)},ze=e=>{var n;let t=o.findIndex(r=>r.value===e);if(t===-1){console.error("Invalid value selected:",e);return}(n=o[t])!=null&&n.disabled&&(t=q(t,1,o,a)),_(),J(t)},P=e=>{let t=v.current,n=t+e;a?n=Math.round(n):n=oe(Math.round(n),0,o.length-1);let r=Math.abs(n-t);if(r===0)return;let s=e>0?1:-1;Z.current=s;let d=Math.sqrt(r/E);_(),ue(t,n,d,()=>{J(v.current,s)})},Ue=e=>{var m;let t=w.current;if(!t){console.error("Container reference is not set.");return}let{top:n}=t.getBoundingClientRect(),r=e-n,s=Ge.findIndex(([T,A])=>r>=T&&r<=A);if(s===-1){console.error("No item found for click position:",r);return}let d=(R-s-1)*-1,c=v.current+d,l=a?X(c):Math.max(0,Math.min(c,o.length-1));(m=o[l])!=null&&m.disabled||P(d)},Ve=e=>{var t,n;try{let r=(e instanceof MouseEvent?e.clientY:(n=(t=e.touches)==null?void 0:t[0])==null?void 0:n.clientY)||0,s=ee.current;s.isClick&&Math.abs(r-s.startY)>5&&(s.isClick=!1),s.yList.push([r,Date.now()]),s.yList.length>5&&s.yList.shift();let d=(s.startY-r)/b,c=v.current+d;if(a)c=X(c);else{let l=o.length;c<0?c*=Le:c>l&&(c=l+(c-l)*Le)}s.touchScroll=V(c)}catch(r){console.error("Error in updateScrollDuringDrag:",r)}},de=e=>{var t;!Y.current&&!((t=w.current)!=null&&t.contains(e.target))&&e.target!==w.current||(e.cancelable&&e.preventDefault(),o.length&&Ve(e))},he=e=>{var t,n,r;try{Y.current=!0;let s=new AbortController,{signal:d}=s;te.current=s;let c={signal:d,passive:!1};(t=w.current)==null||t.addEventListener("touchmove",de,c),document.addEventListener("mousemove",de,c);let l=(e instanceof MouseEvent?e.clientY:(r=(n=e.touches)==null?void 0:n[0])==null?void 0:r.clientY)||0,m=ee.current;m.startY=l,m.yList=[[l,Date.now()]],m.touchScroll=v.current,m.isClick=!0,_()}catch(s){console.error("Error in initiateDragGesture:",s)}},F=C(e=>{var r;let t=Y.current,n=!!((r=w.current)!=null&&r.contains(e.target))||e.target===w.current;(t||n)&&e.cancelable&&(e.preventDefault(),o.length&&he(e))},[he]),Fe=e=>{let t=v.current,n=t,r=e>0?-ae:ae,s=0,d=e>0?1:-1;if(Z.current=d,a){s=Math.abs(e/r);let c=e*s+.5*r*s*s;n=Math.round(t+c)}else if(t<0||t>o.length-1){let c=oe(t,0,o.length-1),l=t-c;r=Pe,s=Math.sqrt(Math.abs(l/r)),e=r*s,e=t>0?-e:e,n=c}else{s=Math.abs(e/r);let c=e*s+.5*r*s*s;n=Math.round(t+c),n=oe(n,0,o.length-1);let l=n-t;s=Math.sqrt(Math.abs(l/r))}ue(t,n,s,()=>{J(v.current,d)}),J(v.current,d)},fe=()=>{var e,t,n,r;try{(e=te.current)==null||e.abort(),te.current=null;let s=ee.current;if(s.isClick){Ue(s.startY);return}let d=s.yList,c=0;if(d.length>1){let l=d.length,[m,T]=(t=d[l-2])!=null?t:[0,0],[A,Q]=(n=d[l-1])!=null?n:[0,0],$=Q-T;if($>0){let xe=(m-A)/b*1e3/$,je=rt,Xe=xe>0?1:-1;c=Math.min(Math.abs(xe),je)*Xe}}v.current=(r=s.touchScroll)!=null?r:v.current,Fe(c)}catch(s){console.error("Error in finalizeDragAndStartInertiaScroll:",s)}finally{Y.current=!1}},B=C(e=>{var r;if(!o.length)return;let t=Y.current,n=!!((r=w.current)!=null&&r.contains(e.target))||e.target===w.current;(t||n)&&e.cancelable&&(e.preventDefault(),fe())},[fe]),ge=e=>{e.preventDefault();let t=Date.now();if(t-le.current<100)return;let n=Math.sign(e.deltaY);n&&(le.current=t,Z.current=n,P(n))},ne=C(e=>{if(!o.length||!w.current)return;let t=Y.current,n=w.current.contains(e.target)||e.target===w.current;(t||n)&&e.cancelable&&(e.preventDefault(),ge(e))},[ge]),re=C(e=>{let t=G.current;if(!y||t===-1)return;let n=y.getPickerIndices(),r=n.indexOf(t);if(r===-1)return;let s;e==="prev"?s=r>0?r-1:n.length-1:s=r<n.length-1?r+1:0;let d=n[s],c=y.getPickerRef(d);if(c){let l=w.current;l&&(l.tabIndex=-1),c.tabIndex=0,y.setActiveIndex(d),c.focus()}},[y]),K=z(()=>{let e=new Map,t=new Map,n=[];return o.forEach((r,s)=>{if(!r.disabled){let d=n.length;e.set(d,s),t.set(s,d),n.push(r)}}),{enabled:n,map:e,reverseMap:t}},[o]),{handleTypeaheadSearch:pe,resetTypeahead:me}=We(K.enabled,{getTextValue:ot,getCurrentIndex:C(()=>{var t;let e=Math.round(v.current);return(t=K.reverseMap.get(e))!=null?t:0},[K]),onMatch:C(e=>{let t=K.map.get(e);if(t!==void 0){let n=t-Math.round(v.current);P(n)}},[K])}),Be=C(e=>{if(!o.length)return;let t=l=>{var $;e.preventDefault();let m=Math.round(v.current),T=m+l;if(!a&&(l===-1&&T<0||l===1&&T>=o.length))return;let A=a?l===-1?(T%o.length+o.length)%o.length:T%o.length:T;if(($=o[A])!=null&&$.disabled){let Te=q(A,l,o,a);T=m+l+(Te-A)}let Q=T-m;Q!==0&&P(Q)},n=()=>{var T;if(a)return;e.preventDefault();let l=0;(T=o[0])!=null&&T.disabled&&(l=q(0,1,o,!1));let m=l-v.current;m!==0&&P(m)},r=()=>{var T;if(a)return;e.preventDefault();let l=o.length-1;(T=o[l])!=null&&T.disabled&&(l=q(l,-1,o,!1));let m=l-v.current;m!==0&&P(m)},s=()=>{e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),pe(e.key))},c={ArrowUp:()=>t(-1),ArrowDown:()=>t(1),ArrowLeft:()=>{e.preventDefault(),re("prev")},ArrowRight:()=>{e.preventDefault(),re("next")},Home:n,End:r}[e.key];c?c():s()},[o.length,a,re,pe]),Ke=C(()=>{ie(!0);let e=G.current;y&&e!==-1&&y.setActiveIndex(e)},[y]),$e=C(()=>{ie(!1),me()},[me]);Ce(()=>{let e=w.current;if(!e)return;let t={passive:!1};return e.addEventListener("touchstart",F,t),e.addEventListener("touchend",B,t),e.addEventListener("wheel",ne,t),document.addEventListener("mousedown",F,t),document.addEventListener("mouseup",B,t),()=>{e.removeEventListener("touchstart",F),e.removeEventListener("touchend",B),e.removeEventListener("wheel",ne),document.removeEventListener("mousedown",F),document.removeEventListener("mouseup",B)}},[B,F,ne]),Ce(()=>{ze(k)},[k,h,o]);let be=G.current,qe=(ve=y==null?void 0:y.activeIndex)!=null?ve:-1;return L.createElement("div",{ref:He,"data-rwp":!0,tabIndex:y&&be!==-1?qe===be?0:-1:0,onKeyDown:Be,onFocus:Ke,onBlur:$e,style:{height:Re}},L.createElement("ul",{ref:j,"data-rwp-options":!0},Oe),L.createElement("div",{className:u==null?void 0:u.highlightWrapper,"data-rwp-highlight-wrapper":!0,"data-rwp-focused":Ae||void 0,"data-slot":"highlight-wrapper",style:{height:b,lineHeight:`${b}px`}},L.createElement("ul",{ref:N,"data-rwp-highlight-list":!0,style:{top:a?-b:void 0}},Ye)))}export{wt 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.19",
3
+ "version": "1.2.0",
4
4
  "description": "iOS-like wheel picker for React with smooth inertia scrolling and infinite loop support.",
5
5
  "publishConfig": {
6
6
  "access": "public",