UNPKG

@heymarco/next-auth

Version:

A complete authentication solution for web applications.

107 lines (106 loc) 3.1 kB
// react: import { // react: default as React, } from 'react'; // reusable-ui core: import { // react helper hooks: useMergeRefs, useMergeClasses, } from '@reusable-ui/core'; // a set of reusable-ui packages which are responsible for building any component // reusable-ui components: import { Icon, Label, Input, Group, } from '@reusable-ui/components'; // a set of official Reusable-UI components const InputWithLabel = (props) => { // rest props: const { // refs: elmRef, outerRef, // identifiers: id, // appearances: icon, // variants: size, theme, gradient, outlined, mild, // classes: mainClass, classes, variantClasses, stateClasses, className, // styles: style, // accessibilities: 'aria-label': ariaLabel, title, // components: inputComponent = React.createElement(Input, null), groupComponent = React.createElement(Group, null), labelComponent = React.createElement(Label, null), iconComponent = React.createElement(Icon, { icon: icon }), ...restInputProps } = props; // refs: const mergedElmRef = useMergeRefs( // preserves the original `elmRef` from `inputComponent`: inputComponent.props.elmRef, // preserves the original `elmRef` from `props`: elmRef); // classes: const allClasses = [ ...(inputComponent.props.className ?? '').split(' '), ...(inputComponent.props.classes ?? []), ]; const isSolidOrFluid = allClasses.includes('solid') || allClasses.includes('fluid'); const mergedClasses = useMergeClasses( // preserves the original `classes` from `inputComponent`: inputComponent.props.classes, // preserves the original `classes` from `props`: props.classes, // classes: (isSolidOrFluid ? null : 'fluid')); // jsx: /* <Group> */ return React.cloneElement(groupComponent, // props: { // refs: outerRef, // identifiers: id, // variants: size, theme, gradient, outlined, mild, // classes: mainClass, classes, variantClasses, stateClasses, className, // styles: style, // accessibilities: 'aria-label': ariaLabel, }, // children: /* <Label> */ React.cloneElement(labelComponent, // props: { // classes: className: labelComponent.props.className ?? 'solid', // accessibilities: title: labelComponent.props.title ?? title, }, // children: /* <Icon> */ React.cloneElement(iconComponent, // props: { // appearances: icon: iconComponent.props.icon ?? icon, })), /* <Input> */ React.cloneElement(inputComponent, // props: { // other props: ...restInputProps, ...inputComponent.props, // overwrites restInputProps (if any conflics) // refs: elmRef: mergedElmRef, // classes: classes: mergedClasses, })); }; export { InputWithLabel, InputWithLabel as default, };