@data-slot/popover 0.2.42 → 0.2.44

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
@@ -144,32 +144,66 @@ Placement can be set on root or content (content takes precedence):
144
144
 
145
145
  ## Styling
146
146
 
147
- Popover position is computed in JavaScript and applied as `position: absolute` + inline `top/left`.
148
- By default, content is portaled to `document.body` while open, so absolute positioning is based on document coordinates.
149
- Use `data-state`, `data-side`, and `data-align` for styling/animation:
147
+ Popover position is computed in JavaScript and applied as `position: absolute` + inline `transform: translate3d(...)`.
148
+ By default, content is portaled to `document.body` while open (document coordinates). In this mode, a generated `popover-positioner` wrapper receives the positioning transform. If `portal` is disabled, positioning is applied directly to `popover-content`.
149
+ Use `data-open`/`data-closed` and `data-side` for styling/animation.
150
+ When portaling is enabled (default), a transient wrapper with `data-slot="popover-positioner"` is created while open and receives the positioning transform. This keeps `popover-content` free for transform animations.
150
151
 
151
152
  ```css
152
- /* Hidden state */
153
- [data-slot="popover-content"][hidden] {
154
- display: none;
153
+ [data-slot="popover-content"] {
154
+ transform-origin: var(--transform-origin, center);
155
+ --popover-slide-x: 0px;
156
+ --popover-slide-y: -4px;
155
157
  }
156
158
 
157
- [data-slot="popover-content"] {
158
- position: absolute;
159
- transition: opacity 0.2s ease-out, transform 0.2s ease-out;
159
+ [data-slot="popover-content"][data-side="top"] {
160
+ --popover-slide-y: 4px;
161
+ }
162
+ [data-slot="popover-content"][data-side="bottom"] {
163
+ --popover-slide-y: -4px;
164
+ }
165
+ [data-slot="popover-content"][data-side="left"] {
166
+ --popover-slide-x: 4px;
167
+ --popover-slide-y: 0px;
168
+ }
169
+ [data-slot="popover-content"][data-side="right"] {
170
+ --popover-slide-x: -4px;
171
+ --popover-slide-y: 0px;
160
172
  }
161
173
 
162
- [data-slot="popover-content"][hidden][data-side="top"] {
163
- transform: translateY(4px);
174
+ [data-slot="popover-content"][data-open] {
175
+ animation: popover-in 160ms cubic-bezier(0.16, 1, 0.3, 1);
164
176
  }
165
- [data-slot="popover-content"][hidden][data-side="bottom"] {
166
- transform: translateY(-4px);
177
+
178
+ [data-slot="popover-content"][data-closed] {
179
+ pointer-events: none;
180
+ animation: popover-out 120ms ease-in forwards;
167
181
  }
168
- [data-slot="popover-content"][hidden][data-side="left"] {
169
- transform: translateX(4px);
182
+
183
+ @keyframes popover-in {
184
+ from {
185
+ opacity: 0;
186
+ scale: 0.96;
187
+ translate: var(--popover-slide-x) var(--popover-slide-y);
188
+ }
189
+ to {
190
+ opacity: 1;
191
+ scale: 1;
192
+ translate: 0 0;
193
+ }
170
194
  }
171
- [data-slot="popover-content"][hidden][data-side="right"] {
172
- transform: translateX(-4px);
195
+
196
+ @keyframes popover-out {
197
+ from {
198
+ opacity: 1;
199
+ scale: 1;
200
+ translate: 0 0;
201
+ }
202
+ to {
203
+ opacity: 0;
204
+ scale: 0.96;
205
+ translate: var(--popover-slide-x) var(--popover-slide-y);
206
+ }
173
207
  }
174
208
  ```
175
209
 
@@ -182,13 +216,15 @@ With Tailwind:
182
216
  data-slot="popover-content"
183
217
  data-side="bottom"
184
218
  data-align="start"
185
- class="absolute bg-white shadow-lg rounded-lg p-4 transition data-[state=closed]:opacity-0"
219
+ class="absolute bg-white shadow-lg rounded-lg p-4"
186
220
  >
187
221
  Content
188
222
  </div>
189
223
  </div>
