A simple library agnostic util functions for css-in-js
styling solutions to make your design spacing consistent
npm install spacing-util
Not every single UI library has its own theme
or if does it might lack of spacing
system that might fit your needs.
spacing-util
is built in customizable way to allow you create your own spacing system which can work even if your library doesn't allow rewriting/extending their theme.
Spacing usage is mentioned to be mainly used for padding
and margin
properties. That's why it's usage is similar to CSS syntax - you can pass up to 4 properties which will be calculated by parser
function.
Passing argument different than number
returns it without any transform.
Default parser function multiplies given argument by 4
and returns as px
unit.
import { spacing } from 'spacing-util';
spacing(1); // 4px
spacing(5); // 20px
spacing(5, 6); // 20px 24px
spacing(5, 2, 1); // 20px 8px 4px
spacing(5, 6, 1, 6); // 20px 24px 4px 24px
spacing(2, '5em'); // 8px 5em
import { spacing } from 'spacing-util';
const RandomBox = () => (
<div
style={{
padding: spacing(4, 8),
borderRadius: spacing(1),
}}
>
random box
</div>
);
import { spacing } from 'spacing-util';
import { css, cx } from '@emotion/css';
const RandomBox = () => (
<div
className={css`
padding: ${spacing(4, 8)};
border-radius: ${spacing(1)};
`}
>
random box
</div>
import { spacing } from 'spacing-util';
import styled from 'styled-components';
const StyledBox = styled.div`
padding: ${spacing(8)};
border-radius: ${spacing(1)};
`;
const RandomBox = () => <StyledBox>random box</StyledBox>;
Sometimes the default parser function might not satisfy you or your design needs. That's why you can create your own spacing
function.
You are not limited to just one spacing across the app. It's up to you what will be the names for your spacings :)
import { generateSpacing } from 'spacing-util';
import type { SpacingParser } from 'spacing-util';
// Default parser function
const parser: SpacingParser = value =>
typeof value === 'number' ? `${~~(value * 4)}px` : value;
const spacing = generateSpacing(parser);
In case when you are lazy enough and feel bored of typing for example:
const StyledBox = styled.div`
padding: ${spacing(8, 4)};
margin: ${spacing(5)};
`;
There is a shorter way to do that by using padding
and margin
util functions.
import { padding, margin } from 'spacing-util';
const StyledBox = styled.div`
${padding(8, 4)}
${margin(5)}
`;
Both shares same usage as spacing
function with 1 extra option. Instead number
or string
input, you can an object of type:
{
x: number | string;
y: number | string;
top: number | string;
right: number | string;
bottom: number | string;
left: number | string;
}
top, right, bottom, left
are responsible for returning just for these specific direction meanwhile x, y
are like a shortcut for left + right
and top + bottom
usage. Values given for given key later on are transformed with spacing parser
function.
Note - if u will use x
shorthand with left
together, the order matters! The value at the bottom will ovveride the previous one - behavior just like in vanilla CSS
padding({
x: 4,
top: 5,
});
// returns
// padding-top: 20px;
// padding-right: 20px;
// padding-left: 20px;
Since margin and padding are built on top of spacing
function and you enjoy it's usage you are able to create your own padding
and margin
utils by passing a parser function to it's generator function.
import { generateMargin, generatePadding } from 'spacing-util';
import type { SpacingParser } from 'spacing-util';
// Default parser function
const parser: SpacingParser = value =>
typeof value === 'number' ? `${~~(value * 4)}px` : value;
const margin = generateMargin(parser);
const padding = generatePadding(parser);