Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

Layout primitives for React and@dash-ui, including Box, Cluster, Grid, Row, Column, and Layer.

License

NotificationsYou must be signed in to change notification settings

dash-ui/react-layout

Repository files navigation


npm i @dash-ui/react-layout

BundlephobiaTypesCode coverageBuild statusNPM VersionMIT License


Features

  • Comprehensive grids, rows, columns, and more.
  • Responsive props add breakpoint-specific styles to your layout components.
  • CSS variable themes mean performance is never going to be an issue whenusers switch from light to dark mode.
  • Strong types even when you use anas prop. If it's a button, you'regoing to be limited to<button> HTML attributes!
  • Tiny (<3.5kB) as layout primitive libraries go

Quick start

Check out an example onCodeSandbox

import*asReactfrom"react";import{createStyles}from"@dash-ui/styles";import{LayoutProvider,Box}from"@dash-ui/react-layout";// These root variable tokens are required in order to access// all features of@dash-ui/react-layoutconsttokens={// "color" is used for the "bg" prop on <Box>color:{primary:"#ee5b5f",},// "elevation" is used for the "elevation" prop on <Box>// It adds a box shadow to componentselevation:{sm:"0 1px 2px 0 rgba(0, 0, 0, 0.05)",md:"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)",},// "pad" is used for the "pad" prop// It adds padding to componentspad:{sm:"0.5rem",md:"1rem",lg:"2rem",},// "gap" is used for the "gap" prop// It adds margins between child componentsgap:{sm:"0.25rem",md:"0.5rem",lg:"1rem",},// "radius" is used for the "radius" prop// It adds border-radius to componentsradius:{sm:"0.125rem",md:"0.25rem",},};conststyles=createStyles({  tokens,});constApp=()=>(<LayoutProviderstyles={styles}mediaQueries={{sm:"only screen and (min-width: 0em)",md:"only screen and (min-width: 35em)",lg:"only screen and (min-width: 80em)",}}><Component/></LayoutProvider>);constComponent=()=>(// Responsive props are opt-in. In order to use them// you have to define a "mediaQueries" prop on your// <LayoutProvider><Boxsize={300}pad={{sm:"md",md:"lg"}}>    Hello world</Box>);

API docs

Components

ComponentDescription
<LayoutProvider>A context provider which is only required if you intend on using responsive props or a customstyles instance.
<Box>A layout component for adding size, padding, position, color, and more using tokens from your CSS variable theme.
<Cluster>A row directional layout component that distributes its items in a cluster. Common use cases are tags and input chips.
<Column>A layout component that distributes its items in a column without wrapping or shrinking.
<FlexItem>A layout component that can add positioning properties to itself inside of a flex container.
<Grid>A layout component that distributes its children in a grid. This an abstraction of CSS grids.
<GridItem>A layout component that can add positioning properties to itself inside of a<Grid> component.
<Layer>A layout component that is a container for<LayerItem>s.
<LayerItem>A layout component than positions itself absolutely inside of its container in whichever placement you decide.
<Row>A layout component that distributes its items in a row without wrapping.

Hooks

ComponentDescription
useResponsiveStyles()Returns theresponsivestyles used for creating responsive layout props.

TypeScript support

@dash-ui/react-layout is written in TypeScript. That said, there are some things to knowas it relates to connecting yourDashTokens and media query types to these layoutcomponents.

Description
Strongly typed media queriesLearn how to add types to responsive props
Strongly typed tokensLearn how to add types to your CSS tokens

Components

<LayoutProvider>

A context provider which is only required if you intend on using media queryprops or a customstyles instance.

Example

Check out an example onCodeSandbox

