# UI Styling Standard ESLint Plugin

The UI Styling Standard is a set of principles to guide styling UI code across Atlassian's frontend
codebases and ecosystem.

These are the current ESLint rules that enforce and help comply with the UI Styling Standard today,
but more are planned to support the standard over time.

## Installation

You must use the recommended config to follow the styling standards at Atlassian, which will ensure
compatability and performance with the design system.

```diff
module.exports = {
  extends: [
+    'plugin:@atlaskit/ui-styling-standard/recommended',
  ],
};
```

We don't recommended maintaining your own configuration. If you do not use our config you will need
to specify individual rules and configuration. Add the plugin to your `eslint.config.cjs` file and
enable individual rules as you're ready to adopt.

```diff
module.exports = {
  plugins: [
+    '@atlaskit/ui-styling-standard',
  ],
  rules: [
+    '@atlaskit/ui-styling-standard/convert-props-syntax': 'warn',
+    '@atlaskit/design-system/local-cx-xcss': 'error',
  ],
};
```

## Rules

<!-- START_RULE_TABLE_CODEGEN -->
<!-- @codegenCommand yarn workspace @atlaskit/eslint-plugin-ui-styling-standard codegen -->

| Rule                                                                                                                                                                                              | Description                                                                                                                                                                                                                                                                                | Recommended | Fixable | Suggestions |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- | ------- | ----------- |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/atlaskit-theme/README.md">atlaskit-theme</a>                                                                        | Ban certain usages of `@atlaskit/theme` that `@compiled/react` does not understand                                                                                                                                                                                                         | Yes         |         |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/convert-props-syntax/README.md">convert-props-syntax</a>                                                            | Convert props syntax that is unsupported by styled-components@<4 or @emotion/styled to props syntax that is supported. This is useful when used in conjunction with `no-styled-tagged-template-expression`, as output from the latter may use props syntax unsupported by those libraries. | Yes         | Yes     |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/enforce-style-prop/README.md">enforce-style-prop</a>                                                                | Disallows usage of static styles in the `style` attribute in components                                                                                                                                                                                                                    | Yes         |         |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/local-cx-xcss/README.md">local-cx-xcss</a>                                                                          | Ensures the cx() function, which is part of the XCSS API, is only used within the xcss prop. This aids tracking what styles are applied to a jsx element.                                                                                                                                  | Yes         |         |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/no-array-arguments/README.md">no-array-arguments</a>                                                                | Prevents usage of array arguments to style declaration functions                                                                                                                                                                                                                           | Yes         | Yes     |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/no-classname-prop/README.md">no-classname-prop</a>                                                                  | Disallows usage of the `className` prop in JSX                                                                                                                                                                                                                                             | Yes         |         |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/no-container-queries/README.md">no-container-queries</a>                                                            | Prevents usage of @container query within css styling                                                                                                                                                                                                                                      | Yes         |         |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/no-dynamic-styles/README.md">no-dynamic-styles</a>                                                                  | Disallows use of dynamic styles in CSS-in-JS calls                                                                                                                                                                                                                                         | Yes         |         |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/no-exported-styles/README.md">no-exported-styles</a>                                                                | Disallows exports of css, keyframes, styled and xcss                                                                                                                                                                                                                                       | Yes         |         |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/no-global-styles/README.md">no-global-styles</a>                                                                    | Prevents global styles through CSS-in-JS or CSS module imports                                                                                                                                                                                                                             | Yes         |         |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/no-important-styles/README.md">no-important-styles</a>                                                              | Disallows important style declarations                                                                                                                                                                                                                                                     | Yes         |         |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/no-imported-style-values/README.md">no-imported-style-values</a>                                                    | Disallows imports of style values                                                                                                                                                                                                                                                          | Yes         |         |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/no-nested-selectors/README.md">no-nested-selectors</a>                                                              | Prevents usage of nested selectors within css styling                                                                                                                                                                                                                                      | Yes         |         |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/no-styled/README.md">no-styled</a>                                                                                  | Disallows usage of the `styled` imports                                                                                                                                                                                                                                                    | Yes         |         |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/no-unsafe-selectors/README.md">no-unsafe-selectors</a>                                                              | Disallows use of nested styles in `css` functions.                                                                                                                                                                                                                                         | Yes         | Yes     | Yes         |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/no-unsafe-values/README.md">no-unsafe-values</a>                                                                    | Disallows styles that are difficult/impossible to statically anaylze.                                                                                                                                                                                                                      | Yes         |         |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/no-unused-cssmap-properties/README.md">no-unused-cssmap-properties</a>                                              | Detects unused properties in cssMap style objects that are not exported. Helps maintain clean code by identifying style variants that are defined but never used.                                                                                                                          | Yes         |         |             |
| <a href="./packages/design-system/eslint-plugin-ui-styling-standard/src/rules/use-compiled/README.md">use-compiled</a>                                                                            | Ensures usage of `@compiled/react` or `@atlaskit/css` instead of other CSS-in-JS libraries                                                                                                                                                                                                 | Yes         | Yes     |             |
| <a href="https://atlassian.design/components/eslint-plugin-ui-styling-standard/consistent-css-prop-usage/usage">@atlaskit/design-system/consistent-css-prop-usage</a>                             | Ensures consistency with `css` and `xcss` prop usages                                                                                                                                                                                                                                      | Yes         | Yes     |             |
| <a href="https://atlassian.design/components/eslint-plugin-ui-styling-standard/no-css-tagged-template-expression/usage">@atlaskit/design-system/no-css-tagged-template-expression</a>             | Disallows any `css` tagged template expressions that originate from Emotion, Styled Components or Compiled                                                                                                                                                                                 | Yes         | Yes     |             |
| <a href="https://atlassian.design/components/eslint-plugin-ui-styling-standard/no-keyframes-tagged-template-expression/usage">@atlaskit/design-system/no-keyframes-tagged-template-expression</a> | Disallows any `keyframe` tagged template expressions that originate from Emotion, Styled Components or Compiled                                                                                                                                                                            | Yes         | Yes     |             |
| <a href="https://atlassian.design/components/eslint-plugin-ui-styling-standard/no-styled-tagged-template-expression/usage">@atlaskit/design-system/no-styled-tagged-template-expression</a>       | Disallows any `styled` tagged template expressions that originate from Emotion, Styled Components or Compiled                                                                                                                                                                              | Yes         | Yes     |             |
| <a href="https://atlassian.design/components/eslint-plugin-ui-styling-standard/no-empty-styled-expression/usage">@atlaskit/design-system/no-empty-styled-expression</a>                           | Forbids any styled expression to be used when passing empty arguments to styled.div() (or other JSX elements).                                                                                                                                                                             | Yes         |         |             |
| <a href="https://atlassian.design/components/eslint-plugin-ui-styling-standard/no-invalid-css-map/usage">@atlaskit/design-system/no-invalid-css-map</a>                                           | Checks the validity of a CSS map created through cssMap. This is intended to be used alongside TypeScript's type-checking.                                                                                                                                                                 | Yes         |         |             |

<!-- END_RULE_TABLE_CODEGEN -->
