@aiquants/swipe-overlay 1.2.0 → 1.2.2
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/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +9 -3
package/dist/index.d.mts
CHANGED
|
@@ -66,6 +66,7 @@ declare const useTapClick: (onTap: () => void, threshold?: number) => {
|
|
|
66
66
|
onPointerDown: (e: React.PointerEvent) => void;
|
|
67
67
|
onPointerUp: (e: React.PointerEvent) => void;
|
|
68
68
|
onPointerCancel: () => void;
|
|
69
|
+
onKeyDown: (e: React.KeyboardEvent) => void;
|
|
69
70
|
onClick: (e: React.MouseEvent) => void;
|
|
70
71
|
};
|
|
71
72
|
|
package/dist/index.d.ts
CHANGED
|
@@ -66,6 +66,7 @@ declare const useTapClick: (onTap: () => void, threshold?: number) => {
|
|
|
66
66
|
onPointerDown: (e: React.PointerEvent) => void;
|
|
67
67
|
onPointerUp: (e: React.PointerEvent) => void;
|
|
68
68
|
onPointerCancel: () => void;
|
|
69
|
+
onKeyDown: (e: React.KeyboardEvent) => void;
|
|
69
70
|
onClick: (e: React.MouseEvent) => void;
|
|
70
71
|
};
|
|
71
72
|
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var D=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var K=Object.prototype.hasOwnProperty;var U=(e,o)=>{for(var t in o)D(e,t,{get:o[t],enumerable:!0})},V=(e,o,t,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let a of G(o))!K.call(e,a)&&a!==t&&D(e,a,{get:()=>o[a],enumerable:!(n=F(o,a))||n.enumerable});return e};var q=e=>V(D({},"__esModule",{value:!0}),e);var ee={};U(ee,{SwipeCloseGuardContext:()=>M,useOverlayEscapeStack:()=>R,useSwipeCloseGuard:()=>$,useSwipeGuardState:()=>J,useSwipeToDismissOverlay:()=>z,useTapClick:()=>Z,useTransitionDisplay:()=>Q});module.exports=q(ee);var r=require("react"),j=120,N=.5,W=40,T=100,M=(0,r.createContext)(null),$=()=>(0,r.useContext)(M)??{isBlocked:!1,requestBlock:()=>()=>{}},c=[],X=e=>{if(e.key!=="Escape")return;c[c.length-1].onEscape(e)&&(e.preventDefault(),e.stopPropagation())},R=()=>(0,r.useCallback)(e=>{let o=c.findIndex(t=>t.id===e.id);return o>=0&&c.splice(o,1),c.push(e),c.length===1&&typeof document<"u"&&document.addEventListener("keydown",X,!0),()=>{let t=c.findIndex(n=>n.id===e.id);t>=0&&c.splice(t,1),c.length===0&&typeof document<"u"&&document.removeEventListener("keydown",X,!0)}},[]),z=({isOpen:e,onClose:o,isCloseBlocked:t,skipWhenTextSelected:n=!1,swipeThreshold:a=j,flickVelocity:f=N,flickDistance:b=W})=>{let[l,A]=(0,r.useState)(null),[Y,v]=(0,r.useState)(!1),g=R(),x=(0,r.useId)(),u=(0,r.useRef)({pointerId:null,startX:0,startY:0,isActive:!1,isClosing:!1,lastDelta:0,capturedPointerId:null,history:[]}),E=(0,r.useCallback)(()=>t()?!1:(o(),!0),[t,o]),C=(0,r.useRef)(E);C.current=E,(0,r.useEffect)(()=>{if(e)return g({id:x,onEscape:()=>C.current()})},[e,g,x]),(0,r.useEffect)(()=>{if(!(l&&e))return;let S=()=>{let s=u.current;if(s.capturedPointerId!==null){try{l.releasePointerCapture(s.capturedPointerId)}catch{}s.capturedPointerId=null}},d=()=>{let s=u.current;S(),Object.assign(s,{pointerId:null,isActive:!1,isClosing:!1,capturedPointerId:null,history:[]}),l.style.transform="",l.style.transition="",v(!1)};u.current={pointerId:null,startX:0,startY:0,isActive:!1,isClosing:!1,lastDelta:0,capturedPointerId:null,history:[]},l.style.transform="",l.style.transition="",v(!1);let h=s=>{s.pointerType==="mouse"&&s.button!==0||s.target.closest('[data-overlay-interactive="true"]')||n&&window.getSelection()?.toString().trim()||(u.current={pointerId:s.pointerId,startX:s.clientX,startY:s.clientY,isActive:!0,isClosing:!1,lastDelta:0,capturedPointerId:null,history:[{x:s.clientX,time:Date.now()}]})},w=s=>{let i=u.current;if(!i.isActive||i.pointerId!==s.pointerId)return;if(n&&window.getSelection()?.toString().trim()){d();return}let y=Date.now();for(i.history.push({x:s.clientX,time:y});i.history.length>2&&i.history[1].time<=y-T;)i.history.shift();let p=s.clientX-i.startX,m=s.clientY-i.startY;if(!i.isClosing){if(Math.abs(p)<4)return;if(Math.abs(p)<Math.abs(m)*1.3||p<=0){d();return}i.isClosing=!0,l.style.transition="none",l.setPointerCapture(s.pointerId),i.capturedPointerId=s.pointerId,v(!0)}i.isClosing&&(s.preventDefault(),i.lastDelta=Math.max(0,p),l.style.transform=`translateX(${Math.min(i.lastDelta,520)}px)`)},P=s=>{let i=u.current;if(i.pointerId!==s.pointerId)return;let y=Date.now(),p=y-T,m=i.history.find(I=>I.time>=p)||i.history[0],k=y-m.time,_=s.clientX-m.x,B=k>0?_/k:0,O=i.lastDelta>a,L=B>f&&i.lastDelta>b;if(i.isClosing&&(O||L))if(C.current()){let I=L?.15:.3;l.style.transition=`transform ${I}s ease-out`,l.style.transform="translateX(100%)",S(),Object.assign(i,{pointerId:null,isActive:!1,isClosing:!1,capturedPointerId:null,history:[]}),v(!1)}else d();else d()};return l.addEventListener("pointerdown",h),l.addEventListener("pointermove",w),l.addEventListener("pointerup",P),l.addEventListener("pointercancel",d),()=>{S(),l.removeEventListener("pointerdown",h),l.removeEventListener("pointermove",w),l.removeEventListener("pointerup",P),l.removeEventListener("pointercancel",d)}},[e,l,n,a,f,b]);let H=(0,r.useMemo)(()=>({transform:e?"translateX(0px)":"translateX(100%)"}),[e]);return{overlayRef:A,overlayStyle:H,attemptClose:E,isSwiping:Y,element:l}},J=()=>{let e=(0,r.useRef)(new Set),[o,t]=(0,r.useState)(!1),n=(0,r.useCallback)(()=>{let f=Symbol("guard");return e.current.add(f),t(!0),()=>{e.current.delete(f),t(e.current.size>0)}},[]),a=(0,r.useCallback)(()=>{e.current.clear(),t(!1)},[]);return{isBlocked:o,requestBlock:n,reset:a}};function Q(e,o){let t=(0,r.useRef)(o);return e&&o!==null&&(t.current=o),e?o:t.current}var Z=(e,o=10)=>{let t=(0,r.useRef)(null);return{onPointerDown:n=>{t.current={x:n.clientX,y:n.clientY}},onPointerUp:n=>{if(t.current){let a=Math.hypot(n.clientX-t.current.x,n.clientY-t.current.y);t.current=null,a<o&&(n.preventDefault(),e())}},onPointerCancel:()=>{t.current=null},onKeyDown:n=>{n.target===n.currentTarget&&(n.key==="Enter"||n.key===" "||n.key==="Spacebar")&&(n.preventDefault(),e())},onClick:n=>n.preventDefault()}};0&&(module.exports={SwipeCloseGuardContext,useOverlayEscapeStack,useSwipeCloseGuard,useSwipeGuardState,useSwipeToDismissOverlay,useTapClick,useTransitionDisplay});
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createContext as F,useCallback as
|
|
1
|
+
import{createContext as F,useCallback as E,useContext as G,useEffect as X,useId as K,useMemo as U,useRef as y,useState as b}from"react";var V=120,q=.5,j=40,M=100,N=F(null),z=()=>G(N)??{isBlocked:!1,requestBlock:()=>()=>{}},l=[],R=e=>{if(e.key!=="Escape")return;l[l.length-1].onEscape(e)&&(e.preventDefault(),e.stopPropagation())},W=()=>E(e=>{let i=l.findIndex(o=>o.id===e.id);return i>=0&&l.splice(i,1),l.push(e),l.length===1&&typeof document<"u"&&document.addEventListener("keydown",R,!0),()=>{let o=l.findIndex(n=>n.id===e.id);o>=0&&l.splice(o,1),l.length===0&&typeof document<"u"&&document.removeEventListener("keydown",R,!0)}},[]),J=({isOpen:e,onClose:i,isCloseBlocked:o,skipWhenTextSelected:n=!1,swipeThreshold:a=V,flickVelocity:p=q,flickDistance:g=j})=>{let[s,A]=b(null),[Y,v]=b(!1),x=W(),h=K(),c=y({pointerId:null,startX:0,startY:0,isActive:!1,isClosing:!1,lastDelta:0,capturedPointerId:null,history:[]}),C=E(()=>o()?!1:(i(),!0),[o,i]),S=y(C);S.current=C,X(()=>{if(e)return x({id:h,onEscape:()=>S.current()})},[e,x,h]),X(()=>{if(!(s&&e))return;let I=()=>{let t=c.current;if(t.capturedPointerId!==null){try{s.releasePointerCapture(t.capturedPointerId)}catch{}t.capturedPointerId=null}},u=()=>{let t=c.current;I(),Object.assign(t,{pointerId:null,isActive:!1,isClosing:!1,capturedPointerId:null,history:[]}),s.style.transform="",s.style.transition="",v(!1)};c.current={pointerId:null,startX:0,startY:0,isActive:!1,isClosing:!1,lastDelta:0,capturedPointerId:null,history:[]},s.style.transform="",s.style.transition="",v(!1);let w=t=>{t.pointerType==="mouse"&&t.button!==0||t.target.closest('[data-overlay-interactive="true"]')||n&&window.getSelection()?.toString().trim()||(c.current={pointerId:t.pointerId,startX:t.clientX,startY:t.clientY,isActive:!0,isClosing:!1,lastDelta:0,capturedPointerId:null,history:[{x:t.clientX,time:Date.now()}]})},P=t=>{let r=c.current;if(!r.isActive||r.pointerId!==t.pointerId)return;if(n&&window.getSelection()?.toString().trim()){u();return}let f=Date.now();for(r.history.push({x:t.clientX,time:f});r.history.length>2&&r.history[1].time<=f-M;)r.history.shift();let d=t.clientX-r.startX,m=t.clientY-r.startY;if(!r.isClosing){if(Math.abs(d)<4)return;if(Math.abs(d)<Math.abs(m)*1.3||d<=0){u();return}r.isClosing=!0,s.style.transition="none",s.setPointerCapture(t.pointerId),r.capturedPointerId=t.pointerId,v(!0)}r.isClosing&&(t.preventDefault(),r.lastDelta=Math.max(0,d),s.style.transform=`translateX(${Math.min(r.lastDelta,520)}px)`)},k=t=>{let r=c.current;if(r.pointerId!==t.pointerId)return;let f=Date.now(),d=f-M,m=r.history.find(D=>D.time>=d)||r.history[0],L=f-m.time,_=t.clientX-m.x,B=L>0?_/L:0,O=r.lastDelta>a,T=B>p&&r.lastDelta>g;if(r.isClosing&&(O||T))if(S.current()){let D=T?.15:.3;s.style.transition=`transform ${D}s ease-out`,s.style.transform="translateX(100%)",I(),Object.assign(r,{pointerId:null,isActive:!1,isClosing:!1,capturedPointerId:null,history:[]}),v(!1)}else u();else u()};return s.addEventListener("pointerdown",w),s.addEventListener("pointermove",P),s.addEventListener("pointerup",k),s.addEventListener("pointercancel",u),()=>{I(),s.removeEventListener("pointerdown",w),s.removeEventListener("pointermove",P),s.removeEventListener("pointerup",k),s.removeEventListener("pointercancel",u)}},[e,s,n,a,p,g]);let H=U(()=>({transform:e?"translateX(0px)":"translateX(100%)"}),[e]);return{overlayRef:A,overlayStyle:H,attemptClose:C,isSwiping:Y,element:s}},Q=()=>{let e=y(new Set),[i,o]=b(!1),n=E(()=>{let p=Symbol("guard");return e.current.add(p),o(!0),()=>{e.current.delete(p),o(e.current.size>0)}},[]),a=E(()=>{e.current.clear(),o(!1)},[]);return{isBlocked:i,requestBlock:n,reset:a}};function Z(e,i){let o=y(i);return e&&i!==null&&(o.current=i),e?i:o.current}var ee=(e,i=10)=>{let o=y(null);return{onPointerDown:n=>{o.current={x:n.clientX,y:n.clientY}},onPointerUp:n=>{if(o.current){let a=Math.hypot(n.clientX-o.current.x,n.clientY-o.current.y);o.current=null,a<i&&(n.preventDefault(),e())}},onPointerCancel:()=>{o.current=null},onKeyDown:n=>{n.target===n.currentTarget&&(n.key==="Enter"||n.key===" "||n.key==="Spacebar")&&(n.preventDefault(),e())},onClick:n=>n.preventDefault()}};export{N as SwipeCloseGuardContext,W as useOverlayEscapeStack,z as useSwipeCloseGuard,Q as useSwipeGuardState,J as useSwipeToDismissOverlay,ee as useTapClick,Z as useTransitionDisplay};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiquants/swipe-overlay",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "React hooks and context for swipe-to-dismiss overlay interactions",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -32,12 +32,18 @@
|
|
|
32
32
|
"LICENSE"
|
|
33
33
|
],
|
|
34
34
|
"peerDependencies": {
|
|
35
|
-
"react": "
|
|
36
|
-
"react-dom": "
|
|
35
|
+
"react": ">=18.0.0",
|
|
36
|
+
"react-dom": ">=18.0.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
40
|
+
"@testing-library/react": "^16.3.0",
|
|
41
|
+
"@testing-library/user-event": "^14.6.1",
|
|
39
42
|
"@types/react": "^19.2.7",
|
|
40
43
|
"@types/react-dom": "^19.2.3",
|
|
44
|
+
"@vitejs/plugin-react": "^5.1.2",
|
|
45
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
46
|
+
"jsdom": "^26.1.0",
|
|
41
47
|
"react": "^19.2.7",
|
|
42
48
|
"react-dom": "^19.2.7",
|
|
43
49
|
"rimraf": "^6.1.2",
|