@hakuna-matata-ui/styled-system
Version:
Style function for css-in-js building component libraries
252 lines (248 loc) • 8.27 kB
text/typescript
import * as CSS from "csstype"
import { Length, t, Token, transforms } from "../utils"
import { createTransform } from "../utils/create-transform"
import { Config } from "../utils/prop-config"
import { spaceXTemplate, spaceYTemplate } from "../utils/templates"
export const flexbox: Config = {
alignItems: true,
alignContent: true,
justifyItems: true,
justifyContent: true,
flexWrap: true,
flexDirection: { transform: transforms.flexDirection },
experimental_spaceX: {
static: spaceXTemplate,
transform: createTransform({
scale: "space",
transform: (value) =>
value !== null ? { "--chakra-space-x": value } : null,
}),
},
experimental_spaceY: {
static: spaceYTemplate,
transform: createTransform({
scale: "space",
transform: (value) =>
value != null ? { "--chakra-space-y": value } : null,
}),
},
flex: true,
flexFlow: true,
flexGrow: true,
flexShrink: true,
flexBasis: t.sizes("flexBasis"),
justifySelf: true,
alignSelf: true,
order: true,
placeItems: true,
placeContent: true,
placeSelf: true,
gap: t.space("gap"),
rowGap: t.space("rowGap"),
columnGap: t.space("columnGap"),
}
Object.assign(flexbox, {
flexDir: flexbox.flexDirection,
})
export interface FlexboxProps {
/**
* The CSS `align-items` property.
*
* It defines the `align-self` value on all direct children as a group.
*
* - In Flexbox, it controls the alignment of items on the Cross Axis.
* - In Grid Layout, it controls the alignment of items on the Block Axis within their grid area.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/align-items)
*/
alignItems?: Token<CSS.Property.AlignItems>
/**
* The CSS `align-content` property.
*
* It defines the distribution of space between and around
* content items along a flexbox's cross-axis or a grid's block axis.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/align-content)
*/
alignContent?: Token<CSS.Property.AlignContent>
/**
* The CSS `justify-items` property.
*
* It defines the default `justify-self` for all items of the box,
* giving them all a default way of justifying each box
* along the appropriate axis.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/justify-items)
*/
justifyItems?: Token<CSS.Property.JustifyItems>
/**
* The CSS `justify-content` property.
*
* It defines how the browser distributes space between and around content items
* along the main-axis of a flex container, and the inline axis of a grid container.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/justify-content)
*/
justifyContent?: Token<CSS.Property.JustifyContent>
/**
* The CSS `flex-wrap` property.
*
* It defines whether flex items are forced onto one line or
* can wrap onto multiple lines. If wrapping is allowed,
* it sets the direction that lines are stacked.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/flex-wrap)
*/
flexWrap?: Token<CSS.Property.FlexWrap>
/**
* The CSS `flex-flow` property.
*
* It is a shorthand property for `flex-direction` and `flex-wrap`.
* It specifies the direction of a flex container, as well as its wrapping behavior.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/flex-flow)
*/
flexFlow?: Token<CSS.Property.FlexFlow>
/**
* The CSS `flex-basis` property.
*
* It defines the initial main size of a flex item.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/flex-basis)
*/
flexBasis?: Token<CSS.Property.FlexBasis<Length>>
/**
* The CSS `flex-direction` property.
*
* It defines how flex items are placed in the flex container
* defining the main axis and the direction (normal or reversed).
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/flex-direction)
*/
flexDirection?: Token<CSS.Property.FlexDirection>
/**
* The CSS `flex-direction` property.
*
* It defines how flex items are placed in the flex container
* defining the main axis and the direction (normal or reversed).
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/flex-direction)
*/
flexDir?: Token<CSS.Property.FlexDirection>
/**
* The CSS `flex` property.
*
* It defines how a flex item will grow or shrink
* to fit the space available in its flex container.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/flex)
*/
flex?: Token<CSS.Property.Flex<Length>>
/**
* The CSS `gap` property.
*
* It defines the gap between items in both flex and
* grid contexts.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/gap)
*/
gap?: Token<CSS.Property.Gap<Length>, "space">
/**
* The CSS `row-gap` property.
*
* It sets the size of the gap (gutter) between an element's grid rows.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/row-gap)
*/
rowGap?: Token<CSS.Property.RowGap<Length>, "space">
/**
* The CSS `column-gap` property.
*
* It sets the size of the gap (gutter) between an element's columns.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/column-gap)
*/
columnGap?: Token<CSS.Property.ColumnGap<Length>, "space">
/**
* The CSS `justify-self` property.
*
* It defines the way a box is justified inside its
* alignment container along the appropriate axis.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/flex-flow)
*/
justifySelf?: Token<CSS.Property.JustifySelf>
/**
* The CSS `align-self` property.
*
* It works like `align-items`, but applies only to a
* single flexbox item, instead of all of them.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/align-self)
*/
alignSelf?: Token<CSS.Property.AlignSelf>
/**
* The CSS `order` property.
*
* It defines the order to lay out an item in a flex or grid container.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/order)
*/
order?: Token<CSS.Property.Order>
/**
* The CSS `flex-grow` property.
*
* It defines how much a flexbox item should grow
* if there's space available.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/flex-grow)
*/
flexGrow?: Token<CSS.Property.FlexGrow | (string & number)>
/**
* The CSS `flex-shrink` property.
*
* It defines how much a flexbox item should shrink
* if there's not enough space available.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/flex-shrink)
*/
flexShrink?: Token<CSS.Property.FlexShrink | (string & number)>
/**
* The CSS `place-items` property.
*
* It allows you to align items along both the block and
* inline directions at once (i.e. the align-items and justify-items properties)
* in a relevant layout system such as `Grid` or `Flex`.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/place-items)
*/
placeItems?: Token<CSS.Property.PlaceItems>
/**
* The CSS `place-content` property.
*
* It allows you to align content along both the block and
* inline directions at once (i.e. the align-content and justify-content properties)
* in a relevant layout system such as Grid or Flexbox.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/place-content)
*/
placeContent?: Token<CSS.Property.PlaceContent>
/**
* The CSS `place-self` property.
*
* It allows you to align an individual item in both the block and
* inline directions at once (i.e. the align-self and justify-self properties)
* in a relevant layout system such as Grid or Flexbox.
*
* @see [Mozilla Docs](https://developer.mozilla.org/docs/Web/CSS/place-self)
*/
placeSelf?: Token<CSS.Property.PlaceSelf>
/**
* Controls the horizontal space between elements
*/
experimental_spaceX?: Token<CSS.Property.Margin | number, "space">
/**
* Controls the vertical space between elements
*/
experimental_spaceY?: Token<CSS.Property.Margin | number, "space">
}