This document aims to discuss some of the core concepts of building with Primer React.
It's really easy to set different values for most of our component props based on screen size! We take advantage of styled-system's responsive props API in our components.
<Button display={['flex', 'flex', 'none']}/>
or
<Text fontSize={[1,1,1,4]}/>
You can provide your own theme to Primer React! There are a few ways of doing this to varying degrees, checkout the theme docs for more information.
css
propWhen push comes to shove and you just really need to add a custom CSS rule, you can do that with the css
prop. Please don't abuse this :)
<Box css='border-bottom-right-radius: 0px' />
Please note that you will need to have the styled-components babel plugin set up in your project in order to use the css
prop.
We categorize our components into 3 general types. Building block components, pattern components, and helper components. Understanding how these types of components interact with each other can help you better understand how to get the most out of Primer React.
Building block components are components that are basic in their functions and can be used together with other components to build just about any UI. Some examples of building block components are Box
, Avatar
, Details
, and Link
.
Pattern components are components that are made up of several building block components to represent a commonly used pattern in our UI. Some examples of pattern components are UnderlineNav
and FilterList
. We plan on expanding our offering of pattern components in the near future.
Helper components are components that help the user achieve common CSS patterns while maintaining some control over values used. An example of a helper component is Box
.
as
propThe as
prop is a feature that all of our components get from styled-components. It allows you to pass a HTML tag or another component to a Primer Component to be rendered as the base tag of that component along with all of it's styles and props.
For example, say you are using a Button
component, and you really need to apply Box
styles to it. You can compose Box
and Button
like so:
<Box display="flex" as={Button} href='https://github.com'>Hello</Box>
This will allow you to use all of the Button
props and all of the Box
props without having to wrap your Button
component in another Box
component.
This pattern does have some limitations. Usage of the as
prop can lead to unexpected output. In the example above, if the user had done <Button as={Box}/>
instead, because the Box
's render method is ultimately applied, and Box
components render div
's, you'll see that the rendered component is a div
when ideally you'd like it to be a button
. It is also not always clear how the styles in both components will interact and/or override each other.
For these reasons, we recommend only using the as
prop when you cannot achieve the same result by nesting components. The Box
/ Button
example could be done like so:
<Box display="flex"><Button href='https://github.com'>Hi</Button></Box>