react-jsx-style
Version:
create dynamic injected styles with react component or hooks
39 lines (38 loc) • 1.24 kB
JavaScript
import React, { useRef, useEffect } from 'react';
import { render } from 'react-dom';
import Keyframe from './keyframe';
function usePortal(portal, root) {
const styleTagRef = useRef(document.createElement('style'));
const styleTag = styleTagRef.current;
const portalRef = useRef(null);
useEffect(() => {
portalRef.current = render(portal, styleTag);
}, [portal]);
useEffect(() => {
if (root) {
root.appendChild(styleTag);
}
return () => {
if (root) {
root.removeChild(styleTag);
}
};
}, [root]);
}
/*
{
from: {...}
"50": {...}
to: {...}
},
*/
function useKeyframe(keyframeBlocks = {}, identity = `ReactStyleKeyframe${Math.round(Math.random() * 1000)}`) {
const blockKeys = Object.keys(keyframeBlocks);
const keyframeTag = (React.createElement(Keyframe, { identity: identity }, blockKeys.map((keyframeSelector, index) => {
const value = keyframeBlocks[keyframeSelector];
return React.createElement(Keyframe.Block, { key: index, selector: keyframeSelector, value: value });
})));
usePortal(keyframeTag, document.head);
return identity;
}
export default useKeyframe;