UNPKG

react-bootstrap

Version:

Bootstrap 5 components built with React

64 lines (59 loc) 1.61 kB
import * as React from 'react'; import { useContext, useMemo } from 'react'; import { jsx as _jsx } from "react/jsx-runtime"; const ThemeContext = /*#__PURE__*/React.createContext({ prefixes: {} }); const { Consumer, Provider } = ThemeContext; function ThemeProvider({ prefixes = {}, dir, children }) { const contextValue = useMemo(() => ({ prefixes: { ...prefixes }, dir }), [prefixes, dir]); return /*#__PURE__*/_jsx(Provider, { value: contextValue, children: children }); } export function useBootstrapPrefix(prefix, defaultPrefix) { const { prefixes } = useContext(ThemeContext); return prefix || prefixes[defaultPrefix] || defaultPrefix; } export function useIsRTL() { const { dir } = useContext(ThemeContext); return dir === 'rtl'; } function createBootstrapComponent(Component, opts) { if (typeof opts === 'string') opts = { prefix: opts }; const isClassy = Component.prototype && Component.prototype.isReactComponent; // If it's a functional component make sure we don't break it with a ref const { prefix, forwardRefAs = isClassy ? 'ref' : 'innerRef' } = opts; const Wrapped = /*#__PURE__*/React.forwardRef(({ ...props }, ref) => { props[forwardRefAs] = ref; const bsPrefix = useBootstrapPrefix(props.bsPrefix, prefix); return /*#__PURE__*/_jsx(Component, { ...props, bsPrefix: bsPrefix }); }); Wrapped.displayName = `Bootstrap(${Component.displayName || Component.name})`; return Wrapped; } export { createBootstrapComponent, Consumer as ThemeConsumer }; export default ThemeProvider;