UNPKG

@pandabox/prettier-plugin

Version:

Prettier plugin for Panda css

165 lines (122 loc) 4.2 kB
# @pandabox/prettier-plugin Prettier plugin for Panda CSS. Will sort style props based on your local `panda.config.ts`: - in any Panda function like `css({ ... })` or `stack({ ... })` - in the `css` prop of any JSX component - etc... ## Installation ```bash pnpm add -D prettier @pandabox/prettier-plugin ``` ## Usage ```json { "plugins": ["@pandabox/prettier-plugin"] } ``` ## Options See below for more details. ```json { "pandaFirstProps": ["as", "className", "layerStyle", "textStyle"], "pandaLastProps": [], "pandaOnlyComponents": false, "pandaOnlyIncluded": false, "pandaStylePropsFirst": false, "pandaSortOtherProps": false, "pandaFunctions": [] } ``` ## Sorting The plugin will dynamically resolve your `panda.config.ts` file and sort the style properties based on your [`utilities`](https://panda-css.com/docs/customization/utilities) (keys and shorthands) and their associated `group`. Each utility in the [`@pandacss/preset-base`](https://github.com/chakra-ui/panda/pull/2269/files) has a group name. The [group names and their order](https://github.com/astahmer/pandakit/blob/5e3d5cb6c5bbed211c3bf608b69b307568cdff06/packages/prettier-plugin/src/get-priority-index.ts#L7) are: ```ts const groupNames = [ 'System', 'Container', 'Display', 'Visibility', 'Position', 'Transform', 'Flex Layout', 'Grid Layout', 'Layout', 'Border', 'Border Radius', 'Width', 'Height', 'Margin', 'Padding', 'Color', 'Typography', 'Background', 'Shadow', 'Table', 'List', 'Scroll', 'Interactivity', 'Transition', 'Effect', 'Other', ] ``` - [Conditions](https://panda-css.com/docs/concepts/conditional-styles) (`_hover`, `_dark`...) will be sorted after `Other` and are always sorted in the same order as in the generated CSS - [Arbitrary conditions](https://panda-css.com/docs/concepts/conditional-styles#arbitrary-selectors) will be sorted after `Conditions` - `Css` will be sorted after `Arbitrary conditions`, since the JSX `css` prop will override any other JSX style prop with JSX patterns / `styled` factory Finally, other (non-style) props will be sorted alphabetically. ## Extending You can extend the `utilities` in your `panda.config.ts` and bind (or re-bind an existing) them to a `group` name so that they will be sorted with the other utilities in that group. ```ts export default defineConfig({ utilities: { boxSize: { values: 'sizes', group: 'Width', transform: (value) => { return { width: value, height: value, } }, }, }, }) // will be sorted near the `width` prop css({ position: 'relative', boxSize: '2xl', width: '100%', fontSize: '2xl', }) ``` ## Options ### `pandaFirstProps` The first props to sort. Defaults to `['as', 'asChild', 'ref', 'className', 'layerStyle', 'textStyle']`. ### `pandaLastProps` The last props to sort. Defaults to `[]`. ### `pandaOnlyComponents` Only sort props in known Panda components (JSX patterns and `<styled.xxx /> factory`). Defaults to `false`. ### `pandaOnlyIncluded` Only sort props in files that are included in the config. Defaults to `false`. ### `pandaStylePropsFirst` Whether to sort the style props before the component props. Defaults to `false`. ### `pandaSortOtherProps` Whether to sort the other props alphabetically. Defaults to `false`. ### `pandaGroupOrder` The order of the style groups. Defaults to: `['System', 'Container', 'Display', 'Visibility', 'Position', 'Transform', 'Flex Layout', 'Grid Layout', 'Layout', 'Border', 'Border Radius', 'Width', 'Height', 'Margin', 'Padding', 'Color', 'Typography', 'Background', 'Shadow', 'Table', 'List', 'Scroll', 'Interactivity', 'Transition', 'Effect', 'Other', 'Conditions', 'Arbitrary conditions', 'Css']` ### `pandaFunctions` A list of style functions to sort in addition to the default ones (css, cva, patterns, defineRecipe, defineSlotRecipe...). Defaults to `[]`. ### `pandaConfigPath` The path to the panda config file. Only relevant when used programatically. ### `pandaCwd` The current working directory from which the config file will be searched for. Only relevant when used programatically.