import React, { useEffect, useRef, forwardRef, useLayoutEffect } from 'react'; import styled from 'styled-components'; import type { MarkerArea } from '@redocly/theme/core/types'; type MarkerProps = { marker: MarkerArea; registerMarker: (element: HTMLElement) => void; removeMarker: (element: HTMLElement) => void; dataAttribures?: Record; }; export const Marker = forwardRef( ({ marker, dataAttribures, registerMarker, removeMarker }, forwardedRef) => { const internalRef = useRef(null); // Reference should be available before paint useLayoutEffect(() => { if (!forwardedRef) return; if (typeof forwardedRef === 'function') { forwardedRef(internalRef.current); } else { forwardedRef.current = internalRef.current; } }, [forwardedRef]); useEffect(() => { const currentElement = internalRef.current; if (!currentElement) return; registerMarker(currentElement); return () => removeMarker(currentElement); }, [registerMarker, removeMarker, marker]); return ( ); }, ); const StyledMarker = styled.div<{ marker: MarkerArea }>` position: absolute; z-index: -1; top: ${({ marker }) => marker.offset}px; height: ${({ marker }) => marker.height}px; width: 100%; left: 0; `;