const ButtonWithPadding = ({ children, ...props }) => <button style={{ padding: '15px 10px' }} {...props}>{children}</button> const ButtonPrimary = ({ children, ...props }) => <button style={{ color: 'white', backgroundColor: 'seagreen' }} {...props}>{children}</button> const ButtonOutline = ({ children, ...props}) => <button style={{ backgroundColor: 'transparent', border: '4px solid darkred' }} {...props}>{children}</button> const ButtonBase = ({ children, ...props }) => <button {...props}>{children}</button>; const Button = props => compose(ButtonBase /* or simply 'button' */, { [ButtonWithPadding]: ['primary', 'outline'].includes(variant), [ButtonPrimary]: props.variant === 'primary', [ButtonOutline]: props.variant === 'outline' }) <Button variant="primary">Primary Button</Button> // Equivalent of: <ButtonWithPadding> <ButtonPrimary>Primary Button</ButtonPrimary> </ButtonWithPadding> <Button variant="outline">Outline Button</Button>