@itwin/itwinui-react
Version:
A react component library for iTwinUI
51 lines (50 loc) • 1.39 kB
JavaScript
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;