@@ -12,7 +12,9 @@ type Props = {
1212export const Section = forwardRef < HTMLDivElement , Props > ( ( props , ref ) => {
1313 const marker_ref = useRef < HTMLDivElement > ( null )
1414 const container_ref = useRef < HTMLDivElement | null > ( null )
15+ const class_marker_ref = useRef < HTMLDivElement > ( null )
1516 const [ is_stuck , set_is_stuck ] = useState ( false )
17+ const [ add_stuck_class , set_add_stuck_class ] = useState ( false )
1618
1719 useEffect ( ( ) => {
1820 props . on_stuck_change ?.( is_stuck )
@@ -21,36 +23,49 @@ export const Section = forwardRef<HTMLDivElement, Props>((props, ref) => {
2123 useEffect ( ( ) => {
2224 const marker = marker_ref . current
2325 const container = container_ref . current
24- if ( ! marker || ! container ) return
26+ const class_marker = class_marker_ref . current
27+ if ( ! marker || ! container || ! class_marker ) return
2528
2629 let is_marker_stuck = false
30+ let is_class_marker_stuck = false
2731 let is_container_visible = true
2832
29- const update_stuck_state = ( ) => {
33+ const update_states = ( ) => {
3034 set_is_stuck ( is_marker_stuck && is_container_visible )
35+ set_add_stuck_class ( is_class_marker_stuck && is_container_visible )
3136 }
3237
3338 const marker_observer = new IntersectionObserver (
3439 ( [ entry ] ) => {
3540 is_marker_stuck = ! entry . isIntersecting
36- update_stuck_state ( )
41+ update_states ( )
42+ } ,
43+ { threshold : 1 }
44+ )
45+
46+ const class_marker_observer = new IntersectionObserver (
47+ ( [ entry ] ) => {
48+ is_class_marker_stuck = ! entry . isIntersecting
49+ update_states ( )
3750 } ,
3851 { threshold : 1 }
3952 )
4053
4154 const container_observer = new IntersectionObserver (
4255 ( [ entry ] ) => {
4356 is_container_visible = entry . isIntersecting
44- update_stuck_state ( )
57+ update_states ( )
4558 } ,
4659 { threshold : 0 }
4760 )
4861
4962 marker_observer . observe ( marker )
63+ class_marker_observer . observe ( class_marker )
5064 container_observer . observe ( container )
5165
5266 return ( ) => {
5367 marker_observer . disconnect ( )
68+ class_marker_observer . disconnect ( )
5469 container_observer . disconnect ( )
5570 }
5671 } , [ ] )
@@ -67,8 +82,11 @@ export const Section = forwardRef<HTMLDivElement, Props>((props, ref) => {
6782 } }
6883 className = { styles . container }
6984 >
85+ < div className = { styles . class_marker } ref = { class_marker_ref } />
7086 < div
71- className = { cn ( styles . header , { [ styles [ 'header--stuck' ] ] : is_stuck } ) }
87+ className = { cn ( styles . header , {
88+ [ styles [ 'header--stuck' ] ] : add_stuck_class
89+ } ) }
7290 >
7391 < div className = { styles . header__marker } ref = { marker_ref } />
7492 < div className = { styles . header__title } > { props . title } </ div >
0 commit comments