@@ -196,9 +196,16 @@ export const Sileo = memo(function Sileo({
196196 }
197197 } ;
198198 measure ( ) ;
199- const ro = new ResizeObserver ( measure ) ;
199+ let rafId = 0 ;
200+ const ro = new ResizeObserver ( ( ) => {
201+ cancelAnimationFrame ( rafId ) ;
202+ rafId = requestAnimationFrame ( measure ) ;
203+ } ) ;
200204 ro . observe ( el ) ;
201- return ( ) => ro . disconnect ( ) ;
205+ return ( ) => {
206+ cancelAnimationFrame ( rafId ) ;
207+ ro . disconnect ( ) ;
208+ } ;
202209 } , [ headerLayer . current . key ] ) ;
203210
204211 useLayoutEffect ( ( ) => {
@@ -213,9 +220,16 @@ export const Sileo = memo(function Sileo({
213220 setContentHeight ( ( prev ) => ( prev === h ? prev : h ) ) ;
214221 } ;
215222 measure ( ) ;
216- const ro = new ResizeObserver ( measure ) ;
223+ let rafId = 0 ;
224+ const ro = new ResizeObserver ( ( ) => {
225+ cancelAnimationFrame ( rafId ) ;
226+ rafId = requestAnimationFrame ( measure ) ;
227+ } ) ;
217228 ro . observe ( el ) ;
218- return ( ) => ro . disconnect ( ) ;
229+ return ( ) => {
230+ cancelAnimationFrame ( rafId ) ;
231+ ro . disconnect ( ) ;
232+ } ;
219233 } , [ hasDesc ] ) ;
220234
221235 useEffect ( ( ) => {
@@ -364,33 +378,18 @@ export const Sileo = memo(function Sileo({
364378
365379 /* ------------------------------- Inline styles ---------------------------- */
366380
367- const viewport = useMemo < CSSProperties > (
368- ( ) => ( { height : open ? expanded : HEIGHT } ) ,
369- [ open , expanded ] ,
370- ) ;
371- const pill = useMemo < CSSProperties > (
381+ const rootStyle = useMemo < CSSProperties & Record < string , string > > (
372382 ( ) => ( {
373- transform : `scaleY(${ open ? 1 : HEIGHT / expanded } )` ,
374- width : resolvedPillWidth ,
375- height : open ? expanded - 5 : expanded ,
383+ "--_h" : `${ open ? expanded : HEIGHT } px` ,
384+ "--_pw" : `${ resolvedPillWidth } px` ,
385+ "--_px" : `${ pillX } px` ,
386+ "--_sy" : `${ open ? 1 : HEIGHT / expanded } ` ,
387+ "--_ph" : `${ open ? expanded - 5 : expanded } px` ,
388+ "--_by" : `${ open ? 1 : 0 } ` ,
389+ "--_ht" : `translateY(${ open ? ( expand === "bottom" ? 3 : - 3 ) : 0 } px) scale(${ open ? 0.9 : 1 } )` ,
390+ "--_co" : `${ open ? 1 : 0 } ` ,
376391 } ) ,
377- [ open , expanded , resolvedPillWidth ] ,
378- ) ;
379- const body = useMemo < CSSProperties > (
380- ( ) => ( { transform : `scaleY(${ open ? 1 : 0 } )` , opacity : open ? 1 : 0 } ) ,
381- [ open ] ,
382- ) ;
383- const header = useMemo (
384- ( ) => ( {
385- left : pillX ,
386- transform : `translateY(${ open ? ( expand === "bottom" ? 3 : - 3 ) : 0 } px) scale(${ open ? 0.9 : 1 } )` ,
387- "--sileo-pill-width" : `${ resolvedPillWidth } px` ,
388- } ) ,
389- [ pillX , open , expand , resolvedPillWidth ] ,
390- ) ;
391- const contentStyle = useMemo < CSSProperties > (
392- ( ) => ( { opacity : open ? 1 : 0 } ) ,
393- [ open ] ,
392+ [ open , expanded , resolvedPillWidth , pillX , expand ] ,
394393 ) ;
395394
396395 /* -------------------------------- Handlers -------------------------------- */
@@ -461,8 +460,8 @@ export const Sileo = memo(function Sileo({
461460 }
462461 } ;
463462
464- el . addEventListener ( "pointermove" , onMove ) ;
465- el . addEventListener ( "pointerup" , onUp ) ;
463+ el . addEventListener ( "pointermove" , onMove , { passive : true } ) ;
464+ el . addEventListener ( "pointerup" , onUp , { passive : true } ) ;
466465 return ( ) => {
467466 el . removeEventListener ( "pointermove" , onMove ) ;
468467 el . removeEventListener ( "pointerup" , onUp ) ;
@@ -472,6 +471,8 @@ export const Sileo = memo(function Sileo({
472471 const handlePointerDown = useCallback (
473472 ( e : React . PointerEvent < HTMLButtonElement > ) => {
474473 if ( exiting || ! onDismiss ) return ;
474+ const target = e . target as HTMLElement ;
475+ if ( target . closest ( "[data-sileo-button]" ) ) return ;
475476 pointerStartRef . current = e . clientY ;
476477 e . currentTarget . setPointerCapture ( e . pointerId ) ;
477478 } ,
@@ -492,7 +493,7 @@ export const Sileo = memo(function Sileo({
492493 data-position = { position }
493494 data-state = { view . state }
494495 className = { className }
495- style = { viewport }
496+ style = { rootStyle }
496497 onMouseEnter = { handleEnter }
497498 onMouseLeave = { handleLeave }
498499 onTransitionEnd = { handleTransitionEnd }
@@ -514,7 +515,6 @@ export const Sileo = memo(function Sileo({
514515 rx = { resolvedRoundness }
515516 ry = { resolvedRoundness }
516517 fill = { view . fill }
517- style = { pill }
518518 />
519519 < rect
520520 data-sileo-body
@@ -524,13 +524,12 @@ export const Sileo = memo(function Sileo({
524524 rx = { resolvedRoundness }
525525 ry = { resolvedRoundness }
526526 fill = { view . fill }
527- style = { body }
528527 />
529528 </ g >
530529 </ svg >
531530 </ div >
532531
533- < div ref = { headerRef } data-sileo-header data-edge = { expand } style = { header } >
532+ < div ref = { headerRef } data-sileo-header data-edge = { expand } >
534533 < div data-sileo-header-stack >
535534 < div
536535 ref = { innerRef }
@@ -582,12 +581,7 @@ export const Sileo = memo(function Sileo({
582581 </ div >
583582
584583 { hasDesc && (
585- < div
586- data-sileo-content
587- data-edge = { expand }
588- data-visible = { open }
589- style = { contentStyle }
590- >
584+ < div data-sileo-content data-edge = { expand } data-visible = { open } >
591585 < div
592586 ref = { contentRef }
593587 data-sileo-description
@@ -598,6 +592,7 @@ export const Sileo = memo(function Sileo({
598592 // biome-ignore lint/a11y/useValidAnchor: cannot use button inside a button
599593 < a
600594 href = "#"
595+ type = "button"
601596 data-sileo-button
602597 data-state = { view . state }
603598 className = { view . styles ?. button }
0 commit comments