* fixes radio button's label (issue #2566) * fixes entity title double text input's width (issue #2562) * fixed checkmark placement on color scheme card * fix failing CI Docs * fixes computed node dimensions and color scheme card * fix color scheme card background * fix color scheme card background * updated color scheme card docs * Fix --------- Co-authored-by: Charles Bochet <charles@twenty.com>
53 lines
1.3 KiB
TypeScript
53 lines
1.3 KiB
TypeScript
import { ReactNode, useLayoutEffect, useRef, useState } from 'react';
|
|
import styled from '@emotion/styled';
|
|
|
|
type ComputeNodeDimensionsProps = {
|
|
children: (
|
|
dimensions: { height: number; width: number } | undefined,
|
|
) => ReactNode;
|
|
node?: ReactNode;
|
|
};
|
|
|
|
const StyledNodeWrapper = styled.span`
|
|
pointer-events: none;
|
|
position: fixed;
|
|
visibility: hidden;
|
|
`;
|
|
|
|
export const ComputeNodeDimensions = ({
|
|
children,
|
|
node = children(undefined),
|
|
}: ComputeNodeDimensionsProps) => {
|
|
const nodeWrapperRef = useRef<HTMLSpanElement>(null);
|
|
const [nodeDimensions, setNodeDimensions] = useState<
|
|
| {
|
|
width: number;
|
|
height: number;
|
|
}
|
|
| undefined
|
|
>(undefined);
|
|
|
|
useLayoutEffect(() => {
|
|
if (!nodeWrapperRef.current) {
|
|
return;
|
|
}
|
|
const resizeObserver = new ResizeObserver(() => {
|
|
if (nodeWrapperRef.current) {
|
|
setNodeDimensions({
|
|
width: nodeWrapperRef.current.offsetWidth,
|
|
height: nodeWrapperRef.current.offsetHeight,
|
|
});
|
|
}
|
|
});
|
|
resizeObserver.observe(nodeWrapperRef.current);
|
|
return () => resizeObserver.disconnect();
|
|
}, [nodeWrapperRef]);
|
|
|
|
return (
|
|
<>
|
|
<StyledNodeWrapper ref={nodeWrapperRef}>{node}</StyledNodeWrapper>
|
|
{nodeDimensions && children(nodeDimensions)}
|
|
</>
|
|
);
|
|
};
|