190
224
  ```
191
225
 
226
+ Use Tailwind for layout/colors and keep the state selectors from the CSS snippet above for fade/zoom animation.
227
+
192
228
  ## Accessibility
193
229
 
194
230
  The component automatically handles:
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`];function r(r,i={}){let a=(0,e.getPart)(r,`popover-trigger`),o=(0,e.getPart)(r,`popover-content`),s=(0,e.getPart)(r,`popover-close`);if(!a||!o)throw Error(`Popover requires trigger and content slots`);let c=i.defaultOpen??(0,e.getDataBool)(r,`defaultOpen`)??!1,l=i.onOpenChange,u=i.closeOnClickOutside??(0,e.getDataBool)(r,`closeOnClickOutside`)??!0,d=i.closeOnEscape??(0,e.getDataBool)(r,`closeOnEscape`)??!0,f=i.portal??(0,e.getDataBool)(o,`portal`)??(0,e.getDataBool)(r,`portal`)??!0,p=i.position??(0,e.getDataEnum)(o,`position`,t)??(0,e.getDataEnum)(r,`position`,t),m=i.side??(0,e.getDataEnum)(o,`side`,t)??(0,e.getDataEnum)(r,`side`,t)??p??`bottom`,h=i.align??(0,e.getDataEnum)(o,`align`,n)??(0,e.getDataEnum)(r,`align`,n)??`center`,g=i.sideOffset??(0,e.getDataNumber)(o,`sideOffset`)??(0,e.getDataNumber)(r,`sideOffset`)??4,_=i.alignOffset??(0,e.getDataNumber)(o,`alignOffset`)??(0,e.getDataNumber)(r,`alignOffset`)??0,v=i.avoidCollisions??(0,e.getDataBool)(o,`avoidCollisions`)??(0,e.getDataBool)(r,`avoidCollisions`)??!0,y=i.collisionPadding??(0,e.getDataNumber)(o,`collisionPadding`)??(0,e.getDataNumber)(r,`collisionPadding`)??8,b=c,x=[],S=(0,e.createPortalLifecycle)({content:o,root:r,enabled:f}),C=null,w=!1,T=()=>{w&&=(o.removeAttribute(`tabindex`),!1)},E=()=>{let e=o.querySelector(`[autofocus]`);if(e)return e.focus();let t=o.querySelector(`a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"])`);if(t)return t.focus();o.getAttribute(`tabindex`)||(o.setAttribute(`tabindex`,`-1`),w=!0),o.focus()},D=(0,e.ensureId)(o,`popover-content`);a.setAttribute(`aria-haspopup`,`dialog`),a.setAttribute(`aria-controls`,D),o.setAttribute(`data-side`,m),o.setAttribute(`data-align`,h),o.setAttribute(`data-position`,m);let O=()=>{let t=r.ownerDocument.defaultView??window,n=(0,e.computeFloatingPosition)({anchorRect:a.getBoundingClientRect(),contentRect:o.getBoundingClientRect(),side:m,align:h,sideOffset:g,alignOffset:_,avoidCollisions:v,collisionPadding:y});o.style.position=`absolute`,o.style.top=`${n.y+t.scrollY}px`,o.style.left=`${n.x+t.scrollX}px`,o.style.margin=`0`,o.setAttribute(`data-side`,n.side),o.setAttribute(`data-align`,n.align),o.setAttribute(`data-position`,n.side)},k=(0,e.createPositionSync)({observedElements:[a,o],isActive:()=>b,ancestorScroll:!1,onUpdate:O}),A=t=>{b!==t&&(t&&(C=document.activeElement),b=t,(0,e.setAria)(a,`expanded`,b),(0,e.emit)(r,`popover:change`,{open:b}),l?.(b),t?(S.mount(),o.hidden=!1,r.setAttribute(`data-state`,`open`),o.setAttribute(`data-state`,`open`),O(),k.start(),k.update(),requestAnimationFrame(E)):(k.stop(),S.restore(),o.hidden=!0,r.setAttribute(`data-state`,`closed`),o.setAttribute(`data-state`,`closed`),T(),requestAnimationFrame(()=>{C&&C.isConnected?C.focus():a.focus(),C=null})))};return(0,e.setAria)(a,`expanded`,b),o.hidden=!b,r.setAttribute(`data-state`,b?`open`:`closed`),o.setAttribute(`data-state`,b?`open`:`closed`),c&&(S.mount(),O(),k.start(),k.update(),requestAnimationFrame(E)),x.push((0,e.on)(a,`click`,()=>A(!b))),s&&x.push((0,e.on)(s,`click`,()=>A(!1))),x.push((0,e.createDismissLayer)({root:r,isOpen:()=>b,onDismiss:()=>A(!1),closeOnClickOutside:u,closeOnEscape:d})),x.push((0,e.on)(r,`popover:set`,e=>{let t=e.detail,n;t?.open===void 0?t?.value!==void 0&&(n=t.value):n=t.open,typeof n==`boolean`&&A(n)})),{open:()=>A(!0),close:()=>A(!1),toggle:()=>A(!b),get isOpen(){return b},destroy:()=>{k.stop(),S.cleanup(),x.forEach(e=>e()),x.length=0,T()}}}const i=new WeakSet;function a(t=document){let n=[];for(let a of(0,e.getRoots)(t,`popover`))i.has(a)||(i.add(a),n.push(r(a)));return n}exports.create=a,exports.createPopover=r;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@data-slot/core`);const t=[`top`,`right`,`bottom`,`left`],n=[`start`,`center`,`end`];function r(r,i={}){let a=(0,e.getPart)(r,`popover-trigger`),o=(0,e.getPart)(r,`popover-content`),s=(0,e.getPart)(r,`popover-close`);if(!a||!o)throw Error(`Popover requires trigger and content slots`);let c=i.defaultOpen??(0,e.getDataBool)(r,`defaultOpen`)??!1,l=i.onOpenChange,u=i.closeOnClickOutside??(0,e.getDataBool)(r,`closeOnClickOutside`)??!0,d=i.closeOnEscape??(0,e.getDataBool)(r,`closeOnEscape`)??!0,f=i.portal??(0,e.getDataBool)(o,`portal`)??(0,e.getDataBool)(r,`portal`)??!0,p=i.position??(0,e.getDataEnum)(o,`position`,t)??(0,e.getDataEnum)(r,`position`,t),m=i.side??(0,e.getDataEnum)(o,`side`,t)??(0,e.getDataEnum)(r,`side`,t)??p??`bottom`,h=i.align??(0,e.getDataEnum)(o,`align`,n)??(0,e.getDataEnum)(r,`align`,n)??`center`,g=i.sideOffset??(0,e.getDataNumber)(o,`sideOffset`)??(0,e.getDataNumber)(r,`sideOffset`)??4,_=i.alignOffset??(0,e.getDataNumber)(o,`alignOffset`)??(0,e.getDataNumber)(r,`alignOffset`)??0,v=i.avoidCollisions??(0,e.getDataBool)(o,`avoidCollisions`)??(0,e.getDataBool)(r,`avoidCollisions`)??!0,y=i.collisionPadding??(0,e.getDataNumber)(o,`collisionPadding`)??(0,e.getDataNumber)(r,`collisionPadding`)??8,b=c,x=[],S=(0,e.createPortalLifecycle)({content:o,root:r,enabled:f,wrapperSlot:`popover-positioner`}),C=!1,w=null,T=!1,E=()=>{T&&=(o.removeAttribute(`tabindex`),!1)},D=()=>{let e=o.querySelector(`[autofocus]`);if(e)return e.focus();let t=o.querySelector(`a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"])`);if(t)return t.focus();o.getAttribute(`tabindex`)||(o.setAttribute(`tabindex`,`-1`),T=!0),o.focus()},O=(0,e.ensureId)(o,`popover-content`);a.setAttribute(`aria-haspopup`,`dialog`),a.setAttribute(`aria-controls`,O),o.setAttribute(`data-side`,m),o.setAttribute(`data-align`,h),o.setAttribute(`data-position`,m);let k=()=>{let t=S.container,n=r.ownerDocument.defaultView??window,i=(0,e.computeFloatingPosition)({anchorRect:a.getBoundingClientRect(),contentRect:o.getBoundingClientRect(),side:m,align:h,sideOffset:g,alignOffset:_,avoidCollisions:v,collisionPadding:y});t.style.position=`absolute`,t.style.top=`0px`,t.style.left=`0px`,t.style.transform=`translate3d(${i.x+n.scrollX}px, ${i.y+n.scrollY}px, 0)`,t.style.willChange=`transform`,t.style.margin=`0`,o.setAttribute(`data-side`,i.side),o.setAttribute(`data-align`,i.align),t!==o&&(t.setAttribute(`data-side`,i.side),t.setAttribute(`data-align`,i.align)),o.setAttribute(`data-position`,i.side)},A=e=>{let t=S.container;r.setAttribute(`data-state`,e),o.setAttribute(`data-state`,e),t!==o&&t.setAttribute(`data-state`,e),e===`open`?(r.setAttribute(`data-open`,``),o.setAttribute(`data-open`,``),t!==o&&t.setAttribute(`data-open`,``),r.removeAttribute(`data-closed`),o.removeAttribute(`data-closed`),t!==o&&t.removeAttribute(`data-closed`)):(r.setAttribute(`data-closed`,``),o.setAttribute(`data-closed`,``),t!==o&&t.setAttribute(`data-closed`,``),r.removeAttribute(`data-open`),o.removeAttribute(`data-open`),t!==o&&t.removeAttribute(`data-open`))},j=()=>{requestAnimationFrame(()=>{w&&w.isConnected?w.focus():a.focus(),w=null})},M=(0,e.createPresenceLifecycle)({element:o,onExitComplete:()=>{C||(S.restore(),o.hidden=!0,E(),j())}}),N=(0,e.createPositionSync)({observedElements:[a,o],isActive:()=>b,ancestorScroll:!1,onUpdate:k}),P=t=>{b!==t&&(t&&(w=document.activeElement),b=t,(0,e.setAria)(a,`expanded`,b),t?(S.mount(),o.hidden=!1,A(`open`),M.enter(),k(),N.start(),N.update(),requestAnimationFrame(D)):(A(`closed`),M.exit(),N.stop()),(0,e.emit)(r,`popover:change`,{open:b}),l?.(b))};return(0,e.setAria)(a,`expanded`,b),A(b?`open`:`closed`),o.hidden=!b,c&&(S.mount(),M.enter(),o.hidden=!1,k(),N.start(),N.update(),requestAnimationFrame(D)),x.push((0,e.on)(a,`click`,()=>P(!b))),s&&x.push((0,e.on)(s,`click`,()=>P(!1))),x.push((0,e.createDismissLayer)({root:r,isOpen:()=>b,onDismiss:()=>P(!1),closeOnClickOutside:u,closeOnEscape:d})),x.push((0,e.on)(r,`popover:set`,e=>{let t=e.detail,n;t?.open===void 0?t?.value!==void 0&&(n=t.value):n=t.open,typeof n==`boolean`&&P(n)})),{open:()=>P(!0),close:()=>P(!1),toggle:()=>P(!b),get isOpen(){return b},destroy:()=>{C=!0,N.stop(),M.cleanup(),S.cleanup(),x.forEach(e=>e()),x.length=0,E()}}}const i=new WeakSet;function a(t=document){let n=[];for(let a of(0,e.getRoots)(t,`popover`))i.has(a)||(i.add(a),n.push(r(a)));return n}exports.create=a,exports.createPopover=r;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{computeFloatingPosition as e,createDismissLayer as t,createPortalLifecycle as n,createPositionSync as r,emit as i,ensureId as a,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`];function h(u,h={}){let g=l(u,`popover-trigger`),_=l(u,`popover-content`),v=l(u,`popover-close`);if(!g||!_)throw Error(`Popover requires trigger and content slots`);let y=h.defaultOpen??o(u,`defaultOpen`)??!1,b=h.onOpenChange,x=h.closeOnClickOutside??o(u,`closeOnClickOutside`)??!0,S=h.closeOnEscape??o(u,`closeOnEscape`)??!0,C=h.portal??o(_,`portal`)??o(u,`portal`)??!0,w=h.position??s(_,`position`,p)??s(u,`position`,p),T=h.side??s(_,`side`,p)??s(u,`side`,p)??w??`bottom`,E=h.align??s(_,`align`,m)??s(u,`align`,m)??`center`,D=h.sideOffset??c(_,`sideOffset`)??c(u,`sideOffset`)??4,O=h.alignOffset??c(_,`alignOffset`)??c(u,`alignOffset`)??0,k=h.avoidCollisions??o(_,`avoidCollisions`)??o(u,`avoidCollisions`)??!0,A=h.collisionPadding??c(_,`collisionPadding`)??c(u,`collisionPadding`)??8,j=y,M=[],N=n({content:_,root:u,enabled:C}),P=null,F=!1,I=()=>{F&&=(_.removeAttribute(`tabindex`),!1)},L=()=>{let e=_.querySelector(`[autofocus]`);if(e)return e.focus();let t=_.querySelector(`a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"])`);if(t)return t.focus();_.getAttribute(`tabindex`)||(_.setAttribute(`tabindex`,`-1`),F=!0),_.focus()},R=a(_,`popover-content`);g.setAttribute(`aria-haspopup`,`dialog`),g.setAttribute(`aria-controls`,R),_.setAttribute(`data-side`,T),_.setAttribute(`data-align`,E),_.setAttribute(`data-position`,T);let z=()=>{let t=u.ownerDocument.defaultView??window,n=e({anchorRect:g.getBoundingClientRect(),contentRect:_.getBoundingClientRect(),side:T,align:E,sideOffset:D,alignOffset:O,avoidCollisions:k,collisionPadding:A});_.style.position=`absolute`,_.style.top=`${n.y+t.scrollY}px`,_.style.left=`${n.x+t.scrollX}px`,_.style.margin=`0`,_.setAttribute(`data-side`,n.side),_.setAttribute(`data-align`,n.align),_.setAttribute(`data-position`,n.side)},B=r({observedElements:[g,_],isActive:()=>j,ancestorScroll:!1,onUpdate:z}),V=e=>{j!==e&&(e&&(P=document.activeElement),j=e,f(g,`expanded`,j),i(u,`popover:change`,{open:j}),b?.(j),e?(N.mount(),_.hidden=!1,u.setAttribute(`data-state`,`open`),_.setAttribute(`data-state`,`open`),z(),B.start(),B.update(),requestAnimationFrame(L)):(B.stop(),N.restore(),_.hidden=!0,u.setAttribute(`data-state`,`closed`),_.setAttribute(`data-state`,`closed`),I(),requestAnimationFrame(()=>{P&&P.isConnected?P.focus():g.focus(),P=null})))};return f(g,`expanded`,j),_.hidden=!j,u.setAttribute(`data-state`,j?`open`:`closed`),_.setAttribute(`data-state`,j?`open`:`closed`),y&&(N.mount(),z(),B.start(),B.update(),requestAnimationFrame(L)),M.push(d(g,`click`,()=>V(!j))),v&&M.push(d(v,`click`,()=>V(!1))),M.push(t({root:u,isOpen:()=>j,onDismiss:()=>V(!1),closeOnClickOutside:x,closeOnEscape:S})),M.push(d(u,`popover:set`,e=>{let t=e.detail,n;t?.open===void 0?t?.value!==void 0&&(n=t.value):n=t.open,typeof n==`boolean`&&V(n)})),{open:()=>V(!0),close:()=>V(!1),toggle:()=>V(!j),get isOpen(){return j},destroy:()=>{B.stop(),N.cleanup(),M.forEach(e=>e()),M.length=0,I()}}}const g=new WeakSet;function _(e=document){let t=[];for(let n of u(e,`popover`))g.has(n)||(g.add(n),t.push(h(n)));return t}export{_ as create,h as createPopover};
1
+ import{computeFloatingPosition as e,createDismissLayer as t,createPortalLifecycle as n,createPositionSync as r,createPresenceLifecycle as i,emit as a,ensureId as o,getDataBool as s,getDataEnum as c,getDataNumber as l,getPart as u,getRoots as d,on as f,setAria as p}from"@data-slot/core";const m=[`top`,`right`,`bottom`,`left`],h=[`start`,`center`,`end`];function g(d,g={}){let _=u(d,`popover-trigger`),v=u(d,`popover-content`),y=u(d,`popover-close`);if(!_||!v)throw Error(`Popover requires trigger and content slots`);let b=g.defaultOpen??s(d,`defaultOpen`)??!1,x=g.onOpenChange,S=g.closeOnClickOutside??s(d,`closeOnClickOutside`)??!0,C=g.closeOnEscape??s(d,`closeOnEscape`)??!0,w=g.portal??s(v,`portal`)??s(d,`portal`)??!0,T=g.position??c(v,`position`,m)??c(d,`position`,m),E=g.side??c(v,`side`,m)??c(d,`side`,m)??T??`bottom`,D=g.align??c(v,`align`,h)??c(d,`align`,h)??`center`,O=g.sideOffset??l(v,`sideOffset`)??l(d,`sideOffset`)??4,k=g.alignOffset??l(v,`alignOffset`)??l(d,`alignOffset`)??0,A=g.avoidCollisions??s(v,`avoidCollisions`)??s(d,`avoidCollisions`)??!0,j=g.collisionPadding??l(v,`collisionPadding`)??l(d,`collisionPadding`)??8,M=b,N=[],P=n({content:v,root:d,enabled:w,wrapperSlot:`popover-positioner`}),F=!1,I=null,L=!1,R=()=>{L&&=(v.removeAttribute(`tabindex`),!1)},z=()=>{let e=v.querySelector(`[autofocus]`);if(e)return e.focus();let t=v.querySelector(`a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"])`);if(t)return t.focus();v.getAttribute(`tabindex`)||(v.setAttribute(`tabindex`,`-1`),L=!0),v.focus()},B=o(v,`popover-content`);_.setAttribute(`aria-haspopup`,`dialog`),_.setAttribute(`aria-controls`,B),v.setAttribute(`data-side`,E),v.setAttribute(`data-align`,D),v.setAttribute(`data-position`,E);let V=()=>{let t=P.container,n=d.ownerDocument.defaultView??window,r=e({anchorRect:_.getBoundingClientRect(),contentRect:v.getBoundingClientRect(),side:E,align:D,sideOffset:O,alignOffset:k,avoidCollisions:A,collisionPadding:j});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)),v.setAttribute(`data-position`,r.side)},H=e=>{let t=P.container;d.setAttribute(`data-state`,e),v.setAttribute(`data-state`,e),t!==v&&t.setAttribute(`data-state`,e),e===`open`?(d.setAttribute(`data-open`,``),v.setAttribute(`data-open`,``),t!==v&&t.setAttribute(`data-open`,``),d.removeAttribute(`data-closed`),v.removeAttribute(`data-closed`),t!==v&&t.removeAttribute(`data-closed`)):(d.setAttribute(`data-closed`,``),v.setAttribute(`data-closed`,``),t!==v&&t.setAttribute(`data-closed`,``),d.removeAttribute(`data-open`),v.removeAttribute(`data-open`),t!==v&&t.removeAttribute(`data-open`))},U=()=>{requestAnimationFrame(()=>{I&&I.isConnected?I.focus():_.focus(),I=null})},W=i({element:v,onExitComplete:()=>{F||(P.restore(),v.hidden=!0,R(),U())}}),G=r({observedElements:[_,v],isActive:()=>M,ancestorScroll:!1,onUpdate:V}),K=e=>{M!==e&&(e&&(I=document.activeElement),M=e,p(_,`expanded`,M),e?(P.mount(),v.hidden=!1,H(`open`),W.enter(),V(),G.start(),G.update(),requestAnimationFrame(z)):(H(`closed`),W.exit(),G.stop()),a(d,`popover:change`,{open:M}),x?.(M))};return p(_,`expanded`,M),H(M?`open`:`closed`),v.hidden=!M,b&&(P.mount(),W.enter(),v.hidden=!1,V(),G.start(),G.update(),requestAnimationFrame(z)),N.push(f(_,`click`,()=>K(!M))),y&&N.push(f(y,`click`,()=>K(!1))),N.push(t({root:d,isOpen:()=>M,onDismiss:()=>K(!1),closeOnClickOutside:S,closeOnEscape:C})),N.push(f(d,`popover:set`,e=>{let t=e.detail,n;t?.open===void 0?t?.value!==void 0&&(n=t.value):n=t.open,typeof n==`boolean`&&K(n)})),{open:()=>K(!0),close:()=>K(!1),toggle:()=>K(!M),get isOpen(){return M},destroy:()=>{F=!0,G.stop(),W.cleanup(),P.cleanup(),N.forEach(e=>e()),N.length=0,R()}}}const _=new WeakSet;function v(e=document){let t=[];for(let n of d(e,`popover`))_.has(n)||(_.add(n),t.push(g(n)));return t}export{v as create,g as createPopover};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@data-slot/popover",
3
- "version": "0.2.42",
3
+ "version": "0.2.44",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.cjs",
@@ -38,6 +38,6 @@
38
38
  ],
39
39
  "license": "MIT",
40
40
  "dependencies": {
41
- "@data-slot/core": "0.2.42"
41
+ "@data-slot/core": "0.2.44"
42
42
  }
43
43
  }