import*asReactfrom"react";import{styles}from"@dash-ui/styles";import{LayoutProvider,Box}from"@dash-ui/react-layout";conststyles=createStyles();constApp=()=>(<LayoutProviderstyles={styles}mediaQueries={{sm:"only screen and (min-width: 0em)",md:"only screen and (min-width: 35em)",lg:"only screen and (min-width: 80em)",}}><Component/></LayoutProvider>);constComponent=()=>(// Responsive props are opt-in. In order to use them// you have to define a "mediaQueries" prop on your// <LayoutProvider><Boxsize={300}pad={{sm:"md",md:"lg"}}>    Hello world</Box>);

Props

PropTypeDefaultRequired?Description
stylesStyles<DashTokens, DashThemes>stylesNoThestyles instance you're using to create styles. By default this is thestyles instance exported from@dash-ui/styles
mediaQueriesRecord<string, string>NoA mapping of name/media query pairs. This is only required if youre' using responsive props.

<Box>

A layout component for adding size, padding, position, color, and more using tokensfrom your CSS variable theme.

Example

Check out an example onCodeSandbox

import*asReactfrom"react";import{Box}from"@dash-ui/react-layout";constComponent=()=>(// Responsive props are opt-in. In order to use them// you have to define a "mediaQueries" prop on your// <LayoutProvider><Boxsize={300}pad={{sm:"md",md:"lg"}}>    Hello world</Box>);

Props

NameTypeRequired?Description
displayResponsiveProp<'flex' | 'inlineFlex' | 'block' | 'inlineBlock' | 'inline' | 'none'>NoSets adisplay CSS property on your component.
positionResponsiveProp<'relative' | 'absolute' | 'sticky' | 'fixed'>NoSets aposition CSS property on your component.
widthResponsiveProp<number | string>NoSets awidth CSS property on your component.
heightResponsiveProp<number | string>NoSets aheight CSS property on your component.
sizeResponsiveProp<number | string>NoSets asize CSS property on your component.
padResponsiveProp<keyof DashTokens['pad'] | (keyof DashTokens['pad'])[]>NoSets apadding CSS property on your component using the "pad" token in your theme. When this is an array padding will be joined in the same order as thepadding CSS property i.e.['sm', 'md'] would bepadding: var(--pad-sm) var(--pad-md).
bgResponsiveProp<keyof DashTokens['color']>NoSets abackground-color CSS property on your component using the "color" token in your theme.
elevationResponsiveProp<keyof DashTokens['elevation']>NoSets abox-shadow CSS property on your component using the "elevation" token in your theme.
radiusResponsiveProp<keyof DashTokens['radius'] | (keyof DashTokens['radius'])[]>NoSets aborder-radius CSS property on your component using the "radius" token in your theme. When this is an array padding will be joined in the same order as theborder-radius CSS property i.e.['sm', 'md'] would beborder-radius: var(--radius-sm) var(--radius-md).
classNamestring | string[]NoAdds one or several class names to your component.

<Cluster>

A row directional layout component that distributes its items ina cluster. Common use cases are tags and input chips.

Example

Check out an example onCodeSandbox

import*asReactfrom"react";import{Cluster,Box}from"@dash-ui/react-layout";constComponent=()=>(// Responsive props are opt-in. In order to use them// you have to define a "mediaQueries" prop on your// <LayoutProvider><Clusterwidth={{sm:"100%",md:400}}gap={{sm:"sm",md:"md"}}><Boxbg="primary"width={100}height={24}radius="md"/><Boxbg="primary"width={140}height={24}radius="md"/><Boxbg="primary"width={80}height={24}radius="md"/><Boxbg="primary"width={90}height={24}radius="md"/></Cluster>);

Props

🔆 In addition to the props below,<Row> inherits all props from<Box>.

NameTypeRequired?Description
gapResponsiveProp<keyof DashTokens['gap']>NoSets a vertical and horizontal gap between the child elements in the cluster using the "gap" token in your theme.
reverseResponsiveProp<boolean>NoReverses the direction of your cluster so that it lays out right-to-left.

<Column>

A layout component that distributes its items in a column without wrappingor shrinking.

Example

Check out an example onCodeSandbox

import*asReactfrom"react";import{Column,Box}from"@dash-ui/react-layout";constComponent=()=>(// Responsive props are opt-in. In order to use them// you have to define a "mediaQueries" prop on your// <LayoutProvider><Columnwidth="100%"gap={{sm:"sm",md:"md"}}><Boxbg="primary"height={100}width="100%"radius="md"/><Boxbg="primary"height={140}width="100%"radius="md"/><Boxbg="primary"height={80}width="100%"radius="md"/><Boxbg="primary"height={90}width="100%"radius="md"/></Column>);

Props

🔆 In addition to the props below,<Column> inherits all props from<Box>.

NameTypeRequired?Description
gapResponsiveProp<keyof DashTokens['gap']>NoSets a vertical gap between its child elements using the "gap" token in your theme.
reverseResponsiveProp<boolean>NoReverses the direction of the column to bottom-to-top

<FlexItem>

A layout component that can add positioning properties to itself inside ofa flex container.

Example

Check out an example onCodeSandbox

import*asReactfrom"react";import{FlexItem,Box,Row}from"@dash-ui/react-layout";constComponent=()=>(// Responsive props are opt-in. In order to use them// you have to define a "mediaQueries" prop on your// <LayoutProvider><Rowalign="start"width="100%"gap={{sm:"sm",md:"md"}}>{/* This item will be aligned in the center */}<FlexItemalign="center"bg="primary"width={100}height={120}radius="md"/>{/* These will both align at flex-start */}<Boxbg="primary"width={140}height={140}radius="md"/><Boxbg="primary"width={80}height={124}radius="md"/></Row>);

Props

🔆 In addition to the props below,<FlexItem> inherits all props from<Box>.

NameTypeRequired?Description
alignResponsiveProp<'start' | 'end' | 'center' | 'baseline' | 'stretch'>NoSets aalign-self CSS property on your component.
basisResponsiveProp<number | string>NoSets aflex-basis CSS property on your component.
growResponsiveProp<boolean | number>NoSets aflex-grow CSS property on your component.
maxWidthResponsiveProp<number | string>NoSets amax-width CSS property on your component.
maxHeightResponsiveProp<number | string>NoSets amax-height CSS property on your component.
orderResponsiveProp<number>NoSets aorder CSS property on your component.
shrinkResponsiveProp<boolean | number>NoSets aflex-shrink CSS property on your component.

<Grid>

A layout component that distributes its children in a grid. This an abstractionof CSS grids.

Example

Check out an example onCodeSandbox

import*asReactfrom"react";import{Grid,Box}from"@dash-ui/react-layout";constComponent=()=>(// Responsive props are opt-in. In order to use them// you have to define a "mediaQueries" prop on your// <LayoutProvider><Gridcols={3}rows={3}gap={{sm:"sm",md:"md"}}><Boxbg="primary"height={100}radius="md"/><Boxbg="primary"height={100}radius="md"/><Boxbg="primary"height={100}radius="md"/><Boxbg="primary"height={100}radius="md"/><Boxbg="primary"height={100}radius="md"/><Boxbg="primary"height={100}radius="md"/><Boxbg="primary"height={100}radius="md"/><Boxbg="primary"height={100}radius="md"/><Boxbg="primary"height={100}radius="md"/></Grid>);

Props

🔆 In addition to the props below,<Grid> inherits all props from<Box>,omittingdisplay which is always"grid".

NameTypeRequired?Description
alignXResponsiveProp<'start' | 'center' | 'end' | 'stretch'>NoSets ajustify-items CSS property on your component.
alignYResponsiveProp<'start' | 'center' | 'end' | 'stretch'>NoSets aalign-items CSS property on your component.
colsResponsiveProp<number | (number | string)[]>NoSets agrid-template-columns CSS property on your component.
distributeXResponsiveProp<'start' | 'center' | 'end' | 'stretch' | 'around' | 'between' | 'evenly'>NoSets ajustify-content CSS property on your component.
distributeYResponsiveProp<'start' | 'center' | 'end' | 'stretch' | 'around' | 'between' | 'evenly'>NoSets aalign-content CSS property on your component.
gapResponsiveProp<GapProp>NoSets a horizontal and vertical gap between the child elements in the row using the "gap" token in your theme.
inlineResponsiveProp<boolean>NoMakes the component display as aninline-grid rather thangrid.
rowsResponsiveProp<number | (number | string)[]>NoSets agrid-template-rows CSS property on your component.

GapProp

typeGapProp=|keyofDashTokens["gap"]|[keyofDashTokens["gap"],keyofDashTokens["gap"]];

<GridItem>

A layout component that can add positioning properties to itself inside ofa<Grid> component.

Example

Check out an example onCodeSandbox

import*asReactfrom"react";import{Grid,GridItem,Box}from"@dash-ui/react-layout";constComponent=()=>(<Gridcols={3}rows={[100,100]}gap={{sm:"sm",md:"md"}}>{/* This item spans 3 columns */}<GridItembg="primary"colStart={1}colEnd={4}radius="md"/><Boxbg="primary"radius="md"/><Boxbg="primary"radius="md"/><Boxbg="primary"radius="md"/></Grid>);

Props

🔆 In addition to the props below,<GridItem> inherits all props from<Box>.

NameTypeRequired?Description
alignXResponsiveProp<'start' | 'center' | 'end' | 'stretch'>NoSets ajustify-self CSS property on your component.
alignYResponsiveProp<'start' | 'center' | 'end' | 'stretch'>NoSets aalign-self CSS property on your component.
colStartResponsiveProp<number | string>NoSets agrid-column-start CSS property on your component.
colEndResponsiveProp<number | string>NoSets agrid-column-end CSS property on your component.
rowStartResponsiveProp<number | string>NoSets agrid-row-start CSS property on your component.
rowEndResponsiveProp<number | string>NoSets agrid-row-end CSS property on your component.

<Layer>

A layout component that is a container for<LayerItem>s.

Example

Check out an example onCodeSandbox

import*asReactfrom"react";import{Layer,LayerItem}from"@dash-ui/react-layout";constComponent=()=>(// Responsive props are opt-in. In order to use them// you have to define a "mediaQueries" prop on your// <LayoutProvider><Layerwidth={600}height={600}><LayerItemplacement="bottomRight"bg="primary"size={64}radius="md"/><LayerItemplacement="topLeft"bg="primary"size={64}radius="md"/></Layer>);

Props

🔆<Layer> inherits all of its props from<Box>,omittingposition which is always"relative".

<LayerItem>

A layout component than positions itself absolutely inside of its containerin whichever placement you decide.

Example

Check out an example onCodeSandbox

import*asReactfrom"react";import{Layer,LayerItem}from"@dash-ui/react-layout";constComponent=()=>(// Responsive props are opt-in. In order to use them// you have to define a "mediaQueries" prop on your// <LayoutProvider><Layerwidth={400}height={400}><LayerItemplacement="bottomRight"bg="primary"size={64}radius="md"/><LayerItemplacement="topLeft"bg="primary"size={64}radius="md"/></Layer>);

Props

🔆 In addition to the props below,<LayerItem> inherits all props from<Box>.

NameTypeRequired?Description
offsetResponsiveProp<number | string>NoSets amargin between the edges of the layer item's container.
placementResponsiveProp<Placements>YesSets the placement of your layer item relative to its container. SeePlacements.
zResponsiveProp<number>NoSets az-index CSS property on your component.

Placements

typePlacements=|"top"|"right"|"bottom"|"left"|"center"|"topLeft"|"topRight"|"bottomRight"|"bottomLeft";

<Row>

A layout component that distributes its items in a row without wrappingor shrinking.

Example

Check out an example onCodeSandbox

import*asReactfrom"react";import{Row,Box}from"@dash-ui/react-layout";constComponent=()=>(// Responsive props are opt-in. In order to use them// you have to define a "mediaQueries" prop on your// <LayoutProvider><Rowwidth="100%"gap={{sm:"sm",md:"md"}}><Boxbg="primary"width={100}height={120}radius="md"/><Boxbg="primary"width={140}height={140}radius="md"/><Boxbg="primary"width={80}height={124}radius="md"/><Boxbg="primary"width={90}height={96}radius="md"/></Row>);

Props

🔆 In addition to the props below,<Row> inherits all props from<Box>.

NameTypeRequired?Description
gapResponsiveProp<keyof DashTokens['gap']>NoSets a horizontal gap between its child elements using the "gap" token in your theme.
reverseResponsiveProp<boolean>NoReverses the direction of the column to right-to-left

Hooks

useResponsiveStyles()

Returns theresponsivestylesused for creating responsive layout props.

Returns

// See https://github.com/dash-ui/responsiveResponsiveStyles<DashTokens,MediaQueries,DashThemeNames>

TypeScript Support

Strongly typed media queries

To use media query types with@dash-ui/react-layout, you have to use the module declarationpattern:

Play with this example onCodeSandbox

constmediaQueries={sm:"only screen and (min-width: 0em)",md:"only screen and (min-width: 35em)",lg:"only screen and (min-width: 80em)",}asconst;typeAppMediaQueries=typeofmediaQueries;declare module"@dash-ui/react-layout"{exportinterfaceMediaQueriesextendsAppMediaQueries{}}// OR alternativelydeclare module"@dash-ui/react-layout"{exportinterfaceMediaQueries{sm:string;md:string;lg:string;}}

Strongly typed tokens

To use variable types with@dash-ui/react-layout, you have to use the module declarationpattern:

Play with this example onCodeSandbox

consttokens={color:{red:"#c17",},};typeAppTokens=typeoftokens;declare module"@dash-ui/styles"{exportinterfaceDashTokensextendsAppTokens{}}// OR alternativelydeclare module"@dash-ui/styles"{exportinterfaceDashTokens{color:{red:string;};}}

LICENSE

MIT


[8]ページ先頭

©2009-2025 Movatter.jp