@data-slot/hover-card 0.2.86 → 0.2.88

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
@@ -60,7 +60,7 @@ const hoverCard = createHoverCard(element, {
60
60
  |--------|------|---------|-------------|
61
61
  | `defaultOpen` | `boolean` | `false` | Initial open state (uncontrolled only) |
62
62
  | `open` | `boolean` | - | Controlled open state |
63
- | `delay` | `number` | `700` | Delay before opening on hover/focus (ms) |
63
+ | `delay` | `number` | `700` | Delay before opening on hover/keyboard focus (ms) |
64
64
  | `skipDelayDuration` | `number` | `300` | Duration to skip delay after closing (ms). Set `0` to disable warm-up. |
65
65
  | `closeDelay` | `number` | `300` | Delay before closing after leave/blur (ms) |
66
66
  | `side` | `"top" \| "right" \| "bottom" \| "left"` | `"bottom"` | Preferred side relative to trigger |
@@ -158,6 +158,9 @@ root.addEventListener("hover-card:change", (e) => {
158
158
 
159
159
  `reason` is one of: `"pointer" | "focus" | "blur" | "dismiss" | "api"`.
160
160
 
161
+ Focus opening is keyboard-intent based (`Tab` navigation). Programmatic focus (for example, dialog auto-focus on open) does not auto-open the hover-card.
162
+ Hover opening is pointer-intent based (recent mouse movement). Synthetic `pointerenter` caused by newly shown UI under a static cursor does not auto-open the hover-card.
163
+
161
164
  ### Inbound
162
165
 
163
166
  - `hover-card:set` - force open state
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@data-slot/core`);const t=[`top`,`right`,`bottom`,`left`],n=[`start`,`center`,`end`];let r=0;function i(i,a={}){let o=(0,e.getPart)(i,`hover-card-trigger`),s=(0,e.getPart)(i,`hover-card-content`),c=(0,e.getPart)(i,`hover-card-positioner`),l=c&&s&&c.contains(s)?c:null,u=(0,e.getPart)(i,`hover-card-portal`),d=u&&l&&u.contains(l)?u:null;if(!o||!s)throw Error(`Hover-card requires trigger and content slots`);let f=a.open!==void 0,p=a.defaultOpen??(0,e.getDataBool)(i,`defaultOpen`)??!1,m=a.delay??(0,e.getDataNumber)(i,`delay`)??700,h=a.skipDelayDuration??(0,e.getDataNumber)(i,`skipDelayDuration`)??300,g=a.closeDelay??(0,e.getDataNumber)(i,`closeDelay`)??300,_=a.onOpenChange,v=a.closeOnClickOutside??(0,e.getDataBool)(i,`closeOnClickOutside`)??!0,y=a.closeOnEscape??(0,e.getDataBool)(i,`closeOnEscape`)??!0,b=a.portal??(0,e.getDataBool)(s,`portal`)??(0,e.getDataBool)(i,`portal`)??!0,x=a.side??(0,e.getDataEnum)(s,`side`,t)??(0,e.getDataEnum)(i,`side`,t)??`bottom`,S=a.align??(0,e.getDataEnum)(s,`align`,n)??(0,e.getDataEnum)(i,`align`,n)??`center`,C=a.sideOffset??(0,e.getDataNumber)(s,`sideOffset`)??(0,e.getDataNumber)(i,`sideOffset`)??4,w=a.alignOffset??(0,e.getDataNumber)(s,`alignOffset`)??(0,e.getDataNumber)(i,`alignOffset`)??0,T=a.avoidCollisions??(0,e.getDataBool)(s,`avoidCollisions`)??(0,e.getDataBool)(i,`avoidCollisions`)??!0,E=a.collisionPadding??(0,e.getDataNumber)(s,`collisionPadding`)??(0,e.getDataNumber)(i,`collisionPadding`)??8,D=a.open??p,O=!1,k=!1,A=!1,j=!1,M=null,N=null,P=[],F=(0,e.createPortalLifecycle)({content:s,root:i,enabled:b,wrapperSlot:l?void 0:`hover-card-positioner`,container:l??void 0,mountTarget:l?d??l:void 0}),I=(0,e.ensureId)(s,`hover-card-content`);o.setAttribute(`aria-haspopup`,`dialog`),o.setAttribute(`aria-controls`,I),s.setAttribute(`data-side`,x),s.setAttribute(`data-align`,S);let L=()=>o.hasAttribute(`disabled`)||o.getAttribute(`aria-disabled`)===`true`,R=()=>{M&&=(clearTimeout(M),null)},z=()=>{N&&=(clearTimeout(N),null)},B=()=>{R(),z()},V=(t,n)=>{(0,e.emit)(i,`hover-card:change`,{open:t,reason:n,trigger:o,content:s}),_?.(t)},H=()=>{let t=F.container,n=i.ownerDocument.defaultView??window,r=(0,e.computeFloatingPosition)({anchorRect:o.getBoundingClientRect(),contentRect:s.getBoundingClientRect(),side:x,align:S,sideOffset:C,alignOffset:w,avoidCollisions:T,collisionPadding:E});t.style.position=`absolute`,t.style.top=`0px`,t.style.left=`0px`,t.style.transform=`translate3d(${r.x+n.scrollX}px, ${r.y+n.scrollY}px, 0)`,t.style.willChange=`transform`,t.style.margin=`0`,s.setAttribute(`data-side`,r.side),s.setAttribute(`data-align`,r.align),t!==s&&(t.setAttribute(`data-side`,r.side),t.setAttribute(`data-align`,r.align))},U=e=>{let t=F.container;if(i.setAttribute(`data-state`,e),s.setAttribute(`data-state`,e),t!==s&&t.setAttribute(`data-state`,e),e===`open`){i.setAttribute(`data-open`,``),s.setAttribute(`data-open`,``),t!==s&&t.setAttribute(`data-open`,``),i.removeAttribute(`data-closed`),s.removeAttribute(`data-closed`),t!==s&&t.removeAttribute(`data-closed`);return}i.setAttribute(`data-closed`,``),s.setAttribute(`data-closed`,``),t!==s&&t.setAttribute(`data-closed`,``),i.removeAttribute(`data-open`),s.removeAttribute(`data-open`),t!==s&&t.removeAttribute(`data-open`)},W=(0,e.createPresenceLifecycle)({element:s,onExitComplete:()=>{O||(F.restore(),s.hidden=!0)}}),G=(0,e.createPositionSync)({observedElements:[o,s],isActive:()=>D,ancestorScroll:!1,onUpdate:H}),K=(t,n)=>{D!==t&&(!t&&D&&h>0&&(r=Date.now()+h),D=t,(0,e.setAria)(o,`expanded`,D),t?(F.mount(),s.hidden=!1,U(`open`),W.enter(),H(),G.start(),G.update()):(U(`closed`),W.exit(),G.stop()),V(D,n))},q=(e,t)=>{if(D!==e){if(f){V(e,t);return}K(e,t)}},J=(e,t)=>{K(e,t)},Y=e=>{if(z(),R(),h>0&&Date.now()<r){q(!0,e);return}if(m<=0){q(!0,e);return}M=setTimeout(()=>{M=null,q(!0,e)},m)},X=e=>{if(R(),z(),g<=0){q(!1,e);return}N=setTimeout(()=>{N=null,q(!1,e)},g)},Z=e=>{k||A||j||X(e)};return(0,e.setAria)(o,`expanded`,D),U(D?`open`:`closed`),s.hidden=!D,D&&(F.mount(),W.enter(),s.hidden=!1,H(),G.start(),G.update()),P.push((0,e.on)(o,`pointerenter`,e=>{e.pointerType!==`touch`&&(k=!0,!L()&&Y(`pointer`))}),(0,e.on)(o,`pointerleave`,e=>{if(e.pointerType===`touch`)return;k=!1;let t=e.relatedTarget;t&&s.contains(t)||Z(`pointer`)})),P.push((0,e.on)(s,`pointerenter`,e=>{e.pointerType!==`touch`&&(A=!0,z())}),(0,e.on)(s,`pointerleave`,e=>{if(e.pointerType===`touch`)return;A=!1;let t=e.relatedTarget;t&&o.contains(t)||Z(`pointer`)})),P.push((0,e.on)(o,`focusin`,()=>{j=!0,!L()&&Y(`focus`)}),(0,e.on)(o,`focusout`,e=>{let t=e.relatedTarget;t&&(o.contains(t)||s.contains(t))||(j=!1,Z(`blur`))}),(0,e.on)(s,`focusin`,()=>{j=!0,z()}),(0,e.on)(s,`focusout`,e=>{let t=e.relatedTarget;t&&(o.contains(t)||s.contains(t))||(j=!1,Z(`blur`))})),P.push((0,e.createDismissLayer)({root:i,isOpen:()=>D,onDismiss:()=>q(!1,`dismiss`),closeOnClickOutside:v,closeOnEscape:y})),P.push((0,e.on)(i,`hover-card:set`,e=>{let t=e.detail,n;t?.open===void 0?t?.value!==void 0&&(n=t.value):n=t.open,typeof n==`boolean`&&J(n,`api`)})),{open:()=>{L()||(B(),q(!0,`api`))},close:()=>{B(),q(!1,`api`)},toggle:()=>{B(),!(!D&&L())&&q(!D,`api`)},setOpen:e=>{B(),J(e,`api`)},get isOpen(){return D},destroy:()=>{O=!0,B(),G.stop(),W.cleanup(),F.cleanup(),P.forEach(e=>e()),P.length=0}}}const a=new WeakSet;function o(t=document){let n=[];for(let r of(0,e.getRoots)(t,`hover-card`))a.has(r)||(a.add(r),n.push(i(r)));return n}exports.create=o,exports.createHoverCard=i;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@data-slot/core`);const t=[`top`,`right`,`bottom`,`left`],n=[`start`,`center`,`end`];let r=0;function i(i,a={}){let o=(0,e.getPart)(i,`hover-card-trigger`),s=(0,e.getPart)(i,`hover-card-content`),c=(0,e.getPart)(i,`hover-card-positioner`),l=c&&s&&c.contains(s)?c:null,u=(0,e.getPart)(i,`hover-card-portal`),d=u&&l&&u.contains(l)?u:null;if(!o||!s)throw Error(`Hover-card requires trigger and content slots`);let f=a.open!==void 0,p=a.defaultOpen??(0,e.getDataBool)(i,`defaultOpen`)??!1,m=a.delay??(0,e.getDataNumber)(i,`delay`)??700,h=a.skipDelayDuration??(0,e.getDataNumber)(i,`skipDelayDuration`)??300,g=a.closeDelay??(0,e.getDataNumber)(i,`closeDelay`)??300,_=a.onOpenChange,v=a.closeOnClickOutside??(0,e.getDataBool)(i,`closeOnClickOutside`)??!0,y=a.closeOnEscape??(0,e.getDataBool)(i,`closeOnEscape`)??!0,b=a.portal??(0,e.getDataBool)(s,`portal`)??(0,e.getDataBool)(i,`portal`)??!0,x=a.side??(0,e.getDataEnum)(s,`side`,t)??(0,e.getDataEnum)(i,`side`,t)??`bottom`,S=a.align??(0,e.getDataEnum)(s,`align`,n)??(0,e.getDataEnum)(i,`align`,n)??`center`,C=a.sideOffset??(0,e.getDataNumber)(s,`sideOffset`)??(0,e.getDataNumber)(i,`sideOffset`)??4,w=a.alignOffset??(0,e.getDataNumber)(s,`alignOffset`)??(0,e.getDataNumber)(i,`alignOffset`)??0,T=a.avoidCollisions??(0,e.getDataBool)(s,`avoidCollisions`)??(0,e.getDataBool)(i,`avoidCollisions`)??!0,E=a.collisionPadding??(0,e.getDataNumber)(s,`collisionPadding`)??(0,e.getDataNumber)(i,`collisionPadding`)??8,D=a.open??p,O=!1,k=!1,A=!1,j=!1,M=null,N=null,P=-1/0,F=-1/0,I=[],L=(0,e.createPortalLifecycle)({content:s,root:i,enabled:b,wrapperSlot:l?void 0:`hover-card-positioner`,container:l??void 0,mountTarget:l?d??l:void 0}),R=(0,e.ensureId)(s,`hover-card-content`);o.setAttribute(`aria-haspopup`,`dialog`),o.setAttribute(`aria-controls`,R),s.setAttribute(`data-side`,x),s.setAttribute(`data-align`,S);let z=()=>o.hasAttribute(`disabled`)||o.getAttribute(`aria-disabled`)===`true`,B=()=>{M&&=(clearTimeout(M),null)},V=()=>{N&&=(clearTimeout(N),null)},H=()=>{B(),V()},U=(t,n)=>{(0,e.emit)(i,`hover-card:change`,{open:t,reason:n,trigger:o,content:s}),_?.(t)},W=()=>{let t=L.container,n=i.ownerDocument.defaultView??window,r=(0,e.computeFloatingPosition)({anchorRect:o.getBoundingClientRect(),contentRect:s.getBoundingClientRect(),side:x,align:S,sideOffset:C,alignOffset:w,avoidCollisions:T,collisionPadding:E});t.style.position=`absolute`,t.style.top=`0px`,t.style.left=`0px`,t.style.transform=`translate3d(${r.x+n.scrollX}px, ${r.y+n.scrollY}px, 0)`,t.style.willChange=`transform`,t.style.margin=`0`,s.setAttribute(`data-side`,r.side),s.setAttribute(`data-align`,r.align),t!==s&&(t.setAttribute(`data-side`,r.side),t.setAttribute(`data-align`,r.align))},G=e=>{let t=L.container;if(i.setAttribute(`data-state`,e),s.setAttribute(`data-state`,e),t!==s&&t.setAttribute(`data-state`,e),e===`open`){i.setAttribute(`data-open`,``),s.setAttribute(`data-open`,``),t!==s&&t.setAttribute(`data-open`,``),i.removeAttribute(`data-closed`),s.removeAttribute(`data-closed`),t!==s&&t.removeAttribute(`data-closed`);return}i.setAttribute(`data-closed`,``),s.setAttribute(`data-closed`,``),t!==s&&t.setAttribute(`data-closed`,``),i.removeAttribute(`data-open`),s.removeAttribute(`data-open`),t!==s&&t.removeAttribute(`data-open`)},K=(0,e.createPresenceLifecycle)({element:s,onExitComplete:()=>{O||(L.restore(),s.hidden=!0)}}),q=(0,e.createPositionSync)({observedElements:[o,s],isActive:()=>D,ancestorScroll:!1,onUpdate:W}),J=(t,n)=>{D!==t&&(!t&&D&&h>0&&(r=Date.now()+h),D=t,(0,e.setAria)(o,`expanded`,D),t?(L.mount(),s.hidden=!1,G(`open`),K.enter(),W(),q.start(),q.update()):(G(`closed`),K.exit(),q.stop()),U(D,n))},Y=(e,t)=>{if(D!==e){if(f){U(e,t);return}J(e,t)}},X=(e,t)=>{J(e,t)},Z=e=>{if(V(),B(),h>0&&Date.now()<r){Y(!0,e);return}if(m<=0){Y(!0,e);return}M=setTimeout(()=>{M=null,Y(!0,e)},m)},Q=e=>{if(B(),V(),g<=0){Y(!1,e);return}N=setTimeout(()=>{N=null,Y(!1,e)},g)},$=e=>{k||A||j||Q(e)};return(0,e.setAria)(o,`expanded`,D),G(D?`open`:`closed`),s.hidden=!D,D&&(L.mount(),K.enter(),s.hidden=!1,W(),q.start(),q.update()),I.push((0,e.on)(i.ownerDocument,`keydown`,e=>{e.key===`Tab`&&(P=Date.now())},{capture:!0}),(0,e.on)(i.ownerDocument,`pointerdown`,()=>{P=-1/0,F=-1/0},{capture:!0}),(0,e.on)(i.ownerDocument,`pointermove`,e=>{e.pointerType!==`touch`&&(F=Date.now())},{capture:!0}),(0,e.on)(o,`pointerenter`,e=>{e.pointerType!==`touch`&&(k=!0,!z()&&(Date.now()-F>250||Z(`pointer`)))}),(0,e.on)(o,`pointermove`,e=>{e.pointerType!==`touch`&&(!k||z()||D||M||Z(`pointer`))}),(0,e.on)(o,`pointerleave`,e=>{if(e.pointerType===`touch`)return;k=!1;let t=e.relatedTarget;t&&s.contains(t)||$(`pointer`)})),I.push((0,e.on)(s,`pointerenter`,e=>{e.pointerType!==`touch`&&(A=!0,V())}),(0,e.on)(s,`pointerleave`,e=>{if(e.pointerType===`touch`)return;A=!1;let t=e.relatedTarget;t&&o.contains(t)||$(`pointer`)})),I.push((0,e.on)(o,`focusin`,()=>{j=!0,!z()&&(Date.now()-P>750||Z(`focus`))}),(0,e.on)(o,`focusout`,e=>{let t=e.relatedTarget;t&&(o.contains(t)||s.contains(t))||(j=!1,$(`blur`))}),(0,e.on)(s,`focusin`,()=>{j=!0,V()}),(0,e.on)(s,`focusout`,e=>{let t=e.relatedTarget;t&&(o.contains(t)||s.contains(t))||(j=!1,$(`blur`))})),I.push((0,e.createDismissLayer)({root:i,isOpen:()=>D,onDismiss:()=>Y(!1,`dismiss`),closeOnClickOutside:v,closeOnEscape:y})),I.push((0,e.on)(i,`hover-card:set`,e=>{let t=e.detail,n;t?.open===void 0?t?.value!==void 0&&(n=t.value):n=t.open,typeof n==`boolean`&&X(n,`api`)})),{open:()=>{z()||(H(),Y(!0,`api`))},close:()=>{H(),Y(!1,`api`)},toggle:()=>{H(),!(!D&&z())&&Y(!D,`api`)},setOpen:e=>{H(),X(e,`api`)},get isOpen(){return D},destroy:()=>{O=!0,H(),q.stop(),K.cleanup(),L.cleanup(),I.forEach(e=>e()),I.length=0}}}const a=new WeakSet;function o(t=document){let n=[];for(let r of(0,e.getRoots)(t,`hover-card`))a.has(r)||(a.add(r),n.push(i(r)));return n}exports.create=o,exports.createHoverCard=i;
package/dist/index.d.cts CHANGED
@@ -7,7 +7,7 @@ interface HoverCardOptions {
7
7
  defaultOpen?: boolean;
8
8
  /** Controlled open state. Internal interactions do not mutate when set. */
9
9
  open?: boolean;
10
- /** Delay before opening on hover/focus (ms). @default 700 */
10
+ /** Delay before opening on hover/keyboard focus (ms). @default 700 */
11
11
  delay?: number;
12
12
  /** Duration to skip delay after closing (ms). Set to 0 to disable warm-up. @default 300 */
13
13
  skipDelayDuration?: number;
package/dist/index.d.ts CHANGED
@@ -7,7 +7,7 @@ interface HoverCardOptions {
7
7
  defaultOpen?: boolean;
8
8
  /** Controlled open state. Internal interactions do not mutate when set. */
9
9
  open?: boolean;
10
- /** Delay before opening on hover/focus (ms). @default 700 */
10
+ /** Delay before opening on hover/keyboard focus (ms). @default 700 */
11
11
  delay?: number;
12
12
  /** Duration to skip delay after closing (ms). Set to 0 to disable warm-up. @default 300 */
13
13
  skipDelayDuration?: number;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{computeFloatingPosition as e,createDismissLayer as t,createPortalLifecycle as n,createPositionSync as r,createPresenceLifecycle as i,emit as a,ensureId as ee,getDataBool as o,getDataEnum as s,getDataNumber as c,getPart as l,getRoots as u,on as d,setAria as f}from"@data-slot/core";const p=[`top`,`right`,`bottom`,`left`],m=[`start`,`center`,`end`];let h=0;function g(u,g={}){let _=l(u,`hover-card-trigger`),v=l(u,`hover-card-content`),y=l(u,`hover-card-positioner`),b=y&&v&&y.contains(v)?y:null,x=l(u,`hover-card-portal`),te=x&&b&&x.contains(b)?x:null;if(!_||!v)throw Error(`Hover-card requires trigger and content slots`);let ne=g.open!==void 0,S=g.defaultOpen??o(u,`defaultOpen`)??!1,C=g.delay??c(u,`delay`)??700,w=g.skipDelayDuration??c(u,`skipDelayDuration`)??300,T=g.closeDelay??c(u,`closeDelay`)??300,re=g.onOpenChange,ie=g.closeOnClickOutside??o(u,`closeOnClickOutside`)??!0,ae=g.closeOnEscape??o(u,`closeOnEscape`)??!0,oe=g.portal??o(v,`portal`)??o(u,`portal`)??!0,E=g.side??s(v,`side`,p)??s(u,`side`,p)??`bottom`,D=g.align??s(v,`align`,m)??s(u,`align`,m)??`center`,se=g.sideOffset??c(v,`sideOffset`)??c(u,`sideOffset`)??4,O=g.alignOffset??c(v,`alignOffset`)??c(u,`alignOffset`)??0,k=g.avoidCollisions??o(v,`avoidCollisions`)??o(u,`avoidCollisions`)??!0,A=g.collisionPadding??c(v,`collisionPadding`)??c(u,`collisionPadding`)??8,j=g.open??S,M=!1,N=!1,P=!1,F=!1,I=null,L=null,R=[],z=n({content:v,root:u,enabled:oe,wrapperSlot:b?void 0:`hover-card-positioner`,container:b??void 0,mountTarget:b?te??b:void 0}),ce=ee(v,`hover-card-content`);_.setAttribute(`aria-haspopup`,`dialog`),_.setAttribute(`aria-controls`,ce),v.setAttribute(`data-side`,E),v.setAttribute(`data-align`,D);let B=()=>_.hasAttribute(`disabled`)||_.getAttribute(`aria-disabled`)===`true`,V=()=>{I&&=(clearTimeout(I),null)},H=()=>{L&&=(clearTimeout(L),null)},U=()=>{V(),H()},W=(e,t)=>{a(u,`hover-card:change`,{open:e,reason:t,trigger:_,content:v}),re?.(e)},G=()=>{let t=z.container,n=u.ownerDocument.defaultView??window,r=e({anchorRect:_.getBoundingClientRect(),contentRect:v.getBoundingClientRect(),side:E,align:D,sideOffset:se,alignOffset:O,avoidCollisions:k,collisionPadding:A});t.style.position=`absolute`,t.style.top=`0px`,t.style.left=`0px`,t.style.transform=`translate3d(${r.x+n.scrollX}px, ${r.y+n.scrollY}px, 0)`,t.style.willChange=`transform`,t.style.margin=`0`,v.setAttribute(`data-side`,r.side),v.setAttribute(`data-align`,r.align),t!==v&&(t.setAttribute(`data-side`,r.side),t.setAttribute(`data-align`,r.align))},K=e=>{let t=z.container;if(u.setAttribute(`data-state`,e),v.setAttribute(`data-state`,e),t!==v&&t.setAttribute(`data-state`,e),e===`open`){u.setAttribute(`data-open`,``),v.setAttribute(`data-open`,``),t!==v&&t.setAttribute(`data-open`,``),u.removeAttribute(`data-closed`),v.removeAttribute(`data-closed`),t!==v&&t.removeAttribute(`data-closed`);return}u.setAttribute(`data-closed`,``),v.setAttribute(`data-closed`,``),t!==v&&t.setAttribute(`data-closed`,``),u.removeAttribute(`data-open`),v.removeAttribute(`data-open`),t!==v&&t.removeAttribute(`data-open`)},q=i({element:v,onExitComplete:()=>{M||(z.restore(),v.hidden=!0)}}),J=r({observedElements:[_,v],isActive:()=>j,ancestorScroll:!1,onUpdate:G}),Y=(e,t)=>{j!==e&&(!e&&j&&w>0&&(h=Date.now()+w),j=e,f(_,`expanded`,j),e?(z.mount(),v.hidden=!1,K(`open`),q.enter(),G(),J.start(),J.update()):(K(`closed`),q.exit(),J.stop()),W(j,t))},X=(e,t)=>{if(j!==e){if(ne){W(e,t);return}Y(e,t)}},Z=(e,t)=>{Y(e,t)},Q=e=>{if(H(),V(),w>0&&Date.now()<h){X(!0,e);return}if(C<=0){X(!0,e);return}I=setTimeout(()=>{I=null,X(!0,e)},C)},le=e=>{if(V(),H(),T<=0){X(!1,e);return}L=setTimeout(()=>{L=null,X(!1,e)},T)},$=e=>{N||P||F||le(e)};return f(_,`expanded`,j),K(j?`open`:`closed`),v.hidden=!j,j&&(z.mount(),q.enter(),v.hidden=!1,G(),J.start(),J.update()),R.push(d(_,`pointerenter`,e=>{e.pointerType!==`touch`&&(N=!0,!B()&&Q(`pointer`))}),d(_,`pointerleave`,e=>{if(e.pointerType===`touch`)return;N=!1;let t=e.relatedTarget;t&&v.contains(t)||$(`pointer`)})),R.push(d(v,`pointerenter`,e=>{e.pointerType!==`touch`&&(P=!0,H())}),d(v,`pointerleave`,e=>{if(e.pointerType===`touch`)return;P=!1;let t=e.relatedTarget;t&&_.contains(t)||$(`pointer`)})),R.push(d(_,`focusin`,()=>{F=!0,!B()&&Q(`focus`)}),d(_,`focusout`,e=>{let t=e.relatedTarget;t&&(_.contains(t)||v.contains(t))||(F=!1,$(`blur`))}),d(v,`focusin`,()=>{F=!0,H()}),d(v,`focusout`,e=>{let t=e.relatedTarget;t&&(_.contains(t)||v.contains(t))||(F=!1,$(`blur`))})),R.push(t({root:u,isOpen:()=>j,onDismiss:()=>X(!1,`dismiss`),closeOnClickOutside:ie,closeOnEscape:ae})),R.push(d(u,`hover-card:set`,e=>{let t=e.detail,n;t?.open===void 0?t?.value!==void 0&&(n=t.value):n=t.open,typeof n==`boolean`&&Z(n,`api`)})),{open:()=>{B()||(U(),X(!0,`api`))},close:()=>{U(),X(!1,`api`)},toggle:()=>{U(),!(!j&&B())&&X(!j,`api`)},setOpen:e=>{U(),Z(e,`api`)},get isOpen(){return j},destroy:()=>{M=!0,U(),J.stop(),q.cleanup(),z.cleanup(),R.forEach(e=>e()),R.length=0}}}const _=new WeakSet;function v(e=document){let t=[];for(let n of u(e,`hover-card`))_.has(n)||(_.add(n),t.push(g(n)));return t}export{v as create,g as createHoverCard};
1
+ import{computeFloatingPosition as e,createDismissLayer as t,createPortalLifecycle as n,createPositionSync as r,createPresenceLifecycle as ee,emit as i,ensureId as te,getDataBool as a,getDataEnum as o,getDataNumber as s,getPart as c,getRoots as l,on as u,setAria as d}from"@data-slot/core";const f=[`top`,`right`,`bottom`,`left`],p=[`start`,`center`,`end`];let m=0;function h(l,h={}){let g=c(l,`hover-card-trigger`),_=c(l,`hover-card-content`),v=c(l,`hover-card-positioner`),y=v&&_&&v.contains(_)?v:null,b=c(l,`hover-card-portal`),ne=b&&y&&b.contains(y)?b:null;if(!g||!_)throw Error(`Hover-card requires trigger and content slots`);let re=h.open!==void 0,ie=h.defaultOpen??a(l,`defaultOpen`)??!1,x=h.delay??s(l,`delay`)??700,S=h.skipDelayDuration??s(l,`skipDelayDuration`)??300,C=h.closeDelay??s(l,`closeDelay`)??300,ae=h.onOpenChange,w=h.closeOnClickOutside??a(l,`closeOnClickOutside`)??!0,oe=h.closeOnEscape??a(l,`closeOnEscape`)??!0,se=h.portal??a(_,`portal`)??a(l,`portal`)??!0,T=h.side??o(_,`side`,f)??o(l,`side`,f)??`bottom`,E=h.align??o(_,`align`,p)??o(l,`align`,p)??`center`,ce=h.sideOffset??s(_,`sideOffset`)??s(l,`sideOffset`)??4,D=h.alignOffset??s(_,`alignOffset`)??s(l,`alignOffset`)??0,O=h.avoidCollisions??a(_,`avoidCollisions`)??a(l,`avoidCollisions`)??!0,le=h.collisionPadding??s(_,`collisionPadding`)??s(l,`collisionPadding`)??8,k=h.open??ie,A=!1,j=!1,M=!1,N=!1,P=null,F=null,I=-1/0,L=-1/0,R=[],z=n({content:_,root:l,enabled:se,wrapperSlot:y?void 0:`hover-card-positioner`,container:y??void 0,mountTarget:y?ne??y:void 0}),ue=te(_,`hover-card-content`);g.setAttribute(`aria-haspopup`,`dialog`),g.setAttribute(`aria-controls`,ue),_.setAttribute(`data-side`,T),_.setAttribute(`data-align`,E);let B=()=>g.hasAttribute(`disabled`)||g.getAttribute(`aria-disabled`)===`true`,V=()=>{P&&=(clearTimeout(P),null)},H=()=>{F&&=(clearTimeout(F),null)},U=()=>{V(),H()},W=(e,t)=>{i(l,`hover-card:change`,{open:e,reason:t,trigger:g,content:_}),ae?.(e)},G=()=>{let t=z.container,n=l.ownerDocument.defaultView??window,r=e({anchorRect:g.getBoundingClientRect(),contentRect:_.getBoundingClientRect(),side:T,align:E,sideOffset:ce,alignOffset:D,avoidCollisions:O,collisionPadding:le});t.style.position=`absolute`,t.style.top=`0px`,t.style.left=`0px`,t.style.transform=`translate3d(${r.x+n.scrollX}px, ${r.y+n.scrollY}px, 0)`,t.style.willChange=`transform`,t.style.margin=`0`,_.setAttribute(`data-side`,r.side),_.setAttribute(`data-align`,r.align),t!==_&&(t.setAttribute(`data-side`,r.side),t.setAttribute(`data-align`,r.align))},K=e=>{let t=z.container;if(l.setAttribute(`data-state`,e),_.setAttribute(`data-state`,e),t!==_&&t.setAttribute(`data-state`,e),e===`open`){l.setAttribute(`data-open`,``),_.setAttribute(`data-open`,``),t!==_&&t.setAttribute(`data-open`,``),l.removeAttribute(`data-closed`),_.removeAttribute(`data-closed`),t!==_&&t.removeAttribute(`data-closed`);return}l.setAttribute(`data-closed`,``),_.setAttribute(`data-closed`,``),t!==_&&t.setAttribute(`data-closed`,``),l.removeAttribute(`data-open`),_.removeAttribute(`data-open`),t!==_&&t.removeAttribute(`data-open`)},q=ee({element:_,onExitComplete:()=>{A||(z.restore(),_.hidden=!0)}}),J=r({observedElements:[g,_],isActive:()=>k,ancestorScroll:!1,onUpdate:G}),Y=(e,t)=>{k!==e&&(!e&&k&&S>0&&(m=Date.now()+S),k=e,d(g,`expanded`,k),e?(z.mount(),_.hidden=!1,K(`open`),q.enter(),G(),J.start(),J.update()):(K(`closed`),q.exit(),J.stop()),W(k,t))},X=(e,t)=>{if(k!==e){if(re){W(e,t);return}Y(e,t)}},Z=(e,t)=>{Y(e,t)},Q=e=>{if(H(),V(),S>0&&Date.now()<m){X(!0,e);return}if(x<=0){X(!0,e);return}P=setTimeout(()=>{P=null,X(!0,e)},x)},de=e=>{if(V(),H(),C<=0){X(!1,e);return}F=setTimeout(()=>{F=null,X(!1,e)},C)},$=e=>{j||M||N||de(e)};return d(g,`expanded`,k),K(k?`open`:`closed`),_.hidden=!k,k&&(z.mount(),q.enter(),_.hidden=!1,G(),J.start(),J.update()),R.push(u(l.ownerDocument,`keydown`,e=>{e.key===`Tab`&&(I=Date.now())},{capture:!0}),u(l.ownerDocument,`pointerdown`,()=>{I=-1/0,L=-1/0},{capture:!0}),u(l.ownerDocument,`pointermove`,e=>{e.pointerType!==`touch`&&(L=Date.now())},{capture:!0}),u(g,`pointerenter`,e=>{e.pointerType!==`touch`&&(j=!0,!B()&&(Date.now()-L>250||Q(`pointer`)))}),u(g,`pointermove`,e=>{e.pointerType!==`touch`&&(!j||B()||k||P||Q(`pointer`))}),u(g,`pointerleave`,e=>{if(e.pointerType===`touch`)return;j=!1;let t=e.relatedTarget;t&&_.contains(t)||$(`pointer`)})),R.push(u(_,`pointerenter`,e=>{e.pointerType!==`touch`&&(M=!0,H())}),u(_,`pointerleave`,e=>{if(e.pointerType===`touch`)return;M=!1;let t=e.relatedTarget;t&&g.contains(t)||$(`pointer`)})),R.push(u(g,`focusin`,()=>{N=!0,!B()&&(Date.now()-I>750||Q(`focus`))}),u(g,`focusout`,e=>{let t=e.relatedTarget;t&&(g.contains(t)||_.contains(t))||(N=!1,$(`blur`))}),u(_,`focusin`,()=>{N=!0,H()}),u(_,`focusout`,e=>{let t=e.relatedTarget;t&&(g.contains(t)||_.contains(t))||(N=!1,$(`blur`))})),R.push(t({root:l,isOpen:()=>k,onDismiss:()=>X(!1,`dismiss`),closeOnClickOutside:w,closeOnEscape:oe})),R.push(u(l,`hover-card:set`,e=>{let t=e.detail,n;t?.open===void 0?t?.value!==void 0&&(n=t.value):n=t.open,typeof n==`boolean`&&Z(n,`api`)})),{open:()=>{B()||(U(),X(!0,`api`))},close:()=>{U(),X(!1,`api`)},toggle:()=>{U(),!(!k&&B())&&X(!k,`api`)},setOpen:e=>{U(),Z(e,`api`)},get isOpen(){return k},destroy:()=>{A=!0,U(),J.stop(),q.cleanup(),z.cleanup(),R.forEach(e=>e()),R.length=0}}}const g=new WeakSet;function _(e=document){let t=[];for(let n of l(e,`hover-card`))g.has(n)||(g.add(n),t.push(h(n)));return t}export{_ as create,h as createHoverCard};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@data-slot/hover-card",
3
- "version": "0.2.86",
3
+ "version": "0.2.88",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.cjs",
@@ -39,6 +39,6 @@
39
39
  ],
40
40
  "license": "MIT",
41
41
  "dependencies": {
42
- "@data-slot/core": "0.2.86"
42
+ "@data-slot/core": "0.2.88"
43
43
  }
44
44
  }