UNPKG

@itwin/itwinui-react

Version:

A react component library for iTwinUI

51 lines (50 loc) 1.39 kB
import * as React from 'react'; import cx from 'classnames'; import { useGlobals } from '../hooks/useGlobals.js'; import { styles } from '../../styles.js'; let _base = (defaultElement) => (className, attrs) => { let Comp = React.forwardRef(({ as = defaultElement, ...props }, ref) => { props = { ...attrs, ...props, className: getScopedClassName( cx(className, attrs?.className, props.className), ), }; let Element = as || 'div'; if ( 'button' === Element || 'a' === Element || ('input' === Element && 'checkbox' === props.type) ) { var _props; (_props = props).tabIndex ?? (_props.tabIndex = 0); } useGlobals(); return React.createElement(Element, { ref: ref, ...props, }); }); if ('development' === process.env.NODE_ENV) Comp.displayName = getDisplayNameFromClass(className); return Comp; }; export const polymorphic = new Proxy( {}, { get: (target, prop) => { if ('string' == typeof prop) return _base(prop); return Reflect.get(target, prop); }, }, ); let getDisplayNameFromClass = (str) => { let camel = str.replace(/-([a-z])/g, (g) => g[1].toUpperCase()); return camel.substring(3); }; let getScopedClassName = (className = '') => className .split(' ') .map((c) => (c in styles ? styles[c] : c)) .join(' ') || null;