diff --git a/contribute/style-guides/styling.md b/contribute/style-guides/styling.md index e5a8789d0bc..fd569459eee 100644 --- a/contribute/style-guides/styling.md +++ b/contribute/style-guides/styling.md @@ -1,48 +1,55 @@ # Styling Grafana -## Emotion - [Emotion](https://emotion.sh/docs/introduction) is our default-to-be approach to styling React components. It provides a way for styles to be a consequence of properties and state of a component. -### Usage +## Usage -#### Basic styling +### Basic styling -For styling components use Emotion's `css` function +For styling components, use [Emotion's `css` function](https://emotion.sh/docs/emotion#css). ```tsx -import { css } from 'emotion'; +import React from 'react'; +import { css } from 'emotion'; - -const ComponentA = () => { - return ( -
- As red as you can ge -
- ); -} +const ComponentA = () => ( +
+ As red as you can get +
+); ``` -#### Styling complex components +### Styling complex components -In more complex cases, especially when you need to style multiple DOM elements in one component or when your styles that depend on properties and/or state, you should create a helper function that returns an object with desired stylesheet. This function should also be wrapped in `stylesFactory` helper function that will provide basic memoization. +In more complex cases, especially when you need to style multiple DOM elements in one component, or when using styles that depend on properties and/or state, you should create a helper function that returns an object of styles. This function should also be wrapped in the `stylesFactory` helper function, which will provide basic memoization. -Let's say you need to style a component that has different background depending on the theme: +Let's say you need to style a component that has a different background depending on the theme: ```tsx -import { css, cx } from 'emotion'; -import { GrafanaTheme, useTheme, selectThemeVariant, stylesFactory } from '@grafana/ui'; +import React from 'react'; +import { css } from 'emotion'; +import { GrafanaTheme } from '@grafana/data'; +import { selectThemeVariant, stylesFactory, useTheme } from '@grafana/ui'; const getStyles = stylesFactory((theme: GrafanaTheme) => { - const backgroundColor = selectThemeVariant({ light: theme.colors.red, dark: theme.colors.blue }, theme.type); + const backgroundColor = selectThemeVariant( + { light: theme.colors.red, dark: theme.colors.blue }, + theme.type + ); return { wrapper: css` background: ${backgroundColor}; `, - icon: css`font-size:${theme.typography.size.sm}`; + icon: css` + font-size: ${theme.typography.size.sm}; + `, }; -} +}); const ComponentA = () => { const theme = useTheme(); @@ -54,18 +61,18 @@ const ComponentA = () => { ); -}); +}; ``` -For more information about themes at Grafana please see [themes guide](./themes.md) +For more information about themes at Grafana please see the [themes guide](./themes.md). -#### Composing class names +### Composing class names -For class composition use Emotion's `cx` function +For class composition, use [Emotion's `cx` function](https://emotion.sh/docs/emotion#cx). ```tsx -import { css, cx } from 'emotion'; - +import React from 'react'; +import { css, cx } from 'emotion'; interface Props { className?: string; @@ -74,13 +81,11 @@ interface Props { const ComponentA: React.FC = ({ className }) => { const finalClassName = cx( className, - css`background: red`, - ) - - return ( -
- As red as you can ge -
+ css` + background: red; + ` ); -} + + return
As red as you can ge
; +}; ```