website/src/theme/NotFound/Fitty.tsx (55 lines of code) (raw):
/* eslint-disable react/require-default-props */
import type {
ElementType,
FC, HTMLAttributes, MutableRefObject,
} from 'react';
import React, { forwardRef } from 'react';
import fitty from 'fitty';
import './fit.css';
import clsx from 'clsx';
type FittyComponentProps = HTMLAttributes<HTMLDivElement> & {
tagName: string;
wrapText?: boolean;
}
type ElRef = MutableRefObject<HTMLElement>
const FittyComponent: FC<FittyComponentProps> = (
props,
ref?: ElRef,
) => {
const {
tagName, children, wrapText = false, className, ...rest
} = props;
const minSize = 10;
const maxSize = 512;
const Tag = tagName as ElementType;
const internalRef = React.useRef<HTMLElement>(null);
const correctRef = ref || internalRef;
React.useLayoutEffect(() => {
const effectRef = ref || internalRef;
const fitInstance = fitty(effectRef?.current, {
minSize,
maxSize,
multiLine: wrapText,
observeMutations: {
subtree: true,
childList: true,
characterData: true,
attributeFilter: ['class'],
},
});
requestAnimationFrame(() => {
fitInstance.fit();
});
return () => {
fitty(effectRef.current!).unsubscribe();
};
}, []);
return (
<Tag className={clsx('fit-wrapper', className)}>
<span className="fit" ref={correctRef} {...rest}>
{children}
</span>
</Tag>
);
};
const Fitty = forwardRef<HTMLElement, FittyComponentProps>(FittyComponent as any);
export default Fitty;