UNPKG

@wordpress/block-editor

Version:
62 lines (53 loc) 1.89 kB
/** * WordPress dependencies */ import { useState, useEffect } from '@wordpress/element'; /** * Internal dependencies */ import ContrastChecker from '../components/contrast-checker'; import { __unstableUseBlockRef as useBlockRef } from '../components/block-list/use-block-props/use-block-refs'; function getComputedStyle( node ) { return node.ownerDocument.defaultView.getComputedStyle( node ); } export default function BlockColorContrastChecker( { clientId } ) { const [ detectedBackgroundColor, setDetectedBackgroundColor ] = useState(); const [ detectedColor, setDetectedColor ] = useState(); const [ detectedLinkColor, setDetectedLinkColor ] = useState(); const ref = useBlockRef( clientId ); // There are so many things that can change the color of a block // So we perform this check on every render. // eslint-disable-next-line react-hooks/exhaustive-deps useEffect( () => { if ( ! ref.current ) { return; } setDetectedColor( getComputedStyle( ref.current ).color ); const firstLinkElement = ref.current?.querySelector( 'a' ); if ( firstLinkElement && !! firstLinkElement.innerText ) { setDetectedLinkColor( getComputedStyle( firstLinkElement ).color ); } let backgroundColorNode = ref.current; let backgroundColor = getComputedStyle( backgroundColorNode ).backgroundColor; while ( backgroundColor === 'rgba(0, 0, 0, 0)' && backgroundColorNode.parentNode && backgroundColorNode.parentNode.nodeType === backgroundColorNode.parentNode.ELEMENT_NODE ) { backgroundColorNode = backgroundColorNode.parentNode; backgroundColor = getComputedStyle( backgroundColorNode ).backgroundColor; } setDetectedBackgroundColor( backgroundColor ); } ); return ( <ContrastChecker backgroundColor={ detectedBackgroundColor } textColor={ detectedColor } enableAlphaChecker linkColor={ detectedLinkColor } /> ); }