Skip to content

Instantly share code, notes, and snippets.

@newswim
Created August 4, 2017 22:42
Show Gist options
  • Save newswim/fa916c66477ddd5952f7d6548e6a0605 to your computer and use it in GitHub Desktop.
Save newswim/fa916c66477ddd5952f7d6548e6a0605 to your computer and use it in GitHub Desktop.
Wrapping Ant Design components with Styled Components
import { Link } from 'react-router-dom'
import { Badge, Col, Menu } from 'antd'
const StyledBadge = styled(Badge)`
.ant-badge-count {
background-color: #7ECBBF;
color: white;
box-shadow: 0 0 0 1px #d9d9d9 inset;
}
`
const StyledLink = styled(Link)`
border: 1px solid #fff;
margin-top: 5px;
transition: background-color .3s ease;
border-radius: 2px;
&:hover {
background-color: #78bdb8;
}
`
const MobileCol = styled(Col)`
.ant-popover-inner-content {
padding: 0;
}
`
const StyledMenu = styled(Menu)`
background: transparent;
border-bottom: none;
display: flex;
justify-content: flex-end;
.ant-menu-submenu-horizontal > .ant-menu {
margin-top: -2px;
}
.ant-menu-item:hover {
border-bottom: 2px solid #B2D235;
}
.about-dropdown {
border-bottom: none;
&:hover {
border-bottom: none;
}
li:hover {
border-bottom: none;
}
}
.ant-menu-item-group-list {
padding: 0 0 10px 0;
}
`
@kozak-iz-kh
Copy link

In this approach, are you overriding the style of the Ant Design itself? Or just taking advantage of the html structure?

Not sure about what do you mean under "just taking advantage of the html structure".

But, that way Ant design styles will be overriden.

@abhilashiic
Copy link

Overriding antd component using styled-component is working fine.
But it is not working on Modal

const StyledModal = styled(Modal)`
   .ant-modal-content {
        border-radius: 1rem;
    }
`

But there is not appearing styled-component created class.

@jorisw
Copy link

jorisw commented Aug 28, 2020

Double check whether you're targeting the right element.

@pranjalsuyal
Copy link

The problem I'm facing with this approach is that after wrapping the Ant Design components with styled I'm missing several methods from the original Component. For example, I missed Modal.info, Modal.useModal, etc.

Hey did anyone find any way to encounter this issue ?

@lucascurti
Copy link

lucascurti commented Nov 6, 2020

The problem I'm facing with this approach is that after wrapping the Ant Design components with styled I'm missing several methods from the original Component. For example, I missed Modal.info, Modal.useModal, etc.

Hey did anyone find any way to encounter this issue ?

You can use hoist-non-react-statics

hoistNonReactStatics(MyModal, AntModal);

@shashankKeshava
Copy link

shashankKeshava commented Dec 16, 2020

This is working great for me. Just importing antd and not loading its LESS stylesheets, then wrapping the imported component in styled(), looks like the way to go for us.

@jorisw Is this solution still working for you? I have installed "antd": "^4.9.4", which is overriding all custom styles.

const StyledTitle = styled(Search)`
	.ant-input-group-wrapper {
		width: 60%;
	}
`;

Also, the className is not being recognized
image

@GabeCabrera
Copy link

Just for contribution, I ran into some troubles when trying to override a component's base class. If you want to override a base class property just wrap the styles in triple & just like this:
const NewButton = styled(Button)' &&& { background: red; } ';

If you don't, the changes you want to do will just be ignored

This worked for me, I'm a little unfamiliar with using that type of selector. Why does this work? is this essentially just the same thing as directly using the class selector but in this case you don't need the actual class name?

@johnkingzy
Copy link

Here is a starter kit for NextJS 🔗 Ant Design 🔗 Styled-Component ⚡️ + Typescript

@indrajitbnikam
Copy link

Overriding antd component using styled-component is working fine.
But it is not working on Modal

const StyledModal = styled(Modal)`
   .ant-modal-content {
        border-radius: 1rem;
    }
`

But there is not appearing styled-component created class.

This won't work as modal is usually at root level. Just go to developer tools and try to understand where this modal is in the DOM. If it is at root then you might have to add styles in global styles probably.

@abhilashiic
Copy link

abhilashiic commented Sep 29, 2021 via email

@akashennn
Copy link

Amazing!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment