UNPKG

@reusable-ui/icon

Version:

An icon set component for React app.

83 lines (82 loc) 2.62 kB
// react: import { // react: default as React, } from 'react'; // cssfn: import { // style sheets: dynamicStyleSheet, } from '@cssfn/cssfn-react'; // writes css in react hook // reusable-ui core: import { // react helper hooks: useMergeClasses, useMergeStyles, useResizable, useThemeable, useMildable, } from '@reusable-ui/core'; // a set of reusable-ui packages which are responsible for building any component // reusable-ui components: import { Generic, } from '@reusable-ui/generic'; // a base component // internals: import { // features: useIcon, } from './features/icon.js'; // styles: export const useIconStyleSheet = dynamicStyleSheet(() => import(/* webpackPrefetch: true */ './styles/styles.js'), { id: 'oqfct2z8qv' }); // a unique salt for SSR support, ensures the server-side & client-side have the same generated class names export const customIconList = [ 'instagram', 'whatsapp', 'google', 'twitter', 'apple', 'close', 'busy', 'navup', 'navdown', 'navleft', 'navright', 'dropup', 'dropdown', 'dropleft', 'dropright', ]; const Icon = (props) => { // styles: const styleSheet = useIconStyleSheet(); // features: const icon = useIcon(props); // variants: const resizableVariant = useResizable(props); const themeableVariant = useThemeable(props); const mildableVariant = useMildable(props); // rest props: const { // appearances: icon: _icon, // remove // variants: size: _size, // remove theme: _theme, // remove mild: _mild, // remove ...restGenericProps } = props; // classes: const variantClasses = useMergeClasses( // preserves the original `variantClasses`: props.variantClasses, // variants: resizableVariant.class, themeableVariant.class, mildableVariant.class); const classes = useMergeClasses( // preserves the original `classes`: props.classes, // appearances: icon.class); // styles: const mergedStyle = useMergeStyles( // appearances: icon.style, // preserves the original `style` (can overwrite the `icon.style`): props.style); // jsx: return (React.createElement(Generic, { ...restGenericProps, // semantics: tag: props.tag ?? 'span', role: props.role ?? 'img', // classes: mainClass: props.mainClass ?? styleSheet.main, variantClasses: variantClasses, classes: classes, // styles: style: mergedStyle })); }; export { Icon, Icon as default, };